Ver código fonte

项目提成

wucl 2 anos atrás
pai
commit
6ee8e9f48f

+ 3 - 0
src/api/modules/item.js

@@ -27,4 +27,7 @@ export default {
   me(params) {
     return request.get(`item/me`, { params: params })
   },
+  itemUser(params){
+    return request.get(`itemUser/user`, { params: params })
+  }
 }

+ 21 - 0
src/api/modules/postRatio.js

@@ -0,0 +1,21 @@
+import request from '@/utils/request'
+/*
+* 岗位抽成率
+*/
+export default {
+  list(params) {
+    return request.get(`brokeragePostRatio`, { params: params })
+  },
+  detail(params) {
+    return request.get(`brokeragePostRatio/${params}`)
+  },
+  add(params) {
+    return request.post(`brokeragePostRatio`, params)
+  },
+  edit(params) {
+    return request.put(`brokeragePostRatio`, params)
+  },
+  delete(params) {
+    return request.delete(`brokeragePostRatio/${params}`)
+  },
+}

+ 2 - 2
src/views/item/list.vue

@@ -142,8 +142,8 @@
             <PermissionButton
               menu-code="_views_item_plan"
               class-name="filter-item"
-              name="排期"
-              type="info"
+              name=""
+              type="primary"
               :page-jump="true"
               :page-query="{id: row.id,itemName: row.name}"
               round

+ 156 - 45
src/views/item/plan.vue

@@ -102,48 +102,123 @@
                 </el-col>
               </el-row>
             </div>
-            <div>
-              <div class="postInfo-container">
-                <el-row>
-                  <el-col>
-                    <el-form-item label="负责人:"
-                                  prop="endDate"
-                                  label-width="180px"
-                                  class="postInfo-container-item">
-                      <el-select
-                        v-model="postForm.dutyerId"
-                        placeholder=""
-                        clearable
-                        filterable
-                        class="filter-item"
-                      >
-                        <el-option
-                          v-for="item in users"
-                          :key="item.id"
-                          :label="item.name"
-                          :value="item.id"
-                        />
-                      </el-select>
-                    </el-form-item>
-                  </el-col>
-                </el-row>
-              </div>
-            </div>
-            <div>
-              <div class="postInfo-container">
-                <el-row>
-                  <el-col>
-                    <el-form-item
-                      label="备注信息:"
-                      prop="remark"
-                      label-width="180px"
-                      class="postInfo-container-item"
+            <div class="postInfo-container">
+              <el-row>
+                <el-col>
+                  <el-form-item label="负责人:"
+                                prop="endDate"
+                                label-width="180px"
+                                class="postInfo-container-item">
+                    <el-select
+                      v-model="postForm.dutyerId"
+                      placeholder=""
+                      clearable
+                      filterable
+                      class="filter-item"
                     >
