瀏覽代碼

Merge branch 'feature/commercial-Eng'

zh 2 年之前
父節點
當前提交
000537faa9
共有 80 個文件被更改,包括 7322 次插入2610 次删除
  1. 0 37
      .history/src/api/stock_20220720145422.js
  2. 0 46
      .history/src/api/stock_20220818144734.js
  3. 0 7
      .history/src/views/basic_data/stock/product_list_20220818143421.vue
  4. 0 7
      .history/src/views/basic_data/stock/product_list_20220818143532.vue
  5. 0 73
      .history/src/views/basic_data/stock/product_list_20220818143704.vue
  6. 0 73
      .history/src/views/basic_data/stock/product_list_20220818143730.vue
  7. 0 68
      .history/src/views/basic_data/stock/product_list_20220818143739.vue
  8. 0 71
      .history/src/views/basic_data/stock/product_list_20220818144052.vue
  9. 0 81
      .history/src/views/basic_data/stock/product_list_20220818144133.vue
  10. 0 110
      .history/src/views/basic_data/stock/product_list_20220818144316.vue
  11. 0 112
      .history/src/views/basic_data/stock/product_list_20220818144338.vue
  12. 0 124
      .history/src/views/basic_data/stock/product_list_20220818144428.vue
  13. 0 138
      .history/src/views/basic_data/stock/product_list_20220818144456.vue
  14. 0 141
      .history/src/views/basic_data/stock/product_list_20220818144523.vue
  15. 0 166
      .history/src/views/basic_data/stock/product_list_20220818144541.vue
  16. 0 167
      .history/src/views/basic_data/stock/product_list_20220818144800.vue
  17. 0 177
      .history/src/views/basic_data/stock/product_list_20220818144930.vue
  18. 0 177
      .history/src/views/basic_data/stock/product_list_20220818144933.vue
  19. 0 177
      .history/src/views/basic_data/stock/product_list_20220818144956.vue
  20. 0 177
      .history/src/views/basic_data/stock/product_list_20220818145008.vue
  21. 0 177
      .history/src/views/basic_data/stock/product_list_20220818145018.vue
  22. 0 175
      .history/src/views/basic_data/stock/product_list_20220818145031.vue
  23. 0 0
      .history/src/views/stock/product_list_20220818143314.vue
  24. 0 3
      .history/src/views/stock/product_list_20220818143351.vue
  25. 0 3
      .history/src/views/stock/product_list_20220818143354.vue
  26. 0 7
      .history/src/views/stock/product_list_20220818143422.vue
  27. 11 7
      package-lock.json
  28. 1 1
      package.json
  29. 47 0
      src/api/basic_data/numerusClausus.js
  30. 47 0
      src/api/basic_data/partya.js
  31. 31 0
      src/api/basic_data/sectorAllocation.js
  32. 9 0
      src/api/common.js
  33. 50 0
      src/api/crossDistrict.js
  34. 17 0
      src/api/dataAnalysis.js
  35. 136 0
      src/api/frock.js
  36. 48 0
      src/api/homeDecoration.js
  37. 20 1
      src/api/setting.js
  38. 17 0
      src/api/summaryTable.js
  39. 9 0
      src/api/supply/engin.js
  40. 20 10
      src/components/Common/file-upload.vue
  41. 70 38
      src/components/template/sel-export-column-list.vue
  42. 10 0
      src/components/template/template-page-1.vue
  43. 19 2
      src/main.js
  44. 4 3
      src/store/getters.js
  45. 14 9
      src/store/modules/user.js
  46. 136 0
      src/utils/lbs.js
  47. 1 1
      src/views/basic_data/dailyWarehouseRent.vue
  48. 286 0
      src/views/basic_data/numerusClausus.vue
  49. 10 0
      src/views/basic_data/partya.vue
  50. 613 0
      src/views/basic_data/partya/partyaForm.vue
  51. 165 0
      src/views/basic_data/partya/partyaList.vue
  52. 238 0
      src/views/basic_data/sectorAllocation.vue
  53. 872 0
      src/views/commercialEngineering/components/base.vue
  54. 300 0
      src/views/commercialEngineering/components/examine.vue
  55. 297 0
      src/views/commercialEngineering/components/geographicalPosi.vue
  56. 123 0
      src/views/commercialEngineering/components/loginSuccess.vue
  57. 219 0
      src/views/commercialEngineering/components/model.vue
  58. 433 0
      src/views/commercialEngineering/components/operate.vue
  59. 97 0
      src/views/commercialEngineering/components/operationRecords.vue
  60. 72 0
      src/views/commercialEngineering/crossDistrict/crossDistrictForm.vue
  61. 312 0
      src/views/commercialEngineering/crossDistrict/crossDistrictkList.vue
  62. 44 0
      src/views/commercialEngineering/crossDistrict/detail.vue
  63. 110 0
      src/views/commercialEngineering/crossDistrict/examine.vue
  64. 42 0
      src/views/commercialEngineering/frock/detail.vue
  65. 90 0
      src/views/commercialEngineering/frock/examine.vue
  66. 57 0
      src/views/commercialEngineering/frock/frockForm.vue
  67. 312 0
      src/views/commercialEngineering/frock/frockList.vue
  68. 42 0
      src/views/commercialEngineering/homeDecoration/detail.vue
  69. 113 0
      src/views/commercialEngineering/homeDecoration/examine.vue
  70. 72 0
      src/views/commercialEngineering/homeDecoration/homeDecorationForm.vue
  71. 317 0
      src/views/commercialEngineering/homeDecoration/homeDecorationList.vue
  72. 231 0
      src/views/commercialEngineering/mixin/index.js
  73. 70 0
      src/views/commercialEngineering/summaryTable/summaryTableList.vue
  74. 120 0
      src/views/dataAnalysis/dataAnalysisList.vue
  75. 110 1
      src/views/secondaryMerchant/components/subMerchantDetail.vue
  76. 189 11
      src/views/secondaryMerchant/components/subMerchantForm.vue
  77. 438 0
      src/views/setting/engineeringSubAccount.vue
  78. 5 5
      src/views/setting/jiaxianSubAccount.vue
  79. 21 4
      src/views/setting/other.vue
  80. 185 23
      src/views/supply/engin/components/engin_form.vue

+ 0 - 37
.history/src/api/stock_20220720145422.js

@@ -1,37 +0,0 @@
-import request from '@/utils/request'
-
-// 获取库存列表
-export function getStockList(params) {
-  return request({
-    url: '/stock/manager/list',
-    method: 'get',
-    params
-  })
-}
-
-// 获取仓库列表
-export function getWarehouseList(params) {
-  return request({
-    url: '/stock/listStock',
-    method: 'get',
-    params
-  })
-}
-
-// 获取销售类型列表
-export function getSalesTypeList(params) {
-  return request({
-    url: '/sale/type/list',
-    method: 'get',
-    params
-  })
-}
-
-// 获取预留库存列表
-export function getReservedList(params) {
-  return request({
-    url: '/stock/manager/listCustomer',
-    method: 'get',
-    params
-  })
-}

+ 0 - 46
.history/src/api/stock_20220818144734.js

@@ -1,46 +0,0 @@
-import request from '@/utils/request'
-
-// 获取库存列表
-export function getStockList(params) {
-  return request({
-    url: '/stock/manager/list',
-    method: 'get',
-    params
-  })
-}
-
-// 获取仓库列表
-export function getWarehouseList(params) {
-  return request({
-    url: '/stock/listStock',
-    method: 'get',
-    params
-  })
-}
-
-// 获取销售类型列表
-export function getSalesTypeList(params) {
-  return request({
-    url: '/sale/type/list',
-    method: 'get',
-    params
-  })
-}
-
-// 获取预留库存列表
-export function getReservedList(params) {
-  return request({
-    url: '/stock/manager/listCustomer',
-    method: 'get',
-    params
-  })
-}
-
-// 获取仓库现存列表
-export function getListStockToDay(params) {
-  return request({
-    url: '/stock/manager/listStockToDay',
-    method: 'get',
-    params
-  })
-}

+ 0 - 7
.history/src/views/basic_data/stock/product_list_20220818143421.vue

@@ -1,7 +0,0 @@
-<template>
-  <div class="app-container">554</div>
-</template>
-
-<script>
-export default {}
-</script>

+ 0 - 7
.history/src/views/basic_data/stock/product_list_20220818143532.vue

@@ -1,7 +0,0 @@
-<template>
-  <div class="app-container">554</div>
-</template>
-
-<script>
-export default {}
-</script>

+ 0 - 73
.history/src/views/basic_data/stock/product_list_20220818143704.vue

@@ -1,73 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品大类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择产品大类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="规格型号" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入规格型号"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="经销商编号" prop="jxsNum">
-              <el-input v-model="screenForm.jxsNum" placeholder="请输入经销商编号"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="经销商名称" prop="jxsName">
-              <el-input v-model="screenForm.jxsName" placeholder="请输入经销商名称"></el-input>
-            </el-form-item>
-          </el-col>
-
-          <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      }
-    }
-  }
-}
-</script>

+ 0 - 73
.history/src/views/basic_data/stock/product_list_20220818143730.vue

@@ -1,73 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品大类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择产品大类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="规格型号" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入规格型号"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="经销商编号" prop="jxsNum">
-              <el-input v-model="screenForm.jxsNum" placeholder="请输入经销商编号"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="经销商名称" prop="jxsName">
-              <el-input v-model="screenForm.jxsName" placeholder="请输入经销商名称"></el-input>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      }
-    }
-  }
-}
-</script>

+ 0 - 68
.history/src/views/basic_data/stock/product_list_20220818143739.vue

@@ -1,68 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <!-- <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品大类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择产品大类" clearable>
-                <el-option v-for="item in typeList" :key="item.dictCode" :label="item.dictValue" :value="item.dictCode"></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col> -->
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="规格型号" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入规格型号"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="经销商编号" prop="jxsNum">
-              <el-input v-model="screenForm.jxsNum" placeholder="请输入经销商编号"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="经销商名称" prop="jxsName">
-              <el-input v-model="screenForm.jxsName" placeholder="请输入经销商名称"></el-input>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      }
-    }
-  }
-}
-</script>

+ 0 - 71
.history/src/views/basic_data/stock/product_list_20220818144052.vue

@@ -1,71 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <!-- <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option v-for="item in typeList" :key="item.dictCode" :label="item.dictValue" :value="item.dictCode"></el-option>
-              </el-select> -->
-            </el-form-item>
-          </el-col>
-
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-  </div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      }
-    }
-  }
-}
-</script>

+ 0 - 81
.history/src/views/basic_data/stock/product_list_20220818144133.vue

@@ -1,81 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <!-- <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option v-for="item in typeList" :key="item.dictCode" :label="item.dictValue" :value="item.dictCode"></el-option>
-              </el-select> -->
-            </el-form-item>
-          </el-col>
-
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: []
-    }
-  },
-
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    }
-  }
-}
-</script>

+ 0 - 110
.history/src/views/basic_data/stock/product_list_20220818144316.vue

@@ -1,110 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: []
-    }
-  },
-
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    }
-  }
-}
-</script>

+ 0 - 112
.history/src/views/basic_data/stock/product_list_20220818144338.vue

@@ -1,112 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: [],
-      dataList: [],
-      listLoading: false
-    }
-  },
-
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    }
-  }
-}
-</script>

+ 0 - 124
.history/src/views/basic_data/stock/product_list_20220818144428.vue

@@ -1,124 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: [],
-      dataList: [],
-      listLoading: false
-    }
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum
-      }
-    }
-  },
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    }
-  }
-}
-</script>

+ 0 - 138
.history/src/views/basic_data/stock/product_list_20220818144456.vue

@@ -1,138 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: [],
-      dataList: [],
-      listLoading: false
-    }
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum
-      }
-    }
-  },
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    }
-  }
-}
-</script>

+ 0 - 141
.history/src/views/basic_data/stock/product_list_20220818144523.vue

@@ -1,141 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: []
-    }
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum
-      }
-    }
-  },
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    }
-  }
-}
-</script>

+ 0 - 166
.history/src/views/basic_data/stock/product_list_20220818144541.vue

@@ -1,166 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: []
-    }
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum
-      }
-    }
-  },
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1
-      this.getList()
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields()
-      this.currentPage = 1
-      this.getList()
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val
-      this.currentPage = 1
-      this.getList()
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val
-      this.getList()
-    }
-  }
-}
-</script>

+ 0 - 167
.history/src/views/basic_data/stock/product_list_20220818144800.vue

@@ -1,167 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getListStockToDay } "@/api/stock"
-import { getDictList } from "@/api/common";
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: "",
-        goodsName: "",
-        goodsNum: "",
-        model: "",
-        jxsName: "",
-        jxsNum: "",
-      },
-      typeList: [],
-    };
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum,
-      };
-    },
-  },
-  methods: {
-    getDictList() {
-      getDictList({ sysDictEnum: "PRODUCT_TYPE" }).then((res) => {
-        this.typeList = res.data;
-      });
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields();
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val;
-      this.getList();
-    },
-  },
-};
-</script>

+ 0 - 177
.history/src/views/basic_data/stock/product_list_20220818144930.vue

@@ -1,177 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getListStockToDay } "@/api/stock"
-import { getDictList } from "@/api/common";
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: "",
-        goodsName: "",
-        goodsNum: "",
-        model: "",
-        jxsName: "",
-        jxsNum: "",
-      },
-      typeList: [],
-    };
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum,
-      };
-    },
-  },
-  methods: {
-
-    getList(){
-      const parmas = {
-        pageNum:
-      }
-      getListStockToDay().then(res=>{
-        this.dataList = res.data.records
-      })
-    }
-
-    getDictList() {
-      getDictList({ sysDictEnum: "PRODUCT_TYPE" }).then((res) => {
-        this.typeList = res.data;
-      });
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields();
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val;
-      this.getList();
-    },
-  },
-};
-</script>

+ 0 - 177
.history/src/views/basic_data/stock/product_list_20220818144933.vue

@@ -1,177 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getListStockToDay } "@/api/stock"
-import { getDictList } from "@/api/common";
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: "",
-        goodsName: "",
-        goodsNum: "",
-        model: "",
-        jxsName: "",
-        jxsNum: "",
-      },
-      typeList: [],
-    };
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum,
-      };
-    },
-  },
-  methods: {
-
-    getList(){
-      const parmas = {
-        pageNum:1
-      }
-      getListStockToDay().then(res=>{
-        this.dataList = res.data.records
-      })
-    }
-
-    getDictList() {
-      getDictList({ sysDictEnum: "PRODUCT_TYPE" }).then((res) => {
-        this.typeList = res.data;
-      });
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields();
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val;
-      this.getList();
-    },
-  },
-};
-</script>

+ 0 - 177
.history/src/views/basic_data/stock/product_list_20220818144956.vue

@@ -1,177 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getListStockToDay } "@/api/stock";
-import { getDictList } from "@/api/common";
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: "",
-        goodsName: "",
-        goodsNum: "",
-        model: "",
-        jxsName: "",
-        jxsNum: "",
-      },
-      typeList: [],
-    };
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum,
-      };
-    },
-  },
-  methods: {
-
-    getList(){
-      const parmas = {
-        pageNum:1
-      }
-      getListStockToDay().then(res=>{
-        this.dataList = res.data.records
-      })
-    }
-
-    getDictList() {
-      getDictList({ sysDictEnum: "PRODUCT_TYPE" }).then((res) => {
-        this.typeList = res.data;
-      });
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields();
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val;
-      this.getList();
-    },
-  },
-};
-</script>

+ 0 - 177
.history/src/views/basic_data/stock/product_list_20220818145008.vue

@@ -1,177 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getListStockToDay } "@/api/stock";
-import { getDictList } from "@/api/common";
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: "",
-        goodsName: "",
-        goodsNum: "",
-        model: "",
-        jxsName: "",
-        jxsNum: "",
-      },
-      typeList: [],
-    };
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum,
-      };
-    },
-  },
-  methods: {
-
-    getList(){
-      const parmas = {
-        pageNum:1
-      }
-      getListStockToDay().then(res=>{
-        this.dataList = res.data.records
-      })
-    }
-
-    getDictList() {
-      getDictList({ sysDictEnum: "PRODUCT_TYPE" }).then((res) => {
-        this.typeList = res.data;
-      });
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields();
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val;
-      this.getList();
-    },
-  },
-};
-</script>

+ 0 - 177
.history/src/views/basic_data/stock/product_list_20220818145018.vue

@@ -1,177 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getListStockToDay } from "@/api/stock";
-import { getDictList } from "@/api/common";
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: "",
-        goodsName: "",
-        goodsNum: "",
-        model: "",
-        jxsName: "",
-        jxsNum: "",
-      },
-      typeList: [],
-    };
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum,
-      };
-    },
-  },
-  methods: {
-
-    getList(){
-      const parmas = {
-        pageNum:1
-      }
-      getListStockToDay().then(res=>{
-        this.dataList = res.data.records
-      })
-    }
-
-    getDictList() {
-      getDictList({ sysDictEnum: "PRODUCT_TYPE" }).then((res) => {
-        this.typeList = res.data;
-      });
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields();
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val;
-      this.currentPage = 1;
-      this.getList();
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val;
-      this.getList();
-    },
-  },
-};
-</script>

+ 0 - 175
.history/src/views/basic_data/stock/product_list_20220818145031.vue

@@ -1,175 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 筛选条件 -->
-    <div class="screen-container">
-      <el-form ref="screenForm" :model="screenForm" label-width="90px" size="mini" label-position="left">
-        <el-row :gutter="20">
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="仓库" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择仓库" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品编码" prop="goodsNum">
-              <el-input v-model="screenForm.goodsNum" placeholder="请输入产品编码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="厂产品代码" prop="model">
-              <el-input v-model="screenForm.model" placeholder="请输入厂产品代码"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="产品名称" prop="goodsName">
-              <el-input v-model="screenForm.goodsName" placeholder="请输入产品名称"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :xs="24" :sm="12" :lg="6">
-            <el-form-item label="品类" prop="type">
-              <el-select v-model="screenForm.type" placeholder="请选择品类" clearable>
-                <el-option
-                  v-for="item in typeList"
-                  :key="item.dictCode"
-                  :label="item.dictValue"
-                  :value="item.dictCode"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col :xs="24" :sm="24" :lg="12" class="tr">
-            <el-form-item label="">
-              <el-button @click="resetScreenForm">清空</el-button>
-              <el-button type="primary" @click="submitScreenForm">搜索</el-button>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mymain-container">
-      <div class="btn-group clearfix">
-        <div class="fr">
-          <ExportButton :exUrl="'stock/manager/export'" :exParams="exParams" />
-        </div>
-      </div>
-      <div class="table">
-        <el-table
-          v-loading="listLoading"
-          :data="dataList"
-          element-loading-text="Loading"
-          border
-          fit
-          highlight-current-row
-          stripe
-        >
-          <el-table-column align="left" label="经销商编码" prop="customerNumber" min-width="100" show-overflow-tooltip>
-            <template slot-scope="scope">
-              <CopyButton :copyText="scope.row.customerNumber" />
-              <span>{{ scope.row.customerNumber }}</span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
-    <div class="pagination clearfix">
-      <div class="fr">
-        <el-pagination
-          @size-change="handleSizeChange"
-          @current-change="handleCurrentChange"
-          :current-page="currentPage"
-          :page-sizes="[10, 20, 30, 50]"
-          :page-size="10"
-          layout="total, sizes, prev, pager, next, jumper"
-          :total="listTotal"
-        >
-        </el-pagination>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getListStockToDay } from '@/api/stock'
-import { getDictList } from '@/api/common'
-export default {
-  data() {
-    return {
-      currentPage: 1, // 当前页码
-      pageSize: 10, // 每页数量
-      listTotal: 0, // 列表总数
-      dataList: null, // 列表数据
-      listLoading: false, // 列表加载loading
-      screenForm: {
-        // 筛选表单数据
-        type: '',
-        goodsName: '',
-        goodsNum: '',
-        model: '',
-        jxsName: '',
-        jxsNum: ''
-      },
-      typeList: []
-    }
-  },
-
-  computed: {
-    exParams() {
-      return {
-        materialName: this.screenForm.goodsName,
-        materialNumber: this.screenForm.goodsNum,
-        specification: this.screenForm.model,
-        mainNumber: this.screenForm.type,
-        customerName: this.screenForm.jxsName,
-        customerNumber: this.screenForm.jxsNum
-      }
-    }
-  },
-  methods: {
-    getList() {
-      const parmas = {
-        pageNum: 1
-      }
-      getListStockToDay().then(res => {
-        this.dataList = res.data.records
-      })
-    },
-    getDictList() {
-      getDictList({ sysDictEnum: 'PRODUCT_TYPE' }).then(res => {
-        this.typeList = res.data
-      })
-    },
-    // 提交筛选表单
-    submitScreenForm() {
-      this.currentPage = 1
-      this.getList()
-    },
-
-    // 重置筛选表单
-    resetScreenForm() {
-      this.$refs.screenForm.resetFields()
-      this.currentPage = 1
-      this.getList()
-    },
-
-    // 更改每页数量
-    handleSizeChange(val) {
-      this.pageSize = val
-      this.currentPage = 1
-      this.getList()
-    },
-
-    // 更改当前页
-    handleCurrentChange(val) {
-      this.currentPage = val
-      this.getList()
-    }
-  }
-}
-</script>

+ 0 - 0
.history/src/views/stock/product_list_20220818143314.vue


+ 0 - 3
.history/src/views/stock/product_list_20220818143351.vue

@@ -1,3 +0,0 @@
-<template>
-  <div class="app-container"></div>
-</template>

+ 0 - 3
.history/src/views/stock/product_list_20220818143354.vue

@@ -1,3 +0,0 @@
-<template>
-  <div class="app-container">554</div>
-</template>

+ 0 - 7
.history/src/views/stock/product_list_20220818143422.vue

@@ -1,7 +0,0 @@
-<template>
-  <div class="app-container">554</div>
-</template>
-
-<script>
-export default {}
-</script>

+ 11 - 7
package-lock.json

@@ -9,7 +9,7 @@
       "version": "4.4.0",
       "license": "MIT",
       "dependencies": {
-        "@zjlib/element-plugins": "^2.5.6",
+        "@zjlib/element-plugins": "^2.7.1",
         "axios": "0.18.1",
         "clipboard": "^2.0.8",
         "concurrent-tasks": "^1.0.7",
@@ -5555,9 +5555,9 @@
       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
     },
     "node_modules/@zjlib/element-plugins": {
-      "version": "2.5.6",
-      "resolved": "http://121.41.110.30:4873/@zjlib%2felement-plugins/-/element-plugins-2.5.6.tgz",
-      "integrity": "sha512-pu+HfYPQkzbyp/7BsDbjz0ZyM4RgZXpixb11NEMmm2reQ48sXLBKS69JoCVW5/AlFrM/aUANLnhQ6jZotJf2og==",
+      "version": "2.7.1",
+      "resolved": "http://121.41.110.30:4873/@zjlib%2felement-plugins/-/element-plugins-2.7.1.tgz",
+      "integrity": "sha512-9Wn/W/WqHxxWhQnPyG9mBg6Fj7hK2uA/OmWSYb9sVDYFTmp3AkT/W68DomDCqKoYMR/13msIvzi0rLZZSjlTlQ==",
       "dependencies": {
         "@turf/turf": "^6.5.0",
         "@vuemap/vue-amap": "^0.1.12",
@@ -5597,6 +5597,10 @@
         "vuex": "3.1.0",
         "webpack": "^4.46.0",
         "yarn": "^1.22.18"
+      },
+      "engines": {
+        "node": ">=8.9",
+        "npm": ">= 3.0.0"
       }
     },
     "node_modules/@zjlib/element-plugins/node_modules/element-ui": {
@@ -31562,9 +31566,9 @@
       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
     },
     "@zjlib/element-plugins": {
-      "version": "2.5.7",
-      "resolved": "http://121.41.110.30:4873/@zjlib%2felement-plugins/-/element-plugins-2.5.7.tgz",
-      "integrity": "sha512-MpSOIU/kDSbzDAcpAgXiuIkmEFz6kMqlVEP9UvAvI9Qot6CXRGKGdxecN6U6KOc6LhD5JM/lFlqpNydjW60FfA==",
+      "version": "2.7.1",
+      "resolved": "http://121.41.110.30:4873/@zjlib%2felement-plugins/-/element-plugins-2.7.1.tgz",
+      "integrity": "sha512-9Wn/W/WqHxxWhQnPyG9mBg6Fj7hK2uA/OmWSYb9sVDYFTmp3AkT/W68DomDCqKoYMR/13msIvzi0rLZZSjlTlQ==",
       "requires": {
         "@turf/turf": "^6.5.0",
         "@vuemap/vue-amap": "^0.1.12",

+ 1 - 1
package.json

@@ -15,7 +15,7 @@
     "test:ci": "npm run lint && npm run test:unit"
   },
   "dependencies": {
-    "@zjlib/element-plugins": "^2.5.7",
+    "@zjlib/element-plugins": "^2.7.1",
     "axios": "0.18.1",
     "clipboard": "^2.0.8",
     "concurrent-tasks": "^1.0.7",

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

@@ -0,0 +1,47 @@
+import request, { postBlob, handleImport, getBlob } from '@/utils/request'
+export function getMerchantLoginQuotaLimitList(params) {
+  return request({
+    url: `/config/merchantLoginQuotaLimit/list?moduleId=${params.moduleId}`,
+    method: 'post',
+    data: params
+  })
+}
+export function exportMerchantLoginQuotaLimit(data, name) {
+  return postBlob({
+    url: '/config/merchantLoginQuotaLimit/export',
+    data,
+    name
+  })
+}
+
+export function editMerchantLoginQuotaLimit(params) {
+  return request({
+    url: `/config/merchantLoginQuotaLimit/edit`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function addMerchantLoginQuotaLimit(params) {
+  return request({
+    url: `/config/merchantLoginQuotaLimit/add`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function getMerchantLoginQuotaLimitDetail(params) {
+  return request({
+    url: `/config/merchantLoginQuotaLimit/detail`,
+    method: 'post',
+    params
+  })
+}
+
+export function delMerchantLoginQuotaLimit(params) {
+  return request({
+    url: `/config/merchantLoginQuotaLimit/del`,
+    method: 'post',
+    data: params
+  })
+}

+ 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
+  })
+}

+ 31 - 0
src/api/basic_data/sectorAllocation.js

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+export function getTradeConfigList(params) {
+  return request({
+    url: '/config/tradeConfig/listLevel',
+    method: 'post',
+    params
+  })
+}
+
+export function editTradeConfig(params) {
+  return request({
+    url: '/config/tradeConfig/edit',
+    method: 'post',
+    data: params
+  })
+}
+export function addTradeConfig(params) {
+  return request({
+    url: '/config/tradeConfig/add',
+    method: 'post',
+    data: params
+  })
+}
+export function delTradeConfig(params) {
+  return request({
+    url: '/config/tradeConfig/del',
+    method: 'post',
+    params
+  })
+}

+ 9 - 0
src/api/common.js

@@ -149,3 +149,12 @@ export function updateStockCostDict(params) {
     params
   })
 }
+
+// 高德省市区街道
+export function getAutonaviRegion(params) {
+  return request({
+    url: '/common/region',
+    method: 'post',
+    params
+  })
+}

+ 50 - 0
src/api/crossDistrict.js

@@ -0,0 +1,50 @@
+import request, { postBlob } from '@/utils/request'
+
+export function getLoginCrossDistrictList(params) {
+  return request({
+    url: `/trade/login/order/span/list?moduleId=${params.moduleId}`,
+    method: 'post',
+    data: params
+  })
+}
+
+
+export function exportLoginCrossDistrict(data, name) {
+  return postBlob({
+    url: '/trade/login/order/span/list/export',
+    data,
+    name
+  })
+}
+
+export function addLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/span-add`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function editLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/span-edit`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function examineLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/span-examine`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function submitLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/span-submit`,
+    method: 'post',
+    data: params
+  })
+}

