Explorar o código

后台制单是否需要付款,客户协作

ct hai 4 días
pai
achega
ffae3293fd

+ 9 - 0
src/api/company/companyConfig.js

@@ -29,4 +29,13 @@ export function configUserCheck(data) {
   })
   })
 }
 }
 
 
+//配置公司默认是否开启小黑屋
+export function config(data) {
+  return request({
+    url: '/company/company/config',
+    method: 'post',
+    data: data
+  })
+}
+
 
 

+ 18 - 1
src/api/crm/customer.js

@@ -200,4 +200,21 @@ export function updateCustomerSource(data) {
     method: 'post',
     method: 'post',
     data: data
     data: data
   })
   })
-}
+}
+
+export function selectByCustomerIds(data) {
+  return request({
+    url: '/crm/assist/selectByCustomerIds',
+    method: 'post',
+    data: data
+  })
+}
+
+export function allOperation(data) {
+  return request({
+    url: '/crm/assist/allOperation',
+    method: 'post',
+    data: data
+  })
+}
+

+ 37 - 10
src/views/company/companyConfig/index.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div class="app-container">
   <div class="app-container">
-      <el-tabs v-model="activeName"    >
+      <el-tabs v-model="activeName">
           <el-tab-pane label="客户管理配置" name="sysConfig">
           <el-tab-pane label="客户管理配置" name="sysConfig">
           <el-form ref="sysConfig" :model="sysConfig" label-width="120px">
           <el-form ref="sysConfig" :model="sysConfig" label-width="120px">
             <el-form-item label="公海回收规则">
             <el-form-item label="公海回收规则">
@@ -141,6 +141,18 @@
             </div>
             </div>
           </el-form>
           </el-form>
         </el-tab-pane>
         </el-tab-pane>
+        <el-tab-pane label="商城配置" name="storeConfig">
+          <el-form ref="storeConfig" label-width="180px">
+            <el-form-item label="后台制单是否需要客户支付">
+              <el-row>
+                <el-switch v-model="isPay"></el-switch>
+              </el-row>
+            </el-form-item>
+            <div style="float:right;margin-right:20px">
+              <el-button type="primary" @click="onSubmit6">提交</el-button>
+            </div>
+          </el-form>
+        </el-tab-pane>
       </el-tabs>
       </el-tabs>
 
 
       <el-dialog :title="customerExt.title" :visible.sync="customerExt.open" width="500px" append-to-body>
       <el-dialog :title="customerExt.title" :visible.sync="customerExt.open" width="500px" append-to-body>
@@ -168,7 +180,7 @@
 
 
 <script>
 <script>
 import { getCompanyInfo } from "@/api/company/company";
 import { getCompanyInfo } from "@/api/company/company";
-import { getConfigKey,updateConfig, configUserCheck } from "@/api/company/companyConfig";
+import { getConfigKey,updateConfig, configUserCheck,config } from "@/api/company/companyConfig";
 import { listCustomerExt, getCustomerExt, delCustomerExt, addCustomerExt, updateCustomerExt } from "@/api/crm/customerExt";
 import { listCustomerExt, getCustomerExt, delCustomerExt, addCustomerExt, updateCustomerExt } from "@/api/crm/customerExt";
 
 
 export default {
 export default {
@@ -213,11 +225,12 @@ export default {
       redPacketConfig:{},
       redPacketConfig:{},
 
 
       redPacketConfigForm:{},
       redPacketConfigForm:{},
-
+      form6:{},
       qwConfigForm:{},
       qwConfigForm:{},
       qwkfConfigForm:{},
       qwkfConfigForm:{},
       companyUserConfig: {},
       companyUserConfig: {},
       userIsDefaultBlack: false,
       userIsDefaultBlack: false,
+      isPay:true
     };
     };
   },
   },
   created() {
   created() {
@@ -239,6 +252,18 @@ export default {
     getCompanyInfo(){
     getCompanyInfo(){
       getCompanyInfo().then(response => {
       getCompanyInfo().then(response => {
         this.company = response.data;
         this.company = response.data;
+        //会员审核
+        if(response.data.fsUserIsDefaultBlack==1){
+          this.userIsDefaultBlack = true;
+        } else{
+          this.userIsDefaultBlack = false;
+        }
+        //支付
+        if(response.data.isPay==1){
+          this.isPay = true;
+        } else{
+          this.isPay = false;
+        }
       });
       });
     },
     },
     /** 新增按钮操作 */
     /** 新增按钮操作 */
@@ -330,12 +355,6 @@ export default {
               if(response.data.configValue!=null){
               if(response.data.configValue!=null){
                 this.redPacketConfig=JSON.parse(response.data.configValue);
                 this.redPacketConfig=JSON.parse(response.data.configValue);
               }
               }
-            }else if (key=="companyUser:config"){
-              console.log(response.data)
-              this.companyUserConfig=response.data;
-              if(response.data.configValue != null){
-                this.userIsDefaultBlack = JSON.parse(response.data.configValue);
-              }
             }
             }
 
 
         });
         });