-                      <el-input type="textarea" v-model="postForm.remark" class="filter-item" placeholder="200字符"/>
-                    </el-form-item>
-                  </el-col>
-                </el-row>
-              </div>
+                      <el-option
+                        v-for="item in users"
+                        :key="item.id"
+                        :label="item.name"
+                        :value="item.id"
+                      />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </div>
+            <div class="postInfo-container">
+              <el-row>
+                <el-col>
+                  <el-form-item
+                    label="阶段权重:"
+                    prop="weight"
+                    :rules="{required: true, message: '请填写阶段权重(0-100)', trigger: 'blur'}"
+                    label-width="180px"
+                    class="postInfo-container-item"
+                  >
+                    <el-input type="text" v-model="postForm.weight" class="filter-item" placeholder="计算参与人员提成">
+                      <i slot="suffix" style="font-size:normal;margin-right: 10px;line-height: 30px">%</i>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </div>
+            <div class="postInfo-container">
+              <el-row>
+                <el-col>
+                  <el-form-item
+                    label="逾期提成系数:"
+                    prop="coefficient"
+                    :rules="{required: true, message: '请填写逾期提成系数(0-100)', trigger: 'blur'}"
+                    label-width="180px"
+                    class="postInfo-container-item"
+                  >
+                    <el-input type="text" v-model="postForm.coefficient" class="filter-item" placeholder="计算参与人员提成">
+                      <i slot="suffix" style="font-size:normal;margin-right: 10px;line-height: 30px">%</i>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </div>
+            <div class="postInfo-container">
+              <el-row>
+                <el-col>
+                  <el-form-item
+                    label="备注信息:"
+                    prop="remark"
+                    label-width="180px"
+                    class="postInfo-container-item"
+                  >
+                    <el-input type="textarea" v-model="postForm.remark" class="filter-item" placeholder="200字符"/>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </div>
+            <div class="postInfo-container">
+              <el-form-item
+                label="参与人员:"
+                prop="remark"
+                label-width="180px"
+                class="postInfo-container-item"
+              >
+                <el-button type="primary" icon="el-icon-edit" class="filter-item" @click="openJoiner" >设置</el-button>
+              </el-form-item>
+              <el-dialog
+                width="600px"
+                :title=" '['+postForm.name +']参与人员提成系数设置'"
+                :visible.sync="dialogFormVisible"
+                :close-on-click-modal="true"
+              >
+                <y-page-list-layout :get-page-list="getJoinUsers" >
+                  <el-table
+                    slot="table"
+                    row-key="id"
+                    :data="joinUsers"
+                    ref="multipleTable"
+                    :header-row-style="{color: '#333333'}"
+                    @selection-change="handleSelectionChange"
+                    style="border-left: 1px solid #EBECED;border-right: 1px solid #EBECED;color: #333333;"
+                  >
+                    <el-table-column
+                      type="selection"
+                      width="55">
+                    </el-table-column>
+                    <el-table-column label="人员" width="100" align="center">
+                      <template slot-scope="{row}">
+                        <span>{{ row.userName }}</span>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="提成系数"  align="center">
+                      <template slot-scope="{row}">
+                        <el-input v-model="row.weight" placeholder="请输入数字">
+                          <i slot="suffix" style="font-size:normal;margin-right: 10px;line-height: 30px">%</i>
+                        </el-input>
+                      </template>
+                    </el-table-column>
+                  </el-table>
+                </y-page-list-layout>
+              </el-dialog>
             </div>
             <el-button type="success" id="addNode" @click="saveNode">保存</el-button>
             <el-button type="normal"  @click="clean">清空</el-button>
@@ -176,7 +251,6 @@
 </template>
 <script>
   import Breadcrumb from '@/components/Breadcrumb'
