多导购分摊业绩比例

news2024/11/27 3:59:08

业务场景: 开单是多个销售参与开单的,但是每个人贡献不一致,所以分摊的业绩比例不一致,总业绩比为100%。在这里插入图片描述

//点击按钮,弹窗

<image bindtap="handleAddsales" src="/images/add.png" style="width: 50rpx;height: 50rpx;margin-left: 10rpx;"></image>

//弹窗

<view bindtap="handleClose" wx:if="{{showMoresales}}" style="position:fixed;left:0;top:0;z-index:1000;background:#000;opacity:0.7;width:100%;height:1200px;">
</view>
<view wx:if="{{showMoresales}}" style="position:fixed;z-index:1100;left: 0;bottom: 0;">
  <view style="padding:20rpx; background:#FFF;width:710rpx;border-radius:16rpx 16rpx 0 0;height: 700rpx;">
    <view style="width: 100%;text-align: center;line-height: 80rpx;">添加</view>
    <view style="width: 100%;height: 450rpx;overflow-y: scroll;">

      <block wx:for="{{fusales}}" wx:key="index">
        <view style="display: flex;margin-bottom: 20rpx;justify-content: space-between;">
          <view style="display: flex;width: 300rpx;">
            <view style="width: 120rpx; line-height: 60rpx;">{{item.salestitle}}:</view>
            <picker style="width: 180rpx; padding: 0 0 0 10rpx;height: 60rpx;line-height: 60rpx;border: 1rpx solid #ddd;" bindchange="bindPickerChange11" data-index="{{index}}" value="{{item.salesIndex}}" range="{{item.salesType}}">
              <view wx:if="{{item.salesIndex < 0}}" class="picker" style="font-size: 28rpx;color: #999;position: relative;">
                请选择
                <image src="/images/down.png" style="width: 30rpx;height:30rpx;position: absolute;right: 0rpx;top: 10rpx;"></image>
              </view>
              <view wx:else class="picker" style="color: #333;position: relative;">
                {{item.salesType[item.salesIndex]}}
                <image src="/images/down.png" style="width: 30rpx;height:30rpx;position: absolute;right: 0rpx;top: 10rpx;"></image>
              </view>
            </picker>
          </view>
          <view style="display: flex;width: 280rpx;">
            <view style="width: 160rpx;line-height: 60rpx;">业绩占比:</view>
            <input bindinput="handleValue2" data-id="{{index}}" style="border:1rpx solid #ddd; width: 150rpx;margin-left:6rpx;height: 50rpx;line-height:50rpx;text-align: center;" value="{{item.yejibi}}" type="text"></input>
            <view style="line-height: 50rpx;margin-left: 10rpx;">%</view>
          </view>
          <view wx:if="{{index == 0}}" style="width: 80rpx;height: 60rpx;text-align: center; line-height: 60rpx;border: 1rpx solid #ddd;color: #ddd;">删除</view>
          <view wx:else bindtap="handleDeletesales" data-index="{{index}}" style="width: 80rpx;height: 60rpx;text-align: center; line-height: 60rpx;border: 1rpx solid #ddd;">删除</view>
        </view>
      </block>
    </view>
    <view bindtap="handleAddline" style="text-align: center;">
      <image src="/images/add.png" style="width: 50rpx;height: 50rpx;position: fixed;bottom: 120rpx;margin-left: -25rpx;"></image>
    </view>
    <view bindtap="handleComplete" class="click-btn" hover-class="click-btn-hover" style="width:708rpx;height: 60rpx;line-height: 60rpx;text-align: center;color: white;border-radius: 16rpx; position: fixed;bottom: 30rpx;">确定</view>
  </view>
</view>

JS
Data:

 fusales: [
      {
        salestitle:'主销售',
        salesType:["公司单", "钟萍", "张生", "谢英",] ,
        salelist:[ {id: "0", salename: "公司单"},{id: "88", salename: "钟萍"},{id: "125", salename: "张生"},{id: "249", salename: "谢英"}] ,
        salesIndex:-1
      }, {
        salestitle:'辅销售',
        salesType:["公司单", "钟萍", "张生", "谢英",] ,
        salelist:[ {id: "0", salename: "公司单"},{id: "88", salename: "钟萍"},{id: "125", salename: "张生"},{id: "249", salename: "谢英"}] ,
        salesIndex:-1
      }

    ]

