Files
fdesk/app/admin/controller/StockOrdersController.php
T
mzl92 2de6342058 fix: 备货单车辆附件图片过期打不开——url 改为响应期重签
原因:attachment[].url 存的是上传时生成的带签名OSS地址(默认1小时
有效),过期后 AccessDenied/Request has expired。
修复:OssService 新增 resignAttachmentUrls(),从存量 url(完整签名URL/
未签名URL/纯对象键三种格式)提取对象键重新签名(7天);
detail(prepareVehicleListData)与 show(crm/admin 两控制器 showFormat
的 items)三处响应时统一重签。存储不动,前端无需改。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-26 11:51:40 +08:00

203 lines
8.0 KiB
PHP

<?php
namespace app\admin\controller;
use app\common\controller\BaseController;
use app\common\traits\crud\CrudControllerTrait;
use app\common\service\StockOrdersService;
use support\Request;
class StockOrdersController extends BaseController
{
protected $noNeedLogin = ['print'];
protected $noNeedHeaderData = ['print'];
use CrudControllerTrait;
protected $service;
public function __construct()
{
$this->service = new StockOrdersService();
}
/**
* 列表页数据格式化
*
* @param array $data
* @return array
*/
protected function indexFormat($data)
{
if (isset($data['created_at'])) $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']);
if (isset($data['updated_at'])) $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']);
if (isset($data['eta_ship_date'])) $data['eta_ship_date'] = date('Y-m-d', $data['eta_ship_date']);
if (isset($data['biz_date'])) $data['biz_date'] = date('Y-m-d', $data['biz_date']);
if (isset($data['latest_arrival_date'])) $data['latest_arrival_date'] = date('Y-m-d', $data['latest_arrival_date']);
if (isset($data['id'])) {
$appro = new \app\common\utils\approval\service\ApprovalFlowService();
$appro = $appro->getBriefStatusByBiz($data['id'], null, 'name');
$map = ['processing'=>'审批中','pending'=>'审批中','approved'=>'已通过','rejected'=>'已拒绝','revoked'=>'已撤回','voided'=>'已作废'];
if ($appro) {
$data['appro_status'] = [
'status' => $appro['status'],
'status_desc' => $map[$appro['status']],
'name' => isset($appro['step'])?$appro['step']['name']:''
];
}
}
return $data;
}
protected function showFormat($data)
{
if (isset($data['created_at'])) $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']);
if (isset($data['updated_at'])) $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']);
if (isset($data['eta_ship_date'])) $data['eta_ship_date'] = date('Y-m-d', $data['eta_ship_date']);
if (isset($data['biz_date']) && $data['biz_date'] > 0) $data['biz_date'] = date('Y-m-d', $data['biz_date']);
if (isset($data['latest_arrival_date']) && $data['latest_arrival_date'] > 0) $data['latest_arrival_date'] = date('Y-m-d', $data['latest_arrival_date']);
if (isset($data['pick_up_date']) && $data['pick_up_date'] > 0) $data['pick_up_date'] = date('Y-m-d', $data['pick_up_date']);
if (isset($data['collect_all_date']) && $data['collect_all_date'] > 0) $data['collect_all_date'] = date('Y-m-d', $data['collect_all_date']);
// 处理文件附件
$fileTypes = [
'contract' => \app\common\model\StockOrdersFiles::CONTRACT,
'transaction_slip' => \app\common\model\StockOrdersFiles::TRANSACTION_SLIP,
'pi_doc' => \app\common\model\StockOrdersFiles::PI_DOC
];
// 初始化文件字段
foreach (array_keys($fileTypes) as $field) {
$data[$field] = [];
$data[$field . '_url'] = [];
}
// 按file_code分组文件
if (!empty($data['files'])) {
$groupedFiles = [];
foreach ($data['files'] as $file) {
if (!isset($groupedFiles[$file['file_code']])) {
$groupedFiles[$file['file_code']] = [];
}
$groupedFiles[$file['file_code']][] = [
'url' => $file['file_url'],
'original_name' => $file['original_name']
];
}
// 映射到对应字段
foreach ($fileTypes as $field => $fileCode) {
if (isset($groupedFiles[$fileCode])) {
// 文件信息数组,包含url和original_name
$data[$field] = $groupedFiles[$fileCode];
// 完整URL数组
$fullUrls = [];
foreach ($groupedFiles[$fileCode] as $fileInfo) {
$fullUrls[] = (new \app\common\service\OssService)->generatePrivateUrl($fileInfo['url']);
}
$data[$field . '_url'] = $fullUrls;
}
}
unset($data['files']);
}
if (count($data['moneyValues']) > 0) {
foreach ($data['moneyValues'] as $mvs) {
$data[$mvs['field']] = [
'exchange_rate' => $mvs['exchange_rate'],
'amount' => $mvs['amount'],
'currency' => $mvs['currency'],
'id' => $mvs['id']
];
}
}
foreach ($data['items'] as &$item) {
foreach ($item['moneyValues'] as $mv) {
$item[$mv['field']] = [
'exchange_rate' => $mv['exchange_rate'],
'amount' => $mv['amount'],
'currency' => $mv['currency'],
'id' => $mv['id']
];
}
unset($item['moneyValues']);
foreach ($item['options'] as $opt) {
$item['modify_list'][] = [
"id" => $opt['id'],
"order_item_id" => $opt['order_item_id'],
"option_id" => $opt['option_id'],
"option_name_snapshot" => $opt['option_name_snapshot'],
"option_price" => $opt['option_price']
];
}
unset($item['options']);
// 附件 url 响应期重签(历史签名URL会过期)
if (!empty($item['attachment']) && is_array($item['attachment'])) {
$item['attachment'] = \app\common\service\OssService::resignAttachmentUrls($item['attachment']);
}
}
unset($item);
foreach ($data['accounts'] as $acc) {
$data['account_list'][] = [
"id" => $acc['id'],
"order_id" => $acc['order_id'],
"seq_no" => $acc['seq_no'],
"remit_country_id" => $acc['remit_country_id'],
"remit_country_name_snapshot" => $acc['remit_country_name_snapshot'],
"remit_date" => date('Y-m-d', $acc['remit_date']),
"currency_code" => $acc['currency_code'],
"currency_name_snapshot" => $acc['currency_name_snapshot'],
"account_id" => $acc['account_id'],
"account_name_snapshot" => $acc['account_name_snapshot'],
"remitter_name" => $acc['remitter_name'],
"amount" => $acc['amount']
];
}
unset($data['accounts']);
$data['veh_list'] = $data['items'];
unset($data['items']);
return $data;
}
protected function printFormat($data)
{
$data['file_url_full'] = (!empty($data['file_url'])) ? (new \app\common\service\OssService)->generatePrivateUrl($data['file_url']) : '';
return $data;
}
public function print(Request $request)
{
try {
$raw = $this->service->servicePrint($request);
$data = $this->transformData($raw, method_exists($this, 'printFormat')
? [$this, 'printFormat']
: null);
return $this->success($data);
} catch (\Throwable $e) {
return $this->error($e->getMessage());
}
}
public function detail(Request $request)
{
try {
$raw = $this->service->serviceDetail($request);
$data = $this->transformData($raw, method_exists($this, 'detailFormat')
? [$this, 'detailFormat']
: null);
return $this->success($data);
} catch (\Throwable $e) {
return $this->error($e->getMessage());
}
}
}