自动任务发送邮件优化

/*
 * Linux 自动任务
 * 质检组收货及积压报表 --- 收件人邮箱
 *
 * $date                   0000-00-00                 日期 当天的前一天
 * $startDate              2017-09-01                 开始日期 每月 1 号
 * $warehouseId            Integer                    仓库
 */
require_once( "config.php" );
$flagFile = dirname(__FILE__) . "/qc-group-receiving-and-backlog-report";
if (@file_exists($flagFile)) {
    Common_Service_Common::autoRunFlag($flagFile, __FILE__, 2);
    die("程序正在运行!");
}
ini_set("memory_limit", "-1");
set_time_limit(0);
define("RUNTIME", "[ " . date("Y-m-d H:i:s") . " ] ");
echo RUNTIME . "Starting!\n";

$Object = new Product_Service_QualityReceivingBacklog();

$warehouseId = array(4, 11, 14);
$date = date("Y-m-d", strtotime("-1 day"));
foreach ($warehouseId as $value) {
    $Object->addQualityReceivingBacklog($date, $value);
}
//休眠 5 秒后等待数据同步
sleep(5);
if (strtotime(date("Y-m-d")) == strtotime(date("Y-m-01"))) {
    $startDate = date("Y-m-01", strtotime("-1 month"));
} else {
    $startDate = date("Y-m-d", mktime(0, 0, 0, date("m"), 1, date("Y")));
}
foreach ($warehouseId as $valu) {
    $Object->sendEmail($startDate, $date, $valu);
}
echo "[ " . date('Y-m-d H:i:s') . " ] 结束运行\r\n";
@unlink($flagFile);


//Service
class Product_Service_QualityReceivingBacklog {
    /*
     * 写入质检组收货及积压预警数据
     *
     * $date                    0000-00-00                 数据日期
     * $warehouseId             Integer                    仓库
     */

    public static function addQualityReceivingBacklog($date, $warehouseId) {
        $combination = self::generateQualityReceivingBacklog($date, $warehouseId);

        $warehouseNameCn = Warehouse_Service_Warehouse::getById($warehouseId);
        if (!self::add($combination)) {
            return $warehouseNameCn['warehouse_name_cn'] . "写入数据失败";
        }
    }

    /*
     * 生成质检组收货及积压预警数据
     *
     * $date               0000-00-00                 日期
     * $warehouseId             Integer                    仓库
     */