//当有超过2个销售时,点击+号按钮,添加下一个辅销售,也就是数组追加一条数据。
在这里插入图片描述

handleAddline() {
    let arr = []
    let obj = {}
    obj.salesType = this.data.fusales[1].salesType
    obj.salelist = this.data.fusales[1].salelist
    obj.salesIndex = -1
    obj.salestitle = '辅销售'
    arr.push(obj)
    // let newarray = this.appendSameDataToArray(arr)
    // console.log(newarray)
    this.setData({
      fusales: this.data.fusales.concat(arr)
    })
  },

//下拉选择销售,(如果身份是销售,那么主销售只能选择自己,如果身份是店长,跟单,那么主销售可以是任意人。 所以onload的时候,要对fusales数据进行过滤。这部分代码依赖基础数据,就不展示了。)

bindPickerChange11(e) {
    console.log(this.data.fusales, e, this.data.lotsales)
    // wx.getStorageSync('userInfo').job == '销售' ?  
    let index = e.currentTarget.dataset.index
    let item = this.data.fusales[index].salelist[e.detail.value].salename
    let id = this.data.fusales[index].salelist[e.detail.value].id
    this.data.fusales[index].salesIndex = e.detail.value
    if (index != this.data.lotsales.length) {
      this.data.lotsales[index].name = item
    } else {
      let arr = []
      let obj = {}
      obj.name = item
      obj.id = id
      arr.push(obj)
      this.setData({
        lotsales: this.data.lotsales.concat(arr)
      })
    }
    console.log(this.data.lotsales)
    this.setData({
      fusales: this.data.fusales,

    })
  },

// 填写对应销售业绩比

 handleValue2(e) {
    console.log(e, this.data.lotsales)
    let index = e.currentTarget.dataset.id

    // this.data.lotsales[index].yejibi = e.detail.value
    this.data.fusales[index].yejibi = e.detail.value
    if (index != this.data.lotsales.length) {
      this.data.lotsales[index].yejibi = e.detail.value
    } else {
      let arr = []
      let obj = {}
      obj.yejibi = e.detail.value
      arr.push(obj)
      this.setData({
        lotsales: this.data.lotsales.concat(arr)
      })
    }
    this.setData({
      fusales: this.data.fusales
    })
  },

//保存
//判断销售名是否重复

hasDuplicateNames(objects) {
    const names = new Set(); // 使用Set来存储已经出现过的名字  
    for (const obj of objects) {
      if (names.has(obj.name)) {
        // 如果名字已经在Set中存在,说明有重复,返回false  
        return false;
      }
      names.add(obj.name); // 否则,将名字添加到Set中  
    }
    // 如果循环结束都没有返回false,说明没有重复名字,返回true  
    return true;
  },
  handleComplete() {
    let sum = 0
    for (let i = 0; i < this.data.lotsales.length; i++) {
      sum += Number(this.data.lotsales[i].yejibi)
      if (Number(this.data.lotsales[i].yejibi) == 0) {
        wx.showToast({
          title: '业绩占比不能为0',
          duration: 3000,
          icon: 'none'
        })
        return
      }
    }
    console.log(sum)
    if (sum != 100) {
      wx.showToast({
        title: '业绩总和应为100%',
        duration: 3000,
        icon: 'none'
      })
      return
    } else {
      for (let j = 0; j < this.data.lotsales.length; j++) {
        if (!this.data.lotsales[j].name) {
          wx.showToast({
            title: '请选择销售',
            duration: 3000,
            icon: 'error'
          })
          return
        }
      }
      if (this.hasDuplicateNames(this.data.lotsales)) {
        let formattedArr = this.data.lotsales.map(function (item) {
          // 将yejibi值转换为百分比字符串,并添加百分号  
          var percentage = (item.yejibi / 100) * 100 + '%'; // 假设yejibi是以100为基准的整数百分比  
          return item.name + percentage; // 组合名字和百分比字符串  
        });
        // 使用join函数将格式化后的数组转换为单个字符串,元素之间用逗号分隔  
        var resultString = formattedArr.join(',');
        this.data.fusales.splice(2)
        this.setData({
          fusales: this.data.fusales,
          showMoresales: false,
          lotvalue: resultString,
          showMoresales2: true
        })
      } else {
        wx.showToast({
          title: '销售不能重复',
          duration: 3000,
          icon: 'none'
        })
        return
      }

    }
  },

