最近做了一个直销的项目,写一下记录。
说一下“公司每月按团队销量的1%发放工资”功能的实现
1、数据查询:
在统计销量的时候使用了mysql聚合函数sum,日期函数FROM_UNIXTIME,因为订单表里的时间是int类型的时间戳,查询语句如下:
$thisMonth=strtotime(date(‘Y-m’));
$lastMonth=strtotime(‘-1 month’,$thisMonth);
$sql=’Select id, sum(num) as num ,FROM_UNIXTIME(creat_time,”%m”) as month from order where creat_time between ’. $lastMonth .’ and ’. $thisMonth .‘ group by month‘; (这里需要注意:数字在进行字符串连接时会报错,在数字前后加空格就好了)。这样就方便接下下来的使用了。
2、数组。之前做分销的项目还没有怎么用到数组,这个项目在计算代理提成、返全款、返差价(货款全部打到公司的账户)、确定月初的等级(代理可能被降级)时很多时候都得对订单做一下处理,方便使用。既然是团队销量,把代理表数据处理成
$team=[
id=>[下级id],
]
把代理订单表处理成:
$salse=[
$order[‘id’]=>sum(num), //代理当月的销售总量
]
然后就可用递归从团队的最下级统计销量,最后得到最上级的团队销量:
static function teamSalse($team,$salse,&$teamSalse,$id){
foreach($team[$id] as $v){
//如果该代理还有下级
if(array_key_exist($v,$team)){
Self::teamSalse($team,$salse,$v);
}
//回溯,加上下级的团队销量
$teamSalse[$id]+=$salse[$v];
}
$teamSalse[$id]+=$salse[$id]; //加上自己的销量
}
还有个问题就是不确定$team的第一个元素的键是什么,所以需要用each函数得到数组的第一个元素的键。另外在确定代理月初等级时用到了数组的排序的函数usort,因为要对数据按时间进行排序,排序函数用到了匿名函数:
usort($arr,$this->cmp(‘time’));
function cmp($key){
return function($a,$b) use ($key){
if($a[$key]==$v[$key]){
return 0;
}
return $a[$key]>$b[$key]?1:-1;
}
}