/*
* 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'] . "对应数据";
}
}
}
自动任务发送邮件优化
最新推荐文章于 2021-08-19 17:42:04 发布