chore: release updated anxinyan version

This commit is contained in:
wushumin
2026-05-22 21:13:52 +08:00
parent 7e86e2a5ec
commit 78098851f9
29 changed files with 1949 additions and 184 deletions

View File

@@ -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();
}
}

View File

@@ -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) {

View File

@@ -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
);
}

View File

@@ -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'],

View 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);
}
}