//删除辅销售

  handleDeletesales(e) {
    console.log(e) //要删除的辅销售下标
    let index = e.currentTarget.dataset.index
    this.data.fusales.splice(index, 1)
    this.data.lotsales.splice(index, 1)
    this.setData({
      fusales: this.data.fusales,
      lotsales: this.data.lotsales
    })
  },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(下)

一、接着上文 上文介绍了mongodb sharding的分片集群搭建&#xff0c;本文侧重于讲述日志治理。 这里使用linux自带的日志治理工具logrotate&#xff0c;无论是哪个端口的进程&#xff0c;其日志治理方式类似。 查看/data目录下的文件大小&#xff0c; du -hs *二、Logrota…

应用方案 | 内置ALC的音频前置放大器D2538A和D3308芯片

一、应用领域 D2538A和D3308是芯谷科技推出的两款内置ALC&#xff08;音频限幅器&#xff09;的前置音频放大器芯片&#xff0c;其中D2538A为单通道&#xff0c;D3308为双通道&#xff0c;它特别适用于胎心仪、个人医疗防护、立体声收录机、盒式录音机等涉及音频放大与限幅的产…

算法——矩阵,被围绕的区域

. - 力扣&#xff08;LeetCode&#xff09; 最开始也是考虑使用dfs&#xff0c;对于矩阵中的每个点&#xff0c;如果能到达边界的O&#xff0c;则跳过继续dfs。否则如果上下左右四个方向都无法到达边界的O&#xff0c;则说明当前的无法到达&#xff0c;在一个set中记录他的行数…

聚焦后成本时代赢销之道 纷享销客2024西北客户大会西安成功举办

纷享销客2024年西北客户大会西安站成功举办&#xff01;此次大会以《后成本时代的赢销之道》为主题&#xff0c;吸引了百余位客户及合作伙伴参会。 纷享销客创始人兼CEO罗旭发表演讲&#xff0c;呼吁一起凝心聚力&#xff0c;共创未来。纷享销客产品副总裁&制造行业中心总…

扫地机器人(蓝桥杯)

文章目录 扫地机器人题目描述解题思路二分贪心 扫地机器人 题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 N 个方格区域组成&#xff0c;如下图所 示。 走廊内部署了 K 台扫地机器人&#xff0c;其中第 i 台在第 Ai 个方格区域中。已知扫地机器人每分钟可以移动…

Python 自学(九) 之异常处理,文件及目录操作

目录 1. try ... except ... else ... finally 排列 P231 2. write, read, seek, readline, readlines 基本文件操作 P245 3. os模块 基本目录操作 P249 4. os.path 模块 复杂目录操作 P250 5. os 模块 高…

YoloV8改进策略:BackBone改进|GCNet(独家原创)|附结构图

摘要 本文使用GCNet注意力改进YoloV8,在YoloV8的主干中加入GCNet实现涨点。改进方法简单易用&#xff0c;欢迎大家使用&#xff01; 论文:《GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond》 非局部网络&#xff08;NLNet&#xff09;通过为每个查…

郭天祥新概念51单片机(第四期读书笔记)

时钟周期、状态周期、机器周期、指令周期与晶振频率之间的关系 1、晶振频率与脉冲的关系 假设单片机的晶振频率是12MHz&#xff0c;那么它的一个脉冲为1/12微秒&#xff1b;晶振单位时间发出的脉冲则为&#xff1a; 12 ∗ 1 0 6 12*10^6 12∗106。 假设单片机的晶振频率是4MH…

通过IP定位准确地址:原理、应用与局限性

在数字化时代&#xff0c;IP地址不仅是网络设备的标识符&#xff0c;同时也承载着地理位置信息。通过IP定位技术&#xff0c;我们可以根据IP地址获取到相应的地理位置信息&#xff0c;这在网络安全、数据分析、广告推送等领域有着广泛的应用。虎观代理将深入探讨通过IP定位准确…

Oracle EBS AR接口和OM销售订单单价为空数据修复