-
   export default {
     name: 'itemDetail',
     components: {
@@ -187,7 +261,9 @@
         type: 'detail',
         postForm: {
           itemId: this.$route.query.id,
-          id:null
+          id:null,
+          participators:[],
+          name:null
         },
         itemId: this.$route.query.id,
         itemName: this.$route.query.itemName,
@@ -200,7 +276,9 @@
         },
         stageFlow:[],
         stages:[],
-        users: []
+        users: [],
+        joinUsers: [],
+        dialogFormVisible:false,
       }
     },
     created() {
@@ -209,8 +287,40 @@
       this.$api.user.simpleAll().then(res => {
         this.users = res.data;
       });
+      this.getJoinUsers();
     },
     methods: {
+      toggleSelection(rows) {
+        if (rows) {
+          rows.forEach(row => {
+            if (row.id!=null){
+              this.$refs.multipleTable.toggleRowSelection(row, true);
+            }
+          });
+        }
+      },
+      handleSelectionChange(val){
+        this.postForm.participators = val;
+      },
+      openJoiner(){
+        this.dialogFormVisible = true;
+        setTimeout(() => {
+          this.toggleSelection(this.joinUsers);
+        }, 200)
+      },
+      getJoinUsers(){
+        const that = this;
+        that.$api.item.itemUser({itemId:this.itemId, stageId:this.id}).then(data => {
+          if (data.code === 200) {
+            this.joinUsers = data.data;
+          } else {
+            this.$message({
+              type: 'error',
+              message: data.msg
+            })
+          }
+        })
+      },
       getSimpleAll(){
         this.$api.itemStage.simpleAll(this.itemId).then(res => {
           this.stages = res.data;
@@ -226,6 +336,7 @@
           this.$api.itemStage.detail(id).then(res => {
             this.postForm = res.data;
             this.id = this.postForm.id;
+            this.getJoinUsers();
           });
         }
       },
@@ -328,7 +439,7 @@
       flex: 1;
     }
     .form-container{
-      padding-top: 100px;
+      padding-top: 30px;
       width: 700px;
       height: 800px;
       border: 1px solid darkgray;

+ 132 - 17
src/views/set/brokerage.vue

@@ -8,7 +8,13 @@
              style="position: relative;margin-top: 30px">
       <el-tabs v-model="activeName" @tab-click="handleClick" type="border-card">
         <el-tab-pane label="提成比例" name="first">
-          <y-page-list-layout :get-page-list="getMarketerRatioList" :page-list="marketerRatioRecord">
+          <el-alert
+            title="客户经理下单时选择的项目类型和业务来源确定的提成比例,用于计算客户经理的提成金额。"
+            type="info"
+            show-icon
+            :closable="false">
+          </el-alert>
+          <y-page-list-layout :get-page-list="getMarketerRatioList" :page-list="marketerRatioRecord" :page-para="listQuery1">
             <el-table
               size="medium"
               slot="table"
@@ -22,17 +28,17 @@
             >
               <el-table-column label="项目类型" min-width="150" align="center">
                 <template slot-scope="{row}">
-                  <span>{{ row.itemCate }}</span>
+                  <span>{{ row.itemCateName }}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="项目来源" min-width="150" align="center">
+              <el-table-column label="业务来源" min-width="150" align="center">
                 <template slot-scope="{row}">
-                  <span>{{ row.itemSource }}</span>
+                  <span>{{ row.itemSourceName }}</span>
                 </template>
               </el-table-column>
               <el-table-column label="提成比例" min-width="30" align="center">
                 <template slot-scope="{row}">
-                  <el-input v-model="row.ratio" placeholder="请输入内容">
+                  <el-input v-model="row.ratio" placeholder="请输入数字">
                     <i slot="suffix" style="font-size:normal;margin-right: 10px;line-height: 30px">%</i>
                   </el-input>
                 </template>
@@ -50,8 +56,63 @@
             </el-table>
           </y-page-list-layout>
         </el-tab-pane>
+        <el-tab-pane label="岗位抽成率" >
+          <el-alert
+            title="根据不同的管理层岗位确定该岗位人员抽成比例,用于计算客户经理的直接或间接领导提成金额。"
+            type="info"
+            show-icon
+            :closable="false">
+          </el-alert>
+          <y-page-list-layout :get-page-list="getPostRatio" :page-list="postRatioRecord" :page-para="listQuery2">
+            <el-table
+              size="medium"
+              slot="table"
+              row-key="id"
+              v-loading="listLoading"
+              :data="postRatioRecord.records"
+              fit
+              highlight-current-row
+              :header-row-style="{color: '#333333'}"
+              style="border-left: 1px solid #EBECED;border-right: 1px solid #EBECED;color: #333333;"
+            >
+              <el-table-column label="部门" min-width="150" align="center">
+                <template slot-scope="{row}">
+                  <span>{{ row.departmentName }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="岗位" min-width="150" align="center">
+                <template slot-scope="{row}">
+                  <span>{{ row.postName }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="抽成率" min-width="30" align="center">
+                <template slot-scope="{row}">
+                  <el-input v-model="row.brokerageRatio" placeholder="请输入数字">
+                    <i slot="suffix" style="font-size:normal;margin-right: 10px;line-height: 30px">%</i>
+                  </el-input>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" align="center" width="250" class-name="small-padding fixed-width">
+                <template slot-scope="{row}">
+                  <el-button
+                    class-name="filter-item"
+                    type="primary"
+                    @click="updatePostRatio(row)"
+                    round
+                  >保存</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </y-page-list-layout>
+        </el-tab-pane>
         <el-tab-pane label="预提金额">
-          <y-page-list-layout :get-page-list="getBaseAmount" :page-list="baseAmount">
+          <el-alert
+            title="一般用于非市场人员每月固定预提成金额,此处未设置则采用[配置项]中[土规部非市场人员每月默认预提金额]进行每月提成计算。"
+            type="info"
+            show-icon
+            :closable="false">
+          </el-alert>
+          <y-page-list-layout :get-page-list="getBaseAmount" :page-list="baseAmount" :page-para="listQuery3">
             <el-table
               size="medium"
               slot="table"
@@ -81,9 +142,9 @@
                   </span>
                 </template>
               </el-table-column>
-              <el-table-column label="默认提成金额" align="center" width="360">
+              <el-table-column label="默认提成金额" align="center" width="300">
                 <template slot-scope="{row}">
-                  <el-input v-model="row.baseAmount">
+                  <el-input v-model="row.baseAmount" placeholder="请输入数字">
                     <i slot="suffix" style="font-size:normal;margin-right: 10px;line-height: 30px">¥</i>
                   </el-input>
                 </template>
@@ -215,12 +276,22 @@
             value:null
           },
         },
-        listLoading: false,
-        listQuery: {
-          current: 1,
+        postRatioRecord:{ records: [] },
+        listLoading: true,
+        listQuery1: {
+          page: 1,
+          size: 10,
+          descs: 'id',
+        },
+        listQuery2: {
+          page: 1,
+          size: 10,
+          descs: 'id',
+        },
+        listQuery3: {
+          page: 1,
           size: 10,
           descs: 'id',
-          me: false
         },
       }
     },
@@ -228,6 +299,34 @@
       this.getMarketerRatioList();
     },
     methods: {
+      updateBaseAmount(row){
+        this.$api.baseAmount.edit(row).then(res => {
+          if (res.code === 200) {
+            this.$notify({
+              title: '成功',
+              message: '修改成功',
+              type: 'success',
+              duration: 2000
+            })
+            this.getBaseAmount();
+          }
+        }).catch(() => {
+        });
+      },
+      updatePostRatio(row){
+        this.$api.postRatio.edit(row).then(res => {
+          if (res.code === 200) {
+            this.$notify({
+              title: '成功',
+              message: '修改成功',
+              type: 'success',
+              duration: 2000
+            })
+          }
+          this.getPostRatio();
+        }).catch(() => {
+        });
+      },
       doSave(config) {
         if (!config.value) {
           this.$notify({
@@ -247,6 +346,7 @@
               duration: 2000
             })
           }
+          this.getGlobalConfig();
         }).catch(() => {
           this.listLoading = false
         });
