qymljy 2 лет назад
Родитель
Сommit
79fe9491f4

+ 30 - 3
src/HDrpManagement/invoicePredictionManage/details/index.vue

@@ -1,8 +1,8 @@
 <template>
   <div>
-    <newDetails :titleText="mainData.title" :mainAreaData="mainAreaData" idname="sa_salesforecastbillid" :editData="mainData">
+    <newDetails :titleText="mainData.title" :mainAreaData="mainAreaData" idname="sa_salesforecastbillid" :editData="mainData" :tabs="['订单','项目','客户']">
       <template #bottomLeft>
-        <div style="height: calc(96vh)">
+        <div style="height: calc(100vh - 180px)">
           <p>预测单汇总</p>
           <el-divider></el-divider>
           <el-row>
@@ -75,16 +75,40 @@
           </el-descriptions>
         </div>
       </template>
+      <div slot="slot0" class=" normal-panel">
+        <orderList @onSuccess="onSuccess" :id="$route.query.id"  ></orderList>
+      </div>
+      <div slot="slot1" class=" normal-panel">
+        <projectList @onSuccess="onSuccess" :id="$route.query.id"  ></projectList>
+      </div>
+      <div slot="slot2" class=" normal-panel">
+        <customList @onSuccess="onSuccess" :id="$route.query.id"  ></customList>
+      </div>
     </newDetails>
+    <el-drawer
+        :visible.sync="drawer"
+        :with-header="false"
+        direction="rtl"
+        size="90%"
+        append-to-body
+    >
+      <div class="detail__panel">
+        <subordinateDetail :id="id" ref="subordinate"></subordinateDetail>
+      </div>
+    </el-drawer>
   </div>
 </template>
 
 <script>
 import newDetails from '@/components/newDetailTemp/index'
 import tableList from '@/components/table/index5'