最近,用户使用客制化Web ADI 批量导入销售订单行功能,把销售订单行的单价更新成空值,直到发运确认以后,财务与客户对帐才发现大量销售订单的单价空,同时我们检查AR接口发现销售订单的单价和金额均为空。 前提条件 采用PAC成本方式具体问题症状 销售订单行的单价为空 Path:…

Spring面试常见问题

目录 1、为什么要用Spring框架&#xff1f;2、有了spring为什么又出现了 springboot&#xff1f;3、springboot出现后为什么又出现了spring cloud&#xff1f;4、SpringBoot自动配置&#xff08;重点&#xff09;5、SpringBoot启动流程&#xff08;重点&#xff09;6、简单谈一…

Latex绘制多行多TSNE列子图

Latex绘制多行多列TSNE子图 问题描述解决办法 问题描述 写论文需要绘制TSNE可视化图像。 解决办法 代码如下 \usepackage{subfigure}\begin{figure*}\centering\small\subfigure[aaa]{\includegraphics[width0.18\textwidth]{Figure/MFPT_v5_train_tsne_user0_bs0.png}}\su…

生态系统服务功能社会价值评估:当量因子法、InVEST、SolVES模型等多技术融合的探索与实践

当量因子法是将生态系统服务功能分类, 以可量化的标准构建不同类型生态系统各种服务功能的价值当量, 结合生态系统的分布面积进行评估,该方法数据量少, 较为直观易用, 适用于区域和全球尺度生态系统服务价值的评估。基于GIS平台的InVEST模型以空间数据为基础&#xff0c;量化多…

gin源码分析(1)--初始化中间件,路由组与路由树

目标 关于gin.Default()&#xff0c;gin.New()&#xff0c;gin.Use()group与子group之间的关系&#xff0c;多group与middleware之间关系中间件的类型&#xff0c;全局&#xff0c;group&#xff0c;get&#xff0c;不同类型的中间件什么时候执行。中间件 next 和abort行为如何…

代码+视频,手动绘制logistic回归预测模型校准曲线(Calibration curve)(1)

校准曲线图表示的是预测值和实际值的差距&#xff0c;作为预测模型的重要部分&#xff0c;目前很多函数能绘制校准曲线。 一般分为两种&#xff0c;一种是通过Hosmer-Lemeshow检验&#xff0c;把P值分为10等分&#xff0c;求出每等分的预测值和实际值的差距. 另外一种是calibra…

vue 响应式原理 Object.defineProperty(obj,‘属性名A‘,options);

目录 self简单讲解1. 视图影响数据2. 数据影响视图3. 视图数据双向影响页面展示 百度 self 简单讲解 get和set方法是ES5中提供的&#xff0c;因为是方法&#xff0c;所以可以进行判断&#xff0c;get 一般是要通过 return 返回的&#xff1b;而 set 是设置&#xff0c;不用返回…

回收站删除的文件在哪里?专业恢复方法分享(最新版)

“我很想知道我从回收站删除的文件被保存在哪里了呢&#xff1f;我刚刚不小心清空了回收站&#xff0c;现在想将它们恢复&#xff0c;应该怎么操作呢&#xff1f;谁能教教我怎么从回收站恢复文件&#xff1f;” 回收站&#xff0c;作为Windows操作系统中的一个重要组件&#xf…

探索AI技术创业的三大机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;行业解决方案 方向二&#xff1a;智能产品和服务 方向三&#xff1a;教育和培训 结语 我的其他博客 前言…

京东云明修“价格战”,暗渡“政企云”

文&#xff5c;白 鸽 编&#xff5c;王一粟 云计算行业越来越“卷”&#xff0c;一边卷大模型&#xff0c;一边卷价格。 2024 刚一开年&#xff0c;阿里云就宣布百余款产品大降价&#xff0c;最高降幅达55%。在阿里云宣布降价后&#xff0c;京东云紧随其后宣布&#xff0…

80后、90后记忆中的经典软件正在老去,新型平台在悄然崛起

当今软件领域&#xff0c;可谓是瞬息万变。 更新迭代频繁&#xff0c;部分软件稳坐电脑桌面&#xff0c;而有些&#xff0c;则沦为记忆深处的图标&#xff0c;在岁月长河中悄然“凋零”。 试问&#xff0c;那些曾属于80、90后独特记忆的经典软件&#xff0c;你还记得多少&…