@@ -383,7 +402,15 @@ export default {
       configUserCheck({userIsDefaultBlack: this.userIsDefaultBlack}).then(response => {
       configUserCheck({userIsDefaultBlack: this.userIsDefaultBlack}).then(response => {
         if (response.code === 200) {
         if (response.code === 200) {
           this.msgSuccess("修改成功");
           this.msgSuccess("修改成功");
-          this.getConfigKey("companyUser:config");
+          getCompanyInfo();
+        }
+      });
+    },
+    onSubmit6() {
+      config({isPay: this.isPay?1:0}).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+          getCompanyInfo();
         }
         }
       });
       });
     },
     },

+ 580 - 122
src/views/crm/components/assistUser.vue

@@ -1,32 +1,34 @@
 <template>
 <template>
     <div>
     <div>
-        <el-form ref="assistForm" :model="assistForm"  label-width="120px">
+        <el-form label-position="left" ref="assistForm" :model="assistForm"  label-width="120px" v-if="!flag">
             <el-form-item label="未添加协作客户" >
             <el-form-item label="未添加协作客户" >
-            <span>{{this.noAssistCount}}个</span>
+                <span>{{this.noAssistCount}}个</span>
             </el-form-item>
             </el-form-item>
             <el-form-item label="未添加协作客户" >
             <el-form-item label="未添加协作客户" >
-            <span>{{this.assistCount}}个</span>
+                <span>{{this.assistCount}}个</span>
             </el-form-item>
             </el-form-item>
 
 
-            <el-form-item label="协作人" prop="users">
+            <el-form-item label="协作人" prop="users" label-width="60px">
                 <el-row :gutter="10" class="mb8">
                 <el-row :gutter="10" class="mb8">
                     <el-col :span="1.5">
                     <el-col :span="1.5">
                         <el-button @click="handleUserSelect">添加协作人</el-button>
                         <el-button @click="handleUserSelect">添加协作人</el-button>
                     </el-col>
                     </el-col>
                 </el-row>
                 </el-row>
-                <el-table border  :data="users" >
-                    <el-table-column label="ID" align="center" prop="userId" />
-                    <el-table-column label="员工帐号" align="center" prop="userName" />
+            </el-form-item>
+            <el-form-item  label-width="0">
+                <el-table border  :data="users">
+                    <el-table-column label="ID" align="center" prop="userId"/>
+                    <el-table-column label="员工帐号" align="center" prop="userName" width="100px"/>
                     <el-table-column label="员工姓名" align="center" prop="nickName" />
                     <el-table-column label="员工姓名" align="center" prop="nickName" />
-                    <el-table-column label="所属部门" align="center" prop="deptName" />
-                    <el-table-column label="添加数量" align="center"  prop="count" width="150px" >
+                    <el-table-column label="所属部门" align="center" prop="deptName"/>
+                    <el-table-column label="添加数量" align="center"  prop="count" width="150px" v-if="!flag">
                         <template slot-scope="scope">
                         <template slot-scope="scope">
-                        <div>
-                            <el-input-number ref="stepTxtNum" :min="0" v-model="scope.row.count"  @change="changeVal(scope.row)"   size="mini"   ></el-input-number>
-                        </div>
-                    </template>
+                            <div>
+                                <el-input-number ref="stepTxtNum" :min="0" v-model="scope.row.count"  @change="changeVal(scope.row)"   size="mini"   ></el-input-number>
+                            </div>
+                        </template>
                     </el-table-column>
                     </el-table-column>
-                    <el-table-column label="操作"   align="center" fixed="right" class-name="small-padding fixed-width">
+                    <el-table-column label="操作"   align="center" fixed="right"  width="60px" class-name="small-padding fixed-width">
                         <template slot-scope="scope">
                         <template slot-scope="scope">
                             <el-button
                             <el-button
                             size="mini"
                             size="mini"
@@ -38,61 +40,412 @@
                 </el-table>
                 </el-table>
             </el-form-item>
             </el-form-item>
         </el-form>
         </el-form>
-        <div   class="footer">
+        <div   class="footer" v-if="!flag">
             <el-button type="primary" @click="submitAssistForm">确 定</el-button>
             <el-button type="primary" @click="submitAssistForm">确 定</el-button>
         </div>
         </div>
         <el-dialog :title="userSelect.title" :visible.sync="userSelect.open" width="1000px" append-to-body>
         <el-dialog :title="userSelect.title" :visible.sync="userSelect.open" width="1000px" append-to-body>
             <user-select ref="userSelects" @selectUser="selectUser"  ></user-select>
             <user-select ref="userSelects" @selectUser="selectUser"  ></user-select>
         </el-dialog>
         </el-dialog>