    public static function generateQualityReceivingBacklog($date, $warehouseId) {
        try {
            $data = array(
                'qrb_peceiving_votes' => 0,
                'qrb_po' => 0,
                'qrb_csp' => 0,
                'qrb_csp_proportion' => 0.00,
                'qrb_manual_asn' => 0,
                'qrb_manual_asn_proportion' => 0.00,
                'qrb_procurement_asn' => 0,
                'qrb_procurement_asn_proportion' => 0.00,
                'qrb_processing' => 0,
                'qrb_week_processing' => 0,
                'qrb_backlog' => 0,
                'qrb_backlog_proportion' => 0.00,
                'qrb_no_po' => 0,
                'qrb_no_csp' => 0,
                'qrb_is_csp' => 0,
                'qrb_category' => '',
                'warehouse_id' => $warehouseId,
                'qrb_date' => $date,
                'qrb_create_time' => date('Y-m-d H:i:s'),
            );
            $row = array();

            $combination = array(
                'warehouse_id' => $warehouseId,
                'rp_receiving_time_from' => $date . ' 00:00:00',
                'rp_receiving_time_to' => $date . ' 23:59:59',
            );
            $rpIds = Product_Service_ReceivingPre::getByleftJoin($combination, '*');
            if ($rpIds) {
                foreach ($rpIds as $value) {
                    //PO 收货量和 CSP 收货量
                    if ($value['asn_has'] == 0) {
                        if ($value['warehouse_id'] == 11 || $value['warehouse_id'] == 14) {
                            if ($value['ref_id'] != '') {
                                $row['count_po'][] = $value['ref_id'];
                                $data['qrb_po'] = count(array_unique($row['count_po']));
                                if ($value['plat_form'] == 'CSP') {
                                    $row['count_csp'][] = $value['ref_id'];
                                    $data['qrb_csp'] = count(array_unique($row['count_csp']));
                                }
                            }
                        } else {
                            if ($value['receiving_code'] != '') {
                                $row['count_po'][] = $value['receiving_code'];
                                $data['qrb_po'] = count(array_unique($row['count_po']));
                                if ($value['plat_form'] == 'CSP') {
                                    $row['count_csp'][] = $value['receiving_code'];
                                    $data['qrb_csp'] = count(array_unique($row['count_csp']));
                                }
                            }
                        }
                    }

                    //收货数量
                    if ($value['rp_tracking_number'] != '') {
                        $row['count_peceiving_votes'][] = $value['rp_tracking_number'];
                        $data['qrb_peceiving_votes'] = count(array_unique($row['count_peceiving_votes']));

                        if ($value['asn_has'] == 1) {
                            $row['count_rp_tracking_number'][] = $value['rp_tracking_number'];
                            $row['rp_tracking_number'] = count(array_unique($row['count_rp_tracking_number']));
                        }
                    }
                }
            }

            //CSP 占比
            if ($data['qrb_csp'] != 0 && $data['qrb_po'] != 0) {
                $data['qrb_csp_proportion'] = round($data['qrb_csp'] / $data['qrb_po'], 4) * 100;
            }

            //无 ASN 单,采购提供 ASN 的票数
            $com = array(
                'warehouse_id' => $warehouseId,
                'po_add_time_start' => $date . ' 00:00:00',
                'po_add_time_end' => $date . ' 23:59:59',
                'po_type' => 169,
            );
            $Object = new Order_Service_ProblemOrder();
            $opIds = $Object->getByCondition($com, '*');
            if ($opIds) {
                foreach ($opIds as $ve) {
                    $row['count_tracking_number'][] = $ve['tracking_number'];
                    $data['qrb_procurement_asn'] = count(array_unique($row['count_tracking_number']));
                }
            }

            //能找到 ASN 单,质检手动绑定的票数
            $data['qrb_manual_asn'] = $row['rp_tracking_number'] - $data['qrb_procurement_asn'];

            //占比
            if ($data['qrb_peceiving_votes'] != 0) {
                if ($data['qrb_procurement_asn'] != 0) {
                    $data['qrb_procurement_asn_proportion'] = round($data['qrb_procurement_asn'] / $data['qrb_peceiving_votes'], 4) * 100;
                }
                if ($data['qrb_manual_asn'] != 0) {
                    $data['qrb_manual_asn_proportion'] = round($data['qrb_manual_asn'] / $data['qrb_peceiving_votes'], 4) * 100;
                }
            }

            //当天处理票数
            $combinat = array(
                'warehouse_id' => $warehouseId,
                'rpm_unpack_time_form' => $date . ' 00:00:00',
                'rpm_unpack_time_to' => $date . ' 23:59:59',
                'rp_status' => 1,
            );
            $rpmIds = Product_Service_ReceivingPre::getByleftJoin($combinat, '*');
            if ($rpmIds) {
                foreach ($rpmIds as $valu) {
                    if ($valu['rp_tracking_number'] != '') {
                        $row['count_processing'][] = $valu['rp_tracking_number'];
                        $data['qrb_processing'] = count(array_unique($row['count_processing']));
                    }
                }
            }

            //上周日均处理票数
            if (date('w') == 1) {
                $combin = array(
                    'warehouse_id' => $warehouseId,
                    //上周周一
                    'rpm_unpack_time_form' => date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') - date('w') + 1 - 7, date('Y'))),
                    //上周周日
                    'rpm_unpack_time_to' => date('Y-m-d H:i:s', mktime(23, 59, 59, date('m'), date('d') - date('w') + 7 - 7, date('Y'))),
                    'rp_status' => 1,
                );
                $rpmIdInfo = Product_Service_ReceivingPre::getByleftJoin($combin, '*');
                if ($rpmIdInfo) {
                    foreach ($rpmIdInfo as $val) {
                        $unpackTime = substr($val['rpm_unpack_time'], 0, 10);
                        $row['week_processing'][$unpackTime] = $val;
                    }
                    foreach ($rpmIdInfo as $va) {
                        if ($va['rp_tracking_number'] != '') {
                            $row['count_week_processing'][] = $va['rp_tracking_number'];
                            $data['qrb_week_processing'] = floor(count(array_unique($row['count_week_processing'])) / count($row['week_processing']));
                        }
                    }
                }
            } else {
                $combin = array(
                    'warehouse_id' => $warehouseId,
                    'start_date' => date('Y-m-d', strtotime('-2 day')),
                    'end_date' => date('Y-m-d', strtotime('-2 day')),
                );
                $qrbId = self::getCombination($combin, 'qrb_week_processing');
                if ($qrbId) {
                    $data['qrb_week_processing'] = $qrbId[0]['qrb_week_processing'];
                }
            }

            $comb = array(
                'warehouse_id' => $warehouseId,
                'rp_status' => '0',
            );
            $receivingIds = Product_Service_ReceivingPre::getByleftJoin($comb, '*');
            if ($receivingIds) {
                foreach ($receivingIds as $v) {
                    //积压票数
                    if ($v['rp_tracking_number'] != '') {
                        $row['count_backlog'][] = $v['rp_tracking_number'];
                        $data['qrb_backlog'] = count(array_unique($row['count_backlog']));

                        //未绑定 PO 票数
                        if ($v['asn_has'] == 1) {
                            $row['count_no_po'][] = $v['rp_tracking_number'];
                            $data['qrb_no_po'] = count(array_unique($row['count_no_po']));
                        } else {
                            //CSP 和非 CSP
                            if ($v['plat_form'] == 'CSP') {
                                $row['count_is_csp'][] = $v['rp_tracking_number'];
                                $data['qrb_is_csp'] = count(array_unique($row['count_is_csp']));
                            } else {
                                $row['count_no_csp'][] = $v['rp_tracking_number'];
                                $data['qrb_no_csp'] = count(array_unique($row['count_no_csp']));
                            }

                            if ($v['category'] != 0) {
                                if (!isset($row['category'])) {
                                    $catearray = Product_Service_Receiving::$productCategory;
                                    foreach ($catearray as $key => $vl) {
                                        $row['category'][$key] = 0;
                                    }
                                }
                                $row['category'][$v['category']] += 1;
                            }
                        }
                    }
                }
            }

            //产品品类
            if ($row['category']) {
                $data['qrb_category'] = serialize($row['category']);
            }

            //积压 / 日均处理票数 %
            if ($data['qrb_backlog'] != 0 && $data['qrb_week_processing'] != 0) {
                $data['qrb_backlog_proportion'] = round($data['qrb_backlog'] / $data['qrb_week_processing'], 4) * 100;
            }

            /*
             * 预警等级:
             * 红色预警:仓库积压来货量(按 PO 单计数)连续 3 天 ≧ 上周质检组日均处理量(按 PO 单计数)的 100% 定义为红色预警
             * 黄色预警:仓库积压来货量(按 PO 单计数)连续 3 天 ≧ 上周质检组日均处理量(按 PO 单计数)的 40% 定义为黄色预警
             */
            $redNumber = 0;
            $yellowNumber = 0;
            $configId = Common_Service_Config::getByAttribute('WARNING_INDICATOR_SETTING', $warehouseId);
            if ($configId && $configId['config_value']) {
                $configValue = unserialize($configId['config_value']);
                $days = $configValue['red_days'] - 1;
                $comb = array(
                    'warehouse_id' => $warehouseId,
                    'start_date' => date('Y-m-d', strtotime("$date -$days day")),
                    'end_date' => $date,
                );
                $qrbIds = Product_Service_QualityReceivingBacklog::getCombination($comb, array('qrb_backlog', 'qrb_week_processing'));
                if ($qrbIds) {
                    foreach ($qrbIds as $vu) {
                        if ($vu['qrb_backlog'] >= floor(($vu['qrb_week_processing'] * $configValue['red_percentage']) / 100)) {
                            $redNumber++;
                        } else if ($vu['qrb_backlog'] >= floor(($vu['qrb_week_processing'] * $configValue['yellow_percentage']) / 100)) {
                            $yellowNumber++;
                        }
                    }
                    if ($data['qrb_backlog'] != 0 && $data['qrb_week_processing'] != 0) {
                        if ($data['qrb_backlog'] >= floor(($data['qrb_week_processing'] * $configValue['red_percentage']) / 100) && $redNumber == $days) {
                            $data['qrb_warning_level'] = 'red';
                        } else if ($data['qrb_backlog'] >= floor(($data['qrb_week_processing'] * $configValue['yellow_percentage']) / 100) && $yellowNumber == $days) {
                            $data['qrb_warning_level'] = 'yellow';
                        }
                    }
                }
            }
            return $data;
        } catch (Exception $e) {
            return '[ ' . date('Y-m-d H:is') . ' ] 出现异常,异常信息为:' . $e->getMessage() . "\r\n";
        }
    }

