Files
coolcoth.com/app/Controllers/PSI/ReportsController.php
T
2026-08-08 15:53:53 +08:00

94 lines
3.6 KiB
PHP

<?php
namespace App\Controllers\PSI;
use App\Controllers\Controller;
use App\Models\PSI\PurchaseOrder;
use App\Models\PSI\PurchaseOrderItem;
use App\Models\PSI\SalesOrder;
use App\Models\PSI\SalesOrderItem;
use App\Models\PSI\Outbound;
use App\Models\PSI\OutboundItem;
/**
* 报表中心:采购订单明细 / 销售·采购订单明细 / 交付明细。
* 集中展示单据之间的关联性(采购→入库、销售订单→出库交付)。
*/
class ReportsController extends Controller
{
public function index()
{
return $this->renderSubsys('psi', 'psi/reports', [
'poCount' => count((new PurchaseOrder())->all()),
'soCount' => count((new SalesOrder())->all()),
'obCount' => count((new Outbound())->all()),
], \psi_nav(), 'reports');
}
/** 采购订单明细 */
public function poDetail()
{
$orders = array_reverse((new PurchaseOrder())->all());
$itemM = new PurchaseOrderItem();
foreach ($orders as &$o) { $o['_items'] = $itemM->whereAll('po_id', $o['id']); }
return $this->renderSubsys('psi', 'psi/report_po_detail', ['orders' => $orders], \psi_nav(), 'reports');
}
/** 销售 / 采购订单明细(合并筛选) */
public function soPo()
{
$type = $this->get('type', 'all');
$so = $po = [];
if ($type !== 'purchase') {
$so = array_reverse((new SalesOrder())->all());
$soItemM = new SalesOrderItem();
foreach ($so as &$o) {
$o['_items'] = $soItemM->whereAll('so_id', $o['id']);
$o['_amt'] = array_sum(array_map(fn($i) => (float)($i['amount'] ?? 0), $o['_items']));
}
}
if ($type !== 'sales') {
$po = array_reverse((new PurchaseOrder())->all());
$poItemM = new PurchaseOrderItem();
foreach ($po as &$o) {
$o['_items'] = $poItemM->whereAll('po_id', $o['id']);
$o['_amt'] = array_sum(array_map(fn($i) => (float)($i['amount'] ?? 0), $o['_items']));
}
}
return $this->renderSubsys('psi', 'psi/report_so_po', [
'type' => $type, 'so' => $so, 'po' => $po,
], \psi_nav(), 'reports');
}
/** 交付明细:出库单 + 销售订单交付进度(应发/已发/未发) */
public function delivery()
{
$list = array_reverse((new Outbound())->all());
$obItemM = new OutboundItem();
foreach ($list as &$o) { $o['_items'] = $obItemM->whereAll('ob_id', $o['id']); }
$soList = (new SalesOrder())->all();
$soItemM = new SalesOrderItem();
$progress = [];
foreach ($soList as $so) {
$items = $soItemM->whereAll('so_id', $so['id']);
$ordered = array_sum(array_map(fn($i) => (int)($i['qty'] ?? 0), $items));
$delivered = array_sum(array_map(fn($i) => (int)($i['delivered_qty'] ?? 0), $items));
$amt = array_sum(array_map(fn($i) => (float)($i['amount'] ?? 0), $items));
if ($ordered <= 0) continue;
$progress[] = [
'order_no' => $so['order_no'],
'customer' => $so['customer'],
'salesman' => $so['salesman'],
'status' => $so['status'],
'ordered' => $ordered,
'delivered' => $delivered,
'remain' => max(0, $ordered - $delivered),
'amount' => $amt,
];
}
return $this->renderSubsys('psi', 'psi/report_delivery', [
'list' => $list, 'progress' => $progress,
], \psi_nav(), 'reports');
}
}