@@ -254,7 +354,7 @@
       getBaseAmount(){
         const that = this;
         this.listLoading = true;
-        this.$api.baseAmount.list(that.listQuery).then(res => {
+        this.$api.baseAmount.list(that.listQuery3).then(res => {
           that.baseAmount = res.data;
           setTimeout(() => {
             that.listLoading = false
@@ -271,7 +371,8 @@
               message: '修改成功',
               type: 'success',
               duration: 2000
-            })
+            });
+            this.getMarketerRatioList();
           }
         }).catch(() => {
         });
@@ -281,10 +382,24 @@
           this.getBaseAmount();
         }else if (tab.label==='配置项') {
           this.getGlobalConfig();
-        }else {
-          this.getMarketerRatioList()
+        }else if (tab.label === '岗位抽成率'){
+          this.getPostRatio();
+        } else {
+          this.getMarketerRatioList();
         }
       },
+      getPostRatio(){
+        const that = this;
+        this.listLoading = true;
+        this.$api.postRatio.list(that.listQuery2).then(res => {
+          that.postRatioRecord = res.data;
+          setTimeout(() => {
+            that.listLoading = false
+          }, 200)
+        }).catch(() => {
+          that.listLoading = false
+        });
+      },
       getGlobalConfig(){
         const that = this;
         this.listLoading = true;
@@ -311,7 +426,7 @@
       getMarketerRatioList() {
         const that = this;
         this.listLoading = true;
-        this.$api.marketerRatio.list(that.listQuery).then(res => {
+        this.$api.marketerRatio.list(that.listQuery1).then(res => {
           that.marketerRatioRecord = res.data;
           setTimeout(() => {
             that.listLoading = false