    /*
     * 发送质检组收货及积压预警报表
     *
     * $startDate      2017-09-01                 开始日期 每月 1 号
     * $date                    0000-00-00                 结束日期 当天的前一天
     * $warehouseId             Integer                    仓库
     */

    public static function sendEmail($startDate, $date, $warehouseId) {
        //获取数据
        $combination = array(
            "warehouse_id" => $warehouseId,
            "start_date" => $startDate,
            "end_date" => $date,
        );
        $qrbIds = self::getCombination($combination, "*", "qrb_date desc");
        $warehouseNameCn = Warehouse_Service_Warehouse::getById($warehouseId);
        if ($qrbIds) {
            $week = array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
            $catearray = Product_Service_Receiving::$productCategory;

            //正文内容
            $text = "<style>.tab-report{border-top:1px solid #cccccc;border-left:1px solid #cccccc;} .tab-report td, .tab-report th{border-bottom:1px solid #cccccc;border-right:1px solid #cccccc; text-align:center;} .tab-report .yellow{background-color:yellow} .tab-report .blue{background-color:#82A3F8} .tab-report .orange{background-color:#E6F3F9} .tab-report .event-tr{background-color:#E6F3F9}</style>";
            $text .= "<table width='100%' border='0' cellspacing='0' cellpadding='0' class='tab-report'>";
            $text .= "<tr class='o0range'>";
            $text .= "<th colspan='2' style='background-color: #EEECE1'>时间</th>";
            $text .= "<th colspan='4' style='background-color: #C5D9F1'>收货数据</th>";
            $text .= "<th colspan='4' style='background-color: #F1F6F5'>PO 单绑定数据</th>";
            $text .= "<th colspan='5' style='background-color: #FDE9D9'>积压预警</th>";
            $text .= "<th colspan='100%' style='background-color: #EBF1DE'>积压数据</th>";
            $text .= "</tr>";
            $text .= "<tr class='even-tr'>";
            $text .= "<th>日期</th>";
            $text .= "<th>星期</th>";
            $text .= "<th>收货票数</th>";
            $text .= "<th>PO 收货量</th>";
            $text .= "<th>CSP 收货量</th>";
            $text .= "<th>CSP 占比</th>";
            $text .= "<th>有 ASN 单的票数</th>";
            $text .= "<th>占比</th>";
            $text .= "<th>无 ASN 单的票数</th>";
            $text .= "<th>占比</th>";
            $text .= "<th>当天处理票数</th>";
            $text .= "<th>上周日均处理票数</th>";
            $text .= "<th>积压票数</th>";
            $text .= "<th>积压 / 日均处理票数 %</th>";
            $text .= "<th>预警等级</th>";
            $text .= "<th>未绑定 PO 票数</th>";
            $text .= "<th>非 CSP</th>";
            $text .= "<th>CSP</th>";
            foreach ($catearray as $key => $value) {
                $text .= "<th value='$key'>$value</th>";
            }
            $text .= "</tr>";
            foreach ($qrbIds as $ke => $valu) {
                $valu['qrb_category'] == "" ? $qrbCategory = array() : $qrbCategory = unserialize($valu['qrb_category']);
                if ($ke % 2 == 0) {
                    $tr = "<tr>";
                } else {
                    $tr = "<tr style='background-color: E6F3F9'>";
                }
                $text .= $tr
                        . "<td>" . $valu['qrb_date'] . "</td>"
                        . "<td>" . $week[date("w", strtotime($valu['qrb_date']))] . "</td>"
                        . "<td>" . $valu['qrb_peceiving_votes'] . "</td>"
                        . "<td>" . $valu['qrb_po'] . "</td>"
                        . "<td>" . $valu['qrb_csp'] . "</td>"
                        . "<td>" . $valu['qrb_csp_proportion'] . "%</td>"
                        . "<td>" . $valu['qrb_manual_asn'] . "</td>"
                        . "<td>" . $valu['qrb_manual_asn_proportion'] . "%</td>"
                        . "<td>" . $valu['qrb_procurement_asn'] . "</td>"
                        . "<td>" . $valu['qrb_procurement_asn_proportion'] . "%</td>"
                        . "<td>" . $valu['qrb_processing'] . "</td>"
                        . "<td>" . $valu['qrb_week_processing'] . "</td>"
                        . "<td>" . $valu['qrb_backlog'] . "</td>"
                        . "<td>" . $valu['qrb_backlog_proportion'] . "%</td>"
                        . "<td style='background-color: " . $valu['qrb_warning_level'] . " '></td>"
                        . "<td>" . $valu['qrb_no_po'] . "</td>"
                        . "<td>" . $valu['qrb_no_csp'] . "</td>"
                        . "<td>" . $valu['qrb_is_csp'] . "</td>";
                if ($qrbCategory) {
                    foreach ($qrbCategory as $k => $val) {
                        $text .= "<td value='$k'>" . $val . "</td>";
                    }
                } else {
                    for ($i = 0; $i < count($catearray); $i++) {
                        $text .= "<td></td>";
                    }
                }
                $text .= "</tr>";
            }
            $text .= "</table>";

            //获取收件人邮箱
            $configId = Common_Service_Config::getByAttribute("RECIPIENT_MAILBOX_ADDRESS");
            if ($configId && $configId['config_value']) {
                $emails = explode("&", $configId['config_value']);
                if ($warehouseId == 11) {
                    $email = explode(";", $emails[0]);
                } else if ($warehouseId == 4) {
                    $email = explode(";", $emails[1]);
                } else if ($warehouseId == 14) {
                    $email = explode(";", $emails[2]);
                }
                //弹出数组最后一个单元(出栈)
                array_pop($email);
            } else {
                throw new Exception("请配置收件人邮箱地址!");
            }

            //发送邮件对应处理
            $mailSubject = $warehouseNameCn['warehouse_name_cn'] . "质检组收货及积压预警监控报表" . date("Y-m-d");
            $mail = Product_Service_ReceivingItem::setupMail();
            $mail->setBodyHtml($text);
            $mail->addTo($email, $mailSubject);
            $mail->setSubject($mailSubject);
            $path = APPLICATION_PATH . "/../public/file/attachment/" . $mailSubject . ".csv";
            if ($path) {
                $handle = fopen($path, "a");
                if ($handle) {
                    fwrite($handle, $text);
                    fclose($handle);
                }
            }
            if ($mail->send()) {
                if (is_array($email)) {
                    $mailUser = implode(";", $email);
                }
                $combinat = array(
                    "eq_to" => $mailUser,
                    "eq_subject" => $mailSubject,
                    "eq_body" => $text,
                    "eq_attachment" => $path,
                    "eq_add_time" => date("Y-m-d H:i:s"),
                    "eq_send_time" => date("Y-m-d H:i:s"),
                    "eq_status" => 1
                );
                Common_Service_MailRecord::addMailRecord($combinat);
            }
        } else {
            echo "未查询到" . $warehouseNameCn['warehouse_name_cn'] . "对应数据";
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值