+ 17 - 0
src/api/dataAnalysis.js

@@ -0,0 +1,17 @@
+import request, { postBlob } from '@/utils/request'
+
+export function getDataList(params) {
+  return request({
+    url: `/trade/login/order/data/list?moduleId=${params.moduleId}`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function exportDataList(data, name) {
+  return postBlob({
+    url: '/trade/login/order/data/list/export',
+    data,
+    name
+  })
+}

+ 136 - 0
src/api/frock.js

@@ -0,0 +1,136 @@
+import request, { postBlob } from '@/utils/request'
+
+export function getLoginFrockList(params) {
+  return request({
+    url: `/trade/login/order/work/list?moduleId=${params.moduleId}`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function exportLoginFrock(data, name) {
+  return postBlob({
+    url: '/trade/login/order/work/list/export',
+    data,
+    name
+  })
+}
+
+export function addLoginFrock(params) {
+  return request({
+    url: `/trade/login/order/work-add`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function editLoginFrock(params) {
+  return request({
+    url: `/trade/login/order/work-edit`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function examineLoginFrock(params) {
+  return request({
+    url: `/trade/login/order/work-examine`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function submitLoginFrock(params) {
+  return request({
+    url: `/trade/login/order/work-submit`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function getCommercialEngineeringDetail(params) {
+  return request({
+    url: `/trade/login/order/detail`,
+    method: 'post',
+    params
+  })
+}
+
+// 商用工程登录单-替换业务员
+export function replaceService(params) {
+  return request({
+    url: `/trade/login/order/replace-service`,
+    method: 'post',
+    data: params
+  })
+}
+// 商用工程登录单-一键更新
+export function batchUpdate(params) {
+  return request({
+    url: `/trade/login/order/batch-update`,
+    method: 'post',
+    data: params
+  })
+}
+//  商用工程登录单-申请修改
+export function applyUpdate(params) {
+  return request({
+    url: `/trade/login/order/apply-update`,
+    method: 'post',
+    data: params
+  })
+}
+
+// 商用工程登录单-申请修改查询
+export function applyUpdateQuery(params) {
+  return request({
+    url: `/trade/login/order/apply-update/query`,
+    method: 'post',
+    params
+  })
+}
+
+// 商用工程登录单-删除
+export function delOrder(params) {
+  return request({
+    url: `/trade/login/order/del`,
+    method: 'post',
+    data: params
+  })
+}
+
+// 商用工程登录单-审核确认
+export function examineUpdate(params) {
+  return request({
+    url: `/trade/login/order/examine-update`,
+    method: 'post',
+    data: params
+  })
+}
+
+// 商用工程登录单-操作记录
+export function getOperationRecord(params) {
+  return request({
+    url: `/trade/login/order/operation/record`,
+    method: 'post',
+    params
+  })
+}
+
+// 商用工程登录单-附近项目
+export function getPositionProject(params) {
+  return request({
+    url: `/trade/login/order/position/project`,
+    method: 'post',
+    params
+  })
+}
+
+// 商用工程登录单-经销商填写历史
+export function getHistory(params) {
+  return request({
+    url: `/trade/login/order/customer/history`,
+    method: 'post',
+    params
+  })
+}

+ 48 - 0
src/api/homeDecoration.js

@@ -0,0 +1,48 @@
+import request, { postBlob } from '@/utils/request'
+
+export function getLoginHomeDecorationList(params) {
+  return request({
+    url: `/trade/login/order/home/list?moduleId=${params.moduleId}`,
+    method: 'post',
+    data: params
+  })
+}
+export function exportLoginHomeDecoration(data, name) {
+  return postBlob({
+    url: '/trade/login/order/home/list/export',
+    data,
+    name
+  })
+}
+
+export function addLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/home-add`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function editLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/home-edit`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function examineLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/home-examine`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function submitLoginHomeDecoration(params) {
+  return request({
+    url: `/trade/login/order/home-submit`,
+    method: 'post',
+    data: params
+  })
+}

+ 20 - 1
src/api/setting.js

@@ -512,6 +512,7 @@ export function getJiaXianUserList(params) {
   })
 }
 
+
 // 新建嘉贤经销商子账号
 export function addJiaXianUser(params) {
   return request({
@@ -519,4 +520,22 @@ export function addJiaXianUser(params) {
     method: 'post',
     params
   })
-}
+}
+
+// 工程子帐号列表
+export function getEngineeringUserList(params) {
+  return request({
+    url: '/admin/user/listGongCheng',
+    method: 'get',
+    params
+  })
+}
+
+// 新建工程子账号
+export function addEngineeringUser(params) {
+  return request({
+    url: '/admin/user/user/child/addGongCheng',
+    method: 'post',
+    params
+  })
+}

+ 17 - 0
src/api/summaryTable.js

@@ -0,0 +1,17 @@
+import request, { postBlob } from '@/utils/request'
+
+export function getLoginList(params) {
+  return request({
+    url: `/trade/login/order/list?moduleId=${params.moduleId}`,
+    method: 'post',
+    data: params
+  })
+}
+
+export function exportLogin(data, name) {
+  return postBlob({
+    url: '/trade/login/order/export',
+    data,
+    name
+  })
+}

+ 9 - 0
src/api/supply/engin.js

@@ -569,3 +569,12 @@ export function getEnginCountList(params) {
     params
   })
 }
+
+// 商用工程登录单-引用
+export function getLoginOrderList(params) {
+  return request({
+    url: '/trade/login/order/ref',
+    method: 'post',
+    params
+  })
+}

+ 20 - 10
src/components/Common/file-upload.vue

@@ -6,11 +6,12 @@
       :multiple="multiple"
       :show-file-list="isShowFileList"
       :file-list="fileList"
+      :limit="limit"
       :before-upload="beforeUpload"
       :on-remove="handleRemove"
       :on-success="handleUploadSuccess"
     >
-      <el-button size="small" type="primary">{{
+      <el-button :size="size" type="primary">{{
         multiple ? '点击上传' : fileList.length == 0 ? '点击上传' : '重新上传'
       }}</el-button>
     </el-upload>
@@ -20,7 +21,7 @@
 import { getOssConfig } from '@/api/common'
 
 export default {
-  name: 'fileUpload',
+  name: 'FileUpload',
   props: {
     fileList: Array,
     multiple: {
@@ -30,6 +31,14 @@ export default {
     fileType: {
       type: Array,
       default: () => ['image', 'video', 'word', 'excel', 'ppt', 'pdf']
+    },
+    size: {
+      type: String,
+      default: 'small'
+    },
+    limit: {
+      type: Number,
+      default: null
     }
   },
   data() {
@@ -40,15 +49,9 @@ export default {
       flag: false
     }
   },
-  created() {
-    getOssConfig().then(res => {
-      this.oss_url = res.data.host
-      this.dataObj = res.data
-    })
-  },
   computed: {
     isShowFileList: {
-      get: function () {
+      get: function() {
         if (!this.multiple) {
           if (this.fileList.length > 0 && this.fileList[0].url) {
             return true
@@ -57,9 +60,15 @@ export default {
           }
         }
       },
-      set: function (newValue) {}
+      set: function(newValue) {}
     }
   },
+  created() {
+    getOssConfig().then(res => {
+      this.oss_url = res.data.host
+      this.dataObj = res.data
+    })
+  },
   methods: {
     getUUID() {
       return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
@@ -84,6 +93,7 @@ export default {
       // this.fileList = [{ name: '', url: '' }];
     },
     beforeUpload(file) {
+      console.log(file, 999)
       const fileSuffix = file.name.substring(file.name.lastIndexOf('.') + 1)
       const imgList = ['jpg', 'jpeg', 'png']
       const videoList = ['mp4']

+ 70 - 38
src/components/template/sel-export-column-list.vue

@@ -4,48 +4,61 @@
     :before-close="cancel"
     :append-to-body="true"
     :visible.sync="dialogVisible"
-    width="400px"
+    :width="dialogWidth + 'px'"
   >
-    <el-table
-      v-bind="{
-        height: '100%',
-        style: 'width: 100%',
-        border: true,
-        headerCellClassName: 'headerRowColor',
-        size: 'mini'
-      }"
-      :data="exportColumnList"
-    >
-      <el-table-column
-        v-bind="{
-          label: '显示',
-          prop: '',
-          width: '80px'
-        }"
-      >
-        <template slot="header" slot-scope="scope">
-          <div>
-            <el-checkbox v-model="isExport"></el-checkbox>
-            <span style="margin-left: 5px">导出</span>
+    <div v-if="mode == 'checkbox'">
+      <el-checkbox v-model="isExport">全选</el-checkbox>
+      <div style="margin: 15px 0"></div>
+      <el-row :gutter="20">
+        <el-col :span="6" v-for="(item, index) in exportColumnList" :key="index">
+          <div style="margin-bottom: 3px">
+            <el-checkbox v-model="item.isExport">{{ item.label }}</el-checkbox>
           </div>
-        </template>
-        <template slot-scope="scope">
-          <el-checkbox v-model="scope.row.isExport"></el-checkbox>
-        </template>
-      </el-table-column>
-      <el-table-column
+        </el-col>
+      </el-row>
+    </div>
+    <div v-if="mode == 'table'">
+      <el-table
+        :data="exportColumnList"
         v-bind="{
-          label: '列名',
-          prop: ''
+          height: '100%',
+          style: 'width: 100%',
+          border: true,
+          headerCellClassName: 'headerRowColor',
+          size: 'mini'
         }"
       >
-        <template slot-scope="scope">
-          <div>
-            {{ scope.row.label }}
-          </div>
-        </template>
-      </el-table-column>
-    </el-table>
+        <el-table-column
+          v-bind="{
+            label: '显示',
+            prop: '',
+            width: '80px'
+          }"
+        >
+          <template slot="header" slot-scope="scope">
+            <div>
+              <el-checkbox v-model="isExport"></el-checkbox>
+              <span style="margin-left: 5px">导出</span>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <el-checkbox v-model="scope.row.isExport"></el-checkbox>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-bind="{
+            label: '列名',
+            prop: ''
+          }"
+        >
+          <template slot-scope="scope">
+            <div>
+              {{ scope.row.label }}
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
     <span slot="footer" class="dialog-footer">
       <el-button size="mini" @click="cancel">取 消</el-button>
       <el-button size="mini" type="primary" @click="determine">确 定</el-button>
@@ -59,6 +72,10 @@ export default {
     columnList: {
       type: Array,
       default: () => []
+    },
+    mode: {
+      type: String,
+      default: 'checkbox'
     }
   },
   data() {
@@ -68,12 +85,27 @@ export default {
       exportColumnList: []
     }
   },
+  computed: {
+    dialogWidth() {
+      var len = 0
+      this.exportColumnList.map(item => {
+        if ((item.label || '').length > len) {
+          len = (item.label || '').length
+        }
+      })
+      if (this.mode == 'checkbox') {
+        return 180 + len * 14 * 4
+      } else if (this.mode == 'table') {
+        return 140 + len * 14
+      }
+    }
+  },
   watch: {
     columnList: {
       handler() {
         if (this.columnList && this.columnList.length) {
           this.exportColumnList = this.columnList.map(item => {
-            return { ...item.exportField, isExport: !item.hidden }
+            return { ...item.exportField, isExport: true }
           })
           this.dialogVisible = true
         } else {

+ 10 - 0
src/components/template/template-page-1.vue

@@ -22,6 +22,8 @@
       :defaultSearchData="defaultSearchData"
       :replaceOrNotMap="replaceOrNotMap"
       :moreParameters="moreParameters"
+      :ellipsis="ellipsis"
+      :pofx="pofx"
       @columnWidthChange="columnWidthChange"
       @columnListChange="columnListChange"
     >
@@ -143,9 +145,17 @@ export default {
       type: Boolean,
       default: true
     },
+    ellipsis: {
+      type: Boolean,
+      default: true
+    },
     setModuleId: {
       type: [String, Number],
       default: null
+    },
+    pofx: {
+      type: Boolean,
+      default: false
     }
   },
   data() {

+ 19 - 2
src/main.js

@@ -31,11 +31,28 @@ import '@/permission' // permission control
 
 import * as filters from './filters' // global filters
 import directives from './directives'
-
+window._AMapSecurityConfig = {
+  serviceHost: 'https://jiasm.zfire.top/' + '_AMapService'
+}
 import '@zjlib/element-plugins/dest/element-plugins.css'
-import ElementPlugins from '@zjlib/element-plugins'
+import ElementPlugins, { AMap } from '@zjlib/element-plugins'
 Vue.use(ElementPlugins)
 
+Vue.use(AMap)
+AMap.initAMapApiLoader({
+  // 高德的key
+  key: '5894bf90997454b0df3c3d60cab12f64',
+  version: '2.0',
+  plugins: ['AMap.Geocoder', 'AMap.AutoComplete', 'AMap.PlaceSearch', 'AMap.DistrictSearch']
+})
+
+import { getIPAdd } from '@/utils/lbs.js'
+
+getIPAdd()
+  .then(res => {
+    Vue.prototype.$IpAdd = res.data
+  })
+  .catch(() => {})
 // // 本地引用;
 // import ElementPlugins from '@packages'
 // Vue.use(ElementPlugins)

+ 4 - 3
src/store/getters.js

@@ -16,8 +16,9 @@ const getters = {
   showMessages: state => state.user.showMessages,
   code: state => state.sales.code,
   isCustomer: state => state.user.customerId && state.user.customerName && state.user.customerNumber,
-  userInfo :state =>state.user.userInfo,
-  isHongGe:state => state.user.userInfo.isHongGe,
-  autoChangeNum:state => state.user.changeNum
+  isTradeExaminer: state => state.user.isTradeExaminer,
+  userInfo: state => state.user.userInfo,
+  isHongGe: state => state.user.userInfo.isHongGe,
+  autoChangeNum: state => state.user.changeNum
 }
 export default getters

+ 14 - 9
src/store/modules/user.js

@@ -9,14 +9,15 @@ const getDefaultState = () => {
     name: '', // 用户名称
     phone: '', // 用户手机
     menus: '', // 菜单
-    customerId: '', //经销商ID
-    customerName: '', //经销商名称
-    customerNumber: '', //经销商编码
+    customerId: '', // 经销商ID
+    customerName: '', // 经销商名称
+    customerNumber: '', // 经销商编码
+    isTradeExaminer: '',
     showMessages: null, //
     isNotice: false,
     websitNumber: '',
     isCollapse: true,
-    changeNum:1,
+    changeNum: 1,
     userInfo: JSON.parse(localStorage.getItem('supply_user')) || {}
   }
 }
@@ -54,6 +55,7 @@ const mutations = {
   SET_CUSTOMERNUMBER: (state, customerNumber) => {
     state.customerNumber = customerNumber
   },
+
   SET_IS_COLLAPSE(state, bool) {
     state.isCollapse = !bool.isCollapse
   },
@@ -63,19 +65,21 @@ const mutations = {
   SET_USETINFO(state, data) {
     state.userInfo = data
   },
-  SET_CHANGEUNM(state, data){
-    state.changeNum = data  || 1
-
+  SET_CHANGEUNM(state, data) {
+    state.changeNum = data || 1
   },
   showMessage: (state, value) => {
     if (value == 'yes') {
       state.showMessages = true
-    }else{
+    } else {
       state.showMessages = false
     }
   },
   SET_MESSAGE(state, value) {
     state.isNotice = value
+  },
+  SET_TRADEEXAMINER: (state, isTradeExaminer) => {
+    state.isTradeExaminer = isTradeExaminer
   }
 }
 
@@ -119,7 +123,7 @@ const actions = {
           }
           console.log(data)
           let websitNumber
-          const { nickName, userName, customerId, customerName, customerNumber, changeNum, isFront } = data
+          const { nickName, userName, customerId, customerName, customerNumber, changeNum, isFront, isTradeExaminer } = data
 
           if (data.adminWebsit) {
             websitNumber = data.adminWebsit.websitNumber
@@ -155,6 +159,7 @@ const actions = {
           commit('SET_CUSTOMERID', customerId)
           commit('SET_CUSTOMERNAME', customerName)
           commit('SET_CUSTOMERNUMBER', customerNumber)
+          commit('SET_TRADEEXAMINER', isTradeExaminer)
           commit('SET_NAME', nickName)
           commit('SET_PHONE', userName)
           commit('SET_USETINFO', data)

+ 136 - 0
src/utils/lbs.js

@@ -0,0 +1,136 @@
+import axios from 'axios'
+
+export function supervisorChangeList(keyword) {
+  return new Promise(function (r, j) {
+    try {
+      new AMap.Autocomplete({
+        city: '全国'
+      }).search(keyword, function (status, result) {
+        if (status === 'complete') {
+          r(result)
+        } else {
+          console.error('根据地址查询位置失败')
+          j(result)
+        }
+      })
+    } catch (error) {
+      j(error)
+    }
+  })
+}
+
+/**
+ * 根据地址查坐标
+ * @param {*} address 例如:广东省广州市天河区邮通小区
+ * @returns Object
+ */
+export function getLocation(address) {
+  return new Promise(function (r, j) {
+    try {
+      new AMap.Geocoder().getLocation(address, function (status, result) {
+        if (status === 'complete' && result.geocodes?.length) {
+          r(result.geocodes)
+        } else {
+          console.error('根据地址查询位置失败')
+          j(result)
+        }
+      })
+    } catch (error) {
+      j(error)
+    }
+  })
+}
+
+/**
+ * 根据坐标查地址
+ * @param {*} location 例如:[113.36242, 23.1368425]
+ * @returns Object
+ */
+export function getAddress(location) {
+  return new Promise(function (r, j) {
+    try {
+      new AMap.Geocoder().getAddress(location, function (status, result) {
+        if (status === 'complete' && result.regeocode) {
+          r(result.regeocode)
+        } else {
+          console.error('根据地址查询位置失败')
+          j(result)
+        }
+      })
+    } catch (error) {
+      j(error)
+    }
+  })
+}
+
+export function axiosMapZb(params) {
+  return axios({
+    url: `https://restapi.amap.com/v3/place/around`,
+    method: 'get',
+    params: {
+      key: 'b772f8b0ace6bc96c04ae8e48f241e36',
+      ...params
+    }
+  })
+}
+
+// 获取ip定位地址
+export function getIPAdd() {
+  return new Promise(function (r, j) {
+    try {
+      getIPs(ip => {
+        axios
+          .get('https://restapi.amap.com/v3/ip?output=json&key=b772f8b0ace6bc96c04ae8e48f241e36&ip=' + ip)
+          .then(r)
+          .catch(j)
+      })
+    } catch (error) {
+      j(error)
+    }
+  })
+}
+
+// 获取当前ip
+function getIPs(callback) {
+  var ip_dups = {}
+  var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection
+  var useWebKit = !!window.webkitRTCPeerConnection
+  var mediaConstraints = {
+    optional: [{ RtpDataChannels: true }]
+  }
+  var servers = {
+    iceServers: [{ urls: 'stun:stun.services.mozilla.com' }, { urls: 'stun:stun.l.google.com:19302' }]
+  }
+  var pc = new RTCPeerConnection(servers, mediaConstraints)
+  function handleCandidate(candidate) {
+    var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
+    var hasIp = ip_regex.exec(candidate)
+    if (hasIp) {
+      var ip_addr = ip_regex.exec(candidate)[1]
+      if (ip_dups[ip_addr] === undefined) callback(ip_addr)
+      ip_dups[ip_addr] = true
+    }
+  }
+  pc.onicecandidate = function (ice) {
+    if (ice.candidate) {
+      handleCandidate(ice.candidate.candidate)
+    }
+  }
+  pc.createDataChannel('')
+  pc.createOffer(
+    function (result) {
+      pc.setLocalDescription(
+        result,
+        function () {},
+        function () {}
+      )
+    },
+    function () {}
+  )
+  setTimeout(function () {
+    var lines = pc.localDescription.sdp.split('\n')
+    lines.forEach(function (line) {
+      if (line.indexOf('a=candidate:') === 0) handleCandidate(line)
+    })
+  }, 500)
+}

+ 1 - 1
src/views/basic_data/dailyWarehouseRent.vue

@@ -92,7 +92,7 @@ export default {
               value: val.query.monthTime
             },
             {
-              param: 'customer_number',
+              param: 'a.customer_number',
               compare: 'like',
               value: val.query.customerNumber
             },

+ 286 - 0
src/views/basic_data/numerusClausus.vue

@@ -0,0 +1,286 @@
+<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"
+  >
+    <el-dialog
+      title="商家登录名称限制"
+      :visible.sync="visible"
+      width="40%"
+      :append-to-body="true"
+      :close-on-click-modal="false"
+      @close="handleClose"
+    >
+      <el-form ref="formData" :model="formData" :rules="rules" label-width="150px" :inline="false" size="mini" :disabled="isDetail">
+        <el-form-item label="商家信息" prop="customerId">
+          <el-select v-model="formData.customerId" placeholder="请选择" clearable filterable style="width: 100%;" @change="handleChange">
+            <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="商家编号" prop="customerNumber">
+          <el-input v-model="formData.customerNumber" placeholder="根据选择自动带出商家编号" readonly />
+        </el-form-item>
+        <el-form-item label="工装登录名额限制" prop="workLoginLimit">
+          <el-input v-model.number="formData.workLoginLimit" type="number" placeholder="请输入正整数" />
+        </el-form-item>
+        <el-form-item label="家装登录名额限制" prop="homeLoginLimit">
+          <el-input v-model.number="formData.homeLoginLimit" type="number" placeholder="请输入正整数" />
+        </el-form-item>
+        <el-form-item label="跨区登录名额限制" prop="spanLoginLimit">
+          <el-input v-model.number="formData.spanLoginLimit" type="number" placeholder="请输入正整数" />
+        </el-form-item>
+        <el-form-item label="状态" prop="state">
+          <el-radio-group v-model="formData.state">
+            <el-radio
+              v-for="item in [
+                { label: '开启', vlaue: true },
+                { label: '停用', vlaue: false }
+              ]"
+              :key="item.key"
+              :label="item.vlaue"
+            >
+              {{ item.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <span slot="footer">
+        <el-button @click="handleClose">取消</el-button>
+        <el-button type="primary" :disabled="isDetail" @click="onSubmit">确定</el-button>
+      </span>
+    </el-dialog>
+  </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 { getDealerListV2 } from '@/api/basic_data/dealer'
+import {
+  getMerchantLoginQuotaLimitList,
+  exportMerchantLoginQuotaLimit,
+  delMerchantLoginQuotaLimit,
+  editMerchantLoginQuotaLimit,
+  addMerchantLoginQuotaLimit,
+  getMerchantLoginQuotaLimitDetail
+} from '@/api/basic_data/numerusClausus'
+
+export default {
+  components: { TemplatePage },
+  mixins: [import_mixin, add_callback_mixin],
+  data() {
+    return {
+      visible: false,
+      // 事件组合
+      optionsEvensGroup: [
+        [
+          [
+            {
+              name: '新增',
+              click: this.addOn(() => {
+                this.formData.id = ''
+                this.getDealerListV2()
+                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
+                await delMerchantLoginQuotaLimit(idList)
+                this.$refs.pageRef.refreshList()
+                this.$message.success('批量删除成功')
+              }
+            }
+          ]
+        ]
+      ],
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      }, // 关闭新增弹窗
+
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: [],
+
+      detailsId: '',
+      formData: {
+        id: '',
+        customerId: '',
+        customerNumber: '',
+        customerName: '',
+        homeLoginLimit: 0,
+        spanLoginLimit: 0,
+        state: true,
+        workLoginLimit: 0
+      },
+      customerList: [],
+      rules: {
+        customerId: [
+          { required: true, message: '请选择', trigger: 'change' }
+        ],
+        customerNumber: [
+          { required: true, message: '请填写', trigger: 'change' }
+        ],
+        homeLoginLimit: [
+          { required: true, message: '请填写', trigger: 'change' }
+        ],
+        spanLoginLimit: [
+          { required: true, message: '请填写', trigger: 'change' }
+        ],
+        workLoginLimit: [
+          { required: true, message: '请填写', trigger: 'change' }
+        ],
+        state: [
+          { required: true, message: '请选择', trigger: 'change' }
+        ]
+      },
+      isDetail: false
+    }
+  },
+  methods: {
+    // 列表请求函数
+    getList(...p) {
+      this.recordSelected = []
+      return getMerchantLoginQuotaLimitList(...p)
+    },
+    // 列表导出函数
+    exportList: exportMerchantLoginQuotaLimit,
+    // 表格列解析渲染数据更改
+    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.getDealerListV2()
+                this.getMerchantLoginQuotaLimitDetail(row.id)
+                this.visible = true
+              }}
+            >
+              编辑
+            </el-button>
+            <el-button
+              size='mini'
+              type='text'
+              onClick={() => {
+                this.getDealerListV2()
+                this.getMerchantLoginQuotaLimitDetail(row.id)
+                this.isDetail = true
+                this.visible = true
+              }}
+            >
+              详情
+            </el-button>
+            {
+              <el-popconfirm
+                title='确定删除吗?'
+                onOnConfirm={() => {
+                  delMerchantLoginQuotaLimit([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.$refs.formData.resetFields()
+        this.visible = false
+        this.isDetail = false
+        this.$refs.pageRef.refreshList()
+      })()
+    },
+    getMerchantLoginQuotaLimitDetail(id) {
+      getMerchantLoginQuotaLimitDetail({ id }).then(res => {
+        this.formData = {
+          ...res.data
+        }
+      })
+    },
+    getDealerListV2() {
+      getDealerListV2({
+        pageNum: 1,
+        pageSize: 100
+      }).then(res => {
+        this.customerList = res.data.records
+      })
+    },
+    handleChange(e) {
+      if (e) {
+        const item = this.customerList.find(k => k.id === e)
+        this.formData.customerNumber = item.number
+        this.formData.customerName = item.name
+      } else {
+        this.formData.customerNumber = ''
+        this.formData.customerName = ''
+      }
+    },
+    onSubmit() {
+      this.$refs.formData.validate(valid => {
+        const params = {
+          ...this.formData
+        }
+        if (valid) {
+          if (this.formData.id) {
+            editMerchantLoginQuotaLimit(params).then(res => {
+              this.visible = false
+              this.$successMsg('编辑成功')
+            })
+          } else {
+            addMerchantLoginQuotaLimit(params).then(res => {
+              this.visible = false
+              this.$successMsg('新增成功')
+            })
+          }
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 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>

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

@@ -0,0 +1,613 @@
+<template>
+  <div>
+    <h3>甲方客户信息 <span
+      style="color: #f00;font-size: 16px;font-weight: 400;
+    padding-left: 20px;"
+    >甲方客户名称要求与工商注册的公司名称一致</span></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" disabled 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" @change="handleTrade">
+                <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: 0
+        },
+        {
+          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) {
+        const item = this.tradeParentList.find(k => k.id === e)
+        this.formData.tradeParentName = item.name
+        this.tradeList = item.childList
+        return
+      }
+      this.formData.tradeId = ''
+    },
+    handleTrade(e) {
+      if (e) {
+        const item = this.tradeList.find(k => k.id === e)
+        this.formData.tradeName = item.name
+      } else {
+        this.formData.tradeId = ''
+        this.formData.tradeName = ''
+      }
+    },
+    getTradeConfigList(parentId = '') {
+      getTradeConfigList({
+        pageNum: 1,
+        pageSize: -1,
+        parentId: parentId
+      }).then(res => {
+        if (parentId) {
+          this.tradeList = res.data.records
+          return
+        }
+        this.tradeParentList = res.data
+        if (this.detailId) {
+          const item = this.tradeParentList.find(k => k.id === this.formData.tradeParentId)
+          console.log(item, 999)
+          if (item.childList && item.childList.length) {
+            this.tradeList = item.childList
+          }
+        }
+      })
+    },
+    getDetail() {
+      getFirstPartyCustomerManagementDetail({ id: this.detailId }).then(res => {
+        this.formData = {
+          ...res.data
+        }
+
+        this.getRegion(1, this.formData.provinceRegionId)
+        this.getRegion(2, this.formData.cityRegionId)
+      })
+    },
+    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>

+ 238 - 0
src/views/basic_data/sectorAllocation.vue

@@ -0,0 +1,238 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <el-col :span="6" :offset="0">
+        <el-input v-model="keyword" placeholder="部门筛选查询" size="mini" clearable />
+      </el-col>
+      <el-col :span="6" :offset="0">
+        <el-button size="mini" type="primary" @click="submitScreenForm">查询</el-button>
+        <el-button size="mini" @click="resetScreenForm">重置</el-button>
+      </el-col>
+    </el-row>
+    <div style="margin-top: 15px">
+      <el-button type="primary" size="mini" @click="handleAdd(false)">创建</el-button>
+    </div>
+    <div class="table">
+      <el-table
+        v-loading="listLoading"
+        :data="tableData"
+        max-height="700px"
+        style="width: 100%"
+        row-key="id"
+        border
+        default-expand-all
+        :tree-props="{ children: 'childList', hasChildren: 'hasChildren' }"
+      >
+        <el-table-column prop="name" label="分类名称" width="300" />
+        <el-table-column prop="createBy" label="发布人" />
+        <el-table-column prop="createTime" label="发布时间" />
+        <el-table-column prop="updateBy" label="更新人" />
+        <el-table-column prop="updateTime" label="更新时间" />
+        <el-table-column label="操作">
+          <template v-slot="{ row }">
+            <div style="display: flex; justify-content: center">
+              <el-button
+                v-if="row.parentId == '0'"
+                size="mini"
+                type="text"
+                @click="handleAdd(true, row)"
+              >添加</el-button>
+              <el-button size="mini" type="text" @click="handleEdit(true, row)">编辑</el-button>
+              <el-popconfirm
+                style="margin-left: 10px"
+                title="这是一段内容确定删除吗?"
+                @onConfirm="handleDelete(row.id)"
+              >
+                <el-button slot="reference" type="text" size="mini">删除</el-button>
+              </el-popconfirm>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <!-- 分页 -->
+    <!-- <div class="fr">
+      <el-pagination
+        :current-page="currentPage"
+        :page-sizes="[10, 20, 30, 50]"
+        :page-size="10"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="listTotal"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div> -->
+    <el-dialog
+      :title="type == 'add' ? '新增分类' : '编辑分类'"
+      :visible.sync="visible"
+      width="30%"
+      :append-to-body="true"
+      :close-on-click-modal="false"
+      @close="handleClose"
+    >
+      <el-form ref="formData" :model="formData" label-width="100px" :inline="false" size="mini">
+        <el-form-item label="分类名称" prop="name">
+          <el-input v-model="formData.name" placeholder="请输入" clearable />
+        </el-form-item>
+        <el-form-item v-if="formData.parentName" label="上级分类" prop="parentName">
+          <el-input v-model="formData.parentName" placeholder="请输入" clearable disabled />
+        </el-form-item>
+        <el-form-item label="状态" prop="state">
+          <el-radio-group v-model="formData.state">
+            <el-radio
+              v-for="item in [
+                { label: '开启', vlaue: true },
+                { label: '停用', vlaue: false }
+              ]"
+              :key="item.vlaue"
+              :label="item.vlaue"
+            >
+              {{ item.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <span slot="footer">
+        <el-button @click="handleClose">取消</el-button>
+        <el-button type="primary" @click="onSubmit">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getTradeConfigList, editTradeConfig, addTradeConfig, delTradeConfig } from '@/api/basic_data/sectorAllocation'
+export default {
+  data() {
+    return {
+      visible: false,
+      keyword: '',
+      tableData: [],
+      formData: {
+        id: '',
+        name: '',
+        parentId: '',
+        parentName: '',
+        state: true
+      },
+      type: 'add',
+      currentPage: 1,
+      pageSize: 10,
+      listTotal: 0,
+      listLoading: false
+    }
+  },
+  created() {
+    this.getTradeConfigList()
+  },
+  methods: {
+    async load(tree, treeNode, resolve) {
+      const data = await this.getTradeConfigList(tree.id)
+      resolve(data)
+    },
+    getTradeConfigList(parentId = '') {
+      getTradeConfigList({
+        keyword: this.keyword
+      })
+        .then(res => {
+          this.listLoading = true
+          if (!parentId) {
+            res.data.forEach(k => {
+              if (!k.childList) {
+                k.childList = []
+              }
+            })
+            this.tableData = res.data
+            this.listTotal = res.data.total
+            this.listLoading = false
+          }
+        })
+        .catch(_err => {
+        })
+    },
+    handleEdit(level, row) {
+      this.formData = { ...row }
+      this.type = 'edit'
+      this.visible = true
+    },
+    handleDelete(id) {
+      delTradeConfig({ id }).then(res => {
+        this.$successMsg('删除成功')
+        this.resetScreenForm()
+      })
+    },
+    onSubmit() {
+      this.$refs.formData.validate(valid => {
+        const params = {
+          ...this.formData
+        }
+        if (valid) {
+          if (this.type !== 'add') {
+            editTradeConfig(params).then(res => {
+              this.visible = false
+              this.$successMsg('编辑成功')
+              this.resetScreenForm()
+            })
+          } else {
+            addTradeConfig(params).then(res => {
+              this.visible = false
+              this.$successMsg('新增成功')
+              this.resetScreenForm()
+            })
+          }
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    submitScreenForm() {
+      this.tableData = []
+      this.getTradeConfigList()
+    },
+    resetScreenForm() {
+      this.keyword = ''
+      this.tableData = []
+      this.getTradeConfigList()
+    },
+    handleAdd(level = false, row = {}) {
+      if (level) {
+        this.formData = {
+          id: '',
+          state: row.state,
+          name: '',
+          parentId: row.id,
+          parentName: ''
+        }
+      } else {
+        this.formData.id = ''
+      }
+      this.type = 'add'
+      this.visible = true
+    },
+    handleClose() {
+      this.formData = {
+        id: '',
+        name: '',
+        parentId: '',
+        parentName: '',
+        state: true
+      }
+      this.visible = false
+    },
+    // 更改每页数量
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.currentPage = 1
+      this.getTradeConfigList()
+    },
+    // 更改当前页
+    handleCurrentChange(val) {
+      this.currentPage = val
+      this.getTradeConfigList()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 872 - 0
src/views/commercialEngineering/components/base.vue

@@ -0,0 +1,872 @@
+<!-- eslint-disable vue/valid-v-on -->
+<template>
+  <div>
+    <h3 class="title">
+      <div>{{ title }}</div>
+      <div class="title-right">格力商用空调登录表提示:带*的为必填项</div>
+    </h3>
+    <el-divider />
+    <div class="diy-table-1">
+      <el-row :gutter="0">
+        <el-col v-if="['cross'].includes(pageType)" :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">项目性质*:</div>
+          <div class="value">
+            <el-radio-group v-model="formData.orderType" size="mini" style="width: 100%">
+              <el-radio
+                v-for="item in [
+                  { label: '工装', value: 'WORK' },
+                  { label: '家装', value: 'HOME' }
+                ]"
+                :key="item.value"
+                :label="item.value"
+              >
+                {{ item.label }}
+              </el-radio>
+            </el-radio-group>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="['add'].includes(module) ? 12 :24" :lg="['add'].includes(module) ? 12 :24" class="item">
+          <div class="label">销售公司名称:</div>
+          <div class="value">
+            <el-input v-model="formData.salesCompanyName" disabled placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <template v-if="!['add'].includes(module)">
+          <el-col :xs="24" :sm="12" :lg="8" class="item">
+            <div class="label">工程登录类型:</div>
+            <div class="value">
+              <el-input :value="formData.orderType === 'WORK'? '工装': '家装'" placeholder="请填写" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="12" :lg="8" class="item">
+            <div class="label">项目编号:</div>
+            <div class="value">
+              <el-input v-model="formData.projectNo" placeholder="请填写" size="mini" clearable />
+            </div>
+          </el-col>
+          <el-col :xs="24" :sm="12" :lg="8" class="item">
+            <div class="label">登录时间:</div>
+            <div class="value">
+              <el-input v-model="formData.createTime" placeholder="请填写" size="mini" clearable />
+            </div>
+          </el-col>
+        </template>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">{{ ['cross'].includes(pageType) ? '业务所在区域' : '项目所在区域' }}*:</div>
+          <div class="value">
+            <el-select v-model="formData.projectArea" placeholder="请选择" clearable filterable>
+              <el-option
+                v-for="item in commonData.dict['TRADE_PROJECT_AREA']"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">跟进业务*:</div>
+          <div class="value">
+            <el-select v-model="formData.serviceId" placeholder="请选择" clearable filterable @change="handleService">
+              <el-option
+                v-for="item in commonData.salesmanList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </div>
+        </el-col>
+        <el-col v-if="['frock', 'cross'].includes(pageType) && formData.orderType === 'WORK'" :xs="24" :sm="module === 'detail'?24: 12" :lg="module === 'detail'?24: 12" class="item">
+          <div class="label">甲方名称*:</div>
+          <div class="value">
+            <el-select v-model="formData.partyAId" placeholder="请选择" clearable filterable @change="handlePartyA">
+              <el-option
+                v-for="item in commonData.PartyAList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </div>
+        </el-col>
+        <el-col v-else :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label" />
+          <div class="value" />
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="module === 'edit'?12: 8" class="item">
+          <div class="label">经销商*:</div>
+          <div class="value">
+            <el-input v-if="isCustomer" v-model="formData.customerName" disabled placeholder="请填写" size="mini" clearable />
+            <el-input v-if="!isCustomer && !isTradeExaminer" v-model="formData.customerName" disabled placeholder="请填写" size="mini" clearable />
+            <el-select v-if="isTradeExaminer" v-model="formData.customerId" placeholder="请选择" clearable filterable @change="handleCustomer">
+              <el-option
+                v-for="item in commonData.customerList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="8" class="item">
+          <div class="label">经销商联系人*:</div>
+          <div class="value">
+            <el-input v-model="formData.customerLinkName" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="8" class="item">
+          <div class="label">经销商联系电话*:</div>
+          <div class="value">
+            <el-input v-model="formData.customerLinkMobile" maxlength="11" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="8" class="item">
+          <div class="label">经销商办公地址*:</div>
+          <div class="value">
+            <el-input v-model="formData.customerAddress" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="8" class="item">
+          <div class="label">跟进经销商*:</div>
+          <div class="value">
+            <el-input v-model="formData.followCustomer" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="8" class="item">
+          <div class="label">跟进经销商电话*:</div>
+          <div class="value">
+            <el-input v-model="formData.followCustomerMobile" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col
+          v-if="['frock', 'cross'].includes(pageType) && formData.orderType !== 'HOME'"
+          :xs="24"
+          :sm="24"
+          :lg="8"
+          class="item"
+        >
+          <div class="label">工程项目名称*:</div>
+          <div class="value">
+            <el-input v-model="formData.projectName" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col
+          :xs="24"
+          :sm="12"
+          :lg="['home'].includes(pageType) || module === 'edit' || formData.orderType === 'HOME' ? 12 : 8"
+          class="item"
+        >
+          <div class="label">工程联系人*:</div>
+          <div class="value">
+            <el-input v-model="formData.enginLinkName" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col
+          :xs="24"
+          :sm="12"
+          :lg="['home'].includes(pageType) || module === 'edit' || formData.orderType === 'HOME' ? 12 : 8"
+          class="item"
+        >
+          <div class="label">电话*:</div>
+          <div class="value">
+            <el-input v-model="formData.enginLinkMobile" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col
+          v-if="['home'].includes(pageType) || formData.orderType === 'HOME'"
+          :xs="24"
+          :sm="24"
+          :lg="24"
+          class="item"
+        >
+          <div class="label" style="height: auto">工程项目名称*:</div>
+          <div class="value my-center" style="height: 100%">
+            <el-radio-group v-model="formData.homeProjectNameRadio" size="mini">
+              <el-radio label="AREA">
+                <el-input
+                  v-model="formData.homeProjectNameArea"
+                  class="my-width"
+                  placeholder="请填写"
+                  size="mini"
+                  clearable
+                />小区
+                <el-input
+                  v-model="formData.homeProjectNameSeat"
+                  class="my-width"
+                  placeholder="请填写"
+                  size="mini"
+                  clearable
+                />座
+                <el-input
+                  v-model="formData.homeProjectNameNumber"
+                  class="my-width"
+                  placeholder="请填写"
+                  size="mini"
+                  clearable
+                />号
+              </el-radio>
+              <el-radio label="SELF">
+                <el-input
+                  v-model="formData.homeProjectNameArea2"
+                  class="my-width"
+                  placeholder="请填写"
+                  size="mini"
+                  clearable
+                />(业主名称)自建房
+              </el-radio>
+              <el-radio label="VILLA">
+                <el-input
+                  v-model="formData.homeProjectNameArea3"
+                  class="my-width"
+                  placeholder="请填写"
+                  size="mini"
+                  clearable
+                />小区
+                <el-input
+                  v-model="formData.homeProjectNameNumber3"
+                  class="my-width"
+                  placeholder="请填写"
+                  size="mini"
+                  clearable
+                />号别墅
+              </el-radio>
+            </el-radio-group>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">工程(建筑)地址*:</div>
+          <div class="value">
+            <el-select v-model="formData.provinceId" placeholder="请选择省" class="my-width" @change="changeProvince">
+              <el-option v-for="item in provinceList" :key="item.lbsId" :label="item.name" :value="item.lbsId" />
+            </el-select>
+            <el-select v-model="formData.cityId" placeholder="请选择市" class="my-width" @change="changeCity">
+              <el-option v-for="item in cityList" :key="item.lbsId" :label="item.name" :value="item.lbsId" />
+            </el-select>
+            <el-select v-model="formData.areaId" placeholder="请选择区" class="my-width" @change="changeArea">
+              <el-option v-for="item in areaList" :key="item.lbsId" :label="item.name" :value="item.lbsId" />
+            </el-select>
+            <el-select v-model="formData.streetId" placeholder="请选择街道" class="my-width" @change="changeStreet">
+              <el-option v-for="item in streetList" :key="item.lbsId" :label="item.name" :value="item.lbsId" />
+            </el-select>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">详细地址*:</div>
+          <div class="value">
+            <el-input v-model="formData.positionAddress" placeholder="定位地址" size="mini" clearable disabled />
+            <el-input v-model="formData.address" placeholder="请填写详细地址" size="mini" clearable />
+            <geographicalPosi v-if="module !== 'detail'" :form-data="formData" @selectPosi="handleSelectPosi" />
+          </div>
+        </el-col>
+        <template>
+          <el-col v-if="module !== 'add'" :xs="24" :sm="24" :lg="24" class="item" style="height: 400px">
+            <div class="label" style="height: auto">地图位置</div>
+            <div class="value" style="height: auto; padding: 0">
+              <zj-amap-polygon
+                eid="bMap"
+                :zoom="zoom"
+                :center="center"
+                :markers="markers"
+                :electronic-fence="electronicFence"
+                @getPolygons="getPolygons"
+              >
+                <template #marker="{ marker }">
+                  <i class="el-icon-location-outline IP_font" />
+                  <div class="IP">
+                    <div>项目编号:{{ marker.no }}</div>
+                    <div>工程项目名称:{{ marker.name }}</div>
+                    <div>地址:{{ marker.address }}</div>
+                  </div>
+                </template>
+              </zj-amap-polygon>
+            </div>
+          </el-col>
+        </template>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">项目类别*:</div>
+          <div class="value">
+            <el-radio-group v-model="formData.projectCategory" size="mini">
+              <el-radio v-for="item in commonData.dict['TRADE_LOGIN_CATEGORY']" :key="item.value" :label="item.value">
+                {{ item.label }}
+              </el-radio>
+            </el-radio-group>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">图纸上传:</div>
+          <div class="value" style="justify-content: flex-end;position: relative;">
+            <FileUpload v-if="module !=='detail'" :file-list="formData.fileList" size="mini" :limit="1" class="file" />
+            <el-link v-if="module =='detail' && formData.fileList && formData.fileList.length" style="position: absolute;left: 5px;" type="primary" :underline="false" @click="openPdf(formData.fileList[0])">{{ formData.fileList[0].name }}下载</el-link>
+            <!-- <el-input v-model="formData.drawUpload"  size="mini" clearable /> -->
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">类型</div>
+          <div class="value">
+            <el-radio-group v-model="formData.type" size="mini">
+              <el-radio v-for="item in commonData.dict['TRADE_LOGIN_TYPE']" :key="item.value" :label="item.value">
+                {{ item.label }}
+              </el-radio>
+            </el-radio-group>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">建筑面积㎡*:</div>
+          <div class="value">
+            <el-input v-model="formData.extent" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">空调使用面积㎡*:</div>
+          <div class="value">
+            <el-input v-model="formData.useExtent" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">项目所在行业分类*:</div>
+          <div class="value">
+            <el-select
+              v-model="formData.tradeParentId"
+              placeholder="请选择"
+              clearable
+              filterable
+              @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="12" :lg="12" class="item">
+          <div class="label">行业细分*:</div>
+          <div class="value">
+            <el-select v-model="formData.tradeId" placeholder="请选择" clearable filterable @change="handleTrade">
+              <el-option v-for="item in tradeList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
+          </div>
+        </el-col>
+        <el-col v-if="['frock', 'home'].includes(pageType)" :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">项目性质*:</div>
+          <div class="value">
+            {{ pageType === 'frock' ? '工程': '家装' }}
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">机组类型*:</div>
+          <div class="value">
+            <el-select v-model="formData.machineType" placeholder="请选择" clearable filterable>
+              <el-option
+                v-for="item in commonData.dict['MACHINE_TYPE']"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">成功机率*:</div>
+          <div class="value">
+            <el-radio-group v-model="formData.successRate" size="mini">
+              <el-radio v-for="item in commonData.dict['SUCCESS_RATE']" :key="item.value" :label="item.value">
+                {{ item.label }}
+              </el-radio>
+            </el-radio-group>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">预计签定合同日期*:</div>
+          <div class="value">
+            <el-date-picker
+              v-model="formData.preSignDate"
+              class="date"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              default-time="00:00:00"
+              style="width: 100%"
+              placeholder="选择日期"
+            />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12" class="item">
+          <div class="label">预计设备金额*:</div>
+          <div class="value">
+            <el-input v-model="formData.preDeviceAmount" placeholder="请填写" size="mini" clearable />万
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">工程跟进状态*:</div>
+          <div class="value">
+            <el-radio-group v-model="formData.status" size="mini">
+              <el-radio v-for="item in commonData.dict['FOLLOW_STATUS']" :key="item.value" :label="item.value">
+                {{ item.label }}
+              </el-radio>
+            </el-radio-group>
+          </div>
+        </el-col>
+        <el-col v-if="['detail', 'examine'].includes(module)" :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">订单状态:</div>
+          <div class="value">
+            <el-input :value="orderTypeEume[formData.orderStatus]" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label" style="height: auto">备注:</div>
+          <div class="value" style="height: 100%">
+            <el-input
+              v-model="formData.remark"
+              style="margin: 5px 0"
+              type="textarea"
+              :rows="4"
+              placeholder="请输入备注"
+            />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label" style="height: auto">工程概况及此工程相关的社会关系以及其他相关信息{{ ['cross'].includes(pageType)?'*':'' }}:</div>
+          <div class="value" style="height: 100%">
+            <el-input
+              v-model="formData.otherInfo"
+              style="margin: 5px 0"
+              type="textarea"
+              :rows="3"
+              placeholder="请输入内容"
+            />
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+import { findElem } from '@/utils/util'
+import { getAutonaviRegion } from '@/api/common'
+import { getTradeConfigList } from '@/api/basic_data/sectorAllocation'
+import GeographicalPosi from './geographicalPosi.vue'
+import FileUpload from '@/components/Common/file-upload.vue'
+import { mapGetters } from 'vuex'
+import { getPositionProject, getHistory } from '@/api/frock'
+
+export default {
+  components: {
+    FileUpload,
+    GeographicalPosi
+  },
+  props: {
+    // 标题
+    title: {
+      type: String,
+      default: '登录信息'
+    },
+    // 数据源
+    formData: {
+      type: Object,
+      default: () => ({})
+    },
+    // 页面类型
+    pageType: {
+      type: String,
+      default: 'frock'
+    },
+    // 功能类型
+    module: {
+      type: String,
+      default: 'add'
+    },
+    commonData: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      fileList: [],
+      // 地图缩放比例
+      zoom: 16,
+      // 地图默认中心
+      center: [113.36242, 23.1368425],
+      markers: [],
+      // 是否启用电子围栏
+      electronicFence: false,
+      provinceList: [],
+      cityList: [],
+      areaList: [],
+      streetList: [],
+      tradeParentList: [],
+      tradeList: [],
+      orderTypeEume: {
+        SAVE: '保存', WAIT: '待审核', OK: '登录成功', FAIL: '登录不成功', RETURN: '返回'
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['isTradeExaminer', 'isCustomer', 'customerNumber', 'customerId', 'customerName'])
+  },
+  watch: {
+    async 'formData.id'(newValue, oldValue) {
+      if (newValue) {
+        if (this.isTradeExaminer) {
+          this.getPositionProject()
+        } else {
+          this.markers = [
+            {
+              name: this.formData.projectName,
+              center: [this.formData.lnt, this.formData.lat],
+              address: this.formData.address,
+              no: this.formData.projectNo
+            }
+          ]
+        }
+        this.center = [this.formData.lnt, this.formData.lat]
+        if (this.module === 'examine' && !this.formData.loginStatus) {
+          this.formData.loginStatus = 'OK'
+        }
+        if (this.module === 'examine' && this.formData.files.length) {
+          const item = this.formData.files
+          this.formData.files = item.map(k => {
+            return {
+              ...k,
+              name: k.fileName,
+              url: k.fileUrl,
+              hover: true
+            }
+          })
+        }
+        if (this.formData.homeProjectNameRadio === 'SELF') {
+          this.formData.homeProjectNameArea2 = this.formData.homeProjectNameArea
+        }
+        if (this.formData.homeProjectNameRadio === 'VILLA') {
+          this.formData.homeProjectNameNumber3 = this.formData.homeProjectNameNumber
+          this.formData.homeProjectNameArea3 = this.formData.homeProjectNameArea
+        }
+        if (this.formData.homeProjectNameRadio === 'SELF' || this.formData.homeProjectNameRadio === 'VILLA') {
+          this.formData.homeProjectNameArea = ''
+          this.formData.homeProjectNameSeat = ''
+          this.formData.homeProjectNameNumber = ''
+        }
+
+        await this.getCallbackPosition(null, this.formData.provinceId, 'province', 'lbsId')
+        await this.getCallbackPosition(this.formData.provinceId, this.formData.cityId, 'city', 'lbsId')
+        await this.getCallbackPosition(this.formData.cityId, this.formData.areaId, 'area', 'lbsId')
+        await this.getCallbackPosition(this.formData.areaId, this.formData.streetId, 'street', 'lbsId')
+      }
+    }
+  },
+  created() {
+    this.getTradeConfigList()
+    if (this.module === 'add') {
+      this.getAutonaviRegion()
+      if (this.isCustomer) {
+        this.formData.customerId = this.customerId
+        this.formData.customerNumber = this.customerNumber
+        this.formData.customerName = this.customerName
+      }
+      if (!this.isCustomer && !this.isTradeExaminer) {
+        this.formData.customerId = '269184'
+        this.formData.customerNumber = '100503'
+        this.formData.customerName = '韶关弘格贸易有限公司'
+      }
+      if (!this.isTradeExaminer) {
+        this.getHistory(this.formData.customerId)
+      }
+    }
+  },
+  methods: {
+    // 获取省市区街道
+    getAutonaviRegion(level = 0, id = null) {
+      getAutonaviRegion({ parentLbsId: id }).then(res => {
+        if (level === 0) {
+          if (['frock', 'home'].includes(this.pageType)) {
+            this.provinceList = res.data.filter(k => {
+              return k.name === '广东省'
+            })
+            this.getPosition(res.data, 'provinceId', 'province')
+          } else {
+            this.provinceList = res.data
+          }
+          console.log(res.data)
+        } else if (level === 1) {
+          this.cityList = res.data
+          //   this.getPosition(res.data, 'cityId', 'city')
+        } else if (level === 2) {
+          this.areaList = res.data
+        } else if (level === 3) {
+          this.streetList = res.data
+        }
+      })
+    },
+    getPosition(data, id, name) {
+      if (this.module === 'add') {
+        const item = data.find(k => k.name === this.$IpAdd[name])
+        this.formData[id] = item.id
+        this.formData[name] = item.name
+        if (name === 'province') {
+          this.getAutonaviRegion(1, item.id)
+        } else {
+          this.getAutonaviRegion(2, item.id)
+        }
+      }
+    },
+    getPositionProject() {
+      getPositionProject({ id: this.formData.id }).then(res => {
+        this.commonData.vicinityMarkers = res.data
+        this.markers = this.commonData.vicinityMarkers.map(k => {
+          return {
+            id: '',
+            name: k.projectName,
+            center: [k.lnt, k.lat],
+            address: k.address,
+            no: k.projectNo
+          }
+        })
+        this.markers.push({
+          name: this.formData.projectName,
+          center: [this.formData.lnt, this.formData.lat],
+          address: this.formData.address,
+          no: this.formData.projectNo
+        })
+      })
+    },
+    handleArea(value, type) {
+      this.formData[type] = this[type + 'List'].find(k => k.lbsId === value).name
+    },
+    // 切换省
+    changeProvince(value) {
+      this.formData.cityId = ''
+      this.formData.areaId = ''
+      this.formData.streetId = ''
+      this.cityList = []
+      this.areaList = []
+      this.streetList = []
+      this.getAutonaviRegion(1, value)
+      this.handleArea(value, 'province')
+    },
+
+    // 切换市
+    changeCity(value) {
+      this.formData.areaId = ''
+      this.formData.streetId = ''
+      this.areaList = []
+      this.streetList = []
+      this.getAutonaviRegion(2, value)
+      this.handleArea(value, 'city')
+    },
+
+    // 切换区
+    changeArea(value) {
+      this.areaValue = value
+      this.formData.streetId = ''
+      this.streetList = []
+      this.getAutonaviRegion(3, value)
+      this.handleArea(value, 'area')
+    },
+
+    // 切换街道
+    changeStreet(value) {
+      this.getAutonaviRegion(3, this.areaValue)
+      this.handleArea(value, 'street')
+    },
+
+    // 初始化省市区街道
+    initRegion(level, item, id = 0) {
+      const { province, city, area, street } = item
+      let nextId = null
+      getAutonaviRegion({ pid: id }).then(res => {
+        if (level === 0) {
+          this.provinceList = res.data
+          nextId = this.formData.provinceId = this.provinceList[findElem(this.provinceList, 'name', province)].id
+        } else if (level === 1) {
+          this.cityList = res.data
+          nextId = this.formData.cityId = 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) {
+        const item = this.tradeParentList.find(k => k.id === e)
+        this.formData.tradeParentName = item.name
+        this.tradeList = item.childList
+        return
+      }
+      this.formData.tradeId = ''
+    },
+    handleTrade(e) {
+      if (e) {
+        const item = this.tradeList.find(k => k.id === e)
+        this.formData.tradeName = item.name
+      } else {
+        this.formData.tradeId = ''
+        this.formData.tradeName = ''
+      }
+    },
+    getTradeConfigList(parentId = '') {
+      getTradeConfigList({
+        pageNum: 1,
+        pageSize: -1,
+        parentId: parentId
+      }).then(res => {
+        if (parentId) {
+          this.tradeList = res.data
+          return
+        }
+        this.tradeParentList = res.data
+        if (this.formData.id) {
+          console.log(this.formData.tradeParentId)
+          const item = this.tradeParentList.find(k => k.id === this.formData.tradeParentId)
+          if (item.childList && item.childList.length) {
+            this.tradeList = item.childList
+          }
+        }
+      })
+    },
+    handleService(e) {
+      if (e) {
+        const item = this.commonData.salesmanList.find(k => k.value === e)
+        this.formData.serviceNumber = item.userName
+        this.formData.serviceName = item.label
+      } else {
+        this.formData.serviceName = ''
+        this.formData.serviceNumber = ''
+      }
+    },
+    handlePartyA(e) {
+      if (e) {
+        const item = this.commonData.PartyAList.find(k => k.value === e)
+        this.formData.partyA = item.label
+      } else {
+        this.formData.partyA = ''
+      }
+    },
+    handleCustomer(e) {
+      if (e) {
+        const item = this.commonData.customerList.find(k => k.value === e)
+        this.formData.customerName = item.label
+        this.formData.customerNumber = item.number
+        this.getHistory(this.formData.customerId)
+      } else {
+        this.formData.customerName = ''
+        this.formData.customerNumber = ''
+        this.formData.customerLinkName = ''
+        this.formData.customerLinkMobile = ''
+        this.formData.customerAddress = ''
+      }
+    },
+    onSbumit() {},
+    getPolygons(data) {
+      console.log(data)
+    },
+    async handleSelectPosi(data) {
+      this.formData.lnt = data.center[0]
+      this.formData.lat = data.center[1]
+      this.formData.positionAddress = data.name
+      // this.formData.address = data.name
+      var { province, city, district, township } = data.data.addressComponent
+      console.log(province, city, district, township)
+      const area = district
+      const street = township
+      await this.getCallbackPosition(null, province, 'province')
+      await this.getCallbackPosition(this.formData.provinceId, city, 'city')
+      await this.getCallbackPosition(this.formData.cityId, area, 'area')
+      await this.getCallbackPosition(this.formData.areaId, street, 'street')
+    },
+
+    /**
+     * @param {*} id // 父级id
+     * @param {*} value // 值
+     * @param {*} name // 字段名称
+     * @param {*} way // 筛选属性,默认name
+     */
+    async getCallbackPosition(id = 0, value = '', name, way = 'name') {
+      const { data } = await getAutonaviRegion({ parentLbsId: id })
+      this[name + 'List'] = data
+      const temp = data.find(k => k[way] == value)
+      this.formData[name] = temp && temp.name
+      this.formData[name + 'Id'] = temp && temp.lbsId
+    },
+    openPdf(item) {
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = this.$imageUrl + item.url
+      link.download = item.name
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
+    },
+    getHistory(id) {
+      getHistory({ customerId: id }).then(res => {
+        this.formData.customerLinkName = res.data.linkName || ''
+        this.formData.customerLinkMobile = res.data.linkMobile || ''
+        this.formData.customerAddress = res.data.address || ''
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.diy-table-1 .item .label {
+  width: 180px;
+  padding: 10px;
+}
+::v-deep .el-select {
+  width: 100% !important;
+}
+::v-deep .date .el-input__icon,
+::v-deep .date .el-input__prefix {
+  right: 50px !important;
+  left: auto;
+}
+::v-deep .el-textarea__inner {
+  padding: 0;
+  border: none;
+}
+::v-deep .file:first-child > div {
+  display: flex !important;
+  align-items: center;
+  flex-direction: row-reverse;
+}
+::v-deep .file .is-success {
+  margin-top: 0;
+}
+.my-width {
+  width: 150px;
+}
+.title {
+  display: flex;
+  justify-content: space-between;
+  .title-right {
+    font-size: 16px;
+    font-weight: 300;
+  }
+}
+::v-deep .my-center{
+  input{
+    text-align: center !important;
+  }
+}
+::v-deep .el-upload-list__item-name{
+  width: 200px !important;
+}
+.IP_font {
+  font-size: 28px;
+  color: #409eff;
+  position: absolute;
+  left: -13px;
+  top: -25px;
+}
+.IP {
+  width: 15vw;
+  background-color: #fff;
+  padding: 6px 0 6px 6px;
+}
+</style>

+ 300 - 0
src/views/commercialEngineering/components/examine.vue

@@ -0,0 +1,300 @@
+<template>
+  <div>
+    <h3>{{ title }}</h3>
+    <el-divider />
+    <div class="diy-table-1">
+      <el-row :gutter="0">
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label">登录状态</div>
+          <div class="value">
+            <el-radio-group v-model="formData.loginStatus">
+              <el-radio v-for="item in engType" :key="item.value" :label="item.value">
+                {{ item.label }}
+              </el-radio>
+            </el-radio-group>
+          </div>
+        </el-col>
+        <el-col v-if="formData.loginStatus === 'FAIL'" :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label" style="height: auto">选择登录成功项目</div>
+          <div class="value" style="height: 100%; display: block">
+            <el-col :span="7" class="flex-box">
+              <div class="flex-box-title">项目编号{{ formData.loginStatus === 'REJECT' ? '*' : '' }}</div>
+              <el-input
+                v-model="formData.successLoginProject"
+                class="my-input"
+                placeholder="请填写"
+                size="mini"
+                clearable
+              >
+                <el-button slot="append" @click="handleFocus">引入</el-button>
+              </el-input>
+            </el-col>
+            <el-col :span="7" class="flex-box">
+              <div class="flex-box-title">经销商编号</div>
+              <el-input
+                v-model="formData.customerNumber2"
+                class="my-input"
+                placeholder="请填写"
+                size="mini"
+                clearable
+              />
+            </el-col>
+            <el-col :span="7" class="flex-box">
+              <div class="flex-box-title">经销商名称</div>
+              <el-input v-model="formData.customerName2" class="my-input" placeholder="请填写" size="mini" clearable />
+            </el-col>
+            <el-col :span="7" class="flex-box">
+              <div class="flex-box-title">业务员编号</div>
+              <el-input v-model="formData.serviceNumber2" class="my-input" placeholder="请填写" size="mini" clearable />
+            </el-col>
+            <el-col :span="7" class="flex-box">
+              <div class="flex-box-title">业务员名称</div>
+              <el-input v-model="formData.serviceName2" class="my-input" placeholder="请填写" size="mini" clearable />
+            </el-col>
+          </div>
+        </el-col>
+        <el-col :xs="12" :sm="12" :lg="12" class="item">
+          <div class="label">审核备注{{ formData.loginStatus === 'REJECT' ? '*' : '' }}</div>
+          <div class="value">
+            <el-select v-model="formData.examineNote" placeholder="请选择" size="mini" clearable style="width: 100%">
+              <el-option
+                v-for="item in commonData.dict['TRADE_EXAMINE_NOTE']"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+            <el-input
+              v-model="formData.note"
+              placeholder="请填写"
+              :disabled="formData.examineNote !== 'NOTE_3'"
+              size="mini"
+              clearable
+            />
+          </div>
+        </el-col>
+        <el-col :xs="12" :sm="12" :lg="12" class="item">
+          <div class="label">共同跟进项目编号</div>
+          <div class="value">
+            <el-input v-model="formData.commonFollowProject" placeholder="请填写" size="mini" clearable />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="24" class="item">
+          <div class="label" style="height: auto">审核上传</div>
+          <div class="value" style="height: auto">
+            <ImageUpload v-if="module !== 'detail'" class="mg-b" :file-list="formData.files" />
+            <template v-else>
+              <div
+                v-for="item in formData.files"
+                :key="item.fileUrl"
+                style="display: flex; width: 120px; height: 120px; align-items: center; justify-content: center"
+              >
+                <el-image
+                  v-if="checkFileType(item.fileUrl) == 'image'"
+                  ref="img"
+                  :src="$imageUrl + item.fileUrl"
+                  fit="cover"
+                  :preview-src-list="[$imageUrl + item.fileUrl]"
+                  class="elImageClose"
+                />
+                <div
+                  style="
+                    display: flex;
+                    width: 120px;
+                    height: 120px;
+                    align-items: center;
+                    justify-content: center;
+                    cursor: pointer;
+                  "
+                  @click="openPdf(item)"
+                >
+                  <img v-if="checkFileType(item.fileUrl) == 'word'" class="file" src="@/assets/common/word.png">
+                  <img v-if="checkFileType(item.fileUrl) == 'excel'" class="file" src="@/assets/common/excel.png">
+                  <img v-if="checkFileType(item.fileUrl) == 'ppt'" class="file" src="@/assets/common/ppt.png">
+                  <img
+                    v-if="checkFileType(item.fileUrl) == 'pdf'"
+                    class="file"
+                    style="cursor: pointer"
+                    src="@/assets/common/pdf.png"
+                  >
+
+                  <img v-if="checkFileType(item.fileUrl) == 'file'" class="file aaa" src="@/assets/common/zip.jpeg">
+                </div>
+              </div>
+            </template>
+            <div style="margin-left: 20px">注:可上传文件、附件</div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!--  -->
+    <LoginSuccess
+      :page-type="pageType"
+      :form-data="formData"
+      :show-dialog="showDialog"
+      @success="handleSuccess"
+      @cancel="handleCancel"
+    />
+  </div>
+</template>
+
+<script>
+import { getLoginHomeDecorationList } from '@/api/homeDecoration'
+import { getLoginCrossDistrictList } from '@/api/crossDistrict'
+import { getLoginFrockList } from '@/api/frock'
+import ImageUpload from '@/components/Common/image-upload.vue'
+import LoginSuccess from './loginSuccess.vue'
+export default {
+  components: {
+    ImageUpload,
+    LoginSuccess
+  },
+  props: {
+    title: {
+      type: String,
+      default: '审核信息'
+    },
+    formData: {
+      type: Object,
+      default: () => ({})
+    },
+    // 页面类型
+    pageType: {
+      type: String,
+      default: 'frock'
+    },
+    // 功能类型
+    module: {
+      type: String,
+      default: 'add'
+    },
+    commonData: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      engType: [
+        { label: '登录成功', value: 'OK' },
+        { label: '登录不成功', value: 'FAIL' },
+        { label: '驳回', value: 'REJECT' }
+      ],
+      showDialog: false
+    }
+  },
+  watch: {
+    async 'formData.id'(newValue, oldValue) {
+      console.log(3333)
+       this.getData()
+    }
+  },
+  methods: {
+    handleSuccess(val) {
+      const res = val[0]
+      this.formData.successLoginProject = res.projectNo
+      this.formData.customerNumber2 = res.customerNumber
+      this.formData.customerName2 = res.customerName
+      this.formData.serviceName2 = res.serviceName
+      this.formData.serviceNumber2 = res.serviceNumber
+    },
+    handleCancel() {
+      this.showDialog = false
+    },
+    handleFocus() {
+      this.showDialog = true
+    },
+    onSbumit() {},
+    // 检查文件类型
+    checkFileType(url) {
+      if (!url) return ''
+      const fileSuffix = url.substring(url.lastIndexOf('.') + 1)
+
+      if (['jpg', 'jpeg', 'png'].includes(fileSuffix)) {
+        return 'image'
+      } else if (['doc', 'docx', 'dot', 'wps', 'wpt'].includes(fileSuffix)) {
+        return 'word'
+      } else if (['xls', 'xlsx', 'xlt', 'et', 'ett'].includes(fileSuffix)) {
+        return 'excel'
+      } else if (['ppt', 'pptx', 'dps', 'dpt', 'pot', 'pps'].includes(fileSuffix)) {
+        return 'ppt'
+      } else if (['pdf'].includes(fileSuffix)) {
+        return 'pdf'
+      } else if (['zip', 'rar', 'gz', 'apk'].includes(fileSuffix)) {
+        return 'file'
+      } else {
+        return ''
+      }
+    },
+    openPdf(item) {
+      console.log(item, 999)
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = this.$imageUrl + item.fileUrl
+      link.download = item.fileName
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
+    },
+    getData() {
+      if (!this.formData.successLoginProject) return
+      const params = {
+        pageNum: 1,
+        pageSize: -1,
+        params: [
+          {
+            param: 'a.project_no',
+            compare: 'like',
+            value: this.formData.successLoginProject
+          }
+        ]
+      }
+      const objFn = {
+        home: getLoginHomeDecorationList,
+        cross: getLoginCrossDistrictList,
+        frock: getLoginFrockList
+      }
+      objFn[this.pageType](params).then(res => {
+        if (res.data.records && res.data.records.length) {
+          this.formData.customerNumber2 = res.data.records[0].customerNumber
+          this.formData.customerName2 = res.data.records[0].customerName
+          this.formData.serviceName2 = res.data.records[0].serviceName
+          this.formData.serviceNumber2 = res.data.records[0].serviceNumber
+        }
+      })
+    }
+  }
+}
+</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;
+}
+::v-deep .el-image-viewer__close {
+  top: 106px;
+  right: 40px;
+  width: 40px;
+  height: 40px;
+  font-size: 40px;
+}
+</style>

+ 297 - 0
src/views/commercialEngineering/components/geographicalPosi.vue

@@ -0,0 +1,297 @@
+<template>
+  <div class="withinLine">
+    <el-button type="primary" size="mini" @click="open">地理定位</el-button>
+    <el-dialog
+      title="地理定位"
+      :visible.sync="dialogVisible"
+      :append-to-body="true"
+      width="1000px"
+      :before-close="handleClose"
+    >
+      <template v-if="dialogVisible">
+        <div>
+          <el-row :gutter="20">
+            <el-col :xs="24" :sm="24" :lg="24">
+              <div class="teshubuju">
+                <el-autocomplete
+                  v-model="queryString"
+                  style="width: 100%; margin-right: 10px"
+                  placeholder="请输入内容"
+                  :fetch-suggestions="querySearchAsync"
+                  @select="handleSelect"
+                />
+                <el-button
+                  size="mini"
+                  type="primary"
+                  @click="
+                    () => {
+                      querySearchAsync(queryString)
+                    }
+                  "
+                >查询</el-button>
+              </div>
+            </el-col>
+          </el-row>
+        </div>
+        <br>
+        <div style="height: 60vh; position: relative">
+          <zj-amap-polygon
+            :markers="markers"
+            :zoom="zoom"
+            :center="center"
+            :electronic-fence="false"
+            @getGeocoder="getGeocoder"
+          >
+            <template #marker="{ marker }">
+              <i class="el-icon-location-outline IP_font" />
+              <div class="IP">
+                <div>地址:{{ marker.name }}</div>
+                <div>经度:{{ marker.center[0] }}</div>
+                <div>维度:{{ marker.center[1] }}</div>
+              </div>
+            </template>
+          </zj-amap-polygon>
+          <!-- 周边数据 -->
+          <div class="zhoubian">
+            <div v-for="(item, index) in mapzhoubian" :key="index" class="zhoubianItem" @click="zhoubiandw(item)">
+              <div class="zhoubianItemview">
+                <i class="el-icon-location-outline" />
+                <div>
+                  <div style="font-weight: bold; margin-bottom: 8px; box-sizing: border-box; padding: 0px 5px">
+                    {{ item.pname }}{{ item.cityname }}{{ item.adname }}{{ item.address }}
+                  </div>
+                  <div>地址:{{ item.name }}</div>
+                </div>
+                <div>
+                  <img
+                    v-for="(p, i) in item.photos || []"
+                    v-if="i === 0"
+                    :key="i"
+                    :src="seturl(p.url)"
+                    alt=""
+                    srcset=""
+                  >
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button size="mini" @click="handleClose">取 消</el-button>
+          <el-button size="mini" type="primary" @click="sub">提交</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getLocation, getAddress, supervisorChangeList, axiosMapZb } from '@/utils/lbs'
+export default {
+  props: { formData: { type: Object, default: () => ({}) }},
+  data() {
+    return {
+      dialogVisible: false,
+      loading: false,
+      center: [113.36242, 23.1368425],
+      zoom: 16.7,
+      markers: [],
+      mapSearchList: [],
+      mapzhoubian: [],
+      queryString: ''
+    }
+  },
+  watch: {
+    'formData.positionAddress'() {
+      if (this.markers[0] && this.markers[0].name !== this.formData.positionAddress) {
+        Object.assign(this.$data, this.$options.data())
+      }
+    }
+  },
+  methods: {
+    seturl(url) {
+      if (~url.indexOf('https://')) {
+        return url
+      } else {
+        return url.replace('http://', 'https://')
+      }
+    },
+    async open() {
+      this.dialogVisible = true
+      if (this.formData.lng && this.formData.lat && this.formData.positionAddress) {
+        this.changeSearchMapFn(`${this.formData.lng}//${this.formData.lat}//${this.formData.positionAddress}`)
+      } else {
+        var str = ''
+        if (!~(this.formData.positionAddress || '').indexOf(this.formData.province)) {
+          str += this.formData.province || ''
+        }
+        if (!~(this.formData.positionAddress || '').indexOf(this.formData.city)) {
+          str += this.formData.city || ''
+        }
+        if (!~(this.formData.positionAddress || '').indexOf(this.formData.area)) {
+          str += this.formData.area || ''
+        }
+        if (!~(this.formData.positionAddress || '').indexOf(this.formData.street)) {
+          str += this.formData.street || ''
+        }
+        str += this.formData.positionAddress || ''
+        await this.remoteMethod(str)
+        if (this.mapSearchList.length) {
+          var v = this.mapSearchList[0]
+          this.changeSearchMapFn(`${v.location.KL}//${v.location.kT}//${v.formattedAddress}`)
+        }
+      }
+    },
+    async querySearchAsync(queryString, cb) {
+      if (!queryString) {
+        cb && cb([])
+      } else {
+        var res = await supervisorChangeList(queryString)
+        var list = res.tips.map(item => {
+          return {
+            ...item,
+            value: item.district + item.name + item.address
+          }
+        })
+        if (cb) {
+          cb(list)
+        } else if (list.length) {
+          this.handleSelect(list[0])
+        }
+      }
+    },
+    async handleSelect(item) {
+      this.center = [item.location.lng, item.location.lat]
+      var data = await getAddress(this.center)
+      this.markers = [
+        {
+          id: '',
+          name: item.value,
+          center: [item.location.lng, item.location.lat],
+          data: {
+            ...data,
+            formattedAddress: item.value
+          }
+        }
+      ]
+      this.getAxiosMapZb(this.center)
+    },
+    zhoubiandw(item) {
+      this.changeSearchMapFn(
+        `${item.location.split(',').join('//')}//${
+          item.pname + item.cityname + item.adname + item.name + item.address
+        }`,
+        false
+      )
+    },
+    async changeSearchMapFn(value, bool = true) {
+      const res = value.split('//')
+      var data = await getAddress([Number(res[0]), Number(res[1])])
+      this.queryString = res[2]
+      this.markers = [
+        {
+          id: '',
+          name: res[2],
+          center: [res[0], res[1]],
+          data
+        }
+      ]
+      this.center = [res[0], res[1]]
+      if (bool) {
+        this.getAxiosMapZb(this.center)
+      }
+    },
+    async remoteMethod(query) {
+      if (query !== '') {
+        this.loading = true
+        this.mapSearchList = await getLocation(query)
+        this.loading = false
+      } else {
+        this.workerList = []
+      }
+    },
+    async getAxiosMapZb(center = []) {
+      axiosMapZb({
+        location: center.join(',')
+      })
+        .then(res => {
+          this.mapzhoubian = res.data.pois
+        })
+        .catch(err => {
+          console.log(err)
+        })
+    },
+    getGeocoder(data) {
+      this.markers = [
+        {
+          id: '',
+          name: data.formattedAddress,
+          center: data.center,
+          data
+        }
+      ]
+      this.changeSearchMapFn(`${data.center[0]}//${data.center[1]}//${data.formattedAddress}`)
+    },
+    handleClose(done) {
+      this.dialogVisible = false
+    },
+    sub() {
+      this.$emit('selectPosi', this.markers[0])
+      this.handleClose()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .address_map {
+  .el-dialog__body {
+    padding: 0 20px;
+  }
+}
+.IP_font {
+  font-size: 28px;
+  color: #409eff;
+  position: absolute;
+  left: -13px;
+  top: -25px;
+}
+.IP {
+  width: 15vw;
+  background-color: #fff;
+  padding: 6px 0 6px 6px;
+}
+.withinLine {
+  display: inline-block;
+  ::v-deep .el-button {
+    margin-left: 10px;
+  }
+}
+.teshubuju {
+  display: flex;
+}
+.zhoubian {
+  width: 320px;
+  max-height: 100%;
+  position: absolute;
+  right: 0;
+  top: 0;
+  overflow-y: auto;
+  .zhoubianItem {
+    width: 100%;
+    height: auto;
+    box-sizing: border-box;
+    padding: 16px 8px;
+    border-bottom: 1px solid #aaa;
+    background: #fff;
+    cursor: pointer;
+    .zhoubianItemview {
+      display: flex;
+      justify-content: space-between;
+      img {
+        width: 100px;
+      }
+    }
+  }
+}
+</style>

+ 123 - 0
src/views/commercialEngineering/components/loginSuccess.vue

@@ -0,0 +1,123 @@
+<template>
+  <el-dialog
+    :modal="true"
+    title="登录成功项目"
+    :visible.sync="showDialog"
+    width="70%"
+    :show-close="false"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    :append-to-body="true"
+  >
+    <div v-if="showDialog" style="height: 60vh">
+      <template-page
+        ref="pageRefTable"
+        :pofx="true"
+        :get-list="getList"
+        :column-parsing="columnParsing"
+        :operation-column-width="200"
+        :table-attributes="tableAttributes"
+        :table-events="tableEvents"
+        :replace-or-not-map="false"
+      />
+    </div>
+    <div slot="footer" class="dialog-footer">
+      <el-button size="mini" @click="cancel">取 消</el-button>
+      <el-button size="mini" type="primary" @click="confirm">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import { getLoginHomeDecorationList } from '@/api/homeDecoration'
+import { getLoginCrossDistrictList } from '@/api/crossDistrict'
+import { getLoginFrockList } from '@/api/frock'
+export default {
+  components: { TemplatePage },
+  mixins: [],
+  props: {
+    pageType: {
+      type: String,
+      required: true
+    },
+    showDialog: {
+      type: Boolean,
+      required: true
+    },
+    formData: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true,
+        selectable: this.selectable
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange,
+        select: (selection, row) => {
+          this.$refs.pageRefTable.$refs.zjpage.$refs.tableEl.$refs.tableView.clearSelection()
+          this.$refs.pageRefTable.$refs.zjpage.$refs.tableEl.$refs.tableView.toggleRowSelection(row)
+        }
+      },
+      recordSelected: []
+    }
+  },
+  computed: {},
+  watch: {
+    showDialog: {
+      handler(nl, ol) {
+        // console.log(this.pageType, this.formData, 9999)
+      }
+    }
+  },
+  created() {},
+  methods: {
+    selectable(row, index) {
+      if (this.formData.id == row.id) {
+        return false
+      } else {
+        return true
+      }
+    },
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    getList(...p) {
+      this.recordSelected = []
+      if (['home', 'frock'].includes(this.pageType)) {
+        p[0].params = [...p[0].params, { param: 'a.order_status', compare: '=', value: 'OK' }]
+      }
+      if (this.pageType === 'home') {
+        return getLoginHomeDecorationList(...p)
+      }
+      if (this.pageType === 'cross') {
+        return getLoginCrossDistrictList(...p)
+      }
+      if (this.pageType === 'frock') {
+        return getLoginFrockList(...p)
+      }
+    },
+    cancel() {
+      this.$emit('cancel')
+    },
+    confirm() {
+      this.$emit('success', this.recordSelected)
+      this.cancel()
+    }
+  }
+}
+</script>
+
+<style scoped></style>

+ 219 - 0
src/views/commercialEngineering/components/model.vue

@@ -0,0 +1,219 @@
+<template>
+  <div>
+    <h3>{{ title }}</h3>
+    <el-divider />
+    <zj-table
+      ref="tableEl"
+      :is-drop="true"
+      :columns="columns"
+      :table-data="formData.items"
+      :table-attributes="{
+        border: true
+      }"
+    />
+    <el-button v-if="!['detail', 'examine'].includes(module)" style="width: 100%" size="small" @click="handleAdd">添加</el-button>
+  </div>
+</template>
+
+<script>
+import { getMaterialListV2 } from '@/api/basic_data/material'
+
+export default {
+  props: {
+    title: {
+      type: String,
+      default: '机型信息'
+    },
+    formData: {
+      type: Object,
+      default: () => ({})
+    },
+    // 页面类型
+    pageType: {
+      type: String,
+      default: 'frock'
+    },
+    // 功能类型
+    module: {
+      type: String,
+      default: 'add'
+    },
+    commonData: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      k3List: []
+    }
+  },
+  computed: {
+    columns() {
+      return [
+        ...(() => {
+          return !['detail', 'examine'].includes(this.module) ? [{
+            hidden: '',
+            columnAttributes: {
+              fixed: 'left',
+              label: '操作',
+              prop: ''
+            },
+            render: (h, { row, column, index }) => {
+              return (
+                <div>
+                  <el-button
+                    size='mini'
+                    type='text'
+                    onClick={() => {
+                      this.formData.items.splice(index, 1)
+                    }}
+                  >
+                  删除
+                  </el-button>
+                </div>
+              )
+            }
+          }] : []
+        })(),
+        {
+          columnAttributes: {
+            label: '物料名称*',
+            prop: 'materialName'
+          },
+          render: (h, { row, column, index }) => {
+            return (
+              <el-select
+                value={row.materialName}
+                clearable
+                style='width: 100%;padding: 5px;'
+                onInput={e => (row.materialName = e)}
+                onChange={e => this.setCheckeData(e, row)}
+                filterable
+                size='mini'
+                remote
+                reserve-keyword
+                placeholder='请输入物料名称'
+                remote-method={e => this.remoteMethod(e, 'name')}
+                loading={this.loading}
+              >
+                {this.k3List.map(k => {
+                  return <el-option key={k.id} label={k.name} value={k.id}></el-option>
+                })}
+              </el-select>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '规格型号*',
+            prop: 'specification'
+          },
+          render: (h, { row, column, index }) => {
+            return (
+              <el-select
+                value={row.specification}
+                clearable
+                style='width: 100%;padding: 5px;'
+                onInput={e => (row.specification = e)}
+                onChange={e => this.setCheckeData(e, row)}
+                filterable
+                size='mini'
+                remote
+                reserve-keyword
+                placeholder='请输入规格型号'
+                remote-method={e => this.remoteMethod(e, 'specification')}
+                loading={this.loading}
+              >
+                {this.k3List.map(k => {
+                  return <el-option key={k.id} label={k.specification} value={k.id}></el-option>
+                })}
+              </el-select>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '备注',
+            prop: 'itemRemark'
+          },
+          render: (h, { row, column, index }) => {
+            return (
+              <el-input style='padding: 5px;' value={row.itemRemark} onInput={e => (row.itemRemark = e)}                 placeholder='请输入备注'
+
+                size='mini' clearable ></el-input>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '数量',
+            prop: 'qty'
+          },
+          render: (h, { row, column, index }) => {
+            return (
+              <el-input style='padding: 5px;' type='number' value={row.qty}  placeholder='请输入数量' onInput={e => (row.qty = e)}
+                size='mini' clearable ></el-input>
+            )
+          }
+        }
+      ]
+    }
+  },
+  methods: {
+    remoteMethod(query, type, name) {
+      if (query !== '') {
+        this.loading = true
+        getMaterialListV2({
+          pageNum: 1,
+          pageSize: 100,
+          params: [
+            {
+              'param': `a.${type}`,
+              'compare': 'like',
+              'value': query
+            }
+          ]
+        }).then(res => {
+          this.k3List = res.data.records
+          this.loading = false
+        })
+      } else {
+        this.k3List = []
+      }
+    },
+    setCheckeData(e, row) {
+      if (e) {
+        const item = this.k3List.find(k => k.id === e)
+        row.specification = item.specification
+        row.materialName = item.name
+        row.materialId = item.id
+        row.materialOldNumber = item.oldNumber
+      } else {
+        row.specification = ''
+        row.materialName = ''
+        row.materialId = ''
+        row.materialOldNumber = ''
+      }
+    },
+    handleAdd() {
+      this.formData.items.push({
+        id: '',
+        itemRemark: '',
+        materialId: '',
+        materialName: '',
+        materialNumber: '',
+        materialOldNumber: '',
+        orderId: '',
+        projectNo: '',
+        qty: null,
+        specification: '',
+        unit: ''
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 433 - 0
src/views/commercialEngineering/components/operate.vue

@@ -0,0 +1,433 @@
+<template>
+  <el-dialog
+    :title="operateTitle"
+    :visible.sync="visible"
+    :width="operateType === 'delete' ? '30%' : '50%'"
+    :append-to-body="true"
+    :close-on-click-modal="false"
+    @close="onClose"
+  >
+    <div v-if="['update', 'replace'].includes(operateType)">
+      <div>
+        <div v-if="operateType === 'update'">
+          <div class="flex-box">
+            <div class="flex-box-title">工单跟进状态</div>
+            <el-select v-model="formData.status" placeholder="请选择" clearable size="mini">
+              <el-option v-for="item in followType" :key="item.value" :label="item.label" :value="item.value" />
+            </el-select>
+          </div>
+          <div class="flex-box">
+            <div class="flex-box-title">工程登录信息</div>
+            <div>已选择{{ tableData.length || 0 }}个工程登录</div>
+          </div>
+        </div>
+      </div>
+      <div v-if="operateType === 'replace'">
+        <div class="flex-box">
+          <div class="flex-box-title">业务员</div>
+          <el-select v-model="formData.serviceId" placeholder="请选择" clearable size="mini">
+            <el-option v-for="item in salesmanList" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </div>
+        <div class="flex-box">
+          <div class="flex-box-title">备注</div>
+          <el-input
+            v-model="formData.remark"
+            type="textarea"
+            :rows="4"
+            placeholder="请输入"
+            :maxlength="-1"
+            :show-word-limit="false"
+            :autosize="{ minRows: 2, maxRows: 4 }"
+          />
+        </div>
+        <div class="flex-box">
+          <div class="flex-box-title">工程登录信息</div>
+          <div>已选择{{ tableData.length || 0 }}个工程登录</div>
+        </div>
+      </div>
+      <div>
+        <zj-table
+          ref="tableEl"
+          style="margin-bottom: 20px"
+          :is-drop="true"
+          :columns="columns"
+          :table-data="tableData"
+          :table-attributes="{
+            border: true,
+            selectColumn: true
+          }"
+          :table-events="tableEvents"
+        />
+        <!-- <div class="fr">
+          <el-pagination
+            :current-page="currentPage"
+            :page-sizes="[10, 20, 30, 50]"
+            :page-size="10"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="listTotal"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+        </div> -->
+      </div>
+    </div>
+    <div v-if="operateType === 'delete'">
+      <div class="mg">请确认是否需要删除该项目?经删除后不可恢复</div>
+      <div>请确认是否需要删除已选择的项目?经删除后不可恢复</div>
+    </div>
+    <div v-if="operateType === 'apply'">
+      <div class="mg">请确认是否需要申请修改项目跟进状态?</div>
+      <div class="mg">申请原因</div>
+      <div>
+        <el-input
+          v-model="formData.remark"
+          type="textarea"
+          :rows="4"
+          placeholder="请输入"
+          :maxlength="-1"
+          :show-word-limit="false"
+          :autosize="{ minRows: 2, maxRows: 4 }"
+        />
+      </div>
+    </div>
+    <div v-if="operateType === 'examine'">
+      <el-row :gutter="20">
+        <el-col :span="12" :offset="0"> 申请人: {{ formData.applyBy }}</el-col>
+        <el-col :span="12" :offset="0"> 所属公司: {{ formData.applyCompany }} </el-col>
+      </el-row>
+      <div class="mg">申请原因</div>
+      <div>
+        <el-input
+          v-model="formData.applyReason"
+          type="textarea"
+          :rows="4"
+          placeholder="请输入"
+          :maxlength="-1"
+          :show-word-limit="false"
+          :autosize="{ minRows: 2, maxRows: 4 }"
+        />
+      </div>
+      <div class="mg">审核确认</div>
+      <div>
+        <el-radio-group v-model="formData.isSuccess">
+          <el-radio
+            v-for="item in [
+              { label: '同意', value: true },
+              { label: '拒绝', value: false }
+            ]"
+            :key="item.value"
+            :label="item.value"
+          >
+            {{ item.label }}
+          </el-radio>
+        </el-radio-group>
+      </div>
+      <div class="mg">备注</div>
+      <div>
+        <el-input
+          v-model="formData.remark"
+          type="textarea"
+          :rows="4"
+          placeholder="请输入"
+          :maxlength="-1"
+          :show-word-limit="false"
+          :autosize="{ minRows: 2, maxRows: 4 }"
+        />
+      </div>
+    </div>
+    <span slot="footer">
+      <el-button @click="onClose">取消</el-button>
+      <el-button type="primary" @click="onConfirm">确定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { getDictList, getSalesmanList } from '@/api/common'
+import { replaceService, batchUpdate, applyUpdate, delOrder, examineUpdate, applyUpdateQuery } from '@/api/frock'
+
+export default {
+  props: {
+    operateVisible: {
+      type: Boolean,
+      default: false
+    },
+    operateType: {
+      type: String,
+      default: 'update'
+    },
+    operateTitle: {
+      type: String,
+      default: '更新'
+    },
+    recordSelected: {
+      type: Array,
+      default: () => []
+    },
+    detailId: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      show: false,
+      visible: true,
+      formData: {
+        applyBy: '',
+        applyCompany: '',
+        applyReason: '',
+        ids: [],
+        isSuccess: true,
+        remark: '',
+        serviceId: '',
+        serviceName: '',
+        status: 'ING'
+      },
+      tableData: [],
+      currentPage: 1,
+      listTotal: 0,
+      followType: [],
+      salesmanList: [],
+      machineList: [],
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      selectedData: []
+      // operateConfig: ['update', 'delete', 'apply', 'replace', 'examine']
+    }
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnAttributes: {
+            label: '工程编号',
+            prop: 'projectNo',
+            width: 150
+          }
+        },
+        {
+          columnAttributes: {
+            label: '项目名称',
+            prop: 'projectName',
+            width: 200
+          }
+        },
+        {
+          columnAttributes: {
+            label: '登录日期',
+            prop: 'createTime',
+            width: 150
+          }
+        },
+        {
+          columnAttributes: {
+            label: '经销商名称',
+            prop: 'customerName',
+            width: 200
+          }
+        },
+        {
+          columnAttributes: {
+            label: '业务员',
+            prop: 'serviceName',
+            width: 100
+          }
+        },
+        {
+          columnAttributes: {
+            label: '机组类型',
+            prop: 'machineType'
+          },
+
+          render: (h, { row, column, $index }) => {
+            console.log(row, 999)
+            const obj = {
+              TYPE_1: '风管机',
+              TYPE_2: '多联机',
+              TYPE_3: '模块机',
+              TYPE_4: '螺杆机',
+              TYPE_5: '离心机',
+              TYPE_6: '热水机',
+              TYPE_7: '冷冻冷藏',
+              TYPE_8: '末端',
+              TYPE_9: '其他'
+
+            }
+            return (
+              <div>
+                {obj[row.machineType] || row.machineType }
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '工程地址',
+            prop: 'address',
+            width: 200
+          }
+        },
+        {
+          columnAttributes: {
+            label: '跟进状态',
+            prop: 'status'
+          },
+          render: (h, { row, column, $index }) => {
+            const obj = {
+              ING: '跟进中', LOSS: '已丢单', SIGN: '签订合同'
+            }
+            return (
+              <div>
+                {obj[row.status] || row.status}
+              </div>
+            )
+          }
+        }
+      ]
+    }
+  },
+  created() {
+    this.visible = this.operateVisible
+    this.tableData = this.recordSelected
+    if (['update', 'replace'].includes(this.operateType)) {
+      this.getDictList()
+      this.operateType === 'replace' && this.getSalesmanList()
+    }
+    if (this.operateType === 'examine' && this.detailId) {
+      this.getApplyUpdateQuery()
+    }
+  },
+  methods: {
+    getDictList() {
+      getDictList({
+        sysDictEnum: 'FOLLOW_STATUS'
+      }).then(res => {
+        this.followType = res.data.map(k => {
+          return {
+            label: k.dictValue,
+            value: k.dictCode
+          }
+        })
+      })
+    },
+    getSalesmanList() {
+      getSalesmanList({
+        pageNum: 1,
+        pageSize: -1,
+        isCustomer: 0,
+        status: true
+      }).then(res => {
+        this.salesmanList = res.data.records.map(k => {
+          return {
+            label: k.nickName,
+            value: k.adminUserId
+          }
+        })
+      })
+    },
+    getApplyUpdateQuery() {
+      applyUpdateQuery({ id: this.detailId }).then(res => {
+        this.formData = {
+          ...res.data
+        }
+        this.formData.isSuccess = true
+        this.formData.status = 'ING'
+      })
+    },
+    selectionChange(data) {
+      this.selectedData = data
+    },
+    handleInterface(fn, tip) {
+      fn.then(() => {
+        this.$successMsg(tip)
+        this.onClose()
+      })
+    },
+    onConfirm() {
+      let params
+      const fnEnum = {
+        update: () => {
+          if (!this.formData.status) {
+            this.$errorMsg('工单跟进状态不能为空')
+            return
+          }
+          if (!this.selectedData.length) {
+            this.$errorMsg('工程登录信息不能为空')
+            return
+          }
+          const ids = this.selectedData.map(k => k.id)
+          params = {
+            status: this.formData.status,
+            ids
+          }
+          this.handleInterface(batchUpdate(params), '更新成功')
+        },
+        replace: () => {
+          if (!this.formData.serviceId) {
+            this.$errorMsg('业务员不能为空')
+            return
+          }
+          if (!this.selectedData.length) {
+            this.$errorMsg('工程登录信息不能为空')
+            return
+          }
+          const ids = this.selectedData.map(k => k.id)
+          const serviceName = this.salesmanList.find(k => k.value === this.formData.serviceId).label
+          params = {
+            serviceId: this.formData.serviceId,
+            serviceName,
+            ids
+          }
+          this.handleInterface(replaceService(params), '替换成功')
+        },
+        apply: () => {
+          if (!this.formData.remark) {
+            this.$errorMsg('申请原因不能为空')
+            return
+          }
+          params = {
+            remark: this.formData.remark,
+            ids: [this.detailId]
+          }
+          this.handleInterface(applyUpdate(params), '申请成功')
+        },
+        examine: () => {
+          params = {
+            isSuccess: this.formData.isSuccess,
+            remark: this.formData.remark,
+            ids: [this.detailId]
+          }
+          this.handleInterface(examineUpdate(params), '审核成功')
+        },
+        delete: () => {
+          const ids = this.tableData.map(k => k.id)
+          this.handleInterface(delOrder(ids), '删除成功')
+        }
+      }
+      fnEnum[this.operateType]()
+    },
+    onClose() {
+      this.$emit('close')
+    },
+    handleSizeChange() {},
+    handleCurrentChange() {}
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.flex-box {
+  display: flex;
+  align-items: center;
+  margin: 20px 0;
+  &-title {
+    flex: 0 0 100px;
+  }
+}
+.mg {
+  margin: 20px 0;
+}
+</style>

+ 97 - 0
src/views/commercialEngineering/components/operationRecords.vue

@@ -0,0 +1,97 @@
+<template>
+  <div>
+    <zj-table
+      ref="tableEl"
+      style="margin: 20px 0"
+      :is-drop="true"
+      :columns="columns"
+      :table-data="tableData"
+      :table-attributes="{
+        border: true,
+        maxHeight: '600px'
+      }"
+    />
+    <!-- <div class="fr">
+      <el-pagination
+        :current-page="currentPage"
+        :page-sizes="[10, 20, 30, 50]"
+        :page-size="10"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="listTotal"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div> -->
+  </div>
+</template>
+
+<script>
+import { getOperationRecord } from '@/api/frock'
+export default {
+  props: {
+    detailId: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      target: 1,
+      tableData: [],
+      currentPage: 1,
+      listTotal: 0
+    }
+  },
+  computed: {
+    columns() {
+      return [
+        {
+          columnAttributes: {
+            label: '操作类型',
+            prop: 'operType'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作内容',
+            prop: 'operContent',
+            width: 400
+          }
+        },
+        {
+          columnAttributes: {
+            label: '备注',
+            prop: 'remark'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作人',
+            prop: 'createBy'
+          }
+        },
+        {
+          columnAttributes: {
+            label: '操作时间',
+            prop: 'createTime'
+          }
+        }
+      ]
+    }
+  },
+  created() {
+    this.getOperationRecord()
+  },
+  methods: {
+    getOperationRecord() {
+      getOperationRecord({ id: this.detailId }).then(res => {
+        this.tableData = res.data
+      })
+    },
+    handleSizeChange() {},
+    handleCurrentChange() {}
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 72 - 0
src/views/commercialEngineering/crossDistrict/crossDistrictForm.vue

@@ -0,0 +1,72 @@
+<template>
+  <div>
+    <Base :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+    <Model :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+    <div style="margin: 20px 0">
+      <el-button type="primary" size="small" @click="onSbumit(1)">提交</el-button>
+      <el-button type="primary" size="small" @click="onSbumit(2)">暂存-草稿箱</el-button>
+      <el-button size="small" @click="onReset">重置</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Mixin from '../mixin'
+import { addLoginHomeDecoration, editLoginHomeDecoration, submitLoginHomeDecoration } from '@/api/crossDistrict'
+export default {
+  components: {
+    Base,
+    Model
+  },
+  mixins: [Mixin],
+  methods: {
+    onSbumit(type) {
+      const params = {
+        ...this.formData,
+        isSpan: true
+      }
+      if (params.orderType === 'HOME' && params.homeProjectNameRadio) {
+        params.projectName = {
+          'AREA': params.homeProjectNameArea + '小区' + params.homeProjectNameSeat + '座' + params.homeProjectNameNumber + '号',
+          'SELF': params.homeProjectNameArea2 + '(业主名称)自建房',
+          'VILLA': params.homeProjectNameArea3 + '小区' + params.homeProjectNameNumber3 + '号'
+        }[params.homeProjectNameRadio]
+      }
+      if (params.homeProjectNameRadio === 'SELF') {
+        params.homeProjectNameArea = params.homeProjectNameArea2
+      }
+      if (params.homeProjectNameRadio === 'VILLA') {
+        params.homeProjectNameNumber = params.homeProjectNameNumber3
+        params.homeProjectNameArea = params.homeProjectNameArea3
+      }
+      if (params.fileList.length) {
+        params.drawUpload = params.fileList[0].url
+      }
+
+      if (type === 1) {
+        submitLoginHomeDecoration(params).then(res => {
+          this.commonFn('提交成功')
+        })
+      } else {
+        if (!this.detailId) {
+          addLoginHomeDecoration(params).then(res => {
+            this.commonFn('新增成功')
+          })
+          return
+        }
+        editLoginHomeDecoration(params).then(res => {
+          this.commonFn('编辑成功')
+        })
+      }
+    },
+    commonFn(name) {
+      this.$successMsg(name)
+      this.$emit('updateList')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 312 - 0
src/views/commercialEngineering/crossDistrict/crossDistrictkList.vue

@@ -0,0 +1,312 @@
+<template>
+  <template-page
+    ref="pageRef"
+    :get-list="getList"
+    :export-list="exportList"
+    :operation="operation()"
+    :pofx="true"
+    :column-parsing="columnParsing"
+    :operation-column-width="160"
+    :options-evens-group="optionsEvensGroup"
+    :table-attributes="tableAttributes"
+    :table-events="tableEvents"
+    :replaceOrNotMap ="false"
+    :ellipsis="false"
+
+  >
+    <Popu v-if="visible">
+      <el-page-header slot="head" :content="content" @back="handleClose" />
+      <CrossDistrictForm
+        v-if="['add', 'edit','apply'].includes(module)"
+        :detail-id="detailId"
+        :module="module"
+        @updateList="handleClose"
+      />
+      <Detail v-if="['detail'].includes(module)" :detail-id="detailId" :module="module" @updateList="handleClose" />
+      <Examine v-if="['examine'].includes(module)" :detail-id="detailId" :module="module" @updateList="handleClose" />
+    </Popu>
+    <Operate v-if="operateVisible" :operate-visible="operateVisible" :operate-type="operateType" :operate-title="operateTitle" :detail-id="detailId" :record-selected="recordSelected" @close="handleClose" />
+
+  </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 CrossDistrictForm from './crossDistrictForm.vue'
+import Detail from './detail.vue'
+import Examine from './examine.vue'
+import Operate from '../components/operate.vue'
+import { mapGetters } from 'vuex'
+
+import { getLoginCrossDistrictList, exportLoginCrossDistrict } from '@/api/crossDistrict'
+export default {
+  components: { TemplatePage, Popu, CrossDistrictForm, Detail, Examine, Operate },
+  mixins: [import_mixin, add_callback_mixin],
+  data() {
+    return {
+      visible: false,
+      // 事件组合
+
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      }, // 关闭新增弹窗
+
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: [],
+      content: '新增',
+      detailId: '',
+      module: 'add', // ['add', 'edit', 'detail', 'examine']
+      operateVisible: false,
+      operateType: null,
+      operateTitle: null
+    }
+  },
+  computed: {
+    ...mapGetters(['isTradeExaminer']),
+    optionsEvensGroup() {
+      return [
+        [
+          [
+            {
+              name: '添加记录',
+              click: this.addOn(() => {
+                this.visible = true
+              })
+            }
+          ]
+        ],
+        ...(() => {
+          console.log(this.isTradeExaminer, 9999)
+          return this.isTradeExaminer
+            ? [
+              [
+                [
+                  {
+                    name: '更新',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要更新的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (!(this.recordSelected[index].orderStatus == '已审核' && this.recordSelected[index].status == '跟进中')) {
+                          this.$message.error('请选择审核通过并且跟进中的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'update'
+                      this.operateTitle = '更新'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ],
+              [
+                [
+                  {
+                    name: '替换业务员',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要替换业务员的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (this.recordSelected[index].orderStatus !== '已审核') {
+                          this.$message.error('请选择审核通过的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'replace'
+                      this.operateTitle = '替换业务员'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ],
+              [
+                [
+                  {
+                    name: '删除',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要删除的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (this.recordSelected[index].orderStatus !== '已审核') {
+                          this.$message.error('请选择审核通过的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'delete'
+                      this.operateTitle = '删除'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ]
+            ]
+            : []
+        })()
+      ]
+    }
+  },
+  created() {
+    this.getCurrentRoute()
+  },
+  methods: {
+    // 列表请求函数
+    getList(...p) {
+      this.recordSelected = []
+      return getLoginCrossDistrictList(...p)
+    },
+    // 列表导出函数
+    exportList: exportLoginCrossDistrict,
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      if (item.colName === 'project_no') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (<el-link type='primary' underline={false} onClick={() => {
+            const page = this.$router.resolve({
+              path: '/commercialEngineering/crossDistrictkList',
+              query: {
+                detailId: row.id,
+                module: 'detail'
+              }
+            })
+            window.open(page.href, '_blank')
+          }}>{row.projectNo}</el-link>)
+        }
+      }
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    operation() {
+      return (h, { row, index, column }) => {
+        return (
+          <div class='operation-btns'>
+            {this.isTradeExaminer && (row.orderStatus === 'WAIT' || row.orderStatus === 'OK' || row.orderStatus === 'FAIL') ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.content = '审核'
+                  this.module = 'examine'
+                  this.detailId = row.id
+                  this.visible = true
+                }}
+              >
+                审核
+              </el-button>
+            ) : null}
+            {/* <el-button
+              size='mini'
+              type='text'
+              onClick={() => {
+                this.content = '详情'
+                this.module = 'detail'
+                this.detailId = row.id
+                this.visible = true
+              }}
+            >
+              详情
+            </el-button> */}
+            {(row.orderStatus === 'SAVE' || row.orderStatus === 'RETURN')
+              ? <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.content = '编辑'
+                  this.module = 'edit'
+                  this.detailId = row.id
+                  this.visible = true
+                }}
+              >
+              编辑
+              </el-button> : null
+            }
+            {row.orderStatus === 'OK' && row.status === 'ING'
+              ? <el-button size='mini' type='text' onClick={() => {
+                this.operateType = 'update'
+                this.operateTitle = '更新'
+                this.recordSelected = [row]
+                this.operateVisible = true
+              }}>
+              更新
+              </el-button> : null
+            }
+            {!this.isTradeExaminer && ((row.orderStatus === 'OK') && row.status === 'ING' && !row.isApplyUpdate) ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.detailId = row.id
+                  this.operateType = 'apply'
+                  this.operateTitle = '申请修改'
+                  this.operateVisible = true
+                }}
+              >
+                申请修改
+              </el-button>
+            ) : null}
+            {this.isTradeExaminer && ((row.orderStatus === 'OK' || row.orderStatus === 'FAIL') && row.isApplyUpdate) ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.detailId = row.id
+                  this.operateType = 'examine'
+                  this.operateTitle = '审核修改'
+                  this.operateVisible = true
+                }}
+              >
+                审核修改
+              </el-button>
+            ) : null}
+          </div>
+        )
+      }
+    },
+    handleClose() {
+      this.getCurrentRoute('OK')
+
+      this.addOff(() => {
+        this.content = '新增'
+        this.module = 'add'
+        this.operateVisible = false
+        this.operateTitle = null
+        this.operateType = null
+        this.detailId = ''
+        this.visible = false
+        this.$refs.pageRef.refreshList()
+      })()
+    },
+    getCurrentRoute(back) {
+      const { detailId, module } = this.$route.query
+      if (back === 'OK' && module === 'detail') {
+        this.$router.replace('/commercialEngineering/frockList')
+        return
+      }
+      if (detailId && module === 'detail') {
+        this.content = '详情'
+        this.detailId = detailId
+        this.module = module
+        this.visible = true
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 44 - 0
src/views/commercialEngineering/crossDistrict/detail.vue

@@ -0,0 +1,44 @@
+<template>
+  <div>
+    <el-radio-group v-model="current" size="mini">
+      <el-radio-button class="my-width" label="detail">详情</el-radio-button>
+      <el-radio-button class="my-width" label="record">操作记录</el-radio-button>
+    </el-radio-group>
+    <el-form v-show="current === 'detail'" disabled>
+      <Base :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+      <Model :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+      <Examine v-if="formData.confirmBy && formData.confirmTime" :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+    </el-form>
+    <OperationRecords v-show="current === 'record'" :detail-id="detailId" />
+
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Examine from '../components/examine.vue'
+import OperationRecords from '../components/operationRecords.vue'
+
+import Mixin from '../mixin'
+export default {
+  components: {
+    Base,
+    Model,
+    Examine,
+    OperationRecords
+  },
+  mixins: [Mixin],
+  data() {
+    return {
+      current: 'detail'
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.my-width ::v-deep .el-radio-button__inner {
+  width: 100px;
+}
+</style>

+ 110 - 0
src/views/commercialEngineering/crossDistrict/examine.vue

@@ -0,0 +1,110 @@
+<template>
+  <div>
+    <el-radio-group v-model="current" size="mini">
+      <el-radio-button class="my-width" label="detail">审核</el-radio-button>
+      <el-radio-button class="my-width" label="record">操作记录</el-radio-button>
+    </el-radio-group>
+    <div v-show="current === 'detail'">
+      <el-form disabled>
+        <Base :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+        <Model :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+      </el-form>
+      <Examine :form-data="formData" page-type="cross" :module="module" :common-data="commonData" />
+      <div style="margin: 20px 0">
+        <el-button type="primary" size="small" @click="onSbumit">提交</el-button>
+        <el-button size="small" @click="handleBack">返回</el-button>
+      </div>
+    </div>
+    <OperationRecords v-show="current === 'record'" :detail-id="detailId" />
+
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Examine from '../components/examine.vue'
+import Mixin from '../mixin'
+import { examineLoginHomeDecoration } from '@/api/crossDistrict'
+import OperationRecords from '../components/operationRecords.vue'
+
+export default {
+  components: {
+    Base,
+    Model,
+    Examine,
+    OperationRecords
+  },
+  mixins: [Mixin],
+  data() {
+    return {
+      current: 'detail'
+    }
+  },
+  methods: {
+    onSbumit(type) {
+      const params = {
+        ...this.formData,
+        isSpan: true
+
+      }
+      if (this.formData.files.length) {
+        params.files = this.formData.files.map(k => {
+          return {
+            ...k,
+            fileName: k.name,
+            fileUrl: k.url
+          }
+        })
+      }
+      if (params.loginStatus === 'FAIL' && !params.projectNo) {
+        this.$errorMsg('请填写项目编号')
+        return
+      }
+
+      if (params.loginStatus === 'REJECT' && !params.examineNote && !params.note) {
+        this.$errorMsg('请填写审核备注')
+        return
+      }
+      if (params.loginStatus === 'FAIL' && params.projectNo === params.successLoginProject) {
+        this.$errorMsg('项目编号不能审核项目编号')
+        return
+      }
+      if (params.orderType === 'HOME' && params.orderType === 'HOME' && params.homeProjectNameRadio) {
+        params.projectName = {
+          'AREA': params.homeProjectNameArea + '小区' + params.homeProjectNameSeat + '座' + params.homeProjectNameNumber + '号',
+          'SELF': params.homeProjectNameArea2 + '(业主名称)自建房',
+          'VILLA': params.homeProjectNameArea3 + '小区' + params.homeProjectNameNumber3 + '号'
+        }[params.homeProjectNameRadio]
+      }
+      if (params.homeProjectNameRadio === 'SELF') {
+        params.homeProjectNameArea = params.homeProjectNameArea2
+      }
+      if (params.homeProjectNameRadio === 'VILLA') {
+        params.homeProjectNameNumber = params.homeProjectNameNumber3
+        params.homeProjectNameArea = params.homeProjectNameArea3
+      }
+      if (params.fileList.length) {
+        params.drawUpload = params.fileList[0].url
+      }
+
+      examineLoginHomeDecoration(params).then(res => {
+        this.commonFn('审核成功')
+      })
+    },
+    commonFn(name) {
+      this.$successMsg(name)
+      this.handleBack()
+    },
+    handleBack() {
+      this.$emit('updateList')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.my-width ::v-deep .el-radio-button__inner {
+  width: 100px;
+}
+</style>

+ 42 - 0
src/views/commercialEngineering/frock/detail.vue

@@ -0,0 +1,42 @@
+<template>
+  <div>
+    <el-radio-group v-model="current" size="mini">
+      <el-radio-button class="my-width" label="detail">详情</el-radio-button>
+      <el-radio-button class="my-width" label="record">操作记录</el-radio-button>
+    </el-radio-group>
+    <el-form v-show="current === 'detail'" disabled>
+      <Base :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+      <Model :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+      <Examine v-if=" formData.confirmBy && formData.confirmTime" :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+    </el-form>
+    <OperationRecords v-show="current === 'record'" :detail-id="detailId" />
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Examine from '../components/examine.vue'
+import OperationRecords from '../components/operationRecords.vue'
+import Mixin from '../mixin'
+export default {
+  components: {
+    Base,
+    Model,
+    Examine,
+    OperationRecords
+  },
+  mixins: [Mixin],
+  data() {
+    return {
+      current: 'detail'
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.my-width ::v-deep .el-radio-button__inner {
+  width: 100px;
+}
+</style>

+ 90 - 0
src/views/commercialEngineering/frock/examine.vue

@@ -0,0 +1,90 @@
+<template>
+  <div>
+    <el-radio-group v-model="current" size="mini">
+      <el-radio-button class="my-width" label="detail">审核</el-radio-button>
+      <el-radio-button class="my-width" label="record">操作记录</el-radio-button>
+    </el-radio-group>
+    <div v-show="current === 'detail'">
+      <el-form disabled>
+        <Base :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+        <Model :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+      </el-form>
+      <Examine :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+      <div style="margin: 20px 0">
+        <el-button type="primary" size="small" @click="onSbumit">提交</el-button>
+        <el-button size="small" @click="handleBack">返回</el-button>
+      </div>
+    </div>
+    <OperationRecords v-show="current === 'record'" :detail-id="detailId" />
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Examine from '../components/examine.vue'
+import Mixin from '../mixin'
+import { examineLoginFrock } from '@/api/frock'
+import OperationRecords from '../components/operationRecords.vue'
+
+export default {
+  components: {
+    Base,
+    Model,
+    Examine,
+    OperationRecords
+  },
+  mixins: [Mixin],
+  data() {
+    return {
+      current: 'detail'
+    }
+  },
+  methods: {
+    onSbumit() {
+      const params = {
+        ...this.formData
+      }
+      if (this.formData.files.length) {
+        params.files = this.formData.files.map(k => {
+          return {
+            ...k,
+            fileName: k.name,
+            fileUrl: k.url
+          }
+        })
+      }
+      if (params.loginStatus === 'FAIL' && !params.projectNo) {
+        this.$errorMsg('请填写项目编号')
+        return
+      }
+
+      if (params.loginStatus === 'REJECT' && !params.examineNote) {
+        this.$errorMsg('请填写审核备注')
+        return
+      }
+      if (params.loginStatus === 'FAIL' && params.projectNo === params.successLoginProject) {
+        this.$errorMsg('项目编号不能审核项目编号')
+        return
+      }
+
+      examineLoginFrock(params).then(res => {
+        this.commonFn('审核成功')
+      })
+    },
+    commonFn(name) {
+      this.$successMsg(name)
+      this.handleBack()
+    },
+    handleBack() {
+      this.$emit('updateList')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.my-width ::v-deep .el-radio-button__inner {
+  width: 100px;
+}
+</style>

+ 57 - 0
src/views/commercialEngineering/frock/frockForm.vue

@@ -0,0 +1,57 @@
+<template>
+  <div>
+    <Base :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+    <Model :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+    <div style="margin: 20px 0">
+      <el-button type="primary" size="small" @click="onSbumit(1)">提交</el-button>
+      <el-button type="primary" size="small" @click="onSbumit(2)">暂存-草稿箱</el-button>
+      <el-button size="small" @click="onReset">重置</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Mixin from '../mixin'
+import { addLoginFrock, editLoginFrock, submitLoginFrock } from '@/api/frock'
+export default {
+  components: {
+    Base,
+    Model
+  },
+  mixins: [Mixin],
+  methods: {
+    onSbumit(type) {
+      const params = {
+        ...this.formData
+      }
+      if (params.fileList.length) {
+        params.drawUpload = params.fileList[0].url
+      }
+
+      if (type === 1) {
+        submitLoginFrock(params).then(res => {
+          this.commonFn('提交成功')
+        })
+      } else {
+        if (!this.detailId) {
+          addLoginFrock(params).then(res => {
+            this.commonFn('新增成功')
+          })
+          return
+        }
+        editLoginFrock(params).then(res => {
+          this.commonFn('编辑成功')
+        })
+      }
+    },
+    commonFn(name) {
+      this.$successMsg(name)
+      this.$emit('updateList')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 312 - 0
src/views/commercialEngineering/frock/frockList.vue

@@ -0,0 +1,312 @@
+<template>
+  <template-page
+    ref="pageRef"
+    :get-list="getList"
+    :export-list="exportList"
+    :pofx="true"
+    :operation="operation()"
+    :column-parsing="columnParsing"
+    :operation-column-width="160"
+    :options-evens-group="optionsEvensGroup"
+    :table-attributes="tableAttributes"
+    :table-events="tableEvents"
+    :replace-or-not-map="false"
+    :ellipsis="false"
+  >
+    <Popu v-if="visible">
+      <el-page-header slot="head" :content="content" @back="handleClose" />
+      <FrockForm
+        v-if="['add', 'edit','apply'].includes(module)"
+        :detail-id="detailId"
+        :module="module"
+        @updateList="handleClose"
+      />
+      <Detail v-if="['detail'].includes(module)" :detail-id="detailId" :module="module" @updateList="handleClose" />
+      <Examine v-if="['examine'].includes(module)" :detail-id="detailId" :module="module" @updateList="handleClose" />
+    </Popu>
+    <Operate v-if="operateVisible" :operate-visible="operateVisible" :operate-type="operateType" :operate-title="operateTitle" :detail-id="detailId" :record-selected="recordSelected" @close="handleClose" />
+  </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 FrockForm from './frockForm.vue'
+import Detail from './detail.vue'
+import Examine from './examine.vue'
+import Operate from '../components/operate.vue'
+import { getLoginFrockList, exportLoginFrock } from '@/api/frock'
+import { mapGetters } from 'vuex'
+export default {
+  components: { TemplatePage, Popu, FrockForm, Detail, Examine, Operate },
+  mixins: [import_mixin, add_callback_mixin],
+  data() {
+    return {
+      visible: false,
+
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      }, // 关闭新增弹窗
+
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: [],
+      content: '新增',
+      detailId: '',
+      module: 'add',
+      operateVisible: false,
+      operateType: null,
+      operateTitle: null
+    }
+  },
+  computed: {
+    ...mapGetters(['isTradeExaminer']),
+    optionsEvensGroup() {
+      return [
+        [
+          [
+            {
+              name: '添加记录',
+              click: this.addOn(() => {
+                this.visible = true
+              })
+            }
+          ]
+        ],
+        ...(() => {
+          console.log(this.isTradeExaminer, 9999)
+          return this.isTradeExaminer
+            ? [
+              [
+                [
+                  {
+                    name: '更新',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要更新的数据')
+                        return
+                      }
+
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (!(this.recordSelected[index].orderStatus == '已审核' && this.recordSelected[index].status == '跟进中')) {
+                          this.$message.error('请选择审核通过并且跟进中的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'update'
+                      this.operateTitle = '更新'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ],
+              [
+                [
+                  {
+                    name: '替换业务员',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要替换业务员的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (this.recordSelected[index].orderStatus !== '已审核') {
+                          this.$message.error('请选择审核通过的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'replace'
+                      this.operateTitle = '替换业务员'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ],
+              [
+                [
+                  {
+                    name: '删除',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要删除的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (this.recordSelected[index].orderStatus !== '已审核') {
+                          this.$message.error('请选择审核通过的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'delete'
+                      this.operateTitle = '删除'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ]
+            ]
+            : []
+        })()
+      ]
+    }
+  },
+  created() {
+    this.getCurrentRoute()
+  },
+  methods: {
+    // 列表请求函数
+    getList(...p) {
+      this.recordSelected = []
+      return getLoginFrockList(...p)
+    },
+    // 列表导出函数
+    exportList: exportLoginFrock,
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      if (item.colName === 'project_no') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (<el-link type='primary' underline={false} onClick={() => {
+            const page = this.$router.resolve({
+              path: '/commercialEngineering/frockList',
+              query: {
+                detailId: row.id,
+                module: 'detail'
+              }
+            })
+            window.open(page.href, '_blank')
+          }}>{row.projectNo}</el-link>)
+        }
+      }
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+      console.log(data)
+    },
+    operation() {
+      return (h, { row, index, column }) => {
+        return (
+          <div class='operation-btns'>
+            {this.isTradeExaminer && (row.orderStatus === 'WAIT' || row.orderStatus === 'OK' || row.orderStatus === 'FAIL') ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.content = '审核'
+                  this.module = 'examine'
+                  this.detailId = row.id
+                  this.visible = true
+                }}
+              >
+                审核
+              </el-button>
+            ) : null}
+            {/* {
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.content = '详情'
+                  this.module = 'detail'
+                  this.detailId = row.id
+                  this.visible = true
+                }}
+              >
+              详情
+              </el-button>
+            } */}
+
+            {(row.orderStatus === 'SAVE' || row.orderStatus === 'RETURN')
+              ? <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.content = '编辑'
+                  this.module = 'edit'
+                  this.detailId = row.id
+                  this.visible = true
+                }}
+              >
+              编辑
+              </el-button> : null
+            }
+            {row.orderStatus === 'OK' && row.status === 'ING'
+              ? <el-button size='mini' type='text' onClick={() => {
+                this.operateType = 'update'
+                this.operateTitle = '更新'
+                this.recordSelected = [row]
+                this.operateVisible = true
+              }}>
+              更新
+              </el-button> : null
+            }
+            {!this.isTradeExaminer && ((row.orderStatus === 'OK') && row.status === 'ING' && !row.isApplyUpdate) ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.detailId = row.id
+                  this.operateType = 'apply'
+                  this.operateTitle = '申请修改'
+                  this.operateVisible = true
+                }}
+              >
+                申请修改
+              </el-button>
+            ) : null}
+            {this.isTradeExaminer && ((row.orderStatus === 'OK' || row.orderStatus === 'FAIL') && row.isApplyUpdate) ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.detailId = row.id
+                  this.operateType = 'examine'
+                  this.operateTitle = '审核修改'
+                  this.operateVisible = true
+                }}
+              >
+                审核修改
+              </el-button>
+            ) : null}
+          </div>
+        )
+      }
+    },
+    handleClose() {
+      this.getCurrentRoute('OK')
+      this.addOff(() => {
+        this.content = '新增'
+        this.module = 'add'
+        this.detailId = ''
+        this.operateVisible = false
+        this.operateTitle = null
+        this.operateType = null
+        this.visible = false
+        this.$refs.pageRef.refreshList()
+      })()
+    },
+    getCurrentRoute(back) {
+      const { detailId, module } = this.$route.query
+      if (back === 'OK' && module === 'detail') {
+        this.$router.replace('/commercialEngineering/frockList')
+        return
+      }
+      if (detailId && module === 'detail') {
+        this.content = '详情'
+        this.detailId = detailId
+        this.module = module
+        this.visible = true
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 42 - 0
src/views/commercialEngineering/homeDecoration/detail.vue

@@ -0,0 +1,42 @@
+<template>
+  <div>
+    <el-radio-group v-model="current" size="mini">
+      <el-radio-button class="my-width" label="detail">详情</el-radio-button>
+      <el-radio-button class="my-width" label="record">操作记录</el-radio-button>
+    </el-radio-group>
+    <el-form v-show="current === 'detail'" disabled>
+      <Base :form-data="formData" page-type="home" :module="module" :common-data="commonData" />
+      <Model :form-data="formData" page-type="home" :module="module" :common-data="commonData" />
+      <Examine v-if="formData.confirmBy && formData.confirmTime" :form-data="formData" page-type="home" :module="module" :common-data="commonData" />
+    </el-form>
+    <OperationRecords v-show="current === 'record'" :detail-id="detailId" />
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Examine from '../components/examine.vue'
+import OperationRecords from '../components/operationRecords.vue'
+import Mixin from '../mixin'
+export default {
+  components: {
+    Base,
+    Model,
+    Examine,
+    OperationRecords
+  },
+  mixins: [Mixin],
+  data() {
+    return {
+      current: 'detail'
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.my-width ::v-deep .el-radio-button__inner {
+  width: 100px;
+}
+</style>

+ 113 - 0
src/views/commercialEngineering/homeDecoration/examine.vue

@@ -0,0 +1,113 @@
+<template>
+  <div>
+    <el-radio-group v-model="current" size="mini">
+      <el-radio-button class="my-width" label="detail">审核</el-radio-button>
+      <el-radio-button class="my-width" label="record">操作记录</el-radio-button>
+    </el-radio-group>
+    <div v-show="current === 'detail'">
+      <el-form disabled>
+        <Base :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+        <Model :form-data="formData" page-type="frock" :module="module" :common-data="commonData" />
+      </el-form>
+      <Examine :form-data="formData" page-type="home" :module="module" :common-data="commonData" />
+      <div style="margin: 20px 0">
+        <el-button type="primary" size="small" @click="onSbumit">提交</el-button>
+        <el-button size="small" @click="handleBack">返回</el-button>
+      </div>
+    </div>
+    <OperationRecords v-show="current === 'record'" :detail-id="detailId" />
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Examine from '../components/examine.vue'
+
+import Mixin from '../mixin'
+import { examineLoginHomeDecoration } from '@/api/homeDecoration'
+import OperationRecords from '../components/operationRecords.vue'
+
+export default {
+  components: {
+    Base,
+    Model,
+    Examine,
+    OperationRecords
+  },
+  mixins: [Mixin],
+  data() {
+    return {
+      current: 'detail'
+    }
+  },
+  methods: {
+    onSbumit(type) {
+      const params = {
+        ...this.formData
+      }
+      if (this.formData.files.length) {
+        params.files = this.formData.files.map(k => {
+          return {
+            ...k,
+            fileName: k.name,
+            fileUrl: k.url
+          }
+        })
+      }
+      if (params.loginStatus === 'FAIL' && !params.projectNo) {
+        this.$errorMsg('请填写项目编号')
+        return
+      }
+
+      if (params.loginStatus === 'REJECT' && !params.examineNote) {
+        this.$errorMsg('请填写审核备注')
+        return
+      }
+      if (params.loginStatus === 'FAIL' && params.projectNo === params.successLoginProject) {
+        this.$errorMsg('项目编号不能审核项目编号')
+        return
+      }
+      if (params.orderType === 'HOME' && params.homeProjectNameRadio) {
+        params.projectName = {
+          AREA:
+            params.homeProjectNameArea +
+            '小区' +
+            params.homeProjectNameSeat +
+            '座' +
+            params.homeProjectNameNumber +
+            '号',
+          SELF: params.homeProjectNameArea2 + '(业主名称)自建房',
+          VILLA: params.homeProjectNameArea3 + '小区' + params.homeProjectNameNumber3 + '号'
+        }[params.homeProjectNameRadio]
+      }
+      if (params.homeProjectNameRadio === 'SELF') {
+        params.homeProjectNameArea = params.homeProjectNameArea2
+      }
+      if (params.homeProjectNameRadio === 'VILLA') {
+        params.homeProjectNameNumber = params.homeProjectNameNumber3
+        params.homeProjectNameArea = params.homeProjectNameArea3
+      }
+      if (params.fileList.length) {
+        params.drawUpload = params.fileList[0].url
+      }
+
+      examineLoginHomeDecoration(params).then(res => {
+        this.commonFn('审核成功')
+      })
+    },
+    commonFn(name) {
+      this.$successMsg(name)
+      this.$emit('updateList')
+    },
+    handleBack() {
+      this.$emit('updateList')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.my-width ::v-deep .el-radio-button__inner {
+  width: 100px;
+}</style>

+ 72 - 0
src/views/commercialEngineering/homeDecoration/homeDecorationForm.vue

@@ -0,0 +1,72 @@
+<template>
+  <div>
+    <Base :form-data="formData" page-type="home" :module="module" :common-data="commonData" />
+    <Model :form-data="formData" page-type="home" :module="module" :common-data="commonData" />
+    <div style="margin: 20px 0">
+      <el-button type="primary" size="small" @click="onSbumit(1)">提交</el-button>
+      <el-button type="primary" size="small" @click="onSbumit(2)">暂存-草稿箱</el-button>
+      <el-button size="small" @click="onReset">重置</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import Base from '../components/base.vue'
+import Model from '../components/model.vue'
+import Mixin from '../mixin'
+import { addLoginHomeDecoration, editLoginHomeDecoration, submitLoginHomeDecoration } from '@/api/homeDecoration'
+export default {
+  components: {
+    Base,
+    Model
+  },
+  mixins: [Mixin],
+  methods: {
+    onSbumit(type) {
+      const params = {
+        ...this.formData,
+        orderType: 'HOME'
+      }
+      if (params.orderType === 'HOME' && params.homeProjectNameRadio) {
+        params.projectName = {
+          'AREA': params.homeProjectNameArea + '小区' + params.homeProjectNameSeat + '座' + params.homeProjectNameNumber + '号',
+          'SELF': params.homeProjectNameArea2 + '(业主名称)自建房',
+          'VILLA': params.homeProjectNameArea3 + '小区' + params.homeProjectNameNumber3 + '号'
+        }[params.homeProjectNameRadio]
+      }
+      if (params.homeProjectNameRadio === 'SELF') {
+        params.homeProjectNameArea = params.homeProjectNameArea2
+      }
+      if (params.homeProjectNameRadio === 'VILLA') {
+        params.homeProjectNameNumber = params.homeProjectNameNumber3
+        params.homeProjectNameArea = params.homeProjectNameArea3
+      }
+      if (params.fileList.length) {
+        params.drawUpload = params.fileList[0].url
+      }
+
+      if (type === 1) {
+        submitLoginHomeDecoration(params).then(res => {
+          this.commonFn('提交成功')
+        })
+      } else {
+        if (!this.detailId) {
+          addLoginHomeDecoration(params).then(res => {
+            this.commonFn('新增成功')
+          })
+          return
+        }
+        editLoginHomeDecoration(params).then(res => {
+          this.commonFn('编辑成功')
+        })
+      }
+    },
+    commonFn(name) {
+      this.$successMsg(name)
+      this.$emit('updateList')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 317 - 0
src/views/commercialEngineering/homeDecoration/homeDecorationList.vue

@@ -0,0 +1,317 @@
+<template>
+  <template-page
+    ref="pageRef"
+    :get-list="getList"
+    :export-list="exportList"
+    :pofx="true"
+    :operation="operation()"
+    :column-parsing="columnParsing"
+    :operation-column-width="160"
+    :options-evens-group="optionsEvensGroup"
+    :table-attributes="tableAttributes"
+    :table-events="tableEvents"
+    :replace-or-not-map="false"
+    :ellipsis="false"
+  >
+    <Popu v-if="visible">
+      <el-page-header slot="head" :content="content" @back="handleClose" />
+      <HomeDecorationForm
+        v-if="['add', 'edit', 'apply'].includes(module)"
+        :detail-id="detailId"
+        :module="module"
+        @updateList="handleClose"
+      />
+      <Detail v-if="['detail'].includes(module)" :detail-id="detailId" :module="module" @updateList="handleClose" />
+      <Examine v-if="['examine'].includes(module)" :detail-id="detailId" :module="module" @updateList="handleClose" />
+    </Popu>
+    <Operate
+      v-if="operateVisible"
+      :operate-visible="operateVisible"
+      :operate-type="operateType"
+      :operate-title="operateTitle"
+      :detail-id="detailId"
+      :record-selected="recordSelected"
+      @close="handleClose"
+    />
+  </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 HomeDecorationForm from './homeDecorationForm.vue'
+import Detail from './detail.vue'
+import Examine from './examine.vue'
+import Operate from '../components/operate.vue'
+import { getLoginHomeDecorationList, exportLoginHomeDecoration } from '@/api/homeDecoration'
+import { mapGetters } from 'vuex'
+
+export default {
+  components: { TemplatePage, Popu, HomeDecorationForm, Detail, Examine, Operate },
+  mixins: [import_mixin, add_callback_mixin],
+  data() {
+    return {
+      visible: false,
+      // 事件组合
+
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      }, // 关闭新增弹窗
+
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: [],
+      content: '新增',
+      module: 'add',
+      detailId: '',
+      operateVisible: false,
+      operateType: null,
+      operateTitle: null
+    }
+  },
+  computed: {
+    ...mapGetters(['isTradeExaminer']),
+    optionsEvensGroup() {
+      return [
+        [
+          [
+            {
+              name: '添加记录',
+              click: this.addOn(() => {
+                this.visible = true
+              })
+            }
+          ]
+        ],
+        ...(() => {
+          console.log(this.isTradeExaminer, 9999)
+          return this.isTradeExaminer
+            ? [
+              [
+                [
+                  {
+                    name: '更新',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要更新的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (!(this.recordSelected[index].orderStatus == '已审核' && this.recordSelected[index].status == '跟进中')) {
+                          this.$message.error('请选择审核通过并且跟进中的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'update'
+                      this.operateTitle = '更新'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ],
+              [
+                [
+                  {
+                    name: '替换业务员',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要替换业务员的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (this.recordSelected[index].orderStatus !== '已审核') {
+                          this.$message.error('请选择审核通过的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'replace'
+                      this.operateTitle = '替换业务员'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ],
+              [
+                [
+                  {
+                    name: '删除',
+                    click: () => {
+                      if (this.recordSelected.length === 0) {
+                        this.$message.error('请选择需要删除的数据')
+                        return
+                      }
+                      for (let index = 0; index < this.recordSelected.length; index++) {
+                        if (this.recordSelected[index].orderStatus !== '已审核') {
+                          this.$message.error('请选择审核通过的数据')
+                          return
+                        }
+                      }
+                      this.operateType = 'delete'
+                      this.operateTitle = '删除'
+                      this.operateVisible = true
+                    }
+                  }
+                ]
+              ]
+            ]
+            : []
+        })()
+      ]
+    }
+  },
+  created() {
+    this.getCurrentRoute()
+  },
+  methods: {
+    // 列表请求函数
+    getList(...p) {
+      this.recordSelected = []
+      return getLoginHomeDecorationList(...p)
+    },
+    // 列表导出函数
+    exportList: exportLoginHomeDecoration,
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      if (item.colName === 'project_no') {
+        defaultData.render = (h, { row, index, column }) => {
+          return (<el-link type='primary' underline={false} onClick={() => {
+            const page = this.$router.resolve({
+              path: '/commercialEngineering/homeDecorationList',
+              query: {
+                detailId: row.id,
+                module: 'detail'
+              }
+            })
+            window.open(page.href, '_blank')
+          }}>{row.projectNo}</el-link>)
+        }
+      }
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    operation() {
+      return (h, { row, index, column }) => {
+        return (
+          <div class='operation-btns'>
+            {this.isTradeExaminer && (row.orderStatus === 'WAIT' || row.orderStatus === 'OK' || row.orderStatus === 'FAIL') ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.content = '审核'
+                  this.module = 'examine'
+                  this.detailId = row.id
+                  this.visible = true
+                }}
+              >
+                审核
+              </el-button>
+            ) : null}
+            {/* <el-button
+              size='mini'
+              type='text'
+              onClick={() => {
+                this.content = '详情'
+                this.module = 'detail'
+                this.detailId = row.id
+                this.visible = true
+              }}
+            >
+              详情
+            </el-button> */}
+            {(row.orderStatus === 'SAVE' || row.orderStatus === 'RETURN')
+              ? <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.content = '编辑'
+                  this.module = 'edit'
+                  this.detailId = row.id
+                  this.visible = true
+                }}
+              >
+              编辑
+              </el-button> : null
+            }
+            {row.orderStatus === 'OK' && row.status === 'ING'
+              ? <el-button size='mini' type='text' onClick={() => {
+                this.operateType = 'update'
+                this.operateTitle = '更新'
+                this.recordSelected = [row]
+                this.operateVisible = true
+              }}>
+              更新
+              </el-button> : null
+            }
+            {!this.isTradeExaminer && ((row.orderStatus === 'OK') && row.status === 'ING' && !row.isApplyUpdate) ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.detailId = row.id
+                  this.operateType = 'apply'
+                  this.operateTitle = '申请修改'
+                  this.operateVisible = true
+                }}
+              >
+                申请修改
+              </el-button>
+            ) : null}
+            {this.isTradeExaminer && ((row.orderStatus === 'OK' || row.orderStatus === 'FAIL') && row.isApplyUpdate) ? (
+              <el-button
+                size='mini'
+                type='text'
+                onClick={() => {
+                  this.detailId = row.id
+                  this.operateType = 'examine'
+                  this.operateTitle = '审核修改'
+                  this.operateVisible = true
+                }}
+              >
+                审核修改
+              </el-button>
+            ) : null}
+          </div>
+        )
+      }
+    },
+    handleClose() {
+      this.getCurrentRoute('OK')
+      this.addOff(() => {
+        this.content = '新增'
+        this.module = 'add'
+        this.detailId = ''
+        this.operateVisible = false
+        this.operateTitle = null
+        this.operateType = null
+        this.visible = false
+        this.$refs.pageRef.refreshList()
+      })()
+    },
+    getCurrentRoute(back) {
+      const { detailId, module } = this.$route.query
+      if (back === 'OK' && module === 'detail') {
+        this.$router.replace('/commercialEngineering/frockList')
+        return
+      }
+      if (detailId && module === 'detail') {
+        this.content = '详情'
+        this.detailId = detailId
+        this.module = module
+        this.visible = true
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 231 - 0
src/views/commercialEngineering/mixin/index.js

@@ -0,0 +1,231 @@
+import { getCommercialEngineeringDetail, getPositionProject } from '@/api/frock'
+import { getDictList, getSalesmanList } from '@/api/common'
+import { getDealerListV2 } from '@/api/basic_data/dealer'
+import { getFirstPartyCustomerManagementList } from '@/api/basic_data/partya'
+import { mapGetters } from 'vuex'
+export default {
+  props: {
+    detailId: {
+      type: String,
+      default: ''
+    },
+    module: {
+      type: String,
+      default: 'add'
+    }
+  },
+  data() {
+    return {
+      resetData: {},
+      formData: {
+        address: '',
+        adminCompanyId: '',
+        adminUserId: '',
+        adminWebsitId: '',
+        applyUpdateBy: '',
+        applyUpdateCompanyId: '',
+        applyUpdateCompanyName: '',
+        applyUpdateName: '',
+        areaId: '',
+        area: '',
+        cityId: '',
+        city: '',
+        commonFollowProject: '',
+        confirmBy: '',
+        confirmName: '',
+        confirmTime: '',
+        customerAddress: '',
+        customerId: '',
+        customerLinkMobile: '',
+        customerLinkName: '',
+        customerName: '',
+        customerNumber: '',
+        del: null,
+        drawUpload: '',
+        enginLinkMobile: '',
+        enginLinkName: '',
+        examineNote: '',
+        tradeName: '',
+        tradeParentName: '',
+        extent: '',
+        files: [],
+        followCustomer: '',
+        followCustomerMobile: '',
+        homeProjectNameArea: '',
+        homeProjectNameArea2: '',
+        homeProjectNameArea3: '',
+        homeProjectNameNumber3: '',
+        homeProjectNameNumber: '',
+        homeProjectNameRadio: '',
+        homeProjectNameSeat: '',
+        id: '',
+        isApplyUpdate: null,
+        isSpan: null,
+        items: [],
+        lat: '',
+        lnt: '',
+        loginStatus: 'OK',
+        machineType: '',
+        note: '',
+        orderStatus: '',
+        orderType: 'WORK',
+        otherInfo: '',
+        partyA: '',
+        partyAId: '',
+        positionAddress: '',
+        preDeviceAmount: null,
+        preSignDate: '',
+        projectArea: '',
+        projectCategory: 'COMMON',
+        projectMent: '',
+        projectName: '',
+        projectNo: '',
+        provinceId: '',
+        province: '',
+        refCustomerId: '',
+        remark: '',
+        salesCompanyName: '韶关弘格贸易有限公司',
+        serviceId: '',
+        serviceName: '',
+        status: 'ING',
+        streetId: '',
+        street: '',
+        submitBy: '',
+        submitName: '',
+        submitTime: '',
+        successLoginProject: '',
+        successRate: 'FIRST',
+        tradeId: '',
+        tradeParentId: '',
+        type: 'DRAW',
+        useExtent: '',
+        fileList: [],
+        serviceNumber2: '',
+        serviceName2: '',
+        customerNumber2: '',
+        customerName2: ''
+      },
+      commonData: {
+        dict: {
+          TRADE_LOGIN_CATEGORY: [], // 项目类别
+          TRADE_LOGIN_TYPE: [], // 类型
+          SUCCESS_RATE: [], // 成功机率
+          FOLLOW_STATUS: [], // 工程跟进状态
+          MACHINE_TYPE: [], // 机组类型
+          TRADE_EXAMINE_NOTE: [], // 审核备注
+          TRADE_PROJECT_AREA: [] // 项目所在区域
+        },
+        salesmanList: [],
+        customerList: [],
+        PartyAList: [],
+        vicinityMarkers: []
+      }
+    }
+  },
+  computed: {
+    ...mapGetters(['isTradeExaminer'])
+  },
+  created() {
+    this.resetData = {
+      ...this.formData
+    }
+    this.getDictList()
+    this.getDealerListV2()
+    this.getSalesmanList()
+    this.getFirstPartyCustomerManagementList()
+    if (this.detailId) {
+      this.getCommercialEngineeringDetail()
+    }
+  },
+  methods: {
+    getDictList() {
+      Object.keys(this.commonData.dict).forEach(async k => {
+        const { data } = await getDictList({ sysDictEnum: k })
+        this.commonData.dict[k] = data.map(l => {
+          return {
+            label: l.dictValue,
+            value: l.dictCode
+          }
+        })
+      })
+    },
+    getSalesmanList() {
+      getSalesmanList({
+        pageNum: 1,
+        pageSize: -1,
+        isCustomer: 0,
+        status: true
+      }).then(res => {
+        this.commonData.salesmanList = res.data.records.map(k => {
+          return {
+            label: k.nickName,
+            value: k.adminUserId,
+            userName: k.userName
+          }
+        })
+      })
+    },
+    getFirstPartyCustomerManagementList() {
+      getFirstPartyCustomerManagementList({ pageNum: 1, pageSize: -1 }).then(res => {
+        this.commonData.PartyAList = res.data.records.map(k => {
+          return {
+            label: k.name,
+            value: k.id
+          }
+        })
+      })
+    },
+    getDealerListV2() {
+      getDealerListV2({
+        pageNum: 1,
+        pageSize: -1,
+        params: [
+          {
+            param: 'a.jiaxian_type',
+            compare: '=',
+            value: 'KING'
+          }
+        ]
+      }).then(res => {
+        this.commonData.customerList = res.data.records.map(k => {
+          return {
+            number: k.number,
+            label: k.name,
+            value: k.id
+          }
+        })
+      })
+    },
+    getCommercialEngineeringDetail() {
+      getCommercialEngineeringDetail({ id: this.detailId }).then(res => {
+        this.formData = {
+          ...this.formData,
+          ...res.data,
+          fileList: []
+        }
+        if (res.data.drawUpload) {
+          this.formData.fileList = [
+            {
+              name: '图纸文件.xlsx',
+              status: 'success',
+              url: res.data.drawUpload,
+              uid: '111'
+            }
+          ]
+        }
+      })
+    },
+    getPositionProject() {
+      getPositionProject({ id: this.detailId }).then(res => {
+        this.commonData.vicinityMarkers = res.data
+      })
+    },
+    onReset() {
+      this.formData = {
+        ...this.resetData,
+        id: this.detailId
+      }
+    }
+
+  }
+}

+ 70 - 0
src/views/commercialEngineering/summaryTable/summaryTableList.vue

@@ -0,0 +1,70 @@
+<template>
+  <template-page
+    ref="pageRef"
+    :get-list="getList"
+    :export-list="exportList"
+    :column-parsing="columnParsing"
+  >
+    <Popu v-if="visible" />
+  </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 { getLoginList, exportLogin } from '@/api/summaryTable'
+export default {
+  components: { TemplatePage, Popu },
+  mixins: [import_mixin, add_callback_mixin],
+  data() {
+    return {
+      visible: false,
+      // 事件组合
+      optionsEvensGroup: [
+      ],
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      }, // 关闭新增弹窗
+
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: []
+    }
+  },
+  methods: {
+    // 列表请求函数
+    getList(...p) {
+      this.recordSelected = []
+      return getLoginList(...p)
+    },
+    // 列表导出函数
+    exportList: exportLogin,
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    operation() {
+      return (h, { row, index, column }) => {
+        return <div class='operation-btns'></div>
+      }
+    },
+    handleClose() {
+      this.addOff(() => {
+        this.visible = false
+      })()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 120 - 0
src/views/dataAnalysis/dataAnalysisList.vue

@@ -0,0 +1,120 @@
+<template>
+  <!-- 数据分析 -->
+  <template-page
+    ref="pageRef"
+    :get-list="getList"
+    :export-list="exportList"
+    :options-evens-group="optionsEvensGroup"
+    :column-parsing="columnParsing"
+  />
+</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 {
+  getDataList,
+  exportDataList
+} from '@/api/dataAnalysis'
+
+export default {
+  components: { TemplatePage },
+  mixins: [import_mixin, add_callback_mixin],
+  data() {
+    return {
+      visible: false,
+      // 事件组合
+      optionsEvensGroup: [
+        [
+          [
+            {
+              name: '是否更新',
+              click: () => {
+                this.$alert(!this.valve ? '是否开启更新?' : '是否关闭更新?', '提示', {
+                  confirmButtonText: '确定',
+                  callback: (e) => {
+                    if (e === 'confirm') {
+                      this.valve = !this.valve
+                      if (this.valve) {
+                        this.timer = setInterval(() => {
+                          this.$refs.pageRef.refreshList()
+                        }, 5000)
+                      } else {
+                        clearInterval(this.timer)
+                        this.timer = null
+                      }
+                    }
+                  }
+                })
+              }
+            }
+          ]
+        ]
+      ],
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      }, // 关闭新增弹窗
+
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      recordSelected: [],
+
+      detailsId: '',
+      valve: false,
+      timer: null
+    }
+  },
+  deactivated() {
+    clearInterval(this.timer)
+    this.timer = null
+  },
+  methods: {
+    // 列表请求函数
+    getList(...p) {
+      this.recordSelected = []
+      return getDataList(...p)
+    },
+    // 列表导出函数
+    exportList: exportDataList,
+    // 表格列解析渲染数据更改
+    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.visible = true
+                this.orderCode = row.id
+              }}
+            >
+              编辑
+            </el-button>
+          </div>
+        )
+      }
+    },
+    handleClose() {
+      this.addOff(() => {
+        this.visible = false
+      })()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 110 - 1
src/views/secondaryMerchant/components/subMerchantDetail.vue

@@ -227,6 +227,64 @@
                 <el-checkbox disabled />
               </el-form-item>
             </el-col>
+            <el-col :span="24">
+              <el-form-item label="类型" prop="jiaxianType">
+                <el-radio-group v-model="infoList.jiaxianType">
+                  <el-radio
+                    v-for="item in [
+                      { label: '嘉贤经销商', value: 'JIAXIAN' },
+                      { label: '商用经销商', value: 'GONGCHENG' }
+                    ]"
+                    :key="item.value"
+                    :label="item.value"
+                  >
+                    {{ item.label }}
+                  </el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="营业执照" prop="jiaxianType">
+                <template>
+                  <div
+                    v-if="infoList.url"
+                    style="display: flex; width: 120px; height: 120px; align-items: center; justify-content: center"
+                  >
+                    <el-image
+                      v-if="checkFileType(infoList.url) == 'image'"
+                      ref="img"
+                      :src="$imageUrl + infoList.url"
+                      fit="cover"
+                      :preview-src-list="[$imageUrl + infoList.url]"
+                      class="elImageClose"
+                    />
+                    <div
+                      style="
+                    display: flex;
+                    width: 120px;
+                    height: 120px;
+                    align-items: center;
+                    justify-content: center;
+                    cursor: pointer;
+                  "
+                      @click="openPdf(infoList)"
+                    >
+                      <img v-if="checkFileType(infoList.url) == 'word'" class="file" src="@/assets/common/word.png">
+                      <img v-if="checkFileType(infoList.url) == 'excel'" class="file" src="@/assets/common/excel.png">
+                      <img v-if="checkFileType(infoList.url) == 'ppt'" class="file" src="@/assets/common/ppt.png">
+                      <img
+                        v-if="checkFileType(infoList.url) == 'pdf'"
+                        class="file"
+                        style="cursor: pointer"
+                        src="@/assets/common/pdf.png"
+                      >
+
+                      <img v-if="checkFileType(infoList.url) == 'file'" class="file aaa" src="@/assets/common/zip.jpeg">
+                    </div>
+                  </div>
+                </template>
+              </el-form-item>
+            </el-col>
           </el-row>
           <!-- </el-form> -->
         </div>
@@ -319,7 +377,21 @@ export default {
       })
     })
     this.categoryArr = [...new Set([...this.frontCategory, ...this.pickCategory])]
-    this.infoList = res.data
+    this.infoList = {
+      ...res.data,
+      files: []
+    }
+    if (this.infoList.url) {
+      this.infoList.files = [
+        {
+          hover: true,
+          name: '营业执照',
+          status: 'success',
+          url: this.infoList.url,
+          uid: '111'
+        }
+      ]
+    }
   },
   methods: {
     goBack() {
@@ -372,12 +444,49 @@ export default {
         this.$successMsg('保存成功')
         this.$emit('close')
       })
+    },
+    // 检查文件类型
+    checkFileType(url) {
+      if (!url) return ''
+      const fileSuffix = url.substring(url.lastIndexOf('.') + 1)
+
+      if (['jpg', 'jpeg', 'png'].includes(fileSuffix)) {
+        return 'image'
+      } else if (['doc', 'docx', 'dot', 'wps', 'wpt'].includes(fileSuffix)) {
+        return 'word'
+      } else if (['xls', 'xlsx', 'xlt', 'et', 'ett'].includes(fileSuffix)) {
+        return 'excel'
+      } else if (['ppt', 'pptx', 'dps', 'dpt', 'pot', 'pps'].includes(fileSuffix)) {
+        return 'ppt'
+      } else if (['pdf'].includes(fileSuffix)) {
+        return 'pdf'
+      } else if (['zip', 'rar', 'gz', 'apk'].includes(fileSuffix)) {
+        return 'file'
+      } else {
+        return ''
+      }
+    },
+    openPdf(item) {
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = this.$imageUrl + item.url
+      link.download = item.fileName
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
+::v-deep .el-image-viewer__close {
+  top: 106px;
+  right: 40px;
+  width: 40px;
+  height: 40px;
+  font-size: 40px;
+}
 .sty {
   margin-bottom: 20px;
 }

+ 189 - 11
src/views/secondaryMerchant/components/subMerchantForm.vue

@@ -12,12 +12,36 @@
           <el-row :gutter="20">
             <el-col :span="6">
               <el-form-item label="上级商户编码" prop="higherPrantNumber">
-                <el-input v-model="formData.higherPrantNumber" disabled placeholder="系统自动生成" />
+                <el-input v-if="isCustomer" v-model="formData.higherPrantNumber" disabled placeholder="系统自动生成" />
+                <el-select
+                  v-else
+                  v-model="formData.higherPrantNumber"
+                  filterable
+                  placeholder="请选择"
+                  clearable
+                  style="width: 100%"
+                  :disabled="moduleType == 3"
+                  @change="handleChange"
+                >
+                  <el-option v-for="item in customerList" :key="item.id" :label="item.number" :value="item.id" />
+                </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="6">
               <el-form-item label="上级商户信息" prop="higherPrantName">
-                <el-input v-model="formData.higherPrantName" disabled placeholder="系统自动生成" />
+                <el-input v-if="isCustomer" v-model="formData.higherPrantName" placeholder="系统自动生成" disabled />
+                <el-select
+                  v-else
+                  v-model="formData.higherPrantName"
+                  placeholder="请选择"
+                  clearable
+                  filterable
+                  style="width: 100%"
+                  :disabled="moduleType == 3"
+                  @change="handleChange"
+                >
+                  <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+                </el-select>
               </el-form-item>
             </el-col>
           </el-row>
@@ -29,28 +53,87 @@
             </el-col>
             <el-col :span="6">
               <el-form-item label="商户名称" prop="name">
-                <el-input v-model="formData.name" placeholder="请输入客户信息" />
+                <el-input v-model="formData.name" placeholder="请输入客户信息" :disabled="moduleType == 3" />
               </el-form-item>
             </el-col>
             <el-col :span="6">
               <el-form-item label="负责人" prop="chargeName">
-                <el-input v-model="formData.chargeName" placeholder="请输入负责人姓名" />
+                <el-input v-model="formData.chargeName" placeholder="请输入负责人姓名" :disabled="moduleType == 3" />
               </el-form-item>
             </el-col>
             <el-col :span="6">
               <el-form-item label="联系电话" prop="mobile">
-                <el-input v-model="formData.mobile" placeholder="请输入联系电话" />
+                <el-input v-model="formData.mobile" placeholder="请输入联系电话" :disabled="moduleType == 3" />
               </el-form-item>
             </el-col>
           </el-row>
           <el-col :span="12">
             <el-form-item label="地址" prop="invoiceAddress">
-              <el-input v-model="formData.invoiceAddress" placeholder="请输入地址" />
+              <el-input v-model="formData.invoiceAddress" placeholder="请输入地址" :disabled="moduleType == 3" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="类型" prop="jiaxianType">
+              <el-radio-group v-model="formData.jiaxianType" :disabled="moduleType == 3">
+                <el-radio
+                  v-for="item in [
+                    { label: '嘉贤经销商', value: 'JIAXIAN' },
+                    { label: '商用经销商', value: 'GONGCHENG' }
+                  ]"
+                  :key="item.value"
+                  :label="item.value"
+                >
+                  {{ item.label }}
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="营业执照" prop="jiaxianType">
+              <ImageUpload v-if="moduleType != 3" :file-list="formData.files" />
+              <template v-else>
+                <div
+                  v-if="formData.url"
+                  style="display: flex; width: 120px; height: 120px; align-items: center; justify-content: center"
+                >
+                  <el-image
+                    v-if="checkFileType(formData.url) == 'image'"
+                    ref="img"
+                    :src="$imageUrl + formData.url"
+                    fit="cover"
+                    :preview-src-list="[$imageUrl + formData.url]"
+                    class="elImageClose"
+                  />
+                  <div
+                    style="
+                    display: flex;
+                    width: 120px;
+                    height: 120px;
+                    align-items: center;
+                    justify-content: center;
+                    cursor: pointer;
+                  "
+                    @click="openPdf(formData)"
+                  >
+                    <img v-if="checkFileType(formData.url) == 'word'" class="file" src="@/assets/common/word.png">
+                    <img v-if="checkFileType(formData.url) == 'excel'" class="file" src="@/assets/common/excel.png">
+                    <img v-if="checkFileType(formData.url) == 'ppt'" class="file" src="@/assets/common/ppt.png">
+                    <img
+                      v-if="checkFileType(formData.url) == 'pdf'"
+                      class="file"
+                      style="cursor: pointer"
+                      src="@/assets/common/pdf.png"
+                    >
+
+                    <img v-if="checkFileType(formData.url) == 'file'" class="file aaa" src="@/assets/common/zip.jpeg">
+                  </div>
+                </div>
+              </template>
             </el-form-item>
           </el-col>
         </el-row>
       </el-card>
-      <el-card>
+      <el-card v-if="formData.jiaxianType === 'JIAXIAN'">
         <div slot="header" class="clearfix">
           <strong>售后系统关联信息</strong>
         </div>
@@ -129,6 +212,7 @@
 </template>
 
 <script>
+import { getDealerListV2 } from '@/api/basic_data/dealer'
 import {
   addStagecustomer,
   examineStagecustomer,
@@ -136,8 +220,12 @@ import {
   updateSystem,
   getStageCustomerDetail
 } from '@/api/basic_data/dealer'
-
+import { mapGetters } from 'vuex'
+import ImageUpload from '@/components/Common/image-upload.vue'
 export default {
+  components: {
+    ImageUpload
+  },
   props: {
     moduleType: {
       type: Number,
@@ -171,15 +259,23 @@ export default {
         forbidStatus: 'A',
         approvalName: '',
         approvalTime: '',
-        approvalRemark: ''
-      }
+        approvalRemark: '',
+        jiaxianType: 'JIAXIAN',
+        files: [],
+        url: ''
+      },
+      customerList: []
     }
   },
+  computed: {
+    ...mapGetters(['isCustomer'])
+  },
   mounted() {
     if ((this.moduleType === 3 || this.moduleType === 4) && this.detailsId) {
       this.title = this.moduleType === 3 ? '审核' : '编辑'
       this.getStageCustomerDetail()
     }
+    this.getDealerListV2()
   },
   methods: {
     goBack() {
@@ -187,10 +283,52 @@ export default {
     },
     getStageCustomerDetail() {
       getStageCustomerDetail({ id: this.detailsId }).then(res => {
-        this.formData = res.data
+        this.formData = {
+          ...res.data,
+          files: []
+        }
+        if (this.formData.url) {
+          this.formData.files = [
+            {
+              hover: true,
+              name: '营业执照',
+              status: 'success',
+              url: this.formData.url,
+              uid: '111'
+            }
+          ]
+        }
       })
     },
+    getDealerListV2() {
+      getDealerListV2({
+        pageNum: 1,
+        pageSize: -1,
+        params: [
+          {
+            param: 'a.jiaxian_type',
+            compare: '=',
+            value: 'KING'
+          }
+        ]
+      }).then(res => {
+        this.customerList = res.data.records
+      })
+    },
+    handleChange(e) {
+      if (e) {
+        const item = this.customerList.find(k => k.id === e)
+        this.formData.higherPrantNumber = item.number
+        this.formData.higherPrantName = item.name
+      } else {
+        this.formData.higherPrantNumber = ''
+        this.formData.higherPrantName = ''
+      }
+    },
     handleSubmit() {
+      if (this.formData.files.length) {
+        this.formData.url = this.formData.files[0].url
+      }
       if (this.moduleType !== 1) {
         updateStagecustomer({
           ...this.formData
@@ -207,6 +345,9 @@ export default {
       this.$emit('close')
     },
     handleExamine(status = 'OK') {
+      if (this.formData.files.length) {
+        this.formData.url = this.formData.files[0].url
+      }
       examineStagecustomer({
         id: this.formData.id,
         examineStatus: status,
@@ -232,12 +373,49 @@ export default {
     },
     handleReset() {
       this.$refs.formData.resetFields()
+    },
+    // 检查文件类型
+    checkFileType(url) {
+      if (!url) return ''
+      const fileSuffix = url.substring(url.lastIndexOf('.') + 1)
+
+      if (['jpg', 'jpeg', 'png'].includes(fileSuffix)) {
+        return 'image'
+      } else if (['doc', 'docx', 'dot', 'wps', 'wpt'].includes(fileSuffix)) {
+        return 'word'
+      } else if (['xls', 'xlsx', 'xlt', 'et', 'ett'].includes(fileSuffix)) {
+        return 'excel'
+      } else if (['ppt', 'pptx', 'dps', 'dpt', 'pot', 'pps'].includes(fileSuffix)) {
+        return 'ppt'
+      } else if (['pdf'].includes(fileSuffix)) {
+        return 'pdf'
+      } else if (['zip', 'rar', 'gz', 'apk'].includes(fileSuffix)) {
+        return 'file'
+      } else {
+        return ''
+      }
+    },
+    openPdf(item) {
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = this.$imageUrl + item.url
+      link.download = item.fileName
+      document.body.appendChild(link)
+      link.click()
+      document.body.removeChild(link)
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
+::v-deep .el-image-viewer__close {
+  top: 106px;
+  right: 40px;
+  width: 40px;
+  height: 40px;
+  font-size: 40px;
+}
 .sty {
   margin-bottom: 20px;
 }

+ 438 - 0
src/views/setting/engineeringSubAccount.vue

@@ -0,0 +1,438 @@
+<template>
+  <div class="app-container">
+    <div class="setting_title">工程子账号</div>
+    <el-divider />
+
+    <div class="mymain-container">
+      <div class="btn-group clearfix">
+        <div class="fl">
+          <el-button
+            v-if="checkBtnRole('add')"
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            @click="addOrEdit('add')"
+          >新增账号</el-button>
+        </div>
+        <!--        <div class="fr">-->
+        <!--          <ImportButton :im-url="'stock/importToll'" @importSuccess="getList" />-->
+        <!--        </div>-->
+      </div>
+
+      <div class="table">
+        <el-table
+          v-loading="listLoading"
+          :data="dataList"
+          element-loading-text="Loading"
+          border
+          fit
+          highlight-current-row
+          stripe
+        >
+          <el-table-column align="left" label="序号" type="index" width="50" />
+          <el-table-column align="left" label="账号" prop="userName" />
+          <el-table-column align="left" label="创建时间" prop="createTime" />
+          <el-table-column align="left" label="最后登录时间" prop="lastLoginTime" />
+          <el-table-column align="left" label="主帐号" prop="isMaster">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.isMaster" type="success">是</el-tag>
+              <el-tag v-else type="danger">否</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="操作" width="180">
+            <template slot-scope="scope">
+              <el-button type="text" @click="addOrEdit('edit', scope.row)">重置密码</el-button>
+              <!-- <el-button
+                v-if="checkBtnRole('detail')"
+                type="text"
+                @click="setMenuRole(scope.row.adminUserId, 'role')"
+              >设置权限</el-button> -->
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <div class="pagination clearfix">
+        <div class="fr">
+          <el-pagination
+            :current-page="currentPage"
+            :page-sizes="[10, 20, 30, 50]"
+            :page-size="10"
+            layout="total, sizes, prev, pager, next, jumper"
+            :total="listTotal"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+        </div>
+      </div>
+    </div>
+
+    <!-- 设置权限 -->
+    <el-dialog
+      title="设置权限"
+      :visible.sync="roleFormVisible"
+      :show-close="false"
+      width="40%"
+      :close-on-click-modal="false"
+      custom-class="tree-dialog"
+      top="50px"
+    >
+      <el-tree
+        ref="tree"
+        :data="menuRoleList"
+        show-checkbox
+        :check-strictly="true"
+        :default-expand-all="true"
+        :expand-on-click-node="false"
+        node-key="moduleId"
+        highlight-current
+        :props="defaultProps"
+      >
+        <span slot-scope="{ node, data }" class="custom-tree-node">
+          <span>{{ node.label }}</span>
+          <span v-if="data.type < 3">
+            <el-button type="text" size="mini" @click="() => quickSelection(data)">一键全选</el-button>
+            <el-button
+              type="text"
+              size="mini"
+              style="color: #f56c6c"
+              @click="() => quickCancel(data)"
+            >一键取消</el-button>
+          </span>
+        </span>
+      </el-tree>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="roleFormVisible = false">{{ editId != 1 ? '取 消' : '关 闭' }}</el-button>
+        <el-button v-if="editId != 1" type="primary" @click="submitRoleForm('role')">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      width="45%"
+      :title="'add' === addFormType ? '新增' : '修改'"
+      @close="cancelAddForm"
+    >
+      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="100px" class="demo-ruleForm">
+        <el-form-item v-if="addFormType !== 'edit'" label="账号" prop="account">
+          <el-input v-model="ruleForm.account" type="text" autocomplete="off" disabled placeholder="系统自动生成" />
+        </el-form-item>
+        <el-form-item v-if="addFormType !== 'edit'" label="子经销商" prop="customerId">
+          <el-select v-model="ruleForm.customerId" placeholder="请选择子经销商" filterable style="width:100%">
+            <el-option
+              v-for="item in subCustomerList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="密码" prop="password">
+          <el-input v-model="ruleForm.password" type="password" autocomplete="off" />
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer" class="dialog-footer">
+        <!--        <el-button type="primary" style="float: left;" @click="setMenuRole">设置权限</el-button>-->
+        <el-button @click="cancelAddForm">取 消</el-button>
+        <el-button type="primary" @click="submitAddForm">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { getStagecustomerListV2 } from '@/api/basic_data/dealer'
+import {
+  addEngineeringUser,
+  deleteRole,
+  editRole,
+  getEngineeringUserList,
+  getMenuList,
+  getRoleChecked,
+  setMenuRole,
+  editSubAccount
+} from '@/api/setting'
+
+export default {
+  data() {
+    return {
+      imageURL: this.$imageUrl,
+      dataList: null, // 列表数据
+      listLoading: true, // 列表加载loading
+      currentPage: 1, // 当前页码
+      pageSize: 10, // 每页数量
+      listTotal: 0, // 列表总数
+
+      editId: null,
+      addFormType: 'add',
+      addFormVisible: false,
+      addForm: {
+        name: '' // 角色名
+      },
+      addFormRules: {
+        name: [{ required: true, message: '请输入角色名', trigger: 'blur' }]
+      },
+
+      roleFormVisible: false,
+
+      menuRoleList: [],
+      defaultProps: {
+        children: 'children',
+        label: 'moduleName'
+      },
+      dialogVisible: false,
+      ruleForm: {
+        account: '',
+        password: '',
+        customerId: ''
+      },
+      rules: {
+        password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
+        customerId: [{ required: true, message: '请选择子经销商', trigger: 'blur' }]
+      },
+      subCustomerList: []
+    }
+  },
+  computed: {
+    ...mapGetters(['userid', 'name', 'customerId'])
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 查询按钮权限
+    checkBtnRole(value) {
+      // let btnRole = this.$route.meta.roles;
+      // if(!btnRole) {return true}
+      // let index = btnRole.indexOf(value);
+      // return index >= 0 ? true : false;
+      return true
+    },
+    // 获取子经销商
+    getStagecustomerListV2() {
+      getStagecustomerListV2({
+        pageNum: 1,
+        pageSize: -1,
+        params: [
+          {
+            param: 'a.jiaxian_type',
+            compare: '=',
+            value: 'GONGCHENG'
+          }
+        ]
+      }).then(res => {
+        this.subCustomerList = res.data.records
+      })
+    },
+    getList() {
+      this.listLoading = true
+      const params = {
+        pageNum: this.currentPage,
+        pageSize: this.pageSize,
+        customerId: this.customerId,
+        isMaster: false
+      }
+      getEngineeringUserList(params).then(res => {
+        this.dataList = res.data.records
+        this.listTotal = res.data.total
+        this.listLoading = false
+      })
+    },
+
+    // 更改每页数量
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.currentPage = 1
+      this.getList()
+    },
+
+    // 更改当前页
+    handleCurrentChange(val) {
+      this.currentPage = val
+      this.getList()
+    },
+
+    // 操作 - 删除
+    handleDelete(id) {
+      deleteRole({ adminRoleId: id }).then(res => {
+        this.getList()
+        this.$successMsg()
+      })
+    },
+
+    // 新增编辑
+    addOrEdit(type, row) {
+      this.addFormType = type
+      this.dialogVisible = true
+      if (type === 'edit') {
+        this.$nextTick(() => {
+          this.ruleForm = {
+            account: row.userName,
+            password: '',
+            adminUserId: row.adminUserId,
+            customerId: row.customerId
+          }
+        })
+      }
+      this.getStagecustomerListV2()
+    },
+
+    // 取消 新增编辑
+    cancelAddForm() {
+      this.dialogVisible = false
+      this.$nextTick(() => {
+        this.$refs.tree && this.$refs.tree.setCheckedKeys([])
+      })
+      this.$refs.ruleForm.resetFields()
+    },
+
+    // 提交 新增编辑
+    submitAddForm() {
+      this.$refs.ruleForm.validate(valid => {
+        const params = {
+          userName: this.ruleForm.account,
+          password: this.ruleForm.password,
+          customerId: this.ruleForm.customerId
+          // adminModuleIds:this.$refs.tree ? this.$refs.tree.getCheckedKeys().join(',') :
+        }
+        if (valid) {
+          if (this.addFormType === 'edit') {
+            params.adminUserId = this.ruleForm.adminUserId
+            editSubAccount(params).then(res => {
+              this.cancelAddForm()
+              this.getList()
+              this.$successMsg('编辑成功')
+            })
+          } else {
+            addEngineeringUser(params).then(res => {
+              this.cancelAddForm()
+              this.getList()
+              this.$successMsg('新增成功')
+            })
+          }
+        }
+      })
+    },
+
+    // 设置权限 - 获取列表
+    setMenuRole(id, type) {
+      this.roleFormVisible = true
+      this.editId = id
+      getMenuList({ adminUserId: this.userid }).then(res => {
+        this.menuRoleList = res.data
+      })
+      getRoleChecked({ adminUserId: id }).then(res => {
+        this.$refs.tree.setCheckedKeys(res.data)
+      })
+    },
+
+    // 设置权限 - 提交数据
+    submitRoleForm(type) {
+      const params = {
+        adminModuleIds: this.$refs.tree.getCheckedKeys().join(','),
+        adminRoleId: this.editId
+      }
+      setMenuRole(params).then(res => {
+        this.getList()
+        this.$successMsg()
+      })
+
+      this.roleFormVisible = false
+    },
+
+    // 一键全选
+    quickSelection(data) {
+      const nowChecked = this.$refs.tree.getCheckedKeys()
+      const thisId = data.moduleId
+      let childId = []
+      if (data.children.length) {
+        childId = this.familyTree(data.children)
+      }
+
+      const setChecked = nowChecked.concat([thisId]).concat(childId)
+
+      this.$refs.tree.setCheckedKeys(setChecked)
+    },
+
+    // 一键取消
+    quickCancel(data) {
+      const nowChecked = this.$refs.tree.getCheckedKeys()
+      const thisId = data.moduleId
+      let childId = []
+      if (data.children.length) {
+        childId = this.familyTree(data.children)
+      }
+
+      const setChecked = nowChecked
+      if (setChecked.indexOf(thisId) >= 0) {
+        setChecked.splice(setChecked.indexOf(thisId), 1)
+      }
+
+      if (childId.length) {
+        for (var i = 0; i < childId.length; i++) {
+          if (setChecked.indexOf(childId[i]) >= 0) {
+            setChecked.splice(setChecked.indexOf(childId[i]), 1)
+          }
+        }
+      }
+
+      this.$refs.tree.setCheckedKeys(setChecked)
+    },
+
+    // 递归子id
+    familyTree(arr) {
+      var temp = []
+      var forFn = function(list) {
+        for (var i = 0; i < list.length; i++) {
+          var item = list[i]
+          if (item.children) {
+            temp.push(item.moduleId)
+            forFn(item.children)
+          }
+        }
+      }
+      forFn(arr)
+      return temp
+    },
+
+    changeStatus(id, status) {
+      editRole({
+        adminRoleId: id,
+        visitSysStatus: status
+      }).then(res => {
+        this.getList()
+        this.$successMsg('编辑成功')
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .tree-dialog {
+  .el-dialog__body {
+    padding: 20px;
+    .el-tree {
+      max-height: calc(100vh - 140px - 54px - 70px);
+      overflow-y: scroll;
+      padding: 0 30px;
+      > .el-tree-node {
+        padding: 15px 0;
+        border: 1px dashed #ddd;
+        margin-bottom: 15px;
+        border-radius: 10px;
+      }
+    }
+  }
+}
+::v-deep .custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+  padding-right: 8px;
+}
+</style>

+ 5 - 5
src/views/setting/jiaxianSubAccount.vue

@@ -216,11 +216,11 @@ export default {
         pageNum: 1,
         pageSize: -1,
         params: [
-          // {
-          //   param: 'a.higher_prant_number',
-          //   compare: 'like',
-          //   value: this.customerId
-          // }
+          {
+            param: 'a.jiaxian_type',
+            compare: '=',
+            value: 'JIAXIAN'
+          }
         ]
       }).then(res => {
         this.subCustomerList = res.data.records

+ 21 - 4
src/views/setting/other.vue

@@ -11,7 +11,7 @@
       <el-radio-button label="eigth">权限分类</el-radio-button>
       <el-radio-button v-if="$checkBtnRole('receipt', $route.meta.roles)" label="receipt">发票</el-radio-button>
       <el-radio-button label="warehouse">仓租费配置</el-radio-button>
-
+      <el-radio-button label="radius">商用登录地图半径</el-radio-button>
     </el-radio-group>
 
     <div v-show="formType === 'first'">
@@ -328,6 +328,19 @@
       </div>
       <el-button type="primary" size="small" @click="submitStockForm">确 定</el-button>
     </div>
+    <div v-show="formType === 'radius'">
+      <div style="margin: 40px 0 30px;">
+        <span>商用工程登录信息的工程半径配置</span>
+        <el-input
+          v-model="radiusForm.input1.dictValue"
+          style="width: 150px; margin: 0 10px"
+          placeholder=""
+          size="mini"
+        />
+        <span>公里</span>
+      </div>
+      <el-button type="primary" size="small" @click="submitForm('radius')">确 定</el-button>
+    </div>
     <!-- //弹窗 -->
     <el-dialog :title="title" :visible.sync="dialogForm" width="30%" :show-close="false" :close-on-click-modal="false">
       <el-form ref="addForm" size="mini" :rules="rules" :model="addForm" label-width="120px">
@@ -384,6 +397,9 @@ export default {
       fifthForm: {
         input1: {}
       },
+      radiusForm: {
+        input1: {}
+      },
       stockCostDict: {},
       sixthForm: [],
       seventhForm: [],
@@ -524,8 +540,8 @@ export default {
             return
           }
           this[type + 'Form'].input1 = data[0]
+          console.log(  this[type + 'Form'].input1, 999)
           // this[type + "Form"].input2 = data[1];
-          console.log(777, this[type + 'Form'].input1)
         } else {
           this[type + 'Form'].input1 = data[0]
           this[type + 'Form'].input2 = data[1]
@@ -549,6 +565,7 @@ export default {
         if (type == 'eigth') {
           this.eigthForm = res.data
         }
+
       })
     },
     getDetail(type) {
@@ -560,7 +577,8 @@ export default {
         fifth: 'PRINT_PASSWORD',
         sixth: 'MACHINE_TYPE',
         seventh: 'SIGN_TYPE',
-        eigth: 'POWER_CATEGORY'
+        eigth: 'POWER_CATEGORY',
+        radius: 'MAP_ENGIN_RATE'
       }
       if (type === 'third') {
         MAP[type].forEach(e => {
@@ -580,7 +598,6 @@ export default {
         }
         list.push(this[type + 'Form'][key])
       }
-      console.log(list, '890')
 
       editDictList(list).then(_res => {
         this.$successMsg('保存成功')

+ 185 - 23
src/views/supply/engin/components/engin_form.vue

@@ -124,7 +124,10 @@
         </el-col>
         <el-col :xs="24" :sm="12" :lg="8">
           <el-form-item label="工程编号" prop="enginNum">
-            <el-input v-model="mainForm.enginNum" placeholder="请输入工程编号" />
+            <div style="display: flex">
+              <el-input v-model="mainForm.enginNum" placeholder="请输入工程编号" />
+              <el-button style="margin-left: 10px" @click="visible = true;getLoginOrderList()">引用</el-button>
+            </div>
           </el-form-item>
         </el-col>
         <el-col :xs="24" :sm="12" :lg="8">
@@ -330,7 +333,6 @@
         </el-popconfirm>
       </div>
     </div>
-
     <el-dialog
       title="添加产品"
       :modal-append-to-body="true"
@@ -454,11 +456,74 @@
         <el-button type="primary" @click="submitAddGoods">确 定</el-button>
       </span>
     </el-dialog>
+
+    <el-dialog
+      title="商用工程登录项目"
+      :visible.sync="visible"
+      width="60%"
+      :modal-append-to-body="true"
+      :append-to-body="true"
+      :close-on-click-modal="false"
+      @close="onClose"
+    >
+      <div>
+        <el-row :gutter="20">
+          <el-form ref="formData" :model="formData" label-width="0" :inline="false" size="small">
+            <el-col :span="6">
+              <el-form-item prop="projectNo">
+                <el-input v-model="formData.projectNo" placeholder="请输入项目编号" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item prop="projectName">
+                <el-input v-model="formData.projectName" placeholder="请输入项目名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item prop="address">
+                <el-input v-model="formData.address" placeholder="请输入项目地址" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6" style="text-align: right;">
+              <el-button size="small" @click="currentPage2 = 1; getLoginOrderList()">查询</el-button>
+              <el-button size="small" type="primary" @click="resetGoodsScreenForm2">重置</el-button></el-col>
+          </el-form>
+        </el-row>
+        <div>
+          <zj-table
+            ref="tableEl"
+            style="margin-bottom: 20px"
+            :is-drop="true"
+            :columns="columns"
+            :table-data="tableData"
+            :table-attributes="{
+              border: true,
+              maxHeight: '600px'
+            }"
+          />
+          <div class="fr">
+            <el-pagination
+              :current-page="currentPage2"
+              :page-sizes="[10, 20, 30, 50]"
+              :page-size="10"
+              layout="total, sizes, prev, pager, next, jumper"
+              :total="listTotal2"
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+            />
+          </div>
+        </div>
+      </div>
+      <span slot="footer">
+        <el-button @click="onClose">取 消</el-button>
+        <el-button type="primary" @click="submitAddOrder">确 定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { getEnginDetail, getRetailProductList, addEngin, editEngin, submitEngin, delItem } from '@/api/supply/engin'
+import { getEnginDetail, getRetailProductList, addEngin, editEngin, submitEngin, delItem, getLoginOrderList } from '@/api/supply/engin'
 import { getDictList, getTypeList, getSalesmanList, getDealerList } from '@/api/common'
 
 export default {
@@ -546,13 +611,63 @@ export default {
 
       leftSelection: [],
       rightSelection: [],
-      examineStatus: ''
+      examineStatus: '',
+      visible: false,
+      currentPage2: 1,
+      pageSize2: 10,
+      listTotal2: 0,
+      formData: {
+        address: '',
+        projectName: '',
+        projectNo: ''
+      },
+      tableData: [],
+      current: ''
     }
   },
 
   computed: {
     isDealer() {
       return JSON.parse(localStorage.getItem('supply_user')).isCustomer
+    },
+    columns() {
+      return [
+        {
+          columnAttributes: {
+            label: '操作',
+            width: 45
+          },
+          render: (h, { row, column, index }) => {
+            return (
+              <div>
+                <el-radio style='margin-left:20px' value={this.current} label={row.id} onChange={(val) => {
+                  this.current = row.id
+                }}>{}</el-radio>
+              </div>
+            )
+          }
+        },
+        {
+          columnAttributes: {
+            label: '项目编号',
+            prop: 'projectNo',
+            width: 100
+          }
+        },
+        {
+          columnAttributes: {
+            label: '项目名称',
+            prop: 'projectName',
+            width: 200
+          }
+        },
+        {
+          columnAttributes: {
+            label: '项目地址',
+            prop: 'address'
+          }
+        }
+      ]
     }
   },
   watch: {
@@ -589,7 +704,16 @@ export default {
     goBack() {
       this.$emit('backListFormDetail')
     },
-
+    getLoginOrderList() {
+      getLoginOrderList({
+        pageNum: this.currentPage2,
+        pageSize: this.pageSize2,
+        ...this.formData
+      }).then(res => {
+        this.tableData = res.data.records
+        this.listTotal2 = res.data.total
+      })
+    },
     getDate(addYear) {
       var date = new Date()
       var seperator1 = '-'
@@ -962,22 +1086,26 @@ export default {
           if (type === 1) {
             if (this.listItem) {
               params.enginInfoId = this.listItem.enginInfoId
-              editEngin(params).then(res => {
-                this.$successMsg('编辑成功')
-                this.goBack()
-              }).finally(() => {
-                this.btnLoading = false
-              })
+              editEngin(params)
+                .then(res => {
+                  this.$successMsg('编辑成功')
+                  this.goBack()
+                })
+                .finally(() => {
+                  this.btnLoading = false
+                })
             } else {
               params.customerNumber = this.mainForm.jxsNum
               params.customerName = this.mainForm.jxsName
               params.customerId = this.mainForm.jxsId
-              addEngin(params).then(res => {
-                this.$successMsg('保存成功')
-                this.goBack()
-              }).finally(() => {
-                this.btnLoading = false
-              })
+              addEngin(params)
+                .then(res => {
+                  this.$successMsg('保存成功')
+                  this.goBack()
+                })
+                .finally(() => {
+                  this.btnLoading = false
+                })
             }
           } else {
             if (this.listItem) {
@@ -987,15 +1115,49 @@ export default {
               params.customerName = this.mainForm.jxsName
               params.customerId = this.mainForm.jxsId
             }
-            submitEngin(params).then(res => {
-              this.$successMsg('提交审核成功')
-              this.goBack()
-            }).finally(() => {
-              this.btnLoading = false
-            })
+            submitEngin(params)
+              .then(res => {
+                this.$successMsg('提交审核成功')
+                this.goBack()
+              })
+              .finally(() => {
+                this.btnLoading = false
+              })
           }
         }
       })
+    },
+    handleSizeChange(val) {
+      this.pageSize2 = val
+      this.currentPage2 = 1
+      this.getLoginOrderList()
+    },
+    handleCurrentChange(val) {
+      this.currentPage2 = val
+      this.getLoginOrderList()
+    },
+    // 重置筛选表单
+    resetGoodsScreenForm2() {
+      this.$refs.formData.resetFields()
+      this.currentPage2 = 1
+      this.getLoginOrderList()
+    },
+    submitAddOrder() {
+      const item = this.tableData.find(k => k.id === this.current)
+      this.mainForm.enginNum = item.projectNo
+      this.mainForm.enginName = item.projectName
+      this.mainForm.linkman = item.enginLinkName
+      this.mainForm.phone = item.enginLinkMobile
+      this.mainForm.address = item.address
+
+      this.onClose()
+    },
+    onClose() {
+      this.$nextTick(() => {
+        this.current = ''
+        this.$refs.formData.resetFields()
+        this.visible = false
+      })
     }
   }
 }