+import subordinateDetail from './modules/subordinate'
+import orderList from './modules/order'
+import projectList from './modules/project'
+import customList from './modules/custom'
 export default {
   name: "index",
-  components:{newDetails,tableList},
+  components:{newDetails,tableList,subordinateDetail,orderList,projectList,customList},
   data(){
     return {
       id:'',
@@ -302,6 +326,9 @@ export default {
       console.log(val)
       this.id = val.sa_salesforecastbillid
       this.drawer = true
+      this.$nextTick(()=>{
+        this.$refs.subordinate.queryMainData()
+      })
     }
   },
   mounted() {

+ 217 - 0
src/HDrpManagement/invoicePredictionManage/details/modules/custom.vue

@@ -0,0 +1,217 @@
+<template>
+  <div>
+    <addCustom v-if="!isDisabled" ref="addOrder" :param="paramAdd" :tablecols="tablecolsAdd" :title="'添加订单'" class="inline-16" @add="addCustom" @adds="addCustoms"></addCustom>
+    <el-button v-if="!isDisabled" :type="items.length > 0?'primary':''" size="small" @click="delCustom" class="inline-16" :disabled="items.length === 0">删 除</el-button>
+    <el-input  style="width:200px;" placeholder="搜索" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+    </el-input>
+    <tableList :height="'calc(100vh - 370px)'" ref="projectRef" style="margin-top: 10px" :checkbox="true"  :layout="tablecols" :data="list" :opwidth="200" :custom="true"  fixedName="operation"
+               highlight-current-row @selectionChange="selectionChange"  >
+      <template v-slot:customcol="scope">
+        <div v-if="scope.column.columnname === 'operation'">
+          <span>{{scope.column.data[scope.column.columnname]}}</span>
+        </div>
+        <div v-else-if="scope.column.columnname === 'outamount'">
+          <span v-if="isDisabled">{{scope.column.data[scope.column.columnname]}}</span>
+          <span v-else>
+            <el-input size="mini" v-model="scope.column.data.outamount" @change="onChange(scope.column.data.price,scope.$index,scope.column.data)"></el-input>
+          </span>
+        </div>
+        <div v-else-if="scope.column.columnname === 'invoiceamount'">
+          <span v-if="isDisabled">{{scope.column.data[scope.column.columnname]}}</span>
+          <span v-else>
+            <el-input size="mini" v-model="scope.column.data.invoiceamount" @change="onChange(scope.column.data.price,scope.$index,scope.column.data)"></el-input>
+          </span>
+        </div>
+        <p v-else>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
+      </template>
+      <template v-slot:opreation="scope">
+        <el-button size="mini" type="text" @click="delCustom(scope.data)" :disabled="isDisabled">删 除</el-button>
+      </template>
+    </tableList>
+    <div class=" container "  style="text-align:left;float: left">
+      <span style="font-size: 14px">出货预测金额: ¥{{tool.formatAmount(alloutamount,2)}}</span>
+      <span style="font-size: 14px;margin-left: 10px">开票预测金额: ¥{{tool.formatAmount(allinvoiceamount,2)}}</span>
+    </div>
+    <div  class="container " style="text-align:right;float: right">
+      <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="param.content.pageNumber"
+          :page-sizes="[20, 50, 100, 200]"
+          :page-size="20"
+          layout="total,sizes, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import addCustom from '@/template/prediction/addTemp'
+import tableList from '@/components/table/index5'
+export default {
+  name: "custom",
+  props:['id','isDisabled'],
+  components:{addCustom,tableList},
+  data(){
+    return {
+      items:[],
+      list:[],
+      tablecolsAdd:[],
+      tablecols:[],
+      alloutamount:0,
+      allinvoiceamount:0,
+      total:0,
+      paramAdd:{
+        "id": 20230706092404,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "sa_salesforecastbillid":this.id,
+          "where": {
+            "condition": ""
+          }
+        }
+      },
+      param:{
+        "id": 20230705145504,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":3, // 1 订单 2项目 3客户
+          "sa_salesforecastbillid":this.id,
+          "where": {
+            "condition": ""
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      console.log(res.data)
+      this.list = res.data
+      this.alloutamount = res.data[0].alloutamount
+      this.allinvoiceamount = res.data[0].allinvoiceamount
+      this.total = res.total
+    },
+    async addCustom(val){
+      console.log(val)
+      const res = await this.$api.requested({
+        "id": 20230705145104,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "ownertable": "sa_customers",
+          "salesforecastproject": [
+            {
+              "sa_salesforecastprojectid": 0,
+              "ownerid": val.sa_customersid,
+              "discountrate":0
+            }
+          ]
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async addCustoms(val){
+      console.log(val,'批量')
+      let addItems = []
+      addItems = val.map(item=>{
+        return {
+          "sa_salesforecastprojectid": 0,
+          "ownerid": item.sa_customersid,
+          "discountrate":0
+        }
+      })
+      const res = await this.$api.requested({
+        "id": 20230705145104,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "ownertable": "sa_customers",
+          "salesforecastproject": addItems
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async delCustom(val){
+      console.log(val)
+      const res = await this.$api.requested({
+        "id": 20230705145304,
+        "content": {
+          "sa_salesforecastbillid":this.id,
+          "sa_salesforecastprojectids":[val.sa_salesforecastprojectid]
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async delCustoms(){
+      let items = []
+      items = this.items.map(item=>item.sa_salesforecastprojectid)
+      const res = await this.$api.requested({
+        "id": 20230705145304,
+        "content": {
+          "sa_salesforecastbillid":this.id,
+          "sa_salesforecastprojectids":items
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    selectionChange(val){
+      this.items = val
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+    async onChange(val,index,data){
+      const res = await this.$api.requested({
+        "id": 20230705145204,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "sa_salesforecastprojectid":data.sa_salesforecastprojectid,
+          "salesforecast": [
+            {
+              "sa_salesforecastid": data.sa_salesforecastid,
+              "outamount": data.outamount,
+              "invoiceamount": data.invoiceamount
+            }
+          ]
+        }
+      })
+      this.onSuccess()
+    },
+    onSuccess(){
+      this.listData()
+      this.$emit('onSuccess')
+    },
+  },
+  mounted() {
+    this.listData()
+  },
+  created() {
+    this.tablecolsAdd = this.tool.tabelCol(this.$route.name).customAddTable.tablecols
+    this.tablecols = this.tool.tabelCol(this.$route.name).customTable.tablecols
+  },
+
+}
+</script>
+
+<style scoped>
+
+</style>

+ 214 - 0
src/HDrpManagement/invoicePredictionManage/details/modules/order.vue

@@ -0,0 +1,214 @@
+<template>
+  <div>
+    <addOrder v-if="!isDisabled" ref="addOrder" :param="paramAdd" :tablecols="tablecolsAdd" :title="'添加订单'" class="inline-16" @add="addOrder" @adds="addOrders"></addOrder>
+    <el-button v-if="!isDisabled" :type="items.length > 0?'primary':''" size="small" @click="delOrders" class="inline-16" :disabled="items.length === 0">删 除</el-button>
+    <el-input  style="width:200px;" placeholder="搜索" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+    </el-input>
+    <tableList :height="'calc(100vh - 370px)'" ref="projectRef" style="margin-top: 10px" :checkbox="true"  :layout="tablecols" :data="list" :opwidth="200" :custom="true"  fixedName="operation"
+               highlight-current-row @selectionChange="selectionChange"  >
+      <template v-slot:customcol="scope">
+        <div v-if="scope.column.columnname === 'operation'">
+          <span>{{scope.column.data[scope.column.columnname]}}</span>
+        </div>
+        <div v-else-if="scope.column.columnname === 'outamount'">
+          <span v-if="isDisabled">{{scope.column.data[scope.column.columnname]}}</span>
+          <span v-else>
+            <el-input size="mini" v-model="scope.column.data.outamount" @change="onChange(scope.column.data.price,scope.$index,scope.column.data)"></el-input>
+          </span>
+        </div>
+        <div v-else-if="scope.column.columnname === 'invoiceamount'">
+          <span v-if="isDisabled">{{scope.column.data[scope.column.columnname]}}</span>
+          <span v-else>
+            <el-input size="mini" v-model="scope.column.data.invoiceamount" @change="onChange(scope.column.data.price,scope.$index,scope.column.data)"></el-input>
+          </span>
+        </div>
+        <p v-else>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
+      </template>
+      <template v-slot:opreation="scope">
+        <el-button size="mini" type="text" @click="delOrder(scope.data)" :disabled="isDisabled">删 除</el-button>
+      </template>
+    </tableList>
+    <div class=" container "  style="text-align:left;float: left">
+      <span style="font-size: 14px">出货预测金额: ¥{{tool.formatAmount(alloutamount,2)}}</span>
+      <span style="font-size: 14px;margin-left: 10px">开票预测金额: ¥{{tool.formatAmount(allinvoiceamount,2)}}</span>
+    </div>
+    <div  class="container " style="text-align:right;float: right">
+      <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="param.content.pageNumber"
+          :page-sizes="[20, 50, 100, 200]"
+          :page-size="20"
+          layout="total,sizes, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import addOrder from '@/template/prediction/addTemp'
+import tableList from '@/components/table/index5'
+export default {
+  name: "order",
+  props:['id','isDisabled'],
+  components:{addOrder,tableList},
+  data(){
+    return {
+      items:[],
+      list:[],
+      tablecolsAdd:[],
+      tablecols:[],
+      alloutamount:0,
+      allinvoiceamount:0,
+      total:0,
+      paramAdd:{
+        "id": 20230706090904,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "where": {
+            "condition": ""
+          }
+        }
+      },
+      param:{
+        "id": 20230705145504,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":1, // 1 订单 2项目 3客户
+          "sa_salesforecastbillid":this.id,
+          "where": {
+            "condition": ""
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      console.log(res.data)
+      this.list = res.data
+      this.alloutamount = res.data[0].alloutamount
+      this.allinvoiceamount = res.data[0].allinvoiceamount
+      this.total = res.total
+    },
+    async addOrder(val){
+      console.log(val)
+      const res = await this.$api.requested({
+        "id": 20230705145104,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "ownertable": "sa_order",
+          "salesforecastproject": [
+            {
+              "sa_salesforecastprojectid": 0,
+              "ownerid": val.sa_orderid,
+              "discountrate":0
+            }
+          ]
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async addOrders(val){
+      console.log(val,'批量')
+      let addItems = []
+      addItems = val.map(item=>{
+        return {
+          "sa_salesforecastprojectid": 0,
+          "ownerid": item.sa_orderid,
+          "discountrate":0
+        }
+      })
+      const res = await this.$api.requested({
+        "id": 20230705145104,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "ownertable": "sa_order",
+          "salesforecastproject": addItems
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async delOrders(){
+      let items = []
+      items = this.items.map(item=>item.sa_salesforecastprojectid)
+      const res = await this.$api.requested({
+        "id": 20230705145304,
+        "content": {
+          "sa_salesforecastbillid":this.id,
+          "sa_salesforecastprojectids":items
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async delOrder(val){
+      console.log(val)
+      const res = await this.$api.requested({
+        "id": 20230705145304,
+        "content": {
+          "sa_salesforecastbillid":this.id,
+          "sa_salesforecastprojectids":[val.sa_salesforecastprojectid]
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    selectionChange(val){
+      this.items = val
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+    async onChange(val,index,data){
+      const res = await this.$api.requested({
+        "id": 20230705145204,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "sa_salesforecastprojectid":data.sa_salesforecastprojectid,
+          "salesforecast": [
+            {
+              "sa_salesforecastid": data.sa_salesforecastid,
+              "outamount": data.outamount,
+              "invoiceamount": data.invoiceamount
+            }
+          ]
+        }
+      })
+      this.onSuccess()
+    },
+    onSuccess(){
+      this.listData()
+      this.$emit('onSuccess')
+    },
+  },
+  mounted() {
+    this.listData()
+  },
+  created() {
+    this.tablecolsAdd = this.tool.tabelCol(this.$route.name).orderAddTable.tablecols
+    this.tablecols = this.tool.tabelCol(this.$route.name).orderTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 217 - 0
src/HDrpManagement/invoicePredictionManage/details/modules/project.vue

@@ -0,0 +1,217 @@
+<template>
+  <div>
+    <addProject v-if="!isDisabled" ref="addOrder" :param="paramAdd" :tablecols="tablecolsAdd" :title="'添加项目'" class="inline-16" @add="addProject" @adds="addProjects"></addProject>
+    <el-button v-if="!isDisabled" :type="items.length > 0?'primary':''" size="small" @click="delProject" class="inline-16" :disabled="items.length === 0">删 除</el-button>
+    <el-input  style="width:200px;" placeholder="搜索" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+    </el-input>
+    <tableList :height="'calc(100vh - 370px)'" ref="projectRef" style="margin-top: 10px" :checkbox="true"  :layout="tablecols" :data="list" :opwidth="200" :custom="true"  fixedName="operation" @selectionChange="selectionChange"  >
+      <template v-slot:customcol="scope">
+        <div v-if="scope.column.columnname === 'operation'">
+          <span>{{scope.column.data[scope.column.columnname]}}</span>
+        </div>
+        <div v-else-if="scope.column.columnname === 'outamount'">
+          <span v-if="isDisabled">{{scope.column.data[scope.column.columnname]}}</span>
+          <span v-else>
+            <el-input size="mini" v-model="scope.column.data.outamount" @change="onChange(scope.column.data.price,scope.$index,scope.column.data)"></el-input>
+          </span>
+        </div>
+        <div v-else-if="scope.column.columnname === 'invoiceamount'">
+          <span v-if="isDisabled">{{scope.column.data[scope.column.columnname]}}</span>
+          <span v-else>
+            <el-input size="mini" v-model="scope.column.data.invoiceamount" @change="onChange(scope.column.data.price,scope.$index,scope.column.data)"></el-input>
+          </span>
+        </div>
+        <p v-else>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
+      </template>
+      <template v-slot:opreation="scope">
+        <el-button size="mini" type="text" @click="delProject(scope.data)" :disabled="isDisabled">删 除</el-button>
+      </template>
+    </tableList>
+    <div class=" container"  style="text-align:left;float: left">
+      <span style="font-size: 14px">出货预测金额: ¥{{tool.formatAmount(alloutamount,2)}}</span>
+      <span style="font-size: 14px;margin-left: 10px">开票预测金额: ¥{{tool.formatAmount(allinvoiceamount,2)}}</span>
+    </div>
+    <div  class="container " style="text-align:right;float: right">
+      <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="param.content.pageNumber"
+          :page-sizes="[20, 50, 100, 200]"
+          :page-size="20"
+          layout="total,sizes, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import addProject from '@/template/prediction/addTemp'
+import tableList from '@/components/table/index5'
+export default {
+  name: "project",
+  props:['id','isDisabled'],
+  components:{addProject,tableList},
+  data(){
+    return {
+      items:[],
+      list:[],
+      tablecolsAdd:[],
+      tablecols:[],
+      alloutamount:0,
+      allinvoiceamount:0,
+      total:0,
+      paramAdd:{
+        "id": 20230705145604,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "sa_salesforecastbillid":this.id,
+          "where": {
+            "condition": ""
+          }
+        }
+      },
+      param:{
+        "id": 20230705145504,
+        "content": {
+          "pageNumber": 1,
+          "pageSize": 20,
+          "type":2, // 1 订单 2项目 3客户
+          "sa_salesforecastbillid":this.id,
+          "where": {
+            "condition": ""
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      console.log(res.data)
+      this.list = res.data
+      if (this.list.length > 0){
+        this.alloutamount = res.data[0].alloutamount
+        this.allinvoiceamount = res.data[0].allinvoiceamount
+      }
+      this.total = res.total
+    },
+    async addProject(val){
+      console.log(val)
+      const res = await this.$api.requested({
+        "id": 20230705145104,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "ownertable": "sa_project",
+          "salesforecastproject": [
+            {
+              "sa_salesforecastprojectid": 0,
+              "ownerid": val.sa_projectid,
+              "discountrate":0
+            }
+          ]
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async addProjects(val){
+      console.log(val,'批量')
+      let addItems = []
+      addItems = val.map(item=>{
+        return {
+          "sa_salesforecastprojectid": 0,
+          "ownerid": item.sa_projectid,
+          "discountrate":0
+        }
+      })
+      const res = await this.$api.requested({
+        "id": 20230705145104,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "ownertable": "sa_project",
+          "salesforecastproject": addItems
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async delProject(val){
+      console.log(val)
+      const res = await this.$api.requested({
+        "id": 20230705145304,
+        "content": {
+          "sa_salesforecastbillid":this.id,
+          "sa_salesforecastprojectids":[val.sa_salesforecastprojectid]
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    async delProjects(){
+      let items = []
+      items = this.items.map(item=>item.sa_salesforecastprojectid)
+      const res = await this.$api.requested({
+        "id": 20230705145304,
+        "content": {
+          "sa_salesforecastbillid":this.id,
+          "sa_salesforecastprojectids":items
+        }
+      })
+      this.tool.showMessage(res,()=>{
+        this.listData()
+      })
+    },
+    selectionChange(val){
+      this.items = val
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.param.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.param.content.pageNumber = val
+      this.listData()
+    },
+    async onChange(val,index,data){
+      const res = await this.$api.requested({
+        "id": 20230705145204,
+        "content": {
+          "sa_salesforecastbillid": this.id,
+          "sa_salesforecastprojectid":data.sa_salesforecastprojectid,
+          "salesforecast": [
+            {
+              "sa_salesforecastid": data.sa_salesforecastid,
+              "outamount": data.outamount,
+              "invoiceamount": data.invoiceamount
+            }
+          ]
+        }
+      })
+      this.onSuccess()
+    },
+    onSuccess(){
+      this.listData()
+      this.$emit('onSuccess')
+    },
+  },
+  mounted() {
+    this.listData()
+  },
+  created() {
+    this.tablecolsAdd = this.tool.tabelCol(this.$route.name).projectAddTable.tablecols
+    this.tablecols = this.tool.tabelCol(this.$route.name).projectTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 106 - 0
src/HDrpManagement/invoicePredictionManage/details/modules/subordinate.vue

@@ -0,0 +1,106 @@
+<template>
+  <div>
+    <basicDetails
+        ref="details"
+        :titleText="mainData.title"
+        formPath="projectChange"
+        :editData="mainData"
+        :mainAreaData="mainAreaData"
+        idname="sa_salesforecastbillid"
+        :tags="[]"
+        :tabs="['订单']"
+        @onEditSuccess="queryMainData($route.query.id)"
+       >
+      <div slot="slot0" class=" normal-panel">
+
+      </div>
+    </basicDetails>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: "subordinate",
+  components:{},
+  props:["id"],
+  data(){
+    return {
+      mainData:'',
+      mainAreaData:'',
+    }
+  },
+  methods:{
+    async queryMainData () {
+      const res = await this.$api.requested({
+        "id": 20230705144704,
+        "content": {
+          "sa_salesforecastbillid":this.id
+        }
+      })
+      this.mainData = res.data
+      this.changeDataStructure()
+
+    },
+    changeDataStructure () {
+      let that = this
+      this.mainAreaData = [
+        {
+          label:'标题',
+          value: this.mainData.title
+        },
+        {
+          label:'单号',
+          value: this.mainData.billnum
+        },
+        {
+          label:'提报人',
+          value: this.mainData.name
+        },
+        {
+          label:'预测时间',
+          value: this.mainData.periodstart + '至' + this.mainData.periodend
+        },
+        {
+          label:'状态',
+          value: this.mainData.status,
+          style: ()=> {
+            let style = {}
+            switch (that.mainData.status) {
+              case '进行中':
+                style = {color:'#00B32B'}
+                break;
+              default:
+                break;
+            }
+            return style
+          }
+        },
+        {
+          label:'出货预测金额',
+          value: '¥'+this.tool.formatAmount(this.mainData.orderinvoamount,2),
+          style: ()=> {
+            let style = {color:'#ff0000'}
+            return style
+          }
+        },
+        {
+          label:'开票预测金额',
+          value: '¥'+this.tool.formatAmount(this.mainData.orderoutamount,2),
+          style: ()=> {
+            let style = {color:'#ff0000'}
+            return style
+          }
+        },
+      ]
+    },
+  },
+  mounted() {
+   /* this.queryMainData()*/
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 4 - 1
src/HDrpManagement/projectPredictionManage/details/index.vue

@@ -2,7 +2,7 @@
  <div>
    <newDetails :titleText="mainData.title" :mainAreaData="mainAreaData" idname="sa_salesforecastbillid" :editData="mainData" :tabs="['项目产品清单']" >
      <template #bottomLeft>
-       <div style="height: calc(96vh)">
+       <div style="height:  calc(100vh - 180px)">
          <p>预测单汇总</p>
          <el-divider></el-divider>
          <el-row>
@@ -311,6 +311,9 @@ export default {
       console.log(val)
       this.id = val.sa_salesforecastbillid
       this.drawer = true
+      this.$nextTick(()=>{
+        this.$refs.subordinate.queryMainData()
+      })
     }
   },
   mounted() {

+ 1 - 1
src/HDrpManagement/projectPredictionManage/details/modules/projectList.vue

@@ -45,7 +45,7 @@
       </el-col>
     </el-row>
 
-    <tableList :height="'calc(90vh - 1750px)'" style="margin-top: 10px" :checkbox="true"  :layout="productCols" :data="productList" :opwidth="200" :custom="true"  fixedName="operation"
+    <tableList :height="'calc(100vh - 800px)'" style="margin-top: 10px" :checkbox="true"  :layout="productCols" :data="productList" :opwidth="200" :custom="true"  fixedName="operation"
                @selectionChange="selectionChangePro">
       <template v-slot:customcol="scope">
         <div v-if="scope.column.columnname === 'operation'">

+ 1 - 1
src/HDrpManagement/projectPredictionManage/details/modules/subordinate.vue

@@ -88,7 +88,7 @@ export default {
     },
   },
   mounted() {
-    this.queryMainData()
+    /*this.queryMainData()*/
   }
 }
 </script>

+ 1 - 1
src/components/newDetailTemp/index.vue

@@ -27,7 +27,7 @@
         <div style="margin:10px 10px 0 5px;border-radius:5px;position:relative" class="container normal-panel sticky" >
           <slot name="bottomRight"></slot>
         </div>
-        <div style="height: calc(100vh - 140px);margin:10px 10px 0 5px;border-radius:5px;position:relative" class="container normal-panel sticky" >
+        <div style="height: calc(100vh - 280px);margin:10px 10px 0 5px;border-radius:5px;position:relative" class="container normal-panel sticky" >
 <!--          <slot name="bottomTabs"></slot>-->
           <tabTemp :tabs="tabs" :editData="editData" :idname="idname" :ownertable="ownertable?ownertable:idname.slice(0, this.idname.length - 2)" @onTabClick="onTabClick">
             <div :slot="'slot' + index" v-for="(tab,index) in tabs" :key="tab.index">

+ 1 - 1
src/components/newLayout/index.vue

@@ -77,7 +77,7 @@ export default {
     }
   },
   mounted() {
-    this.debouned()
+    /*this.debouned()*/
    /* console.log('长度')
     console.log(this.$refs.menu.$refs.menuList.$el.clientHeight,'高度')
     console.log(this.$refs.menu.$refs.menuList.$el.clientHeight % 60)

+ 108 - 0
src/template/prediction/addTemp.vue

@@ -0,0 +1,108 @@
+<template>
+  <div>
+    <el-button type="primary" size="small" @click="onShow">{{title}}</el-button>
+    <el-drawer
+        :title="title"
+        :visible.sync="dialogVisible"
+        size="900px"
+        direction="rtl"
+        :show-close="false"
+        append-to-body
+        >
+      <div class="drawer__panel">
+        <div style="margin-bottom: 20px">
+          <el-button type="primary" size="small" class="inline-16" @click="adds">批量添加</el-button>
+
+          <el-input  style="width:200px;" placeholder="搜索" :suffix-icon="param.content.where.condition?param.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="param.content.where.condition" @keyup.native.enter="listData(param.content.pageNumber = 1)" @clear="listData(param.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+          </el-input>
+        </div>
+
+        <el-row>
+          <el-col :span="24">
+            <tableList :checkbox="true" :data="list" :layout="tablecols" :opwidth="200" :custom="true" fixedName="operation" @selectionChange="checkboxCallBack">
+              <template v-slot:customcol="scope">
+                <div v-if="scope.column.columnname === 'operation'">
+                  <span>{{scope.column.data[scope.column.columnname]}}</span>
+                </div>
+                <div v-else-if="scope.column.columnname === 'tag'">
+                  <div v-for="item in scope.column.data.tag_sys" :key="item.index"  style="float: left;margin-left: 5px;margin-bottom: 5px">
+                    <el-tag  color="#3874F6" size="mini" type="primary" effect="dark">
+                      <span>{{item}}</span>
+                    </el-tag>
+                  </div>
+                  <div v-for="item in scope.column.data.tag" :key="item.index"  style="float: left;margin-left: 5px;margin-bottom: 5px">
+                    <el-tag color="#FA8C16" size="mini" type="warning" effect="dark">
+                      <span>{{item}}</span>
+                    </el-tag>
+                  </div>
+                </div>
+                <p v-else>{{scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname]:'--'}}</p>
+              </template>
+              <template v-slot:opreation="scope">
+                <el-button size="mini" type="text" @click="add(scope.data)">添 加</el-button>
+              </template>
+            </tableList>
+          </el-col>
+        </el-row>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import tableList from '@/components/table/index5'
+import uploadAllData from '@/components/uploadAllData/index'
+export default {
+  name: "addProjectTemp",
+  props:['param','tablecols','title'],
+  components:{tableList,uploadAllData},
+  data() {
+    return {
+      dialogVisible:false,
+      list:[],
+      items:[]
+    }
+  },
+  methods:{
+    onShow(){
+      this.dialogVisible = true
+      this.listData()
+    },
+    async listData(){
+      const res = await this.$api.requested(this.param)
+      this.list = res.data
+      console.log(this.list,'list')
+    },
+    add(val){
+      console.log(val)
+      this.dialogVisible = false
+      this.$emit('add',val)
+
+
+    },
+    checkboxCallBack(val){
+      console.log(val)
+      this.items = val
+    },
+    adds(){
+     /* let addItems = []
+      addItems = this.items.map(item=>{
+        return {
+          "sa_salesforecastprojectid": 0,
+          "ownerid": item.sa_projectid,
+          "discountrate":1
+        }
+      })*/
+      this.dialogVisible = false
+      this.$emit('adds',this.items)
+    }
+  },
+  created() {
+
+  },
+}
+</script>
+
+<style scoped>
+
+</style>

+ 188 - 50
src/views/mediaStatistics/modules/salesfunnel.vue

@@ -1,44 +1,68 @@
 // 各模块文件存储占比
 <template>
   <div class="container normal-panel">
-    <div>
-      <p class="title">销售漏斗图</p>
-      <div class="re-panel">
-        <div id="containerFunnel"></div>
-      </div>
-      
+    <div class="inline-16" style="margin-top:20px;margin-bottom: 50px">
+      <label  class="search__label" >部门:</label>
+      <el-cascader ref="selectdep" size="small" v-model="depment" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"  @change="selectDep"  clearable></el-cascader>
+    </div>
+    <div class="inline-16">
+      <label  class="search__label" >人员:</label>
+      <el-select v-model="person" filterable placeholder="请选择" size="small" clearable @change="selectPerson">
+        <el-option
+            v-for="item in personnelList"
+            :key="item.index"
+            :label="item.name"
+            :value="item.userid">
+        </el-option>
+      </el-select>
+    </div>
+    <div class="inline-16">
+      <el-button-group>
+        <el-button size="small" :type="dataParam.content.dateType==1?'primary':''" @click="dataChange(1)">近一年</el-button>
+        <el-button size="small" :type="dataParam.content.dateType==2?'primary':''" @click="dataChange(2)">近九个月</el-button>
+        <el-button size="small" :type="dataParam.content.dateType==3?'primary':''" @click="dataChange(3)">近六个月</el-button>
+        <el-button size="small" :type="dataParam.content.dateType==4?'primary':''" @click="dataChange(4)">近三个月</el-button>
+      </el-button-group>
     </div>
     <div>
-    <p class="title">表格数据</p>
-    <el-table
-      :data="tableData"
-      style="width: 100%"
-      size="small"
-      border>
-      <el-table-column
-        prop="stagename"
-        label="阶段"
-        width="180">
-      </el-table-column>
-      <el-table-column
-        prop="projectqty"
-        label="项目数"
-        width="180">
-      </el-table-column>
-      <el-table-column
-        prop="signamount_due"
-        label="签约金额(元)">
-      </el-table-column>
-      <el-table-column
-        prop="totalinvestment"
-        label="总计预计投资金额(万元)">
-      </el-table-column>
-      <el-table-column
-        prop="budgetary"
-        label="项目预算(万元)">
-      </el-table-column>
-    </el-table>
+      <el-row>
+        <el-col :span="14">
+          <p class="title">销售漏斗图</p>
+          <div class="re-panel">
+            <div id="containerFunnel" style="height: calc(100vh - 500px)"></div>
+          </div>
+        </el-col>
+        <el-col :span="10">
+          <div>
+            <p class="title">表格数据</p>
+            <el-table
+                :data="tableData"
+                style="width: 100%"
+                width="900px"
+                size="small"
+                border>
+              <el-table-column
+                  prop="stagename"
+                  label="阶段"
+                  width="120">
+              </el-table-column>
+              <el-table-column
+                  prop="projectqty"
+                  label="项目数"
+                  width="100">
+              </el-table-column>
+              <el-table-column
+                  prop="signamount_due"
+                  label="预计签约金额(万元)">
+              </el-table-column>
+            </el-table>
+          </div>
+        </el-col>
+      </el-row>
+
+
     </div>
+
   </div>
 </template>
 
@@ -50,15 +74,124 @@ export default {
     return {
       chartPie:null,
       tableData:[],
-      data:[{ stagename: '简历筛选', sequence1: 253 },]
+      person:'',
+      depment:'',
+      dateType:"",
+      data:[{ stagename: '简历筛选', sequence1: 253 },],
+      activeName: '部门',
+      dataid:'',
+      range:'',
+      pointValue:'',
+      isDep:false,
+      isPerson:false,
+      visible:false,
+      deplist:[],
+      personnelList:[],
+      depmentParam:{
+        "id": 20230620102004,
+        "content": {
+        }
+      },
+      dataParam:{
+        "id": 20230630151504,
+        "content": {
+          "type":0, // 0 按人搜素 1 按部门搜索
+          "dataid":0, // 人员id或部门id
+          'dateType':1,
+          "where": {
+            "begindate": "",
+            "enddate":"",
+            "departmentid":""
+          }
+        }
+      }
     }
   },
   methods:{
+    async departmentrtment() {
+      const res = await this.$api.requested(this.depmentParam)
+      this.deplist = this.createMenu(res.data.dep)
+      this.personnelList = res.data.hr
+      /*this.range = JSON.parse(window.sessionStorage.getItem('active_account')).name*/
+      this.renderPie()
+    },
+    createMenu (array) {
+      var that = this
+      let arr = []
+      function convertToElementTree(node) {
+        // 新节点
+        if (node.subdep.length === 0){
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+          }
+        }else {
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+            children: []
+          }
+        }
+        if (node.subdep && node.subdep.length > 0) {
+          // 如果存在子节点
+          for (var index = 0; index < node.subdep.length; index++) {
+            // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+            elNode.children.push(convertToElementTree(node.subdep[index]));
+          }
+        }
+        return elNode;
+      }
+      array.forEach((element) => {
+        arr.push(convertToElementTree(element))
+      });
+      return arr
+    },
+    selectDep(val) {
+      console.log(val)
+      this.person = ''
+      this.dataParam.content.type = 1
+      this.dataParam.content.dataid = val[0]
+      this.getProportionOfFileModel()
+    },
+    selectPerson(val){
+      console.log(val)
+      this.depment = ''
+      this.dataParam.content.type = 0
+      this.dataParam.content.dataid = val
+      console.log(this.dataParam)
+      this.getProportionOfFileModel()
+    },
+    dataChange(val){
+      this.dataParam.content.dateType = val
+      this.getProportionOfFileModel()
+    },
     renderPie() {
       const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed'];
       this.chartPie = new Funnel('containerFunnel', {
         data: this.data,
-        maxSize:0.3,
+        maxSize:0.6,
         xField: 'stagename',
         yField: 'sequence1',
         shape: 'pyramid',
@@ -72,7 +205,7 @@ export default {
             const group = new G.Group({});
             const content = ()=>{
                 if (this.tableData[0]) {
-                  const text = `${datum.stagename}  当前项目数: ${datum.projectqty} 项目数: ${this.tableData[0].projectqty} 转化率: ${((datum[Funnel.CONVERSATION_FIELD][1] / datum[Funnel.CONVERSATION_FIELD][0]) * 100).toFixed(2)}%  总投资金额: ${datum.totalinvestment} 总计项目预算: ${datum.budgetary} 总预计签约金额: ${datum.signamount_due}`
+                  const text = `${datum.stagename}  当前项目数: ${datum.projectqty} 项目数: ${this.tableData[0].projectqty} 转化率: ${datum.zhl?datum.zhl* 100 + '%':'--'}  预计签约金额: ${datum.signamount_due}万元`
                   const lines = text.split('  ');
                   return lines.join('\n');
                 }
@@ -92,7 +225,7 @@ export default {
             group.addShape({
               type: 'text',
               attrs: {
-                x: 30,
+                x: 40,
                 y: 0,
                 text: content(),
                 textAlign: 'left',
@@ -102,7 +235,7 @@ export default {
               },
             });
             return group;
-            
+
           },
         },
         tooltip:{
@@ -128,26 +261,31 @@ export default {
         },
       });
       this.chartPie.render();
+      /*this.departmentrtment()*/
       this.getProportionOfFileModel()
     },
     async getProportionOfFileModel () {
-      let param = {
+     /* let param = {
         "id": 20230630151504,
         "content": {
-            "where": {
-              "begindate": "",
-              "enddate":"",
-              "departmentid":""
-            }
+          "type":'', // 0 按人搜素 1 按部门搜索
+          "dataid":"", // 人员id或部门id
+          "where": {
+            "begindate": "",
+            "enddate":"",
+            "departmentid":""
+          }
         }
-      }
-      const res = await this.$api.requested(param)
+      }*/
+      console.log(this.dataParam,'dataParam')
+      const res = await this.$api.requested(this.dataParam)
       this.tableData = res.data
       this.chartPie.changeData(res.data)
     }
   },
   mounted () {
-    this.renderPie()
+   /* this.renderPie()*/
+    this.departmentrtment()
   }
 }
 
@@ -166,6 +304,6 @@ export default {
   border-left: .3rem solid #3874F6;
 }
 .container{
-  height:calc(100vh - 200px)
+  height:calc(100vh - 180px)
 }
 </style>

+ 306 - 0
src/views/mediaStatistics/modules/salesfunnel2.vue

@@ -0,0 +1,306 @@
+// 各模块文件存储占比
+<template>
+  <div class="container normal-panel">
+    <div>
+      <p class="title">销售漏斗图</p>
+      <div class="mt-10">
+        <label  class="search__label" >范围:</label>
+        <el-popover
+            placement="bottom"
+            v-model="visible"
+            :stretch="true"
+            trigger="click">
+          <el-tabs v-model="activeName" @tab-click="handleClick">
+            <el-tab-pane label="部门" name="部门">
+              <el-cascader-panel ref="selectdep" :options="deplist" :props="{emitPath:true,expandTrigger:'hover',checkStrictly:true,label:'label',value:'departmentid',children:'children'}"  @change="selectDep"  clearable></el-cascader-panel>
+            </el-tab-pane>
+            <el-tab-pane label="人员" name="人员">
+              <el-cascader-panel ref="selectPerson" :options="personnelList" :props="{label:'name',value:'userid'}"   @change="selectPerson"  clearable></el-cascader-panel>
+            </el-tab-pane>
+          </el-tabs>
+          <el-input style="width: 200px" size="small" slot="reference" v-model="range" placeholder="请选择" @input="departmentrtment"></el-input>
+        </el-popover>
+      </div>
+      <div class="re-panel">
+        <div id="containerFunnel"></div>
+      </div>
+
+    </div>
+    <div>
+    <p class="title">表格数据</p>
+    <el-table
+      :data="tableData"
+      style="width: 100%"
+      size="small"
+      border>
+      <el-table-column
+        prop="stagename"
+        label="阶段"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="projectqty"
+        label="项目数"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="signamount_due"
+        label="预计签约金额(万元)">
+      </el-table-column>
+      <el-table-column
+        prop="totalinvestment"
+        label="投资金额(万元)">
+      </el-table-column>
+      <el-table-column
+        prop="budgetary"
+        label="项目预算(万元)">
+      </el-table-column>
+    </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import { Funnel,G2 } from '@antv/g2plot';
+const G = G2.getEngine('canvas');
+export default {
+  data () {
+    return {
+      chartPie:null,
+      tableData:[],
+      data:[{ stagename: '简历筛选', sequence1: 253 },],
+      activeName: '部门',
+      dataid:'',
+      range:'',
+      pointValue:'',
+      isDep:false,
+      isPerson:false,
+      visible:false,
+      deplist:[],
+      personnelList:[],
+      depmentParam:{
+        "id": 20230620102004,
+        "content": {
+        }
+      },
+      dataParam:{
+        "id": 20230630151504,
+        "content": {
+          "type":0, // 0 按人搜素 1 按部门搜索
+          "dataid":0, // 人员id或部门id
+          "where": {
+            "begindate": "",
+            "enddate":"",
+            "departmentid":""
+          }
+        }
+      }
+    }
+  },
+  methods:{
+    async departmentrtment() {
+      const res = await this.$api.requested(this.depmentParam)
+      this.deplist = this.createMenu(res.data.dep)
+      this.personnelList = res.data.hr
+      /*this.range = JSON.parse(window.sessionStorage.getItem('active_account')).name*/
+      this.renderPie()
+    },
+    createMenu (array) {
+      var that = this
+      let arr = []
+      function convertToElementTree(node) {
+        // 新节点
+        if (node.subdep.length === 0){
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+          }
+        }else {
+          var elNode = {
+            label: node["depname"],
+            parentid:node['parentid'],
+            parentname:node['parentname'],
+            departmentid:node["departmentid"],
+            value:node["departmentid"],
+            remarks:node["remarks"],
+            isused:node["isused"],
+            changedate:node['changedate'],
+            changeby:node['changeby'],
+            createdate:node['createdate'],
+            createby:node['createby'],
+            depno:node['depno'],
+            disabled:that.pageOnlyRead,
+            children: []
+          }
+        }
+        if (node.subdep && node.subdep.length > 0) {
+          // 如果存在子节点
+          for (var index = 0; index < node.subdep.length; index++) {
+            // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+            elNode.children.push(convertToElementTree(node.subdep[index]));
+          }
+        }
+        return elNode;
+      }
+      array.forEach((element) => {
+        arr.push(convertToElementTree(element))
+      });
+      return arr
+    },
+    selectDep(val) {
+      let dataDep = this.$refs.selectdep.getCheckedNodes(true)[0].data
+      this.range = dataDep.label
+      this.isDep = true
+      this.isPerson = false
+      this.dataid = val[val.length -1]
+      this.dataParam.content.type = 1
+      this.dataParam.content.dataid = this.dataid
+      this.visible = false
+      this.getProportionOfFileModel()
+    },
+    selectPerson(val){
+      let dataperson = this.$refs.selectPerson.getCheckedNodes(true)[0].data
+      this.range = dataperson.name
+      this.isDep = false
+      this.isPerson = true
+
+      this.dataid = val[val.length-1]
+      this.dataParam.content.type = 0
+      this.dataParam.content.dataid = this.dataid
+      this.visible = false
+      this.getProportionOfFileModel()
+
+    },
+    handleClick(tab, event) {
+      console.log(tab, event);
+    },
+    renderPie() {
+      const colorArray = ['#6395fa','#63daab','#657798','#f7c122','#7666fa','#75cbed'];
+      this.chartPie = new Funnel('containerFunnel', {
+        data: this.data,
+        maxSize:0.5,
+        xField: 'stagename',
+        yField: 'sequence1',
+        shape: 'pyramid',
+        dynamicHeight: false,
+        legend: false,
+        label: {
+          layout:"fixedOverlap",
+          position:'right',
+          offsetX:40,
+          content:(datum)=>{
+            const group = new G.Group({});
+            const content = ()=>{
+                if (this.tableData[0]) {
+                  const text = `${datum.stagename}  当前项目数: ${datum.projectqty} 项目数: ${this.tableData[0].projectqty} 转化率: ${datum.zhl?datum.zhl* 100 + '%':'--'}  投资金额: ${datum.totalinvestment}万元 项目预算: ${datum.budgetary}万元 预计签约金额: ${datum.signamount_due}万元`
+                  const lines = text.split('  ');
+                  return lines.join('\n');
+                }
+            };
+            const color = ()=>{
+              let clr = ''
+              this.tableData.some((e,index) =>{
+                if (e.stagename == datum.stagename) {
+                  clr = colorArray[index]
+                }
+              })
+              if (clr == '') {
+                clr= '#666'
+              }
+              return clr
+            };
+            group.addShape({
+              type: 'text',
+              attrs: {
+                x: 40,
+                y: 0,
+                text: content(),
+                textAlign: 'left',
+                fontSize: 14,
+                textBaseline: 'top',
+                fill: color()
+              },
+            });
+            return group;
+
+          },
+        },
+        tooltip:{
+          customContent: (title, items) => {
+            // 构建自定义内容
+            const content = `<div>
+              <ul style="padding:10px">
+                ${items.map((item) => `
+                <li>
+                <p style="margin-bottom:10px">${title}</p>
+                <p>项目数:${item.data.projectqty}</p>
+                </li>`).join('')}
+              </ul>
+            </div>`;
+
+            return content;
+          },
+        },
+        conversionTag: false,
+        funnelStyle: {
+          stroke: '#fff',
+          lineWidth: 3,
+        },
+      });
+      this.chartPie.render();
+      /*this.departmentrtment()*/
+      this.getProportionOfFileModel()
+    },
+    async getProportionOfFileModel () {
+     /* let param = {
+        "id": 20230630151504,
+        "content": {
+          "type":'', // 0 按人搜素 1 按部门搜索
+          "dataid":"", // 人员id或部门id
+          "where": {
+            "begindate": "",
+            "enddate":"",
+            "departmentid":""
+          }
+        }
+      }*/
+      const res = await this.$api.requested(this.dataParam)
+      this.tableData = res.data
+      this.chartPie.changeData(res.data)
+    }
+  },
+  mounted () {
+   /* this.renderPie()*/
+    this.departmentrtment()
+  }
+}
+
+</script>
+<style>
+</style>
+<style scoped>
+.title{
+  height: 20px;
+  line-height: 20px;
+  font-size: 14px;
+  text-indent: 7px;
+  font-weight: bold;
+  color: #333333;
+  margin-bottom: 20px;
+  border-left: .3rem solid #3874F6;
+}
+.container{
+  height:calc(100vh - 200px)
+}
+</style>