订单组日工作量报表数据生成优化

class Order_Service_OrderWorkload {

    /*
     * 生成订单组日工作量数据
     *
     * $startDate          0000-00-00 00:00:00              开始时间
     * $endDate            0000-00-00 00:00:00              结束时间
     */

    public static function generateOrderWorkload($startDate, $endDate) {
        try {
            $combination = array(
                'op_start_time' => $startDate,
                'pickup_finish_time' => $endDate,
                'op_status' => 1,
            );
            $combinat = array(
                'op_pack_start' => $startDate,
                'op_pack_end' => $endDate,
                'op_status' => 1,
            );
            $combin = array(
                'op_sorting_start' => $startDate,
                'op_sorting_end' => $endDate,
                'op_status' => 1,
            );

            //根据订单类型分别计算订单最大可用订单票数
            //A类
            $configIdA = Common_Service_Config::getByAttribute(self::$MaxSortNumber[0]);
            if ($configIdA && $configIdA['config_value']) {
                $maximumUsableA = $configIdA['config_value'];
            } else {
                throw new Exception('请配置系统订单类型最大可用订单票数 '. self::$MaxSortNumber[0]);
            }
            //B类
            $configIdB = Common_Service_Config::getByAttribute(self::$MaxSortNumber[1]);
            if ($configIdB && $configIdB['config_value']) {
                $maximumUsableB = $configIdB['config_value'];
            } else {
                throw new Exception('请配置系统订单类型最大可用订单票数 '. self::$MaxSortNumber[1]);
            }
            //C类
            $configIdC = Common_Service_Config::getByAttribute(self::$MaxSortNumber[2]);
            if ($configIdC && $configIdC['config_value']) {
                $maximumUsableC = $configIdC['config_value'];
            } else {
                throw new Exception('请配置系统订单类型最大可用订单票数 '. self::$MaxSortNumber[2]);
            }

            //配货
            $peihuos = Product_Service_Pickup::getByCondition($combination, '*');
            if ($peihuos) {
                self::generate($peihuos, $maximumUsableA, $maximumUsableB, $maximumUsableC, $startDate, 0);
            }
            //打包
            $packings = Product_Service_Pickup::getByCondition($combinat, '*');
            if ($packings) {
                self::generate($packings, $maximumUsableA, $maximumUsableB, $maximumUsableC, $startDate, 1);
            }
            //分拣
            $sorters = Product_Service_Pickup::getByCondition($combin, '*');
            if ($sorters) {
                self::generate($sorters, $maximumUsableA, $maximumUsableB, $maximumUsableC, $startDate, 2);
            }
        } catch (Exception $ex) {
            echo '[ ' . date('Y-m-d H:i:s') . ' ] 出现异常,异常信息为:' . $ex->getMessage() . "\r\n";
        }
    }

