chore: release updated anxinyan version
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller\admin;
|
||||
|
||||
use app\support\ExpressCompanyService;
|
||||
use support\Request;
|
||||
|
||||
class ExpressCompaniesController
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$enabledOnly = (int)$request->input('enabled_only', 0) === 1;
|
||||
|
||||
return api_success([
|
||||
'list' => $this->service()->list($enabledOnly),
|
||||
'default_company' => $this->service()->defaultName(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function save(Request $request)
|
||||
{
|
||||
$id = (int)$request->input('id', 0);
|
||||
|
||||
try {
|
||||
$companyId = $this->service()->save([
|
||||
'company_name' => $request->input('company_name', ''),
|
||||
'company_code' => $request->input('company_code', ''),
|
||||
'status' => $request->input('status', 'enabled'),
|
||||
'is_default' => $request->input('is_default', false),
|
||||
'sort_order' => $request->input('sort_order', 0),
|
||||
'remark' => $request->input('remark', ''),
|
||||
], $id);
|
||||
} catch (\RuntimeException $e) {
|
||||
return api_error($e->getMessage(), 422);
|
||||
} catch (\Throwable $e) {
|
||||
return api_error('快递公司保存失败', 500, [
|
||||
'detail' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
|
||||
return api_success([
|
||||
'id' => $companyId,
|
||||
], $id > 0 ? '快递公司已更新' : '快递公司已创建');
|
||||
}
|
||||
|
||||
private function service(): ExpressCompanyService
|
||||
{
|
||||
return new ExpressCompanyService();
|
||||
}
|
||||
}
|
||||
@@ -41,6 +41,7 @@ class ReportsController
|
||||
'r.zhongjian_report_no',
|
||||
'r.report_entry_admin_name',
|
||||
'r.report_entered_at',
|
||||
'r.trace_info_visible',
|
||||
'o.order_no',
|
||||
'p.product_name',
|
||||
'p.category_name',
|
||||
@@ -83,6 +84,7 @@ class ReportsController
|
||||
'zhongjian_report_no' => (string)($item['zhongjian_report_no'] ?? ''),
|
||||
'report_entry_admin_name' => (string)($item['report_entry_admin_name'] ?? ''),
|
||||
'report_entered_at' => (string)($item['report_entered_at'] ?? ''),
|
||||
'trace_info_visible' => (int)($item['trace_info_visible'] ?? 0) === 1,
|
||||
'product_name' => $item['product_name'] ?: (string)($productSnapshot['product_name'] ?? ''),
|
||||
'category_name' => $item['category_name'] ?: (string)($productSnapshot['category_name'] ?? ''),
|
||||
'brand_name' => $item['brand_name'] ?: (string)($productSnapshot['brand_name'] ?? ''),
|
||||
@@ -169,6 +171,7 @@ class ReportsController
|
||||
'report_entry_admin_id' => (int)($report['report_entry_admin_id'] ?? 0),
|
||||
'report_entry_admin_name' => (string)($report['report_entry_admin_name'] ?? ''),
|
||||
'report_entered_at' => (string)($report['report_entered_at'] ?? ''),
|
||||
'trace_info_visible' => (int)($report['trace_info_visible'] ?? 0) === 1,
|
||||
],
|
||||
'product_info' => $productSnapshot,
|
||||
'result_info' => $resultSnapshot,
|
||||
@@ -188,6 +191,32 @@ class ReportsController
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateTraceVisibility(Request $request)
|
||||
{
|
||||
$id = (int)$request->input('id', 0);
|
||||
if (!$id) {
|
||||
return api_error('报告 ID 不能为空', 422);
|
||||
}
|
||||
|
||||
$report = Db::name('reports')->where('id', $id)->find();
|
||||
if (!$report) {
|
||||
return api_error('报告不存在', 404);
|
||||
}
|
||||
|
||||
$visible = $this->boolInput($request->input('trace_info_visible', false));
|
||||
$now = date('Y-m-d H:i:s');
|
||||
|
||||
Db::name('reports')->where('id', $id)->update([
|
||||
'trace_info_visible' => $visible ? 1 : 0,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
|
||||
return api_success([
|
||||
'id' => $id,
|
||||
'trace_info_visible' => $visible,
|
||||
], $visible ? '追溯信息已设为显示' : '追溯信息已隐藏');
|
||||
}
|
||||
|
||||
public function saveInspection(Request $request)
|
||||
{
|
||||
$id = (int)$request->input('id', 0);
|
||||
@@ -540,6 +569,18 @@ class ReportsController
|
||||
return [];
|
||||
}
|
||||
|
||||
private function boolInput(mixed $value): bool
|
||||
{
|
||||
if (is_bool($value)) {
|
||||
return $value;
|
||||
}
|
||||
if (is_numeric($value)) {
|
||||
return (int)$value === 1;
|
||||
}
|
||||
|
||||
return in_array(strtolower(trim((string)$value)), ['1', 'true', 'yes', 'on'], true);
|
||||
}
|
||||
|
||||
private function loadReportContentMap(array $reportIds): array
|
||||
{
|
||||
if (!$reportIds) {
|
||||
|
||||
@@ -108,12 +108,16 @@ class ReportsController
|
||||
$reportMedia = [
|
||||
'images' => $this->filterAssetsByType($evidenceAttachments, 'image'),
|
||||
];
|
||||
$traceInfo = $this->buildTraceInfo(
|
||||
(int)($reportData['order_id'] ?? 0),
|
||||
$payload['appraisal_snapshot'],
|
||||
$evidenceAttachments,
|
||||
$request
|
||||
);
|
||||
$traceInfoVisible = (int)($reportData['trace_info_visible'] ?? 0) === 1;
|
||||
$traceInfo = $traceInfoVisible
|
||||
? $this->buildTraceInfo(
|
||||
(int)($reportData['order_id'] ?? 0),
|
||||
$payload['appraisal_snapshot'],
|
||||
$evidenceAttachments,
|
||||
$request
|
||||
)
|
||||
: ['visible' => false, 'nodes' => []];
|
||||
$traceInfo['visible'] = $traceInfoVisible;
|
||||
$pdfUrl = $this->ensurePdfFile($request, $reportData, $content ?: [], $verify ?: [], $productDisplay, $reportMedia);
|
||||
|
||||
return api_success([
|
||||
@@ -129,6 +133,7 @@ class ReportsController
|
||||
'zhongjian_report_no' => (string)($reportData['zhongjian_report_no'] ?? ''),
|
||||
'report_entry_admin_name' => (string)($reportData['report_entry_admin_name'] ?? ''),
|
||||
'report_entered_at' => (string)($reportData['report_entered_at'] ?? ''),
|
||||
'trace_info_visible' => $traceInfoVisible,
|
||||
],
|
||||
'result_info' => $payload['result_snapshot'],
|
||||
'product_info' => $payload['product_snapshot'],
|
||||
@@ -353,7 +358,7 @@ class ReportsController
|
||||
$items,
|
||||
$label,
|
||||
$this->textValue($point['point_value'] ?? '') ?: '-',
|
||||
$this->textValue($point['point_remark'] ?? ''),
|
||||
'',
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
@@ -71,6 +71,8 @@ class AdminAuthMiddleware implements MiddlewareInterface
|
||||
str_starts_with($path, '/api/admin/customers'),
|
||||
str_starts_with($path, '/api/admin/customer/') => ['customers.manage'],
|
||||
str_starts_with($path, '/api/admin/warehouse-workbench/') => ['warehouse_workbench.manage'],
|
||||
str_starts_with($path, '/api/admin/express-companies') && strtoupper($method) === 'GET' => ['warehouse_workbench.manage', 'orders.manage', 'warehouses.manage'],
|
||||
str_starts_with($path, '/api/admin/express-company/') => ['warehouses.manage'],
|
||||
str_starts_with($path, '/api/admin/warehouses'),
|
||||
str_starts_with($path, '/api/admin/warehouse/') => ['warehouses.manage'],
|
||||
str_starts_with($path, '/api/admin/material/') => ['materials.manage'],
|
||||
|
||||
208
server-api/app/support/ExpressCompanyService.php
Normal file
208
server-api/app/support/ExpressCompanyService.php
Normal file
@@ -0,0 +1,208 @@
|
||||
<?php
|
||||
|
||||
namespace app\support;
|
||||
|
||||
use support\think\Db;
|
||||
|
||||
class ExpressCompanyService
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->ensureTable();
|
||||
$this->bootstrapDefaults();
|
||||
}
|
||||
|
||||
public function list(bool $enabledOnly = false): array
|
||||
{
|
||||
$query = Db::name('express_companies')
|
||||
->order('is_default', 'desc')
|
||||
->order('sort_order', 'asc')
|
||||
->order('id', 'asc');
|
||||
|
||||
if ($enabledOnly) {
|
||||
$query->where('status', 'enabled');
|
||||
}
|
||||
|
||||
return array_map(fn (array $item) => $this->format($item), $query->select()->toArray());
|
||||
}
|
||||
|
||||
public function save(array $payload, int $id = 0): int
|
||||
{
|
||||
$now = date('Y-m-d H:i:s');
|
||||
$companyName = trim((string)($payload['company_name'] ?? ''));
|
||||
$companyCode = trim((string)($payload['company_code'] ?? ''));
|
||||
$status = trim((string)($payload['status'] ?? 'enabled'));
|
||||
$isDefault = !empty($payload['is_default']);
|
||||
|
||||
if ($companyName === '') {
|
||||
throw new \RuntimeException('快递公司名称不能为空');
|
||||
}
|
||||
if (!in_array($status, ['enabled', 'disabled'], true)) {
|
||||
throw new \RuntimeException('快递公司状态无效');
|
||||
}
|
||||
if ($isDefault && $status !== 'enabled') {
|
||||
throw new \RuntimeException('默认快递公司必须保持启用');
|
||||
}
|
||||
if ($companyCode === '') {
|
||||
$companyCode = $this->generateCompanyCode($companyName);
|
||||
}
|
||||
|
||||
$existsByName = Db::name('express_companies')
|
||||
->where('company_name', $companyName)
|
||||
->when($id > 0, fn ($query) => $query->where('id', '<>', $id))
|
||||
->find();
|
||||
if ($existsByName) {
|
||||
throw new \RuntimeException('快递公司名称已存在');
|
||||
}
|
||||
|
||||
$existsByCode = Db::name('express_companies')
|
||||
->where('company_code', $companyCode)
|
||||
->when($id > 0, fn ($query) => $query->where('id', '<>', $id))
|
||||
->find();
|
||||
if ($existsByCode) {
|
||||
throw new \RuntimeException('快递公司编码已存在');
|
||||
}
|
||||
|
||||
$data = [
|
||||
'company_name' => $companyName,
|
||||
'company_code' => $companyCode,
|
||||
'status' => $status,
|
||||
'is_default' => $isDefault ? 1 : 0,
|
||||
'sort_order' => (int)($payload['sort_order'] ?? 0),
|
||||
'remark' => trim((string)($payload['remark'] ?? '')),
|
||||
'updated_at' => $now,
|
||||
];
|
||||
|
||||
Db::startTrans();
|
||||
try {
|
||||
if ($isDefault) {
|
||||
Db::name('express_companies')->update([
|
||||
'is_default' => 0,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
}
|
||||
|
||||
if ($id > 0) {
|
||||
Db::name('express_companies')->where('id', $id)->update($data);
|
||||
$companyId = $id;
|
||||
} else {
|
||||
$data['created_at'] = $now;
|
||||
$companyId = (int)Db::name('express_companies')->insertGetId($data);
|
||||
}
|
||||
|
||||
$this->ensureEnabledDefault($now);
|
||||
Db::commit();
|
||||
} catch (\Throwable $e) {
|
||||
Db::rollback();
|
||||
throw $e;
|
||||
}
|
||||
|
||||
return $companyId;
|
||||
}
|
||||
|
||||
public function defaultName(): string
|
||||
{
|
||||
$row = Db::name('express_companies')
|
||||
->where('status', 'enabled')
|
||||
->where('is_default', 1)
|
||||
->find();
|
||||
|
||||
if (!$row) {
|
||||
$row = Db::name('express_companies')
|
||||
->where('status', 'enabled')
|
||||
->order('sort_order', 'asc')
|
||||
->order('id', 'asc')
|
||||
->find();
|
||||
}
|
||||
|
||||
return trim((string)($row['company_name'] ?? ''));
|
||||
}
|
||||
|
||||
private function format(array $item): array
|
||||
{
|
||||
$status = (string)($item['status'] ?? 'enabled');
|
||||
|
||||
return [
|
||||
'id' => (int)$item['id'],
|
||||
'company_name' => (string)$item['company_name'],
|
||||
'company_code' => (string)$item['company_code'],
|
||||
'status' => $status,
|
||||
'status_text' => $status === 'enabled' ? '启用中' : '已停用',
|
||||
'is_default' => (bool)$item['is_default'],
|
||||
'sort_order' => (int)$item['sort_order'],
|
||||
'remark' => (string)($item['remark'] ?? ''),
|
||||
'created_at' => (string)($item['created_at'] ?? ''),
|
||||
'updated_at' => (string)($item['updated_at'] ?? ''),
|
||||
];
|
||||
}
|
||||
|
||||
private function bootstrapDefaults(): void
|
||||
{
|
||||
$now = date('Y-m-d H:i:s');
|
||||
$exists = Db::name('express_companies')->where('company_name', '顺丰速运')->find();
|
||||
if (!$exists) {
|
||||
Db::name('express_companies')->insert([
|
||||
'company_name' => '顺丰速运',
|
||||
'company_code' => 'sf_express',
|
||||
'status' => 'enabled',
|
||||
'is_default' => 1,
|
||||
'sort_order' => 1,
|
||||
'remark' => '系统默认快递公司',
|
||||
'created_at' => $now,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
}
|
||||
|
||||
$this->ensureEnabledDefault($now);
|
||||
}
|
||||
|
||||
private function ensureEnabledDefault(string $now): void
|
||||
{
|
||||
$default = Db::name('express_companies')
|
||||
->where('status', 'enabled')
|
||||
->where('is_default', 1)
|
||||
->find();
|
||||
if ($default) {
|
||||
return;
|
||||
}
|
||||
|
||||
$firstEnabled = Db::name('express_companies')
|
||||
->where('status', 'enabled')
|
||||
->order('sort_order', 'asc')
|
||||
->order('id', 'asc')
|
||||
->find();
|
||||
if ($firstEnabled) {
|
||||
Db::name('express_companies')->where('id', $firstEnabled['id'])->update([
|
||||
'is_default' => 1,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
private function generateCompanyCode(string $companyName): string
|
||||
{
|
||||
return 'express_' . substr(hash('sha256', $companyName), 0, 12);
|
||||
}
|
||||
|
||||
private function ensureTable(): void
|
||||
{
|
||||
Db::execute(<<<'SQL'
|
||||
CREATE TABLE IF NOT EXISTS express_companies (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
company_name VARCHAR(64) NOT NULL DEFAULT '',
|
||||
company_code VARCHAR(64) NOT NULL DEFAULT '',
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'enabled',
|
||||
is_default TINYINT(1) NOT NULL DEFAULT 0,
|
||||
sort_order INT NOT NULL DEFAULT 0,
|
||||
remark VARCHAR(255) NOT NULL DEFAULT '',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_express_companies_name (company_name),
|
||||
UNIQUE KEY uk_express_companies_code (company_code),
|
||||
KEY idx_express_companies_status (status),
|
||||
KEY idx_express_companies_default (is_default)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='快递公司字典'
|
||||
SQL);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user