2025-09-04 10:26:28 +08:00
|
|
|
<?php
|
|
|
|
|
namespace app\crm\controller;
|
|
|
|
|
|
|
|
|
|
use app\common\controller\BaseController;
|
|
|
|
|
use app\common\traits\crud\CrudControllerTrait;
|
2025-09-10 13:39:06 +08:00
|
|
|
use app\crm\service\StockOrdersService;
|
2025-09-04 10:26:28 +08:00
|
|
|
use support\Request;
|
|
|
|
|
|
|
|
|
|
class StockOrdersController extends BaseController
|
|
|
|
|
{
|
2025-09-08 11:34:19 +08:00
|
|
|
protected $noNeedLogin = ['print'];
|
|
|
|
|
|
|
|
|
|
protected $noNeedHeaderData = ['print'];
|
|
|
|
|
|
2025-09-04 10:26:28 +08:00
|
|
|
use CrudControllerTrait;
|
|
|
|
|
|
|
|
|
|
protected $service;
|
|
|
|
|
|
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
$this->service = new StockOrdersService();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 列表页数据格式化
|
|
|
|
|
*
|
|
|
|
|
* @param array $data
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
2025-09-04 18:22:24 +08:00
|
|
|
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']);
|
2025-09-09 17:30:39 +08:00
|
|
|
|
|
|
|
|
if (isset($data['id'])) {
|
|
|
|
|
$appro = new \app\common\utils\approval\service\ApprovalFlowService();
|
|
|
|
|
$appro = $appro->getBriefStatusByBiz($data['id'], null, 'name');
|
2025-10-11 08:41:11 +00:00
|
|
|
$map = ['processing'=>'审批中','pending'=>'审批中','approved'=>'已通过','rejected'=>'已拒绝','revoked'=>'已撤回','voided'=>'已作废'];
|
2025-09-09 17:30:39 +08:00
|
|
|
if ($appro) {
|
|
|
|
|
$data['appro_status'] = [
|
|
|
|
|
'status' => $appro['status'],
|
|
|
|
|
'status_desc' => $map[$appro['status']],
|
|
|
|
|
'name' => isset($appro['step'])?$appro['step']['name']:''
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-04 18:22:24 +08:00
|
|
|
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']);
|
2025-09-11 16:52:10 +08:00
|
|
|
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']);
|
2025-09-08 11:34:19 +08:00
|
|
|
|
2025-11-03 18:07:56 +08:00
|
|
|
// 处理文件附件:只允许 _url 字段调用 OSS 生成私有链接
|
2025-10-21 19:53:21 +08:00
|
|
|
$fileTypes = [
|
|
|
|
|
'contract' => \app\common\model\StockOrdersFiles::CONTRACT,
|
|
|
|
|
'transaction_slip' => \app\common\model\StockOrdersFiles::TRANSACTION_SLIP,
|
|
|
|
|
'pi_doc' => \app\common\model\StockOrdersFiles::PI_DOC
|
|
|
|
|
];
|
2025-11-03 18:07:56 +08:00
|
|
|
|
2025-10-21 19:53:21 +08:00
|
|
|
// 初始化文件字段
|
|
|
|
|
foreach (array_keys($fileTypes) as $field) {
|
2025-11-03 18:07:56 +08:00
|
|
|
$data[$field] = []; // 存储原始文件信息(不包含签名链接)
|
|
|
|
|
$data[$field . '_url'] = []; // 存储通过OSS生成的私有链接
|
2025-10-21 19:53:21 +08:00
|
|
|
}
|
2025-11-03 18:07:56 +08:00
|
|
|
|
|
|
|
|
// 按 file_code 分组文件
|
2025-10-21 19:53:21 +08:00
|
|
|
if (!empty($data['files'])) {
|
|
|
|
|
$groupedFiles = [];
|
|
|
|
|
foreach ($data['files'] as $file) {
|
2025-11-03 18:07:56 +08:00
|
|
|
$code = $file['file_code'];
|
|
|
|
|
if (!isset($groupedFiles[$code])) {
|
|
|
|
|
$groupedFiles[$code] = [];
|
2025-10-21 19:53:21 +08:00
|
|
|
}
|
2025-11-03 18:07:56 +08:00
|
|
|
$groupedFiles[$code][] = [
|
|
|
|
|
'url' => $file['file_url'], // 原始路径
|
|
|
|
|
'original_name' => $file['original_name'] // 原始文件名
|
|
|
|
|
];
|
2025-10-21 19:53:21 +08:00
|
|
|
}
|
2025-11-03 18:07:56 +08:00
|
|
|
|
|
|
|
|
// 映射到对应字段,并仅对 _url 调用 OSS 服务
|
2025-10-21 19:53:21 +08:00
|
|
|
foreach ($fileTypes as $field => $fileCode) {
|
|
|
|
|
if (isset($groupedFiles[$fileCode])) {
|
2025-11-03 18:07:56 +08:00
|
|
|
// 主字段存储基本信息(无签名链接)
|
2025-10-21 19:53:21 +08:00
|
|
|
$data[$field] = $groupedFiles[$fileCode];
|
2025-11-03 18:07:56 +08:00
|
|
|
|
|
|
|
|
// 只有 *_url 字段才生成带签名的完整 URL
|
|
|
|
|
$signedUrls = [];
|
|
|
|
|
foreach ($groupedFiles[$fileCode] as $fileInfo) {
|
|
|
|
|
$signedUrls[] = (new \app\common\service\OssService)->generatePrivateUrl($fileInfo['url']);
|
2025-10-21 19:53:21 +08:00
|
|
|
}
|
2025-11-03 18:07:56 +08:00
|
|
|
$data[$field . '_url'] = $signedUrls;
|
2025-10-21 19:53:21 +08:00
|
|
|
}
|
|
|
|
|
}
|
2025-11-03 18:07:56 +08:00
|
|
|
|
|
|
|
|
// 清理临时数据
|
2025-10-21 19:53:21 +08:00
|
|
|
unset($data['files']);
|
2025-09-08 11:34:19 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-04 18:22:24 +08:00
|
|
|
if (count($data['moneyValues']) > 0) {
|
2025-09-11 15:31:37 +08:00
|
|
|
foreach ($data['moneyValues'] as $mvs) {
|
|
|
|
|
$data[$mvs['field']] = [
|
|
|
|
|
'exchange_rate' => $mvs['exchange_rate'],
|
|
|
|
|
'amount' => $mvs['amount'],
|
|
|
|
|
'currency' => $mvs['currency'],
|
|
|
|
|
'id' => $mvs['id']
|
|
|
|
|
];
|
|
|
|
|
}
|
2025-09-04 18:22:24 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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']);
|
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
}
|
2025-09-04 10:26:28 +08:00
|
|
|
|
2025-09-09 16:15:48 +08:00
|
|
|
|
|
|
|
|
protected function printFormat($data)
|
|
|
|
|
{
|
|
|
|
|
$data['file_url_full'] = (!empty($data['file_url'])) ? (new \app\common\service\OssService)->generatePrivateUrl($data['file_url']) : '';
|
|
|
|
|
return $data;
|
|
|
|
|
}
|
2025-09-05 09:26:29 +08:00
|
|
|
|
2025-09-10 18:34:20 +08:00
|
|
|
/**
|
|
|
|
|
* 获取打印数据
|
|
|
|
|
*/
|
2025-09-08 11:34:19 +08:00
|
|
|
public function print(Request $request)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
$raw = $this->service->servicePrint($request);
|
2025-09-09 16:15:48 +08:00
|
|
|
$data = $this->transformData($raw, method_exists($this, 'printFormat')
|
|
|
|
|
? [$this, 'printFormat']
|
|
|
|
|
: null);
|
|
|
|
|
return $this->success($data);
|
2025-09-08 11:34:19 +08:00
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->error($e->getMessage());
|
|
|
|
|
}
|
2025-09-11 15:31:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function detail(Request $request)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
$raw = $this->service->serviceDetail($request);
|
2025-09-11 16:52:10 +08:00
|
|
|
$data = $this->transformData($raw, method_exists($this, 'detailFormat')
|
|
|
|
|
? [$this, 'detailFormat']
|
2025-09-11 15:31:37 +08:00
|
|
|
: null);
|
|
|
|
|
return $this->success($data);
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->error($e->getMessage());
|
|
|
|
|
}
|
2025-09-08 11:34:19 +08:00
|
|
|
}
|
2025-09-11 16:52:10 +08:00
|
|
|
|
|
|
|
|
protected function detailFormat($data)
|
|
|
|
|
{
|
|
|
|
|
// if (!isset($data['profit_total'])) $data['profit_total'] = 0.00;
|
|
|
|
|
return $data;
|
|
|
|
|
}
|
2025-09-05 09:26:29 +08:00
|
|
|
|
2025-09-10 18:34:20 +08:00
|
|
|
/**
|
|
|
|
|
* 启动审批
|
|
|
|
|
*/
|
|
|
|
|
public function approval(Request $request)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
$raw = $this->service->serviceApproval($request);
|
|
|
|
|
$data = $this->transformData($raw, method_exists($this, 'approvalFormat')
|
|
|
|
|
? [$this, 'approvalFormat']
|
|
|
|
|
: null);
|
|
|
|
|
return $this->success($data);
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->error($e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-04 10:26:28 +08:00
|
|
|
|
2025-10-10 11:09:37 +00:00
|
|
|
public function approvalNullify(Request $request)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
$raw = $this->service->serviceApprovalNullify($request);
|
|
|
|
|
$data = $this->transformData($raw, method_exists($this, 'approvalFormat')
|
|
|
|
|
? [$this, 'approvalFormat']
|
|
|
|
|
: null);
|
|
|
|
|
return $this->success($data);
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->error($e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function approvalRevoke(Request $request)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
$raw = $this->service->serviceApprovalRevoke($request);
|
|
|
|
|
$data = $this->transformData($raw, method_exists($this, 'approvalFormat')
|
|
|
|
|
? [$this, 'approvalFormat']
|
|
|
|
|
: null);
|
|
|
|
|
return $this->success($data);
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->error($e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-15 15:01:19 +08:00
|
|
|
/**
|
|
|
|
|
* 最终审批
|
|
|
|
|
*/
|
|
|
|
|
public function ultimateApproval(Request $request)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
$raw = $this->service->serviceUltimateApproval($request);
|
|
|
|
|
$data = $this->transformData($raw, method_exists($this, 'approvalFormat')
|
|
|
|
|
? [$this, 'approvalFormat']
|
|
|
|
|
: null);
|
|
|
|
|
return $this->success($data);
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->error($e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-09-04 10:26:28 +08:00
|
|
|
}
|