+
+        <!-- 手动分佣模式 -->
+        <el-form label-position="left" ref="assistForm2" :model="assistForm2"  label-width="120px" v-if="flag">
+            <el-form-item  label-width="0">
+                <div v-for="(customer, customerIndex) in customers" :key="customer.customerId || customerIndex" class="customer-section">
+                    <el-card class="customer-card" shadow="hover">
+                        <div slot="header" class="customer-header">
+                            <span class="customer-title">
+                                <strong>{{ customer.customerName }}</strong> 
+                                <span class="customer-code">({{ customer.customerCode }})</span>
+                            </span>
+                            <el-button 
+                                size="mini" 
+                                type="primary" 
+                                @click="handleAddCollaborator(customerIndex)"
+                                icon="el-icon-plus">
+                                添加协作人
+                            </el-button>
+                        </div>
+                        
+                        <div class="collaborator-content">
+                            <el-table 
+                                :data="customer.collaborators" 
+                                border 
+                                size="small"
+                                v-if="customer.collaborators && customer.collaborators.length > 0">
+                                <el-table-column label="员工姓名" align="center" prop="companyUserName" width="100px"/>
+                                <el-table-column label="员工ID" align="center" prop="companyUserId" width="80px"/>
+                                <el-table-column label="分佣比例(%)" align="center" width="160px">
+                                    <template slot-scope="scope">
+                                        <el-input-number 
+                                            v-model="scope.row.rate" 
+                                            :min="0" 
+                                            :max="100" 
+                                            size="mini"
+                                            @input="handleRateChange(customerIndex, scope.$index, scope.row)">
+                                        </el-input-number>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column label="状态" align="center" width="80px">
+                                    <template slot-scope="scope">
+                                        <el-tag :type="scope.row.isNew ? 'success' : 'info'" size="mini">
+                                            {{ scope.row.isNew ? '新增' : '原有' }}
+                                        </el-tag>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column label="操作" align="center" width="80px">
+                                    <template slot-scope="scope">
+                                        <el-button
+                                            size="mini"
+                                            type="text"
+                                            @click="handleRemoveCollaborator(customerIndex, scope.$index)">
+                                            删除
+                                        </el-button>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+                            
+                            <div v-else class="no-collaborator">
+                                <i class="el-icon-user" style="font-size: 48px; color: #ddd;"></i>
+                                <p>暂无协作人员</p>
+                            </div>
+                            
+                            <!-- 分佣比例汇总 -->
+                            <div class="rate-summary-container">
+                                <div class="rate-summary">
+                                    <div class="rate-item">
+                                        <span class="rate-label">协作人员总分佣比例:</span>
+                                        <span :class="getTotalRateClass(customerIndex)">
+                                            {{ getTotalRate(customerIndex) }}%
+                                        </span>
+                                        <span v-if="getTotalRate(customerIndex) > 100" class="rate-warning">
+                                            (超出100%,请调整)
+                                        </span>
+                                    </div>
+                                    <div class="rate-item owner-rate">
+                                        <span class="rate-label">本人佣金比例:</span>
+                                        <span :class="getOwnerRateClass(customerIndex)">
+                                            {{ getOwnerRate(customerIndex) }}%
+                                        </span>
+                                        <span v-if="getOwnerRate(customerIndex) < 0" class="rate-warning">
+                                            (协作人员分佣超出100%,请调整)
+                                        </span>
+                                    </div>
+                                    <div class="rate-item total-check" v-if="customer.collaborators && customer.collaborators.length > 0">
+                                        <span class="rate-label">总计:</span>
+                                        <span class="rate-total">
+                                            {{ getTotalRate(customerIndex) + getOwnerRate(customerIndex) }}%
+                                        </span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </el-card>
+                </div>
+            </el-form-item>
+        </el-form>
+        
+        <div class="footer" v-if="flag">
+            <el-button @click="$emit('close')">取 消</el-button>
+            <el-button type="primary" @click="submitAssistForm2" :loading="submitLoading">确 定</el-button>
+        </div>
     </div>
     </div>
 </template>
 </template>
   
   
 <script>
 <script>