    /*
     * 生成数据
     * 
     * $combination         array()         查询结果数据
     * $maximumUsableA      Integer         A 类订单最大可用订单票数
     * $maximumUsableB      Integer         B 类订单最大可用订单票数
     * $maximumUsableC      Integer         C 类订单最大可用订单票数
     * $startDate           0000-00-00      开始时间
     * $post                Integer         岗位人员
     */
    public static function generate($combination, $maximumUsableA, $maximumUsableB, $maximumUsableC, $startDate, $post) {
        $data = array();
        foreach ($combination as $value) {
            $type = $value['op_orders_type'];
            $warehouseId = $value['warehouse_id'];
            $opmId = Order_Service_OrderPickupMap::getByfield('op_code', $value['op_code']);
            if ($opmId) {
                $row = array();
                foreach ($opmId as $valu) {
                    $row[] = $valu['orders_code'];
                }
                $countCode = count(array_unique($row));
            }

            //根据订单类型计算花费时间、标准配置时间、岗位人员
            $time = 0;
            if ($post == 0) {
                if ($value['pickup_finish_time'] != '0000-00-00 00:00:00' && $value['op_start_time'] != '0000-00-00 00:00:00') {
                    $time = round((strtotime($value['pickup_finish_time']) - strtotime($value['op_start_time'])) / 60, 0);
                }
                $configId = Common_Service_Config::getByAttribute(self::$StandardConfigurationTime[0], $warehouseId);
                $userIds = $value['pickup_user_id'];
            } else if ($post == 1) {
                if ($value['op_pack_end'] != '0000-00-00 00:00:00' && $value['op_pack_start'] != '0000-00-00 00:00:00') {
                    $time = ceil((strtotime($value['op_pack_end']) - strtotime($value['op_pack_start'])) / 60);
                }
                $configId = Common_Service_Config::getByAttribute(self::$StandardConfigurationTime[1], $warehouseId);
                $userIds = $value['package_user_id'];
            } else {
                if ($value['op_sorting_end'] != '0000-00-00 00:00:00' && $value['op_sorting_start'] != '0000-00-00 00:00:00') {
                    $time = ceil((strtotime($value['op_sorting_end']) - strtotime($value['op_sorting_start'])) / 60);
                }
                $configId = Common_Service_Config::getByAttribute(self::$StandardConfigurationTime[2], $warehouseId);
                $userIds = $value['op_sorting_user'];
            }

            //根据岗位人员账号开通时间查询属于哪个时期
            if ($userIds) {
                $userId = User_Service_User::getByUserId($userIds);
                if ($userId && $userId['create_date']) {
                    //培训期
                    $trainDate = date('Y-m-d H:i:s', strtotime('+10 day', strtotime($userId['create_date'])));
                    //试岗期
                    $tryDate = date('Y-m-d H:i:s', strtotime('+20 day', strtotime($userId['create_date'])));
                    //上岗期
                    $postsDate = date('Y-m-d H:i:s', strtotime('+30 day', strtotime($userId['create_date'])));
                }

                //根据时期计算超时票数
                $count = 0;
                if ($configId && $configId['config_value']) {
                    $configValueInfo = unserialize($configId['config_value']);
                    if ($value['op_pack_start'] <= $trainDate) {
                        if (!empty($configValueInfo['trainA']) && $type == 0 && $configValueInfo['trainA'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['trainB']) && $type == 1 && $configValueInfo['trainB'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['trainC']) && $type == 2 && $configValueInfo['trainC'] <= $time) {
                            $count = 1;
                        }
                    } else if ($value['op_pack_start'] > $trainDate && $value['op_pack_start'] <= $tryDate) {
                        if (!empty($configValueInfo['try_hillockA']) && $type == 0 && $configValueInfo['try_hillockA'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['try_hillockB']) && $type == 1 && $configValueInfo['try_hillockB'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['try_hillockC']) && $type == 2 && $configValueInfo['try_hillockC'] <= $time) {
                            $count = 1;
                        }
                    } else if ($value['op_pack_start'] > $tryDate && $value['op_pack_start'] <= $postsDate) {
                        if (!empty($configValueInfo['postsA']) && $type == 0 && $configValueInfo['postsA'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['postsB']) && $type == 1 && $configValueInfo['postsB'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['postsC']) && $type == 2 && $configValueInfo['postsC'] <= $time) {
                            $count = 1;
                        }
                    } else if ($value['op_pack_start'] > $postsDate) {
                        if (!empty($configValueInfo['matureA']) && $type == 0 && $configValueInfo['matureA'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['matureB']) && $type == 1 && $configValueInfo['matureB'] <= $time) {
                            $count = 1;
                        }
                        if (!empty($configValueInfo['matureC']) && $type == 2 && $configValueInfo['matureC'] <= $time) {
                            $count = 1;
                        }
                    }
                }

                //根据岗位人员和订单类型仓库作为键、组成四维数组,如果有相同的键,就把对应值相加
                if (isset($data[$userIds . '-' . $post][$type][$warehouseId])) {
                    if ($type == 0 && $countCode >= $maximumUsableA) {
                        $data[$userIds . '-' . $post][$type][$warehouseId]['ow_overtime_qty'] += $count;
                    } else if ($type == 1 && $countCode >= $maximumUsableB) {
                        $data[$userIds . '-' . $post][$type][$warehouseId]['ow_overtime_qty'] += $count;
                    } else if ($type == 2 && $countCode >= $maximumUsableC) {
                        $data[$userIds . '-' . $post][$type][$warehouseId]['ow_overtime_qty'] += $count;
                    }
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_more'] += $value['op_more'];
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_wrong'] += $value['op_wrong'];
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_leakage'] += $value['op_leakage'];
                } else {
                    if ($type == 0 && $countCode >= $maximumUsableA) {
                        $data[$userIds . '-' . $post][$type][$warehouseId]['ow_overtime_qty'] = $count;
                    } else if ($type == 1 && $countCode >= $maximumUsableB) {
                        $data[$userIds . '-' . $post][$type][$warehouseId]['ow_overtime_qty'] = $count;
                    } else if ($type == 2 && $countCode >= $maximumUsableC) {
                        $data[$userIds . '-' . $post][$type][$warehouseId]['ow_overtime_qty'] = $count;
                    }
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_more'] = $value['op_more'];
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_wrong'] = $value['op_wrong'];
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_leakage'] = $value['op_leakage'];
                }

                if ($type == 0 && $countCode >= $maximumUsableA) {
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_orders'] += 1;
                    $data[$userIds . '-' . $post][$type][$warehouseId]['total_time'][] = $time;
                } else if ($type == 1 && $countCode >= $maximumUsableB) {
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_orders'] += 1;
                    $data[$userIds . '-' . $post][$type][$warehouseId]['total_time'][] = $time;
                } else if ($type == 2 && $countCode >= $maximumUsableC) {
                    $data[$userIds . '-' . $post][$type][$warehouseId]['ow_orders'] += 1;
                    $data[$userIds . '-' . $post][$type][$warehouseId]['total_time'][] = $time;
                }

                $data[$userIds . '-' . $post][$type][$warehouseId]['ow_total_pickup'] += 1;
            }
        }

        //分解数组写入数据库
        if ($data) {
            foreach ($data as $key => $val) {
                foreach ($val as $ke => $va) {
                    foreach ($va as $k => $v) {
                        $combinat = array(
                            'user_id' => $key,
                            'warehouse_id' => $k,
                            'ow_date' => $startDate,
                            'ow_total_pickup' => $v['ow_total_pickup'],
                            'ow_type' => $ke,
                            'ow_fast' => isset($v['total_time']) ? min($v['total_time']) : 0,
                            'ow_avg' => empty($v['ow_orders']) ? 0 : round(array_sum($v['total_time']) / $v['ow_orders']),
                            'ow_slow' => isset($v['total_time']) ? max($v['total_time']) : 0,
                            'ow_orders' => isset($v['ow_orders']) ? $v['ow_orders'] : 0,
                            'ow_overtime_qty' => isset($v['ow_overtime_qty']) ? $v['ow_overtime_qty'] : 0,
                            'ow_more' => $v['ow_more'],
                            'ow_wrong' => $v['ow_wrong'],
                            'ow_leakage' => $v['ow_leakage'],
                            'ow_create_time' => date('Y-m-d H:i:s'),
                            'ow_post' => $post,
                        );
                        if (!Order_Service_OrderWorkload::add($combinat)) {
                            return '写入数据失败';
                        }
                    }
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值