-    import { assistToUser } from "@/api/crm/customer";
-    import userSelect from '../../company/components/userSelect.vue';
-    export default {
-        components: {userSelect },
-        name: "visit",
-        data() {
-            return {
-                noAssistCount:0,
-                assistCount:0,
-                customerIds:[],
-                userSelect:{
-                    title:"选择员工",
-                    open:false,
-                },
-                assistForm: {
-                },
-                // 表单校验
-                assistRules: {
-                    
-                },
-                users:[],
-                 
-            };
-        },
-        created() {
-          
-        },
-        methods: {
-            changeVal(row) {
-                this.$forceUpdate();//解决点击计数器失效问题
-                this.computeCount();
-                if(this.assistCount>this.customerIds.length){
-                    this.$nextTick(() => {
-                         row.count=0;
-                         this.computeCount();
-                    });
-                   
-                }
+import { assistToUser,selectByCustomerIds,allOperation } from "@/api/crm/customer";
+import userSelect from '../../company/components/userSelect.vue';
+export default {
+    components: {userSelect },
+    name: "visit",
+    data() {
+        return {
+            originalCollaborators: {}, // 确保初始化为空对象
+            flag:false,
+            noAssistCount:0,
+            assistCount:0,
+            customerIds:[],
+            currentCustomerIndex: -1,
+            submitLoading: false,
+            userSelect:{
+                title:"选择员工",
+                open:false,
+            },
+            assistForm: {
             },
             },
-            handleRemoveUser(index){
-                this.users.splice(index,1);
-                this.computeCount();
-                this.$refs.userSelects.delUser(index);
+            assistForm2:{},
+            // 表单校验
+            assistRules: {
+                
             },
             },
-            selectUser(data){
+            users:[],
+            customers:[]
+                
+        };
+    },
+    created() {
+        
+    },
+    methods: {
+         // 检查并更新所有协作者的操作状态
+         checkAndUpdateOperations() {
+            // 确保 originalCollaborators 存在
+            if (!this.originalCollaborators) {
+                this.originalCollaborators = {};
+            }
+            this.customers.forEach(customer => {
+                if (customer.collaborators) {
+                    customer.collaborators.forEach(collaborator => {
+                        if (collaborator.id && (!collaborator.operation || collaborator.operation === 'NONE')) {
+                            const originalKey = `${collaborator.customerId}_${collaborator.companyUserId}`;
+                            const originalCollaborator = this.originalCollaborators[originalKey];
+                            
+                            if (originalCollaborator && 
+                                (originalCollaborator.rate !== collaborator.rate || 
+                                 originalCollaborator.remark !== (collaborator.remark || ''))) {
+                                collaborator.operation = 'UPDATE';
+                            } else if (!originalCollaborator && collaborator.id) {
+                                // 如果找不到原始数据但有ID,说明可能是数据加载问题,标记为UPDATE
+                                collaborator.operation = 'UPDATE';
+                            }
+                        }
+                    });
+                }
+            });
+        },
+         // 处理分佣比例变化
+         handleRateChange(customerIndex, collaboratorIndex, collaborator) {
+            // 确保 originalCollaborators 存在
+            if (!this.originalCollaborators) {
+                this.originalCollaborators = {};
+            }
+            // 如果是原有协作者且分佣比例发生变化,标记为UPDATE
+            if (collaborator.operation === 'NONE' || !collaborator.operation) {
+                const originalKey = `${collaborator.customerId}_${collaborator.companyUserId}`;
+                const originalCollaborator = this.originalCollaborators[originalKey];
+
+               
+                
+                if (originalCollaborator) {
+                    // 检查分佣比例或备注是否发生变化
+                    if (originalCollaborator.rate !== collaborator.rate || 
+                        originalCollaborator.remark !== (collaborator.remark || '')) {
+                        collaborator.operation = 'UPDATE';
+                    }
+                } else {
+                    // 如果找不到原始数据,但有id,说明是原有数据,标记为UPDATE
+                    if (collaborator.id) {
+                        collaborator.operation = 'UPDATE';
+                    }
+                }
+            }
+            
+            this.validateTotalRate(customerIndex);
+        },
+        validateTotalRate(customerIndex) {
+            const total = this.getTotalRate(customerIndex);
+            const ownerRate = this.getOwnerRate(customerIndex);
+            
+            if(total > 100) {
+                this.$message.warning(`客户 ${this.customers[customerIndex].customerName} 的协作人员总分佣比例不能超过100%`);
+            } else if(ownerRate < 10) {
+                this.$message.warning(`客户 ${this.customers[customerIndex].customerName} 的本人佣金比例过低,建议调整协作人员分佣比例`);
+            }
+        },
+        // 获取本人佣金比例(100% - 协作人员总分佣比例)
+        getOwnerRate(customerIndex) {
+            const collaboratorTotalRate = this.getTotalRate(customerIndex);
+            return Math.max(0, 100 - collaboratorTotalRate);
+        },
+        // 获取本人佣金比例的样式类
+        getOwnerRateClass(customerIndex) {
+            const ownerRate = this.getOwnerRate(customerIndex);
+            if(ownerRate < 0) return 'rate-error';
+            if(ownerRate === 0) return 'rate-warning';
+            return 'rate-success';
+        },
+        getTotalRateClass(customerIndex) {
+            const total = this.getTotalRate(customerIndex);
+            if(total > 100) return 'rate-error';
+            if(total === 100) return 'rate-success';
+            return 'rate-normal';
+        },
+        handleAddCollaborator(customerIndex) {
+            // 为特定客户添加协作人
+            this.currentCustomerIndex = customerIndex;
+            var that = this;
+            this.userSelect.open = true;
+            setTimeout(() => {
+                that.$refs.userSelects.getList();
+            }, 500);
+        },
+        handleRemoveCollaborator(customerIndex, collaboratorIndex) {
+            const customer = this.customers[customerIndex];
+            const collaborator = customer.collaborators[collaboratorIndex];
+            if (collaborator.operation === 'ADD') {
+                // 如果是新增的协作者,直接从列表中移除
+                customer.collaborators.splice(collaboratorIndex, 1);
+            } else {
+                // 如果是原有的协作者,标记为删除但不从列表中移除
+                collaborator.operation = 'DELETE';
+                // 可以选择隐藏已删除的项目或者用特殊样式显示
+                // 这里我们从界面上移除,但在提交时会包含删除操作
+                customer.collaborators.splice(collaboratorIndex, 1);
+                
+                // 将删除的协作者添加到待删除列表中
+                if (!customer.deletedCollaborators) {
+                    this.$set(customer, 'deletedCollaborators', []);
+                }
+                customer.deletedCollaborators.push(collaborator);
+            }
+        },
+        getTotalRate(customerIndex) {
+            const customer = this.customers[customerIndex];
+            if(!customer.collaborators) return 0;
+            
+            return customer.collaborators.reduce((total, collaborator) => {
+                // 只计算未删除的协作者
+                if (collaborator.operation !== 'DELETE') {
+                    return total + (collaborator.rate || 0);
+                }
+                return total;
+            }, 0);
+        },
+        async loadCustomerCollaborators() {
+            // 确保 originalCollaborators 存在
+            if (!this.originalCollaborators) {
+                this.originalCollaborators = {};
+            }
+            
+            // 加载每个客户的协作者信息
+            let customerIds = this.customers.map(customer => customer.customerId || null);
+            this.customerIds = customerIds;
+            
+            if(customerIds && customerIds.length > 0){
+                try {
+                    //查询用户分佣信息
+                    selectByCustomerIds(customerIds).then(response => {
+                        if(response && response.code == 200){
+                            // 清空原始数据
+                            this.originalCollaborators = {};
+                            
+                            // 遍历每个客户,匹配对应的协作者数据
+                            this.customers.forEach(customer => {
+                                // 查找当前客户的协作者数据
+                                const customerData = response.data.find(item => item.customerId === customer.customerId);
+                                
+                                if(customerData && customerData.assistList && customerData.assistList.length > 0) {
+                                    // 将协作者数据转换为组件需要的格式
+                                    const collaborators = customerData.assistList.map(item => {
+                                        const collaborator = {
+                                            id: item.id,
+                                            companyId: item.companyId,
+                                            companyUserId: item.companyUserId,
+                                            companyUserName: item.companyUserName,
+                                            customerId: item.customerId,
+                                            rate: item.rate || 0,
+                                            remark: item.remark || '',
+                                            operation: 'NONE' // 标记为原有数据,无变化
+                                        };
+                                        
+                                        // 保存原始数据用于对比
+                                        const originalKey = `${item.customerId}_${item.companyUserId}`;
+                                        this.originalCollaborators[originalKey] = {
+                                            id: item.id,
+                                            rate: item.rate || 0,
+                                            remark: item.remark || ''
+                                        };
+                                        
+                                        
+                                        return collaborator;
+                                    });
+                                    
+                                    // 设置客户的协作者列表
+                                    this.$set(customer, 'collaborators', collaborators);
+                                    // 初始化删除列表
+                                    this.$set(customer, 'deletedCollaborators', []);
+                                } else {
+                                    // 如果没有协作者数据,设置为空数组
+                                    this.$set(customer, 'collaborators', []);
+                                    this.$set(customer, 'deletedCollaborators', []);
+                                }
+                            });
+                            
+                        } else {
+                            // 如果查询失败,确保 originalCollaborators 是空对象
+                            this.originalCollaborators = {};
+                        }
+                    }).catch(error => {
+                        this.originalCollaborators = {};
+                        this.$message.error("加载协作者数据失败,请重试");
+                    });
+                } catch(error) {
+                    // 异常情况下,确保 originalCollaborators 是空对象
+                    this.originalCollaborators = {};
+                    // 异常情况下,为所有客户设置空的协作者列表
+                    this.customers.forEach(customer => {
+                        this.$set(customer, 'collaborators', []);
+                        this.$set(customer, 'deletedCollaborators', []);
+                    });
+                    this.$message.error("加载协作者数据失败,请重试");
+                }
+            } else {
+                // 如果没有客户ID,确保 originalCollaborators 是空对象
+                this.originalCollaborators = {};
+            }
+        },
+        changeVal(row) {
+            this.$forceUpdate();//解决点击计数器失效问题
+            this.computeCount();
+            if(this.assistCount>this.customerIds.length){
+                this.$nextTick(() => {
+                        row.count=0;
+                        this.computeCount();
+                });
+                
+            }
+        },
+        handleRemoveUser(index){
+            this.users.splice(index,1);
+            this.computeCount();
+            this.$refs.userSelects.delUser(index);
+        },
+        selectUser(data){
+            if(this.flag){
+                // 手动分佣模式 - 为特定客户添加协作人
+                if(this.currentCustomerIndex >= 0) {
+                    const customer = this.customers[this.currentCustomerIndex];
+                    if(!customer.collaborators) {
+                        this.$set(customer, 'collaborators', []);
+                    }
+                    data.forEach(user => {
+                        // 检查是否已存在
+                        const exists = customer.collaborators.some(c => c.userId === user.userId);
+                        const existsInDeleted = customer.deletedCollaborators && 
+                            customer.deletedCollaborators.some(c => c.companyUserId === user.userId);
+                        if(!exists && !existsInDeleted) {
+                            const collaborator = {
+                                companyUserId: user.userId,
+                                companyUserName: user.nickName,
+                                customerId: customer.customerId,
+                                rate: 0,
+                                remark: '',
+                                operation: 'ADD' // 标记为新增
+                            };
+                            customer.collaborators.push(collaborator);
+                        } else if (existsInDeleted) {
+                            // 如果在删除列表中存在,则恢复该协作者
+                            const deletedIndex = customer.deletedCollaborators.findIndex(c => c.companyUserId === user.userId);
+                            if (deletedIndex >= 0) {
+                                const restoredCollaborator = customer.deletedCollaborators[deletedIndex];
+                                restoredCollaborator.operation = 'NONE'; // 恢复为原有状态
+                                customer.collaborators.push(restoredCollaborator);
+                                customer.deletedCollaborators.splice(deletedIndex, 1);
+                            }
+                        }
+                    });
+                    this.userSelect.open=false;
+                }
+            } else{
                 var users=[];
                 var users=[];
                 var number=parseInt(this.customerIds.length/data.length);
                 var number=parseInt(this.customerIds.length/data.length);
                 data.forEach(element => {
                 data.forEach(element => {
@@ -110,81 +463,186 @@
                 this.users=users;
                 this.users=users;
                 this.userSelect.open=false;
                 this.userSelect.open=false;
                 this.computeCount()
                 this.computeCount()
-            },
-            computeCount(){
-                this.assistCount=0;
-                var that=this;
-                this.users.forEach(element => {
-                    that.assistCount+=element.count;
-                });
-                this.noAssistCount=this.customerIds.length-this.assistCount
-            },
-            handleUserSelect(){
-                var that=this;
-                this.userSelect.open=true;
-                setTimeout(() => {
-                    that.$refs.userSelects.getList();
-                }, 500);
-            },
-            init(customerIds){
+            }
+            
+        },
+        computeCount(){
+            this.assistCount=0;
+            var that=this;
+            this.users.forEach(element => {
+                that.assistCount+=element.count;
+            });
+            this.noAssistCount=this.customerIds.length-this.assistCount
+        },
+        handleUserSelect(){
+            var that=this;
+            this.userSelect.open=true;
+            setTimeout(() => {
+                that.$refs.userSelects.getList();
+            }, 500);
+        },
+        async init(customerIds,flag){
+            this.flag = flag //是否设置分佣
+            if(flag){
+                this.customers = customerIds;
+                await this.loadCustomerCollaborators();
+            } else {
                 this.customerIds =  customerIds;
                 this.customerIds =  customerIds;
                 this.assistCount=0;
                 this.assistCount=0;
                 this.noAssistCount=this.customerIds.length;
                 this.noAssistCount=this.customerIds.length;
                 this.users=[];
                 this.users=[];
-            },
-            /** 提交按钮 */
-            submitAssistForm() {
-                var that=this;
-                this.$refs["assistForm"].validate(valid => {
-                    if (valid) {
-                        var users=[];
-                        var customerIds=[];
-                        var idIndex=0;
-                        var totalAssistCount=0;
-                        console.log("qxj users",JSON.stringify(this.users));
-                        this.users.forEach(element => {
-                            if(element.count>0){
-                                var ids=that.customerIds.slice(idIndex,idIndex+element.count)
-                                console.log("qxj customerIds:"+that.customerIds+" count:"+element.count);
-                                console.log("qxj ids:"+ids);
-                                customerIds=customerIds.concat(ids);
-                                idIndex=idIndex+element.count;
-                                var data={companyUserId:element.userId,count:element.count};
-                                users.push(data);
-                                totalAssistCount+=element.count;
+            }
+            
+        },
+        async submitAssistForm2(){
+            // 提交前检查并更新操作状态
+            this.checkAndUpdateOperations();
+            // 验证数据
+            let hasError = false;
+            for(let i = 0; i < this.customers.length; i++) {
+                const customer = this.customers[i];
+                const totalRate = this.getTotalRate(i);
+                
+                if(totalRate > 100) {
+                    this.$message.error(`客户 ${customer.customerName} 的协作人员总分佣比例不能超过100%`);
+                    hasError = true;
+                    break;
+                }
+            }
+            
+            if(hasError) return;
+            
+            this.submitLoading = true;
+            
+            try {
+                // 准备提交数据 - 包含所有操作类型
+                const submitData = {
+                    customerIds: this.customers.map(c => c.customerId), // 包含所有客户ID
+                    operations: []
+                };
+                
+                this.customers.forEach(customer => {
+                    if(customer.collaborators && customer.collaborators.length > 0) {
+                        customer.collaborators.forEach(collaborator => {
+                            if (collaborator.operation !== 'DELETE') {
+                                 // 确保每个协作者都有正确的operation字段
+                                 let operation = collaborator.operation;
+                                 // 如果没有operation字段,根据是否有id来判断
+                                if (!operation) {
+                                    if (collaborator.id) {
+                                        // 有id说明是原有数据,检查是否有变化
+                                        const originalKey = `${collaborator.customerId}_${collaborator.companyUserId}`;
+                                        const originalCollaborator = this.originalCollaborators[originalKey];
+                                        
+                                        if (originalCollaborator && 
+                                            (originalCollaborator.rate !== collaborator.rate || 
+                                             originalCollaborator.remark !== (collaborator.remark || ''))) {
+                                            operation = 'UPDATE';
+                                        } else {
+                                            operation = 'NONE';
+                                        }
+                                    } else {
+                                        // 没有id说明是新增数据
+                                        operation = 'ADD';
+                                    }
+                                }
+                                submitData.operations.push({
+                                    operation: operation, // ADD, UPDATE, NONE
+                                    id: collaborator.id || null,
+                                    companyId: collaborator.companyId,
+                                    companyUserId: collaborator.companyUserId,
+                                    companyUserName: collaborator.companyUserName,
+                                    customerId: customer.customerId,
+                                    rate: collaborator.rate,
+                                    remark: collaborator.remark || ''
+                                });
                             }
                             }
                         });
                         });
-                        if(users.length==0){
-                            this.msgError("请选择员工");
-                            return;
-                        }
-                        if(totalAssistCount>(this.assistCount+this.noAssistCount)){
-                            this.msgError("添加数量有误");
-                            return;
-                        }
-                        this.myloading = this.$loading({
-                            lock: true,
-                            text: '处理中...',
-                            spinner: 'el-icon-loading',
-                            background: 'rgba(0, 0, 0, 0.7)'
-                        });
-                        var data={customerIds:customerIds,users:users}
-                        console.log("qxj data:",JSON.stringify(data));
-                        assistToUser(data).then(response => {
-                            this.myloading.close()
-                            if (response.code === 200) {
-                                this.msgSuccess("操作成功");
-                                this.$emit('close');
-                            }
+                    }
+                    // 处理已删除的协作者
+                    if(customer.deletedCollaborators && customer.deletedCollaborators.length > 0) {
+                        customer.deletedCollaborators.forEach(collaborator => {
+                            submitData.operations.push({
+                                operation: 'DELETE',
+                                id: collaborator.id,
+                                companyUserId: collaborator.companyUserId,
+                                customerId: customer.customerId
+                            });
                         });
                         });
                     }
                     }
+
                 });
                 });
-            },
-            closeAction(){
-                this.$refs.userSelects.users=[];
+                
+                console.log("提交的完整分佣数据:", JSON.stringify(submitData, null, 2));
+                
+                // 这里需要根据你的实际更新接口来调用
+                const response = await allOperation(submitData.operations);
+                
+                if(response.code === 200) {
+                    this.$message.success("分佣设置保存成功");
+                    this.$emit('close');
+                } else {
+                    this.$message.error(response.msg || "保存失败");
+                }
+            } catch(error) {
+                this.$message.error("保存失败,请重试");
+            } finally {
+                this.submitLoading = false;
             }
             }
+        },
+        /** 提交按钮 */
+        submitAssistForm() {
+            var that=this;
+            this.$refs["assistForm"].validate(valid => {
+                if (valid) {
+                    var users=[];
+                    var customerIds=[];
+                    var idIndex=0;
+                    var totalAssistCount=0;
+                    console.log("qxj users",JSON.stringify(this.users));
+                    this.users.forEach(element => {
+                        if(element.count>0){
+                            var ids=that.customerIds.slice(idIndex,idIndex+element.count)
+                            console.log("qxj customerIds:"+that.customerIds+" count:"+element.count);
+                            console.log("qxj ids:"+ids);
+                            customerIds=customerIds.concat(ids);
+                            idIndex=idIndex+element.count;
+                            var data={companyUserId:element.userId,count:element.count};
+                            users.push(data);
+                            totalAssistCount+=element.count;
+                        }
+                    });
+                    if(users.length==0){
+                        this.msgError("请选择员工");
+                        return;
+                    }
+                    if(totalAssistCount>(this.assistCount+this.noAssistCount)){
+                        this.msgError("添加数量有误");
+                        return;
+                    }
+                    this.myloading = this.$loading({
+                        lock: true,
+                        text: '处理中...',
+                        spinner: 'el-icon-loading',
+                        background: 'rgba(0, 0, 0, 0.7)'
+                    });
+                    var data={customerIds:customerIds,users:users}
+                    console.log("qxj data:",JSON.stringify(data));
+                    assistToUser(data).then(response => {
+                        this.myloading.close()
+                        if (response.code === 200) {
+                            this.msgSuccess("操作成功");
+                            this.$emit('close');
+                        }
+                    });
+                }
+            });
+        },
+        closeAction(){
+            this.$refs.userSelects.users=[];
         }
         }
-    };
+    }
+};
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
 .contents{
 .contents{

+ 27 - 8
src/views/crm/customer/my.vue

@@ -260,7 +260,7 @@
           <el-button v-hasPermi="['crm:customer:addRemark']" type="text" size="mini" @click="handleAddRemark(scope.row)">修改备注</el-button>
           <el-button v-hasPermi="['crm:customer:addRemark']" type="text" size="mini" @click="handleAddRemark(scope.row)">修改备注</el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
-      <el-table-column  label="协作人" width="150px" align="center" >
+      <el-table-column  label="协作人" width="100px" align="center" >
         <template slot-scope="scope">
         <template slot-scope="scope">
           <div v-for="(user, index) in scope.row.assistUser" :key="index">
           <div v-for="(user, index) in scope.row.assistUser" :key="index">
             {{ user }}
             {{ user }}
@@ -327,7 +327,7 @@
     <el-dialog :title="assign.title" :visible.sync="assign.open" width="800px" append-to-body>
     <el-dialog :title="assign.title" :visible.sync="assign.open" width="800px" append-to-body>
         <assign-user  ref="assignUser" @close="closeAssign"   />
         <assign-user  ref="assignUser" @close="closeAssign"   />
     </el-dialog>
     </el-dialog>
-    <el-dialog :title="assist.title" :visible.sync="assist.open" width="800px" append-to-body>
+    <el-dialog :title="assist.title" :visible.sync="assist.open" width="1000px" append-to-body>
         <assist-user  ref="assistUser" @close="closeAssist"   />
         <assist-user  ref="assistUser" @close="closeAssist"   />
     </el-dialog>
     </el-dialog>
     
     
@@ -375,6 +375,7 @@ export default {
   components: {addPackage,addOrderOffline,addVisitStatus,addCustomerType,addRemark,addTag,assignUser,assistUser,addOrEditCustomer,editSource, addBatchSms,customerDetails,addVisit },
   components: {addPackage,addOrderOffline,addVisitStatus,addCustomerType,addRemark,addTag,assignUser,assistUser,addOrEditCustomer,editSource, addBatchSms,customerDetails,addVisit },
   data() {
   data() {
     return {
     return {
+      customers:[], //所选用户数据
       customerId:null,
       customerId:null,
       selectedCallerLine:null,
       selectedCallerLine:null,
       callerApis:[], //我的线路
       callerApis:[], //我的线路
@@ -661,12 +662,29 @@ export default {
         }, 200);
         }, 200);
     },
     },
     handleAssist(){
     handleAssist(){
-      var that=this;
-      var ids=this.ids;
-      that.assist.open=true;
-      setTimeout(() => {
-          that.$refs.assistUser.init(ids);
-      }, 200);
+       // 弹出选择提示框
+       this.$confirm('请选择分佣方式', '客户协作', {
+        confirmButtonText: '手动分佣',
+        cancelButtonText: '自动分佣(平分)',
+        distinguishCancelAndClose: true,
+        type: 'info',
+        customClass: 'commission-select-dialog'
+      }).then(() => {
+        // 用户选择了手动分佣
+        var that=this;
+        var ids=this.customers;
+        that.assist.open=true;
+        setTimeout(() => {
+          that.$refs.assistUser.init(ids,true);
+        }, 200);
+      }).catch(action => {
+        var that=this;
+        var ids=this.ids;
+        that.assist.open=true;
+        setTimeout(() => {
+          that.$refs.assistUser.init(ids,false);
+        }, 200);
+      });
     },
     },
     handleRemoveAllAssist(){
     handleRemoveAllAssist(){
       const ids = this.ids;
       const ids = this.ids;
@@ -824,6 +842,7 @@ export default {
     // 多选框选中数据
     // 多选框选中数据
     handleSelectionChange(selection) {
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.customerId)
       this.ids = selection.map(item => item.customerId)
+      this.customers = selection;
       this.single = selection.length!==1
       this.single = selection.length!==1
       this.multiple = !selection.length
       this.multiple = !selection.length
     },
     },