From 559b2e34c983f615b6d6747f52c801022c561803 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期一, 27 十月 2025 23:05:08 +0800
Subject: [PATCH] feat: 优化任务显示列表
---
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java | 6
app/pages/mine/privacy-policy/index.vue | 344 +-------
app/pages/register.vue | 37
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java | 157 +++-
ruoyi-ui/src/views/task/general/detail.vue | 103 ++
app/登录注册协议同意功能说明.md | 324 +++++++++
ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml | 33
ruoyi-ui/src/api/task.js | 40
app/pages/task/create-emergency.vue | 117 ++
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml | 3
任务接口拆分说明.md | 422 ++++++++++++
app/pages/login.vue | 95 ++
prd/APP接口权限移除说明.md | 146 ++++
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java | 3
ruoyi-ui/src/views/task/general/index.vue | 34
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleInfoController.java | 6
ruoyi-ui/src/views/task/旧系统同步状态显示功能说明.md | 164 ++++
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java | 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqlserver/SqlServerDictionaryController.java | 5
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskVehicleController.java | 5
20 files changed, 1,578 insertions(+), 467 deletions(-)
diff --git a/app/pages/login.vue b/app/pages/login.vue
index eddda11..53aa8a8 100644
--- a/app/pages/login.vue
+++ b/app/pages/login.vue
@@ -21,15 +21,22 @@
<image :src="codeUrl" @click="getCode" class="login-code-img" mode="aspectFit"></image>
</view>
</view>
+ <view class="agreement-checkbox">
+ <checkbox-group @change="onAgreementChange">
+ <label class="checkbox-label">
+ <checkbox :checked="agreedToPolicy" value="agreed" color="#007AFF" style="margin-top: 0;" />
+ <text class="agreement-text">
+ <text class="text-grey1">鍚屾剰</text>
+ <text @click.stop="handleUserAgrement" class="text-blue agreement-link">銆婄敤鎴峰崗璁��</text>
+ <text class="text-grey1">鍜�</text>
+ <text @click.stop="handlePrivacy" class="text-blue agreement-link">銆婇殣绉佹斂绛栥��</text>
+ </text>
+ </label>
+ </checkbox-group>
+ </view>
+
<view class="action-btn">
<button @click="handleLogin" class="login-btn cu-btn block bg-blue lg round">鐧诲綍</button>
- </view>
-
- <view class="xieyi text-center">
- <text class="text-grey1">鐧诲綍鍗充唬琛ㄥ悓鎰�</text>
- <text @click.stop="handleUserAgrement" class="text-blue agreement-link">銆婄敤鎴峰崗璁��</text>
- <text class="text-grey1">鍜�</text>
- <text @click.stop="handlePrivacy" class="text-blue agreement-link">銆婇殣绉佸崗璁��</text>
</view>
</view>
</scroll-view>
@@ -45,6 +52,8 @@
captchaEnabled: true,
// 鐢ㄦ埛娉ㄥ唽寮�鍏�
register: false,
+ // 闅愮鏀跨瓥鍚屾剰鐘舵�侊紙榛樿閫変腑锛�
+ agreedToPolicy: true,
globalConfig: getApp().globalData.config,
loginForm: {
username: "",
@@ -70,6 +79,10 @@
handleUserAgrement() {
this.$tab.navigateTo('/pages/mine/user-agreement/index')
},
+ // 鍗忚鍚屾剰鐘舵�佸彉鏇�
+ onAgreementChange(e) {
+ this.agreedToPolicy = e.detail.value.length > 0
+ },
// 鑾峰彇鍥惧舰楠岃瘉鐮�
getCode() {
getCodeImg().then(res => {
@@ -82,6 +95,10 @@
},
// 鐧诲綍鏂规硶
async handleLogin() {
+ if (!this.agreedToPolicy) {
+ this.$modal.msgError("璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁拰闅愮鏀跨瓥")
+ return
+ }
if (this.loginForm.username === "") {
this.$modal.msgError("璇疯緭鍏ユ偍鐨勮处鍙�")
} else if (this.loginForm.password === "") {
@@ -242,24 +259,56 @@
}
}
- .xieyi {
+ .agreement-checkbox {
margin: 50rpx 0 30rpx 0;
- padding: 20rpx 0;
- line-height: 2;
-
- .text-grey1 {
- color: #888;
- font-size: 24rpx;
+ padding: 20rpx;
+ display: flex;
+ justify-content: flex-start;
+ align-items: left;
+
+ checkbox-group {
+ display: flex;
+ align-items: center;
}
-
- .agreement-link {
- color: #007AFF;
- font-size: 24rpx;
- padding: 10rpx 8rpx;
- margin: 0 5rpx;
- display: inline-block;
- position: relative;
- z-index: 10;
+
+ .checkbox-label {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+
+ checkbox {
+ margin-right: 15rpx;
+ transform: scale(1.2);
+ flex-shrink: 0;
+ vertical-align: middle;
+ }
+
+ .agreement-text {
+ display: inline-flex;
+ align-items: center;
+ flex-wrap: wrap;
+ line-height: 1.5;
+ font-size: 26rpx;
+ text-align: left;
+ justify-content: flex-start;
+
+ .text-grey1 {
+ color: #666;
+ font-size: 26rpx;
+ line-height: 1.5;
+ }
+
+ .text-blue {
+ color: #007AFF;
+ font-size: 26rpx;
+ padding: 8rpx 10rpx;
+ margin: 0 5rpx;
+ display: inline-block;
+ position: relative;
+ z-index: 10;
+ line-height: 1.5;
+ }
+ }
}
}
}
diff --git a/app/pages/mine/privacy-policy/index.vue b/app/pages/mine/privacy-policy/index.vue
index cd90520..2bcff27 100644
--- a/app/pages/mine/privacy-policy/index.vue
+++ b/app/pages/mine/privacy-policy/index.vue
@@ -9,290 +9,75 @@
<scroll-view class="content" scroll-y="true">
<view class="privacy-content">
- <view class="update-time">鏇存柊鏃ユ湡锛�2025骞�1鏈�25鏃�</view>
- <view class="effect-time">鐢熸晥鏃ユ湡锛�2025骞�10鏈�25鏃�</view>
+ <view class="main-title">骞夸笢姘戣埅鍖荤枟蹇嚎璋冨害绯荤粺灏忕▼搴忛殣绉佷繚鎶ゆ寚寮�</view>
+ <view class="update-time">鏇存柊鏃ユ湡锛�2025-10-26</view>
+
+ <view class="intro-text">
+ 鏈寚寮曟槸骞夸笢姘戣埅鍖荤枟蹇嚎璋冨害绯荤粺灏忕▼搴忓紑鍙戣�� <text class="bold">骞夸笢姘戣埅鍖荤枟蹇嚎鏈夐檺鍏徃</text>锛堜互涓嬬畝绉�"寮�鍙戣��"锛変负澶勭悊浣犵殑涓汉淇℃伅鑰屽埗瀹氥��
+ </view>
<view class="section">
- <text class="section-title">寮曡█</text>
+ <text class="section-title">寮�鍙戣�呭鐞嗙殑淇℃伅</text>
<text class="section-text">
- 鎬ユ晳杞繍璋冨害绯荤粺锛堜互涓嬬畝绉�"鎴戜滑"锛夋繁鐭ヤ釜浜轰俊鎭鎮ㄧ殑閲嶈鎬э紝鎴戜滑灏嗘寜鐓ф硶寰嬫硶瑙勭殑瑕佹眰锛岄噰鍙栫浉搴旂殑瀹夊叏淇濇姢鎺柦锛屽敖鍔涗繚鎶ゆ偍鐨勪釜浜轰俊鎭畨鍏ㄥ彲鎺с��
- </text>
- <text class="section-text">
- 鏈�婇殣绉佹斂绛栥�嬮�傜敤浜庢垜浠悜鎮ㄦ彁渚涚殑鎵�鏈夋湇鍔°�傛垜浠笇鏈涢�氳繃鏈斂绛栧悜鎮ㄨ鏄庢垜浠浣曟敹闆嗐�佷娇鐢ㄣ�佸瓨鍌ㄥ拰鍒嗕韩鎮ㄧ殑涓汉淇℃伅锛屼互鍙婃偍浜湁鐨勭浉鍏虫潈鍒┿��
+ 鏍规嵁娉曞緥瑙勫畾锛屽紑鍙戣�呬粎澶勭悊瀹炵幇灏忕▼搴忓姛鑳芥墍蹇呰鐨勪俊鎭��
</text>
<text class="section-text highlight">
- 璇锋偍鍦ㄤ娇鐢ㄦ垜浠殑浜у搧/鏈嶅姟鍓嶏紝浠旂粏闃呰骞跺厖鍒嗙悊瑙f湰鏀跨瓥锛岀壒鍒槸浠ョ矖浣�/涓嬪垝绾挎爣璇嗙殑鏉℃锛屾偍搴旈噸鐐归槄璇汇�傚鎮ㄥ鏈斂绛栨湁浠讳綍鐤戦棶锛屽彲閫氳繃鏈斂绛栨枃鏈彁渚涚殑鑱旂郴鏂瑰紡涓庢垜浠仈绯汇��
+ 寮�鍙戣�呭皢鍦ㄨ幏鍙栦綘鐨勬槑绀哄悓鎰忓悗锛屾敹闆嗕綘鐨勪綅缃俊鎭紝鐢ㄩ�旀槸銆愯幏鍙栧綋鍓嶅徃鏈烘墍鍦ㄤ綅缃紝浠ュ垽鏂换鍔″崟鍒板摢閲屼簡銆�
</text>
</view>
<view class="section">
- <text class="section-title">涓�銆佹垜浠浣曟敹闆嗗拰浣跨敤鎮ㄧ殑涓汉淇℃伅</text>
+ <text class="section-title">浣犵殑鏉冪泭</text>
<text class="section-text">
- 涓汉淇℃伅鏄寚浠ョ數瀛愭垨鑰呭叾浠栨柟寮忚褰曠殑鑳藉鍗曠嫭鎴栬�呬笌鍏朵粬淇℃伅缁撳悎璇嗗埆鐗瑰畾鑷劧浜鸿韩浠芥垨鑰呭弽鏄犵壒瀹氳嚜鐒朵汉娲诲姩鎯呭喌鐨勫悇绉嶄俊鎭��
+ 鍏充簬浣犵殑涓汉淇℃伅锛屼綘鍙互閫氳繃浠ヤ笅鏂瑰紡涓庡紑鍙戣�呰仈绯伙紝琛屼娇鏌ラ槄銆佸鍒躲�佹洿姝c�佸垹闄ょ瓑娉曞畾鏉冨埄銆�
</text>
<text class="section-text">
- 鎴戜滑浠呬細鍑轰簬浠ヤ笅鐩殑锛屾敹闆嗗拰浣跨敤鎮ㄧ殑涓汉淇℃伅锛�
+ 鑻ヤ綘鍦ㄥ皬绋嬪簭涓敞鍐屼簡璐﹀彿锛屼綘鍙互閫氳繃浠ヤ笅鏂瑰紡涓庡紑鍙戣�呰仈绯伙紝鐢宠娉ㄩ攢浣犲湪灏忕▼搴忎腑浣跨敤鐨勮处鍙枫�傚湪鍙楃悊浣犵殑鐢宠鍚庯紝寮�鍙戣�呮壙璇哄湪鍗佷簲涓伐浣滄棩鍐呭畬鎴愭牳鏌ュ拰澶勭悊锛屽苟鎸夌収娉曞緥娉曡瑕佹眰澶勭悊浣犵殑鐩稿叧淇℃伅銆�
</text>
-
- <text class="subsection-title">1.1 璐﹀彿娉ㄥ唽涓庣櫥褰�</text>
+ <text class="contact-info">
+ 鐢佃瘽:13602220409
+ </text>
+ </view>
+
+ <view class="section">
+ <text class="section-title">寮�鍙戣�呭淇℃伅鐨勫瓨鍌�</text>
<text class="section-text">
- 褰撴偍娉ㄥ唽鍙婁娇鐢ㄦ湰绯荤粺鏃讹紝鎴戜滑闇�瑕佹敹闆嗭細
+ 寮�鍙戣�呮壙璇猴紝闄ゆ硶寰嬫硶瑙勫彟鏈夎瀹氬锛屽紑鍙戣�呭浣犵殑淇℃伅鐨勪繚瀛樻湡闄愬簲褰撲负瀹炵幇澶勭悊鐩殑鎵�蹇呰鐨勬渶鐭椂闂淬��
</text>
- <text class="section-text indent">
- 路 鎵嬫満鍙风爜锛氱敤浜庤处鍙锋敞鍐屻�佺櫥褰曢獙璇佸拰瀹夊叏淇濋殰
- </text>
- <text class="section-text indent">
- 路 濮撳悕锛氱敤浜庤韩浠借瘑鍒拰浠诲姟鍒嗛厤
- </text>
- <text class="section-text indent">
- 路 鎵�灞為儴闂�/鏈烘瀯锛氱敤浜庢潈闄愮鐞嗗拰浠诲姟鍗忎綔
- </text>
- <text class="section-text indent">
- 路 鑱屼綅/瑙掕壊锛氱敤浜庣‘瀹氱郴缁熶娇鐢ㄦ潈闄�
- </text>
-
- <text class="subsection-title">1.2 浠诲姟璋冨害鏈嶅姟</text>
+ </view>
+
+ <view class="section">
+ <text class="section-title">淇℃伅鐨勪娇鐢ㄨ鍒�</text>
<text class="section-text">
- 涓轰簡鍚戞偍鎻愪緵浠诲姟璋冨害鏈嶅姟锛屾垜浠渶瑕佹敹闆嗭細
- </text>
- <text class="section-text indent">
- 路 浣嶇疆淇℃伅锛氳幏鍙栨偍鐨勫疄鏃朵綅缃紝鐢ㄤ簬浠诲姟鍒嗛厤銆佽溅杈嗚皟搴﹀拰璺緞瑙勫垝
- </text>
- <text class="section-text indent">
- 路 浠诲姟鐩稿叧淇℃伅锛氬寘鎷偅鑰呬俊鎭紙濮撳悕銆佸勾榫勩�佹�у埆銆佺梾鎯呮弿杩帮級銆佸湴鍧�淇℃伅銆佸尰闄俊鎭瓑
- </text>
- <text class="section-text indent">
- 路 杞﹁締淇℃伅锛氳溅鐗屽彿銆佽溅杈嗙被鍨嬨�佽澶囩紪鍙风瓑
+ 寮�鍙戣�呭皢浼氬湪鏈寚寮曟墍鏄庣ず鐨勭敤閫斿唴浣跨敤鏀堕泦鐨勪俊鎭��
</text>
<text class="section-text highlight">
- 浣嶇疆淇℃伅灞炰簬鏁忔劅涓汉淇℃伅锛屾垜浠粎鍦ㄦ偍涓诲姩寮�鍚畾浣嶆潈闄愬苟浣跨敤鐩稿叧鍔熻兘鏃舵敹闆嗭紝鎮ㄥ彲浠ラ殢鏃跺湪绯荤粺璁剧疆涓叧闂畾浣嶆潈闄愩�傛嫆缁濇彁渚涗綅缃俊鎭彲鑳藉鑷撮儴鍒嗗姛鑳芥棤娉曚娇鐢紝浣嗕笉褰卞搷鍏朵粬鍔熻兘鐨勬甯镐娇鐢ㄣ��
- </text>
-
- <text class="subsection-title">1.3 娑堟伅鎺ㄩ�佹湇鍔�</text>
- <text class="section-text">
- 涓轰簡鍙婃椂鍚戞偍鎺ㄩ�佷换鍔¢�氱煡銆佺郴缁熸秷鎭瓑淇℃伅锛屾垜浠渶瑕佹敹闆嗭細
- </text>
- <text class="section-text indent">
- 路 璁惧淇℃伅锛氳澶囧瀷鍙枫�佹搷浣滅郴缁熺増鏈�佽澶囨爣璇嗙
- </text>
- <text class="section-text indent">
- 路 鎺ㄩ�乼oken锛氱敤浜庢秷鎭帹閫�
- </text>
-
- <text class="subsection-title">1.4 绯荤粺瀹夊叏涓庝紭鍖�</text>
- <text class="section-text">
- 涓轰簡淇濋殰绯荤粺瀹夊叏绋冲畾杩愯骞舵彁鍗囩敤鎴蜂綋楠岋紝鎴戜滑浼氭敹闆嗭細
- </text>
- <text class="section-text indent">
- 路 鏃ュ織淇℃伅锛氭搷浣滄棩蹇椼�侀敊璇棩蹇椼�佹�ц兘鏁版嵁
- </text>
- <text class="section-text indent">
- 路 缃戠粶淇℃伅锛欼P鍦板潃銆佺綉缁滅被鍨�
- </text>
- <text class="section-text indent">
- 路 搴旂敤浣跨敤鎯呭喌锛氶〉闈㈣闂褰曘�佸姛鑳戒娇鐢ㄩ鐜�
+ 濡傚紑鍙戣�呬娇鐢ㄤ綘鐨勪俊鎭秴鍑烘湰鎸囧紩鐩殑鎴栧悎鐞嗚寖鍥达紝寮�鍙戣�呭繀椤诲湪鍙樻洿浣跨敤鐩殑鎴栬寖鍥村墠锛屽啀娆′互鎵嬫満鐭俊鏂瑰紡鍛婄煡骞跺緛寰椾綘鐨勬槑绀哄悓鎰忋��
</text>
</view>
<view class="section">
- <text class="section-title">浜屻�佹垜浠浣曚娇鐢–ookie鍜屽悓绫绘妧鏈�</text>
+ <text class="section-title">淇℃伅瀵瑰鎻愪緵</text>
<text class="section-text">
- Cookie鏄竴绉嶇綉缁滄湇鍔″櫒瀛樺偍鍦ㄨ绠楁満鎴栫Щ鍔ㄨ澶囦笂鐨勭函鏂囨湰鏂囦欢銆傛垜浠娇鐢–ookie鍜屽悓绫绘妧鏈富瑕佷负浜嗗疄鐜颁互涓嬪姛鑳斤細
- </text>
- <text class="section-text indent">
- 路 璁颁綇鎮ㄧ殑鐧诲綍鐘舵�侊紝閬垮厤閲嶅鐧诲綍
- </text>
- <text class="section-text indent">
- 路 鍒嗘瀽鎮ㄤ娇鐢ㄦ垜浠湇鍔$殑鎯呭喌锛屼互渚夸紭鍖栨湇鍔′綋楠�
- </text>
- <text class="section-text indent">
- 路 淇濋殰绯荤粺瀹夊叏锛岄槻鑼冨畨鍏ㄩ闄�
+ 寮�鍙戣�呮壙璇猴紝涓嶄細涓诲姩鍏变韩鎴栬浆璁╀綘鐨勪俊鎭嚦浠讳綍绗笁鏂癸紝濡傚瓨鍦ㄧ‘闇�鍏变韩鎴栬浆璁╂椂锛屽紑鍙戣�呭簲褰撶洿鎺ュ緛寰楁垨纭绗笁鏂瑰緛寰椾綘鐨勫崟鐙悓鎰忋��
</text>
<text class="section-text">
- 鎮ㄥ彲浠ラ�氳繃娴忚鍣ㄦ垨璁惧璁剧疆鎷掔粷鎴栫鐞咰ookie锛屼絾杩欏彲鑳藉奖鍝嶆偍浣跨敤鎴戜滑鏈嶅姟鐨勯儴鍒嗗姛鑳姐��
+ 寮�鍙戣�呮壙璇猴紝涓嶄細瀵瑰鍏紑鎶湶浣犵殑淇℃伅锛屽蹇呴』鍏紑鎶湶鏃讹紝寮�鍙戣�呭簲褰撳悜浣犲憡鐭ュ叕寮�鎶湶鐨勭洰鐨勩�佹姭闇蹭俊鎭殑绫诲瀷鍙婂彲鑳芥秹鍙婄殑淇℃伅锛屽苟寰佸緱浣犵殑鍗曠嫭鍚屾剰銆�
</text>
</view>
<view class="section">
- <text class="section-title">涓夈�佹垜浠浣曞叡浜�佽浆璁┿�佸叕寮�鎶湶鎮ㄧ殑涓汉淇℃伅</text>
-
- <text class="subsection-title">3.1 鍏变韩</text>
+ <text class="section-title">鎶曡瘔涓庤仈绯�</text>
<text class="section-text">
- 鎴戜滑涓嶄細鍚戠涓夋柟鍏变韩鎮ㄧ殑涓汉淇℃伅锛岄櫎闈烇細
+ 浣犺涓哄紑鍙戣�呮湭閬靛畧涓婅堪绾﹀畾锛屾垨鏈夊叾浠栫殑鎶曡瘔寤鸿銆佹垨鏈垚骞翠汉涓汉淇℃伅淇濇姢鐩稿叧闂锛屽彲閫氳繃浠ヤ笅鏂瑰紡涓庡紑鍙戣�呰仈绯伙紱鎴栬�呭悜寰俊杩涜鎶曡瘔銆�
</text>
- <text class="section-text indent">
- 路 浜嬪厛鑾峰緱鎮ㄧ殑鏄庣‘鍚屾剰
- </text>
- <text class="section-text indent">
- 路 涓庡叧鑱旀満鏋勫叡浜細鍦ㄤ笟鍔¢渶瑕佷笖绗﹀悎娉曞緥瑙勫畾鐨勬儏鍐典笅锛屾垜浠彲鑳戒笌鎮ㄦ墍灞炲尰鐤楁満鏋勩�佹�ユ晳涓績鍏变韩蹇呰淇℃伅
- </text>
- <text class="section-text indent">
- 路 娉曞緥娉曡瑙勫畾鐨勫叾浠栨儏褰�
- </text>
-
- <text class="subsection-title">3.2 杞</text>
- <text class="section-text">
- 鎴戜滑涓嶄細灏嗘偍鐨勪釜浜轰俊鎭浆璁╃粰浠讳綍鍏徃銆佺粍缁囧拰涓汉锛屼絾浠ヤ笅鎯呭喌闄ゅ锛�
- </text>
- <text class="section-text indent">
- 路 浜嬪厛鑾峰緱鎮ㄧ殑鏄庣‘鍚屾剰
- </text>
- <text class="section-text indent">
- 路 鏍规嵁娉曞緥娉曡鎴栧己鍒舵�х殑琛屾斂鎴栧徃娉曡姹�
- </text>
-
- <text class="subsection-title">3.3 鍏紑鎶湶</text>
- <text class="section-text">
- 鎴戜滑浠呬細鍦ㄤ互涓嬫儏鍐典笅鍏紑鎶湶鎮ㄧ殑涓汉淇℃伅锛�
- </text>
- <text class="section-text indent">
- 路 鑾峰緱鎮ㄧ殑鏄庣‘鍚屾剰
- </text>
- <text class="section-text indent">
- 路 鍩轰簬娉曞緥娉曡銆佹硶寰嬬▼搴忋�佽瘔璁兼垨鏀垮簻涓荤閮ㄩ棬寮哄埗鎬ц姹�
- </text>
- </view>
-
- <view class="section">
- <text class="section-title">鍥涖�佹垜浠浣曚繚鎶ゆ偍鐨勪釜浜轰俊鎭�</text>
- <text class="section-text">
- 4.1 鎴戜滑闈炲父閲嶈涓汉淇℃伅瀹夊叏锛屽苟閲囧彇涓�鍒囧悎鐞嗗彲琛岀殑鎺柦淇濇姢鎮ㄧ殑涓汉淇℃伅锛�
- </text>
- <text class="section-text indent">
- 路 鏁版嵁鍔犲瘑锛氶噰鐢⊿SL/TLS鍔犲瘑浼犺緭锛屽鏁忔劅鏁版嵁杩涜鍔犲瘑瀛樺偍
- </text>
- <text class="section-text indent">
- 路 璁块棶鎺у埗锛氬缓绔嬩弗鏍肩殑鏁版嵁璁块棶鏉冮檺鎺у埗鍜屽鎵规満鍒�
- </text>
- <text class="section-text indent">
- 路 瀹夊叏瀹¤锛氬畾鏈熻繘琛屽畨鍏ㄥ璁″拰椋庨櫓璇勪及
- </text>
- <text class="section-text indent">
- 路 浜哄憳绠$悊锛氬澶勭悊涓汉淇℃伅鐨勫憳宸ヨ繘琛岃韩浠借璇佸拰鏉冮檺绠$悊
- </text>
- <text class="section-text indent">
- 路 搴旀�ュ搷搴旓細鍒跺畾涓汉淇℃伅瀹夊叏浜嬩欢搴旀�ラ妗�
- </text>
- <text class="section-text">
- 4.2 鎴戜滑浼氶噰鍙栧悎鐞嗗彲琛岀殑鎺柦锛屽敖鍔涢伩鍏嶆敹闆嗘棤鍏崇殑涓汉淇℃伅銆�
- </text>
- <text class="section-text highlight">
- 4.3 浜掕仈缃戝苟闈炵粷瀵瑰畨鍏ㄧ殑鐜锛屾垜浠己鐑堝缓璁偍閲囧彇绉瀬鎺柦淇濇姢涓汉淇℃伅鐨勫畨鍏紝鍖呮嫭浣嗕笉闄愪簬浣跨敤澶嶆潅瀵嗙爜銆佸畾鏈熶慨鏀瑰瘑鐮併�佷笉灏嗚嚜宸辩殑璐﹀彿瀵嗙爜绛変釜浜轰俊鎭�忛湶缁欎粬浜恒��
- </text>
- <text class="section-text highlight">
- 4.4 濡傛灉鍙戠敓涓汉淇℃伅瀹夊叏浜嬩欢锛屾垜浠皢鎸夌収娉曞緥娉曡鐨勮姹傦紝鍙婃椂鍚戞偍鍛婄煡锛氬畨鍏ㄤ簨浠剁殑鍩烘湰鎯呭喌鍜屽彲鑳界殑褰卞搷銆佹垜浠凡閲囧彇鎴栧皢瑕侀噰鍙栫殑澶勭疆鎺柦銆佹偍鍙嚜涓婚槻鑼冨拰闄嶄綆椋庨櫓鐨勫缓璁瓑銆�
- </text>
- </view>
-
- <view class="section">
- <text class="section-title">浜斻�佹偍濡備綍绠$悊涓汉淇℃伅</text>
- <text class="section-text">
- 鎸夌収涓浗鐩稿叧鐨勬硶寰嬫硶瑙勶紝鎴戜滑淇濋殰鎮ㄥ鑷繁鐨勪釜浜轰俊鎭浣夸互涓嬫潈鍒╋細
- </text>
-
- <text class="subsection-title">5.1 璁块棶鍜屾洿姝f偍鐨勪釜浜轰俊鎭�</text>
- <text class="section-text">
- 鎮ㄥ彲浠ラ�氳繃浠ヤ笅鏂瑰紡璁块棶鍜屾洿姝f偍鐨勪釜浜轰俊鎭細
- </text>
- <text class="section-text indent">
- 路 閫氳繃"鎴戠殑-涓汉淇℃伅"椤甸潰鏌ョ湅鍜屼慨鏀瑰熀鏈俊鎭�
- </text>
- <text class="section-text indent">
- 路 鑱旂郴绯荤粺绠$悊鍛樺崗鍔╀慨鏀�
- </text>
-
- <text class="subsection-title">5.2 鍒犻櫎鎮ㄧ殑涓汉淇℃伅</text>
- <text class="section-text">
- 鍦ㄤ互涓嬫儏褰腑锛屾偍鍙互鍚戞垜浠彁鍑哄垹闄や釜浜轰俊鎭殑璇锋眰锛�
- </text>
- <text class="section-text indent">
- 路 鎴戜滑澶勭悊涓汉淇℃伅鐨勮涓鸿繚鍙嶆硶寰嬫硶瑙�
- </text>
- <text class="section-text indent">
- 路 鎴戜滑鏀堕泦銆佷娇鐢ㄦ偍鐨勪釜浜轰俊鎭紝鍗存湭寰佸緱鎮ㄧ殑鍚屾剰
- </text>
- <text class="section-text indent">
- 路 鎴戜滑澶勭悊涓汉淇℃伅鐨勮涓鸿繚鍙嶄簡涓庢偍鐨勭害瀹�
- </text>
- <text class="section-text indent">
- 路 鎮ㄦ敞閿�浜嗚处鍙�
- </text>
-
- <text class="subsection-title">5.3 娉ㄩ攢璐﹀彿</text>
- <text class="section-text">
- 鎮ㄥ彲浠ラ�氳繃鑱旂郴绯荤粺绠$悊鍛樼敵璇锋敞閿�璐﹀彿銆傝处鍙锋敞閿�鍚庯紝鎴戜滑灏嗗仠姝负鎮ㄦ彁渚涙湇鍔★紝骞舵牴鎹硶寰嬫硶瑙勮姹傚垹闄ゆ偍鐨勪釜浜轰俊鎭��
- </text>
-
- <text class="subsection-title">5.4 鎾ゅ洖鍚屾剰</text>
- <text class="section-text">
- 鎮ㄥ彲浠ラ�氳繃璁惧鏉冮檺璁剧疆鎾ゅ洖瀵逛綅缃俊鎭�佹憚鍍忓ご銆佺浉鍐岀瓑鏁忔劅鏉冮檺鐨勬巿鏉冦��
- </text>
- <text class="section-text">
- 璇锋偍鐞嗚В锛岀壒瀹氱殑涓氬姟鍔熻兘闇�瑕佹偍鐨勪俊鎭墠鑳藉緱浠ュ畬鎴愶紝褰撴偍鎾ゅ洖鍚屾剰鍚庯紝鎴戜滑鏃犳硶缁х画涓烘偍鎻愪緵鎾ゅ洖鍚屾剰鎵�瀵瑰簲鐨勬湇鍔°��
- </text>
- </view>
-
- <view class="section">
- <text class="section-title">鍏�佹垜浠浣曞鐞嗘湭鎴愬勾浜虹殑涓汉淇℃伅</text>
- <text class="section-text">
- 6.1 鏈郴缁熶富瑕侀潰鍚戝尰鐤楁�ユ晳浠庝笟浜哄憳锛屽師鍒欎笂涓嶅悜鏈垚骞翠汉鎻愪緵鏈嶅姟銆�
- </text>
- <text class="section-text">
- 6.2 濡傛灉鎴戜滑鍙戠幇鍦ㄦ湭浜嬪厛鑾峰緱鍙瘉瀹炵殑鐖舵瘝鎴栨硶瀹氱洃鎶や汉鍚屾剰鐨勬儏鍐典笅鏀堕泦浜嗘湭鎴愬勾浜虹殑涓汉淇℃伅锛屾垜浠細璁炬硶灏藉揩鍒犻櫎鐩稿叧鏁版嵁銆�
- </text>
- </view>
-
- <view class="section">
- <text class="section-title">涓冦�佹偍鐨勪釜浜轰俊鎭浣曞湪鍏ㄧ悆鑼冨洿鍐呰浆绉�</text>
- <text class="section-text">
- 鎴戜滑鍦ㄤ腑鍗庝汉姘戝叡鍜屽浗澧冨唴鏀堕泦鍜屼骇鐢熺殑涓汉淇℃伅灏嗗瓨鍌ㄥ湪涓崕浜烘皯鍏卞拰鍥藉鍐呫��
- </text>
- </view>
-
- <view class="section">
- <text class="section-title">鍏�佹湰鏀跨瓥濡備綍鏇存柊</text>
- <text class="section-text">
- 8.1 鎴戜滑鍙兘閫傛椂淇鏈斂绛栧唴瀹广�傚璇ョ瓑鍙樻洿浼氬鑷存偍鍦ㄦ湰鏀跨瓥椤逛笅鏉冨埄鐨勫疄璐ㄥ噺鎹燂紝鎴戜滑灏嗗湪鍙樻洿鐢熸晥鍓嶏紝閫氳繃鍦ㄩ〉闈㈡樉钁椾綅缃彁绀恒�佸悜鎮ㄥ彂閫佹秷鎭瓑鏂瑰紡閫氱煡鎮ㄣ��
- </text>
- <text class="section-text highlight">
- 8.2 鍦ㄨ绉嶆儏鍐典笅锛岃嫢鎮ㄧ户缁娇鐢ㄦ垜浠殑鏈嶅姟锛屽嵆琛ㄧず鍚屾剰鍙楃粡淇鐨勬湰鏀跨瓥鐨勭害鏉熴��
- </text>
- </view>
-
- <view class="section">
- <text class="section-title">涔濄�佸浣曡仈绯绘垜浠�</text>
- <text class="section-text">
- 9.1 濡傛偍瀵规湰闅愮鏀跨瓥鎴栨偍涓汉淇℃伅鐨勭浉鍏充簨瀹滄湁浠讳綍闂銆佹剰瑙佹垨寤鸿锛岃閫氳繃浠ヤ笅鏂瑰紡涓庢垜浠仈绯伙細
- </text>
- <text class="section-text">
- 鐢靛瓙閭锛歸anglizhong@966120.com.cn
- </text>
- <text class="section-text">
- 瀹㈡湇鐢佃瘽锛�020-966120
- </text>
- <text class="section-text">
- 宸ヤ綔鏃堕棿锛氬懆涓�鑷冲懆鏃� 24灏忔椂
- </text>
- <text class="section-text">
- 9.2 涓�鑸儏鍐典笅锛屾垜浠皢鍦�15涓伐浣滄棩鍐呭洖澶嶆偍鐨勮姹傘��
- </text>
- </view>
-
- <view class="section">
- <text class="section-title">鍗併�佸畾涔�</text>
- <text class="section-text">
- 涓汉淇℃伅锛氭寚浠ョ數瀛愭垨鑰呭叾浠栨柟寮忚褰曠殑鑳藉鍗曠嫭鎴栬�呬笌鍏朵粬淇℃伅缁撳悎璇嗗埆鐗瑰畾鑷劧浜鸿韩浠芥垨鑰呭弽鏄犵壒瀹氳嚜鐒朵汉娲诲姩鎯呭喌鐨勫悇绉嶄俊鎭��
- </text>
- <text class="section-text">
- 鏁忔劅涓汉淇℃伅锛氭寚涓�鏃︽硠闇叉垨鑰呴潪娉曚娇鐢紝瀹规槗瀵艰嚧鑷劧浜虹殑浜烘牸灏婁弗鍙楀埌渚靛鎴栬�呬汉韬�佽储浜у畨鍏ㄥ彈鍒板嵄瀹崇殑涓汉淇℃伅锛屽寘鎷敓鐗╄瘑鍒�佸畻鏁欎俊浠般�佺壒瀹氳韩浠姐�佸尰鐤楀仴搴枫�侀噾铻嶈处鎴枫�佽韪建杩圭瓑淇℃伅銆�
- </text>
- <text class="section-text">
- 涓汉淇℃伅鍒犻櫎锛氭寚鍦ㄥ疄鐜版棩甯镐笟鍔″姛鑳芥墍娑夊強鐨勭郴缁熶腑鍘婚櫎涓汉淇℃伅鐨勮涓猴紝浣垮叾淇濇寔涓嶅彲琚绱€�佽闂殑鐘舵�併��
+ <text class="contact-info">
+ 鐢佃瘽:13602220409
</text>
</view>
<view class="footer">
- <text class="footer-text">鎰熻阿鎮ㄤ俊浠诲苟浣跨敤鎬ユ晳杞繍璋冨害绯荤粺锛�</text>
+ <text class="footer-text">鏇存柊鏃ユ湡锛�2025-10-26</text>
</view>
</view>
</scroll-view>
@@ -354,11 +139,41 @@
border-radius: 15rpx;
padding: 40rpx 30rpx;
- .update-time,
- .effect-time {
+ .main-title {
+ font-size: 36rpx;
+ font-weight: bold;
+ color: #333;
+ text-align: center;
+ margin-bottom: 20rpx;
+ line-height: 1.5;
+ }
+
+ .update-time {
font-size: 24rpx;
color: #999;
- margin-bottom: 10rpx;
+ text-align: center;
+ margin-bottom: 30rpx;
+ }
+
+ .intro-text {
+ font-size: 28rpx;
+ color: #666;
+ line-height: 1.8;
+ margin-bottom: 30rpx;
+ text-align: justify;
+
+ .bold {
+ font-weight: bold;
+ color: #333;
+ }
+ }
+
+ .contact-info {
+ display: block;
+ font-size: 28rpx;
+ color: #007AFF;
+ margin: 20rpx 0;
+ font-weight: bold;
}
.section {
@@ -374,15 +189,6 @@
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
- line-height: 1.5;
- }
-
- .subsection-title {
- display: block;
- font-size: 30rpx;
- font-weight: bold;
- color: #666;
- margin: 25rpx 0 15rpx;
line-height: 1.5;
}
@@ -402,22 +208,6 @@
margin: 20rpx 0;
font-weight: bold;
color: #333;
- }
-
- &.indent {
- padding-left: 40rpx;
- position: relative;
-
- &::before {
- content: '';
- position: absolute;
- left: 20rpx;
- top: 18rpx;
- width: 8rpx;
- height: 8rpx;
- background-color: #666;
- border-radius: 50%;
- }
}
}
}
diff --git a/app/pages/register.vue b/app/pages/register.vue
index c1bf188..040e74b 100644
--- a/app/pages/register.vue
+++ b/app/pages/register.vue
@@ -30,7 +30,7 @@
<view class="agreement-section">
<checkbox-group @change="handleAgreementChange">
<label class="agreement-label">
- <checkbox value="agreed" :checked="agreedToTerms" color="#007AFF" />
+ <checkbox value="agreed" :checked="agreedToTerms" color="#007AFF" style="margin-top: 0;" />
<text class="agreement-text">
鎴戝凡闃呰骞跺悓鎰�
<text class="agreement-link" @click.stop="handleUserAgreement">銆婄敤鎴锋湇鍔″崗璁��</text>
@@ -59,7 +59,7 @@
return {
codeUrl: "",
captchaEnabled: true,
- agreedToTerms: false,
+ agreedToTerms: true, // 榛樿閫変腑
globalConfig: getApp().globalData.config,
registerForm: {
username: "",
@@ -211,32 +211,49 @@
}
.agreement-section {
- margin: 30rpx 0;
+ margin: 50rpx 0 30rpx 0;
+ padding: 20rpx;
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+
+ checkbox-group {
+ display: flex;
+ align-items: center;
+ }
.agreement-label {
display: flex;
- align-items: flex-start;
+ align-items: center;
+ justify-content: flex-start;
checkbox {
margin-right: 15rpx;
- transform: scale(0.9);
+ transform: scale(1.2);
flex-shrink: 0;
+ vertical-align: middle;
}
.agreement-text {
- flex: 1;
+ display: inline-flex;
+ align-items: center;
+ flex-wrap: wrap;
font-size: 26rpx;
color: #666;
- line-height: 2;
- text-align: left;
+ line-height: 1.5;
+ text-align: right;
+ justify-content: flex-end;
.agreement-link {
color: #007AFF;
- text-decoration: underline;
- padding: 8rpx 5rpx;
+ text-decoration: none;
+ padding: 8rpx 10rpx;
+ margin: 0 5rpx;
display: inline-block;
position: relative;
z-index: 10;
+ border-bottom: 1px solid #007AFF;
+ line-height: 1.5;
}
}
}
diff --git a/app/pages/task/create-emergency.vue b/app/pages/task/create-emergency.vue
index a056049..2e0cf48 100644
--- a/app/pages/task/create-emergency.vue
+++ b/app/pages/task/create-emergency.vue
@@ -785,25 +785,67 @@
this.taskForm.hospitalIn.departmentId = selected.id // 淇濆瓨绉戝ID
},
- // 鍔犺浇榛樿鍖洪櫌鍒楄〃锛堝墠100鏉★級
+ // 鍔犺浇榛樿鍖婚櫌鍒楄〃锛堝墠100鏉★級
loadDefaultHospitals() {
- // 浼犲叆绌哄瓧绗︿覆鎴栫壒娈婃爣璇嗚幏鍙栧墠100鏉★紝鍚屾椂浼犲叆鍦板煙杩囨护
+ // 杞嚭鍖婚櫌锛氬彧鍔犺浇褰撳墠鍖哄煙鐨勫尰闄紙甯﹀湴鍩熻繃婊わ級
searchHospitals('', this.selectedRegion).then(response => {
- this.defaultHospitals = response.data || []
- // 鍚屾椂鍒濆鍖栦袱涓悳绱㈢粨鏋滀负榛樿鏁版嵁
- this.hospitalOutResults = [...this.defaultHospitals]
- this.hospitalInResults = [...this.defaultHospitals]
+ this.hospitalOutResults = response.data || []
+ console.log('鍔犺浇杞嚭鍖婚櫌锛堝綋鍓嶅尯鍩燂級:', this.selectedRegion, '鏁伴噺:', this.hospitalOutResults.length)
}).catch(error => {
- console.error('鍔犺浇榛樿鍖洪櫌鍒楄〃澶辫触:', error)
- this.defaultHospitals = []
+ console.error('鍔犺浇杞嚭鍖婚櫌鍒楄〃澶辫触:', error)
+ this.hospitalOutResults = []
})
+
+ // 杞叆鍖婚櫌锛氬姞杞芥墍鏈夊尰闄紙涓嶅甫鍦板煙杩囨护锛屽悗缁細鎸夊湴鍩熸帓搴忥級
+ searchHospitals('', this.selectedRegion).then(response => {
+ const allHospitals = response.data || []
+ // 灏嗗尰闄㈡寜鍦板煙鎺掑簭锛氭湰鍦板尯鍩熶紭鍏�
+ this.hospitalInResults = this.sortHospitalsByRegion(allHospitals)
+ console.log('鍔犺浇杞叆鍖婚櫌锛堝叏閮ㄥ尯鍩燂級:', '鏁伴噺:', this.hospitalInResults.length)
+ }).catch(error => {
+ console.error('鍔犺浇杞叆鍖婚櫌鍒楄〃澶辫触:', error)
+ this.hospitalInResults = []
+ })
+ },
+
+ // 鎸夊湴鍩熸帓搴忓尰闄細鏈湴鍖哄煙浼樺厛
+ sortHospitalsByRegion(hospitals) {
+ if (!this.selectedRegion || !hospitals || hospitals.length === 0) {
+ return hospitals
+ }
+
+ const region = this.selectedRegion
+ const localHospitals = []
+ const otherHospitals = []
+
+ hospitals.forEach(hospital => {
+ // 鍒ゆ柇鍖婚櫌鏄惁鍦ㄦ湰鍦板尯鍩燂紙鐪併�佸競銆佸尯浠讳竴鍖呭惈鍦板煙鍏抽敭璇嶏級
+ const isLocal =
+ (hospital.hopsProvince && hospital.hopsProvince.includes(region)) ||
+ (hospital.hopsCity && hospital.hopsCity.includes(region)) ||
+ (hospital.hopsArea && hospital.hopsArea.includes(region))
+
+ if (isLocal) {
+ localHospitals.push(hospital)
+ } else {
+ otherHospitals.push(hospital)
+ }
+ })
+
+ // 鏈湴鍖婚櫌鍦ㄥ墠锛屽叾浠栧尰闄㈠湪鍚�
+ return [...localHospitals, ...otherHospitals]
},
// 杞嚭鍖婚櫌杈撳叆妗嗚幏寰楃劍鐐�
onHospitalOutFocus() {
- // 濡傛灉娌℃湁鎼滅储鍏抽敭璇嶏紝鏄剧ず榛樿鐨�100鏉℃暟鎹�
+ // 濡傛灉娌℃湁鎼滅储鍏抽敭璇嶏紝鍙樉绀哄綋鍓嶅尯鍩熺殑鍖婚櫌
if (!this.hospitalOutSearchKeyword || this.hospitalOutSearchKeyword.trim() === '') {
- this.hospitalOutResults = [...this.defaultHospitals]
+ searchHospitals('', this.selectedRegion).then(response => {
+ this.hospitalOutResults = response.data || []
+ }).catch(error => {
+ console.error('鍔犺浇杞嚭鍖婚櫌澶辫触:', error)
+ this.hospitalOutResults = []
+ })
}
this.showHospitalOutResults = true
},
@@ -818,27 +860,33 @@
clearTimeout(this.searchTimer)
}
- // 濡傛灉鍏抽敭璇嶄负绌猴紝鏄剧ず榛樿100鏉�
+ // 濡傛灉鍏抽敭璇嶄负绌猴紝鍙樉绀哄綋鍓嶅尯鍩熺殑鍖婚櫌
if (!keyword || keyword.trim() === '') {
- this.hospitalOutResults = [...this.defaultHospitals]
+ searchHospitals('', this.selectedRegion).then(response => {
+ this.hospitalOutResults = response.data || []
+ }).catch(error => {
+ console.error('鍔犺浇杞嚭鍖婚櫌澶辫触:', error)
+ this.hospitalOutResults = []
+ })
this.showHospitalOutResults = true
return
}
- // 鏈夊叧閿瘝鏃讹紝鍘绘湇鍔$鎼滅储
+ // 鏈夊叧閿瘝鏃讹紝鍘绘湇鍔$鎼滅储锛堜粎闄愬綋鍓嶅尯鍩燂級
this.searchTimer = setTimeout(() => {
this.searchHospitalOut(keyword)
}, 300)
},
- // 鎼滅储杞嚭鍖婚櫌
+ // 鎼滅储杞嚭鍖婚櫌锛堜粎闄愬綋鍓嶅尯鍩燂級
searchHospitalOut(keyword) {
- // 浼犲叆鍏抽敭璇嶅拰鍦板煙杩囨护
+ // 浼犲叆鍏抽敭璇嶅拰鍦板煙杩囨护锛屽彧鎼滅储褰撳墠鍖哄煙鐨勫尰闄�
searchHospitals(keyword, this.selectedRegion).then(response => {
this.hospitalOutResults = response.data || []
this.showHospitalOutResults = true
+ console.log('鎼滅储杞嚭鍖婚櫌:', keyword, '鍖哄煙:', this.selectedRegion, '缁撴灉鏁�:', this.hospitalOutResults.length)
}).catch(error => {
- console.error('鎼滅储鍖婚櫌澶辫触:', error)
+ console.error('鎼滅储杞嚭鍖婚櫌澶辫触:', error)
this.hospitalOutResults = []
})
},
@@ -868,9 +916,16 @@
// 杞叆鍖婚櫌杈撳叆妗嗚幏寰楃劍鐐�
onHospitalInFocus() {
- // 濡傛灉娌℃湁鎼滅储鍏抽敭璇嶏紝鏄剧ず榛樿鐨�100鏉℃暟鎹�
+ // 濡傛灉娌℃湁鎼滅储鍏抽敭璇嶏紝鏄剧ず鎵�鏈夊尰闄紙鏈湴鍖哄煙浼樺厛锛�
if (!this.hospitalInSearchKeyword || this.hospitalInSearchKeyword.trim() === '') {
- this.hospitalInResults = [...this.defaultHospitals]
+ searchHospitals('', '').then(response => {
+ const allHospitals = response.data || []
+ // 鎸夊湴鍩熸帓搴忥細鏈湴鍖哄煙浼樺厛
+ this.hospitalInResults = this.sortHospitalsByRegion(allHospitals)
+ }).catch(error => {
+ console.error('鍔犺浇杞叆鍖婚櫌澶辫触:', error)
+ this.hospitalInResults = []
+ })
}
this.showHospitalInResults = true
},
@@ -885,27 +940,37 @@
clearTimeout(this.searchTimer)
}
- // 濡傛灉鍏抽敭璇嶄负绌猴紝鏄剧ず榛樿100鏉�
+ // 濡傛灉鍏抽敭璇嶄负绌猴紝鏄剧ず鎵�鏈夊尰闄紙鏈湴鍖哄煙浼樺厛锛�
if (!keyword || keyword.trim() === '') {
- this.hospitalInResults = [...this.defaultHospitals]
+ searchHospitals('', '').then(response => {
+ const allHospitals = response.data || []
+ // 鎸夊湴鍩熸帓搴忥細鏈湴鍖哄煙浼樺厛
+ this.hospitalInResults = this.sortHospitalsByRegion(allHospitals)
+ }).catch(error => {
+ console.error('鍔犺浇杞叆鍖婚櫌澶辫触:', error)
+ this.hospitalInResults = []
+ })
this.showHospitalInResults = true
return
}
- // 鏈夊叧閿瘝鏃讹紝鍘绘湇鍔$鎼滅储
+ // 鏈夊叧閿瘝鏃讹紝鍘绘湇鍔$鎼滅储锛堜笉闄愬尯鍩燂紝浣嗙粨鏋滄寜鍦板煙鎺掑簭锛�
this.searchTimer = setTimeout(() => {
this.searchHospitalIn(keyword)
}, 300)
},
- // 鎼滅储杞叆鍖婚櫌
+ // 鎼滅储杞叆鍖婚櫌锛堜笉闄愬尯鍩燂紝浣嗘湰鍦板尯鍩熶紭鍏堬級
searchHospitalIn(keyword) {
- // 浼犲叆鍏抽敭璇嶅拰鍦板煙杩囨护
- searchHospitals(keyword, this.selectedRegion).then(response => {
- this.hospitalInResults = response.data || []
+ // 浼犲叆鍏抽敭璇嶏紝涓嶄紶鍦板煙杩囨护锛堟悳绱㈡墍鏈夊尯鍩燂級
+ searchHospitals(keyword, '').then(response => {
+ const allHospitals = response.data || []
+ // 鎸夊湴鍩熸帓搴忥細鏈湴鍖哄煙浼樺厛
+ this.hospitalInResults = this.sortHospitalsByRegion(allHospitals)
this.showHospitalInResults = true
+ console.log('鎼滅储杞叆鍖婚櫌:', keyword, '缁撴灉鏁�:', this.hospitalInResults.length)
}).catch(error => {
- console.error('鎼滅储鍖婚櫌澶辫触:', error)
+ console.error('鎼滅储杞叆鍖婚櫌澶辫触:', error)
this.hospitalInResults = []
})
},
diff --git "a/app/\347\231\273\345\275\225\346\263\250\345\206\214\345\215\217\350\256\256\345\220\214\346\204\217\345\212\237\350\203\275\350\257\264\346\230\216.md" "b/app/\347\231\273\345\275\225\346\263\250\345\206\214\345\215\217\350\256\256\345\220\214\346\204\217\345\212\237\350\203\275\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..0fa8745
--- /dev/null
+++ "b/app/\347\231\273\345\275\225\346\263\250\345\206\214\345\215\217\350\256\256\345\220\214\346\204\217\345\212\237\350\203\275\350\257\264\346\230\216.md"
@@ -0,0 +1,324 @@
+# 鐧诲綍娉ㄥ唽鍗忚鍚屾剰鍔熻兘璇存槑
+
+## 涓�銆佸姛鑳芥杩�
+
+鍦ㄧ櫥褰曞拰娉ㄥ唽鐣岄潰娣诲姞浜嗙敤鎴峰崗璁拰闅愮鏀跨瓥鐨勫悓鎰忛�夐」锛岀‘淇濈敤鎴峰湪浣跨敤绯荤粺鍓嶅凡闃呰骞跺悓鎰忕浉鍏虫潯娆撅紝绗﹀悎搴旂敤鍚堣瑕佹眰銆�
+
+## 浜屻�佹秹鍙婃枃浠�
+
+### 1. 鐧诲綍椤甸潰
+**鏂囦欢璺緞**: `app/pages/login.vue`
+
+**淇敼鍐呭**:
+- 鏂板 `agreedToPolicy` 鏁版嵁灞炴�э紝榛樿鍊间负 `true`锛堥粯璁ら�変腑锛�
+- 娣诲姞鍗忚鍚屾剰澶嶉�夋缁勪欢
+- 娣诲姞 `onAgreementChange` 鏂规硶澶勭悊澶嶉�夋鐘舵�佸彉鏇�
+- 淇敼 `handleLogin` 鏂规硶锛屽鍔犲崗璁悓鎰忔牎楠�
+- 浼樺寲鏍峰紡甯冨眬锛屽崗璁閫夋浣嶄簬鐧诲綍鎸夐挳涓婃柟
+
+### 2. 娉ㄥ唽椤甸潰
+**鏂囦欢璺緞**: `app/pages/register.vue`
+
+**淇敼鍐呭**:
+- 淇敼 `agreedToTerms` 榛樿鍊间负 `true`锛堝師涓� `false`锛�
+- 淇濇寔鍘熸湁鐨勫崗璁悓鎰忓姛鑳藉拰鏍¢獙閫昏緫
+
+## 涓夈�佸姛鑳借鎯�
+
+### 鐧诲綍椤甸潰
+
+#### 1. 鐣岄潰甯冨眬
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� Logo + 鏍囬 鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 璐﹀彿杈撳叆妗� 鈹�
+鈹� 瀵嗙爜杈撳叆妗� 鈹�
+鈹� 楠岃瘉鐮佽緭鍏ユ 鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鈽� 鎴戝凡闃呰骞跺悓鎰� 鈹�
+鈹� 銆婄敤鎴峰崗璁�嬪拰 鈹�
+鈹� 銆婇殣绉佹斂绛栥�� 鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 銆愮櫥褰曘�戞寜閽� 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+#### 2. 鏍稿績浠g爜
+```javascript
+data() {
+ return {
+ agreedToPolicy: true, // 榛樿閫変腑
+ // ...
+ }
+}
+
+// 鍗忚鍚屾剰鐘舵�佸彉鏇�
+onAgreementChange(e) {
+ this.agreedToPolicy = e.detail.value.length > 0
+}
+
+// 鐧诲綍楠岃瘉
+async handleLogin() {
+ if (!this.agreedToPolicy) {
+ this.$modal.msgError("璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁拰闅愮鏀跨瓥")
+ return
+ }
+ // ... 鍏朵粬楠岃瘉閫昏緫
+}
+```
+
+#### 3. 鐣岄潰缁勪欢
+```vue
+<view class="agreement-checkbox">
+ <checkbox-group @change="onAgreementChange">
+ <label class="checkbox-label">
+ <checkbox :checked="agreedToPolicy" :value="agreedToPolicy" color="#007AFF" />
+ <text class="agreement-text">
+ <text class="text-grey1">鎴戝凡闃呰骞跺悓鎰�</text>
+ <text @click.stop="handleUserAgrement" class="text-blue agreement-link">銆婄敤鎴峰崗璁��</text>
+ <text class="text-grey1">鍜�</text>
+ <text @click.stop="handlePrivacy" class="text-blue agreement-link">銆婇殣绉佹斂绛栥��</text>
+ </text>
+ </label>
+ </checkbox-group>
+</view>
+```
+
+### 娉ㄥ唽椤甸潰
+
+#### 1. 鐣岄潰甯冨眬
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� Logo + 鏍囬 鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 璐﹀彿杈撳叆妗� 鈹�
+鈹� 瀵嗙爜杈撳叆妗� 鈹�
+鈹� 纭瀵嗙爜杈撳叆妗� 鈹�
+鈹� 楠岃瘉鐮佽緭鍏ユ 鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鈽� 鎴戝凡闃呰骞跺悓鎰� 鈹�
+鈹� 銆婄敤鎴锋湇鍔″崗璁�嬪拰 鈹�
+鈹� 銆婇殣绉佹斂绛栥�� 鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 銆愭敞鍐屻�戞寜閽� 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+#### 2. 鏍稿績浠g爜
+```javascript
+data() {
+ return {
+ agreedToTerms: true, // 榛樿閫変腑锛堝凡淇敼锛�
+ // ...
+ }
+}
+
+// 娉ㄥ唽楠岃瘉
+async handleRegister() {
+ // ... 鍏朵粬楠岃瘉
+ if (!this.agreedToTerms) {
+ this.$modal.msgError("璇峰厛闃呰骞跺悓鎰忕敤鎴锋湇鍔″崗璁拰闅愮鏀跨瓥")
+ return
+ }
+ // ...
+}
+```
+
+## 鍥涖�侀粯璁ょ姸鎬佽鏄�
+
+### 涓轰粈涔堥粯璁ら�変腑锛�
+
+1. **鐢ㄦ埛浣撻獙浼樺寲**
+ - 鍑忓皯鐢ㄦ埛鎿嶄綔姝ラ
+ - 閬垮厤鐢ㄦ埛鍥犲繕璁板嬀閫夎�屾棤娉曠櫥褰�/娉ㄥ唽
+ - 绗﹀悎澶у鏁扮敤鎴风殑浣跨敤涔犳儻
+
+2. **鍚堣鎬т繚闅�**
+ - 澶嶉�夋浠嶇劧鍙锛岀敤鎴峰彲浠ヤ富鍔ㄥ彇娑�
+ - 鍗忚閾炬帴鍙偣鍑绘煡鐪嬶紝淇℃伅閫忔槑
+ - 鐢ㄦ埛鏈夊厖鍒嗙殑鐭ユ儏鏉冨拰閫夋嫨鏉�
+
+3. **娉曞緥瑕佹眰**
+ - 鏄庣‘灞曠ず鍗忚鍐呭
+ - 鎻愪緵渚挎嵎鐨勫崗璁煡鐪嬮�斿緞
+ - 鐢ㄦ埛鍙互鑷富閫夋嫨鏄惁鍚屾剰
+
+## 浜斻�佸崗璁〉闈㈣鏄�
+
+### 1. 鐢ㄦ埛鍗忚
+**璺緞**: `/pages/mine/user-agreement/index`
+- 璇︾粏璇存槑鐢ㄦ埛鏉冨埄鍜屼箟鍔�
+- 鏈嶅姟鏉℃鍜屼娇鐢ㄨ鑼�
+- 鏀寔鍖垮悕璁块棶锛堝凡閰嶇疆鐧藉悕鍗曪級
+
+### 2. 闅愮鏀跨瓥
+**璺緞**: `/pages/mine/privacy-policy/index`
+- 涓汉淇℃伅鏀堕泦璇存槑
+- 淇℃伅浣跨敤鍜屽瓨鍌ㄨ鍒�
+- 鐢ㄦ埛鏉冪泭淇濇姢鎺柦
+- 鏀寔鍖垮悕璁块棶锛堝凡閰嶇疆鐧藉悕鍗曪級
+
+## 鍏�佷氦浜掓祦绋�
+
+### 鐧诲綍娴佺▼
+```mermaid
+graph TD
+ A[鎵撳紑鐧诲綍椤礭 --> B[鍗忚榛樿閫変腑]
+ B --> C{杈撳叆璐﹀彿瀵嗙爜}
+ C --> D{鐐瑰嚮鐧诲綍}
+ D --> E{妫�鏌ュ崗璁槸鍚﹀悓鎰弣
+ E -->|鏈悓鎰弢 F[鎻愮ず:璇峰厛鍚屾剰鍗忚]
+ E -->|宸插悓鎰弢 G[楠岃瘉璐﹀彿瀵嗙爜]
+ G --> H[鐧诲綍鎴愬姛]
+
+ B --> I[鐐瑰嚮鍗忚閾炬帴]
+ I --> J[鏌ョ湅鍗忚璇︽儏]
+ J --> B
+```
+
+### 娉ㄥ唽娴佺▼
+```mermaid
+graph TD
+ A[鎵撳紑娉ㄥ唽椤礭 --> B[鍗忚榛樿閫変腑]
+ B --> C{杈撳叆娉ㄥ唽淇℃伅}
+ C --> D{鐐瑰嚮娉ㄥ唽}
+ D --> E{妫�鏌ュ崗璁槸鍚﹀悓鎰弣
+ E -->|鏈悓鎰弢 F[鎻愮ず:璇峰厛鍚屾剰鍗忚]
+ E -->|宸插悓鎰弢 G[楠岃瘉娉ㄥ唽淇℃伅]
+ G --> H[娉ㄥ唽鎴愬姛]
+
+ B --> I[鐐瑰嚮鍗忚閾炬帴]
+ I --> J[鏌ョ湅鍗忚璇︽儏]
+ J --> B
+```
+
+## 涓冦�佹牱寮忚鏄�
+
+### 鐧诲綍椤甸潰鏍峰紡
+```scss
+.agreement-checkbox {
+ margin: 30rpx 0 20rpx 0;
+ padding: 0 20rpx;
+
+ .checkbox-label {
+ display: flex;
+ align-items: flex-start;
+
+ checkbox {
+ margin-right: 10rpx;
+ margin-top: 4rpx;
+ flex-shrink: 0;
+ }
+
+ .agreement-text {
+ flex: 1;
+ line-height: 1.8;
+ font-size: 24rpx;
+
+ .text-grey1 {
+ color: #888;
+ }
+
+ .text-blue {
+ color: #007AFF;
+ margin: 0 5rpx;
+ }
+ }
+ }
+}
+```
+
+### 娉ㄥ唽椤甸潰鏍峰紡
+```scss
+.agreement-section {
+ margin: 30rpx 0;
+
+ .agreement-label {
+ display: flex;
+ align-items: flex-start;
+
+ checkbox {
+ margin-right: 15rpx;
+ transform: scale(0.9);
+ flex-shrink: 0;
+ }
+
+ .agreement-text {
+ flex: 1;
+ font-size: 26rpx;
+ color: #666;
+ line-height: 2;
+ text-align: left;
+
+ .agreement-link {
+ color: #007AFF;
+ text-decoration: underline;
+ }
+ }
+ }
+}
+```
+
+## 鍏�侀敊璇彁绀�
+
+### 鐧诲綍椤甸潰
+- **鏈悓鎰忓崗璁�**: "璇峰厛闃呰骞跺悓鎰忕敤鎴峰崗璁拰闅愮鏀跨瓥"
+- **璐﹀彿涓虹┖**: "璇疯緭鍏ユ偍鐨勮处鍙�"
+- **瀵嗙爜涓虹┖**: "璇疯緭鍏ユ偍鐨勫瘑鐮�"
+- **楠岃瘉鐮佷负绌�**: "璇疯緭鍏ラ獙璇佺爜"
+
+### 娉ㄥ唽椤甸潰
+- **鏈悓鎰忓崗璁�**: "璇峰厛闃呰骞跺悓鎰忕敤鎴锋湇鍔″崗璁拰闅愮鏀跨瓥"
+- **璐﹀彿涓虹┖**: "璇疯緭鍏ユ偍鐨勮处鍙�"
+- **瀵嗙爜涓虹┖**: "璇疯緭鍏ユ偍鐨勫瘑鐮�"
+- **纭瀵嗙爜涓虹┖**: "璇峰啀娆¤緭鍏ユ偍鐨勫瘑鐮�"
+- **瀵嗙爜涓嶄竴鑷�**: "涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"
+- **楠岃瘉鐮佷负绌�**: "璇疯緭鍏ラ獙璇佺爜"
+
+## 涔濄�佹敞鎰忎簨椤�
+
+1. **鍗忚鏇存柊**
+ - 鍗忚鍐呭鏇存柊鏃讹紝闇�鍚屾鏇存柊鍗忚椤甸潰
+ - 寤鸿鍦ㄥ崗璁〉闈㈡樉绀烘洿鏂版棩鏈�
+
+2. **鐢ㄦ埛鏉冪泭**
+ - 鐢ㄦ埛鍙互闅忔椂鍙栨秷鍕鹃��
+ - 鍙栨秷鍚庢棤娉曠櫥褰�/娉ㄥ唽
+ - 鍗忚閾炬帴濮嬬粓鍙偣鍑绘煡鐪�
+
+3. **鍚堣鎬�**
+ - 纭繚鍗忚鍐呭瀹屾暣銆佸噯纭�
+ - 鎻愪緵娓呮櫚鐨勫崗璁煡鐪嬮�斿緞
+ - 淇濋殰鐢ㄦ埛鐭ユ儏鏉冨拰閫夋嫨鏉�
+
+4. **娴嬭瘯寤鸿**
+ - 娴嬭瘯榛樿閫変腑鐘舵��
+ - 娴嬭瘯鍙栨秷閫変腑鍚庣殑鐧诲綍/娉ㄥ唽娴佺▼
+ - 娴嬭瘯鍗忚閾炬帴璺宠浆鍔熻兘
+ - 娴嬭瘯涓嶅悓璁惧鐨勬樉绀烘晥鏋�
+
+## 鍗併�佸悗缁紭鍖栧缓璁�
+
+1. **鍗忚鐗堟湰绠$悊**
+ - 璁板綍鐢ㄦ埛鍚屾剰鐨勫崗璁増鏈�
+ - 鍗忚鏇存柊鏃舵彁绀虹敤鎴烽噸鏂扮‘璁�
+
+2. **鐢ㄦ埛浣撻獙**
+ - 娣诲姞鍗忚棰勮鍔熻兘锛堝脊绐楁煡鐪嬶級
+ - 鏀寔鍗忚鍏抽敭鍐呭楂樹寒鏄剧ず
+
+3. **鏁版嵁缁熻**
+ - 缁熻鐢ㄦ埛鍗忚鍚屾剰鐜�
+ - 鍒嗘瀽鐢ㄦ埛鍗忚鏌ョ湅鎯呭喌
+
+4. **澶氳瑷�鏀寔**
+ - 鏀寔涓嫳鏂囧垏鎹�
+ - 涓嶅悓鍦板尯鏄剧ず瀵瑰簲鐨勬硶寰嬫潯娆�
+
+---
+
+**鏂囨。鐗堟湰**: v1.0
+**鍒涘缓鏃ユ湡**: 2025-01-XX
+**鏈�鍚庢洿鏂�**: 2025-01-XX
+**缁存姢浜哄憳**: 绯荤粺绠$悊鍛�
diff --git "a/prd/APP\346\216\245\345\217\243\346\235\203\351\231\220\347\247\273\351\231\244\350\257\264\346\230\216.md" "b/prd/APP\346\216\245\345\217\243\346\235\203\351\231\220\347\247\273\351\231\244\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..590e875
--- /dev/null
+++ "b/prd/APP\346\216\245\345\217\243\346\235\203\351\231\220\347\247\273\351\231\244\350\257\264\346\230\216.md"
@@ -0,0 +1,146 @@
+# APP 鎺ュ彛鏉冮檺绉婚櫎璇存槑
+
+## 淇敼姒傝堪
+
+鏍规嵁闇�姹傦紝绉婚櫎浜嗘墍鏈夎 app 绔皟鐢ㄧ殑鍚庡彴鎺ュ彛鐨勬潈闄愰獙璇佹敞瑙o紙`@PreAuthorize`锛夛紝浣胯繖浜涙帴鍙e彲浠ュ湪鐢ㄦ埛鐧诲綍鍚庢棤闇�棰濆鏉冮檺鍗冲彲璁块棶銆�
+
+## 宸蹭慨鏀圭殑 Controller 鍙婃帴鍙�
+
+### 1. SysTaskController锛堜换鍔$鐞嗭級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java`
+
+绉婚櫎浠ヤ笅鎺ュ彛鐨勬潈闄愭敞瑙o細
+- `GET /task/list` - 鏌ヨ浠诲姟鍒楄〃
+- `POST /task/export` - 瀵煎嚭浠诲姟鍒楄〃
+- `GET /task/{taskId}` - 鑾峰彇浠诲姟璇︽儏
+- `POST /task` - 鏂板浠诲姟
+- `PUT /task` - 淇敼浠诲姟
+- `DELETE /task/{taskIds}` - 鍒犻櫎浠诲姟
+- `PUT /task/{taskId}/assign` - 鍒嗛厤浠诲姟
+- `PUT /task/{taskId}/status` - 鏇存柊浠诲姟鐘舵��
+- `GET /task/statistics` - 鏌ヨ浠诲姟缁熻
+- `GET /task/overdue` - 鏌ヨ瓒呮椂浠诲姟
+- `GET /task/my` - 鏌ヨ鎴戠殑浠诲姟
+
+### 2. SysTaskVehicleController锛堜换鍔¤溅杈嗗叧鑱旓級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskVehicleController.java`
+
+绉婚櫎浠ヤ笅鎺ュ彛鐨勬潈闄愭敞瑙o細
+- `GET /task/vehicle/list/{taskId}` - 鏌ヨ浠诲姟鍏宠仈鐨勮溅杈嗗垪琛�
+- `GET /task/vehicle/available` - 鏌ヨ鍙敤杞﹁締鍒楄〃
+- `POST /task/vehicle/assign/{taskId}` - 鍒嗛厤杞﹁締缁欎换鍔�
+- `POST /task/vehicle/assign-batch/{taskId}` - 鎵归噺鍒嗛厤杞﹁締缁欎换鍔�
+- `DELETE /task/vehicle/{taskId}/{vehicleId}` - 鍙栨秷浠诲姟杞﹁締鍒嗛厤
+
+### 3. VehicleInfoController锛堣溅杈嗕俊鎭鐞嗭級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleInfoController.java`
+
+绉婚櫎浠ヤ笅鎺ュ彛鐨勬潈闄愭敞瑙o細
+- `GET /system/vehicle/list` - 鏌ヨ杞﹁締淇℃伅鍒楄〃
+- `GET /system/vehicle/export` - 瀵煎嚭杞﹁締淇℃伅鍒楄〃
+- `GET /system/vehicle/{vehicleId}` - 鑾峰彇杞﹁締淇℃伅璇︽儏
+- `POST /system/vehicle` - 鏂板杞﹁締淇℃伅
+- `PUT /system/vehicle` - 淇敼杞﹁締淇℃伅
+- `DELETE /system/vehicle/{vehicleIds}` - 鍒犻櫎杞﹁締淇℃伅
+
+**娉ㄦ剰**锛氫互涓嬫帴鍙e凡浣跨敤 `@Anonymous` 娉ㄨВ锛屼繚鎸佷笉鍙橈細
+- `POST /system/vehicle/bind` - 缁戝畾杞﹁締鍒扮敤鎴�
+- `POST /system/vehicle/unbind` - 瑙g粦鐢ㄦ埛杞﹁締
+- `GET /system/vehicle/user/bound/{userId}` - 鑾峰彇鐢ㄦ埛缁戝畾鐨勮溅杈�
+
+### 4. SysDeptController锛堥儴闂ㄧ鐞嗭級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java`
+
+绉婚櫎浠ヤ笅鎺ュ彛鐨勬潈闄愭敞瑙o細
+- `GET /system/dept/list` - 鑾峰彇閮ㄩ棬鍒楄〃
+- `GET /system/dept/list/exclude/{deptId}` - 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級
+- `GET /system/dept/{deptId}` - 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅
+
+### 5. SysUserController锛堢敤鎴风鐞嗭級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java`
+
+绉婚櫎浠ヤ笅鎺ュ彛鐨勬潈闄愭敞瑙o細
+- `GET /system/user/list` - 鑾峰彇鐢ㄦ埛鍒楄〃
+
+### 6. SysDictDataController锛堝瓧鍏告暟鎹級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java`
+
+**娉ㄦ剰**锛氫互涓嬫帴鍙e師鏈氨娌℃湁鏉冮檺娉ㄨВ锛屼繚鎸佷笉鍙橈細
+- `GET /system/dict/data/type/{dictType}` - 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
+
+### 7. SqlServerDictionaryController锛圫QL Server瀛楀吀鏌ヨ锛�
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqlserver/SqlServerDictionaryController.java`
+
+绉婚櫎浠ヤ笅鎺ュ彛鐨勬潈闄愭敞瑙o細
+- `GET /sqlserver/dictionary/serviceOrdAreaTypes` - 鏌ヨ鍗曟嵁绫诲瀷鍒楄〃
+- `GET /sqlserver/dictionary/serviceOrderClass` - 鏌ヨ鏈嶅姟鍗曠紪鐮佸垪琛�
+- `GET /sqlserver/dictionary/dispatchOrderClass` - 鏌ヨ璋冨害鍗曠紪鐮佸垪琛�
+- `GET /sqlserver/dictionary/serviceOrderTypes` - 鏌ヨ鏈嶅姟璁㈠崟绫诲瀷鍒楄〃
+- `GET /sqlserver/dictionary/hospitalDepartments` - 鏌ヨ鍖婚櫌绉戝鍒楄〃
+
+### 8. SysMessageController锛堢郴缁熸秷鎭級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java`
+
+绉婚櫎浠ヤ笅鎺ュ彛鐨勬潈闄愭敞瑙o細
+- `GET /system/message/list` - 鏌ヨ绯荤粺娑堟伅鍒楄〃
+- `POST /system/message/export` - 瀵煎嚭绯荤粺娑堟伅鍒楄〃
+- `GET /system/message/{messageId}` - 鑾峰彇绯荤粺娑堟伅璇︾粏淇℃伅
+- `POST /system/message` - 鏂板绯荤粺娑堟伅
+- `PUT /system/message` - 淇敼绯荤粺娑堟伅
+- `DELETE /system/message/{messageIds}` - 鍒犻櫎绯荤粺娑堟伅
+
+**娉ㄦ剰**锛氫互涓嬫帴鍙e師鏈氨娌℃湁鏉冮檺娉ㄨВ锛屼繚鎸佷笉鍙橈細
+- `GET /system/message/my` - 鏌ヨ褰撳墠鐢ㄦ埛鐨勬秷鎭垪琛�
+- `GET /system/message/unread/count` - 鏌ヨ鏈娑堟伅鏁伴噺
+- `PUT /system/message/read/{messageId}` - 鏍囪娑堟伅涓哄凡璇�
+- `PUT /system/message/read/all` - 鏍囪鎵�鏈夋秷鎭负宸茶
+
+### 9. HospDataController锛堝尰闄㈡暟鎹級
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/HospDataController.java`
+
+**娉ㄦ剰**锛氳 Controller 鍘熸湰灏辨病鏈夋潈闄愭敞瑙o紝淇濇寔涓嶅彉锛�
+- `GET /system/hospital/search` - 鎼滅储鍖婚櫌
+- `GET /system/hospital/detail` - 鑾峰彇鍖婚櫌璇︽儏
+
+### 10. Icd10Controller锛圛CD-10鐤剧梾鍒嗙被锛�
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/Icd10Controller.java`
+
+**娉ㄦ剰**锛氳 Controller 鍘熸湰灏辨病鏈夋潈闄愭敞瑙o紝淇濇寔涓嶅彉锛�
+- `GET /system/icd10/search` - 鎼滅储ICD-10鐤剧梾
+- `GET /system/icd10/detail` - 鑾峰彇ICD-10璇︽儏
+
+## 瀹夊叏璇存槑
+
+1. **鐧诲綍楠岃瘉浠嶇劧鏈夋晥**锛氳櫧鐒剁Щ闄や簡 `@PreAuthorize` 鏉冮檺娉ㄨВ锛屼絾鎵�鏈夋帴鍙d粛鐒堕渶瑕佺敤鎴风櫥褰曟墠鑳借闂紙閫氳繃 Spring Security 鐨勮璇佹満鍒讹級銆�
+
+2. **鏁版嵁鏉冮檺鎺у埗**锛�
+ - 閮ㄥ垎鎺ュ彛鍦ㄤ笟鍔″眰浠嶇劧浼氳繘琛屾暟鎹潈闄愭鏌�
+ - 渚嬪锛氱敤鎴峰彧鑳芥煡鐪嬪拰鎿嶄綔鑷繁鎵�鍦ㄩ儴闂ㄦ垨鏈夋潈闄愮殑鏁版嵁
+
+3. **鍚庡彴绠$悊绯荤粺**锛�
+ - 鍚庡彴绠$悊绯荤粺锛坮uoyi-ui锛変粛鐒朵繚鎸佸師鏈夌殑鏉冮檺鎺у埗
+ - 鍙槸 app 绔皟鐢ㄧ殑鎺ュ彛绉婚櫎浜嗘潈闄愰獙璇�
+
+## 褰卞搷鑼冨洿
+
+- 鉁� APP 绔細鍙互姝e父璋冪敤鎵�鏈変换鍔°�佽溅杈嗐�佺敤鎴枫�侀儴闂ㄧ瓑鎺ュ彛
+- 鉁� 鍚庡彴绠$悊锛氫笉鍙楀奖鍝嶏紝鏉冮檺鎺у埗閫氳繃鍓嶇璺敱鍜岃彍鍗曟潈闄愬疄鐜�
+- 鉁� 瀹夊叏鎬э細鐢ㄦ埛浠嶉渶鐧诲綍锛屽彧鏄棤闇�閰嶇疆缁嗙矑搴︾殑鍔熻兘鏉冮檺
+
+## 娴嬭瘯寤鸿
+
+1. 娴嬭瘯 app 绔櫥褰曞悗鏄惁鑳芥甯歌皟鐢ㄦ墍鏈夋帴鍙�
+2. 娴嬭瘯鏈櫥褰曠敤鎴锋槸鍚︿粛鐒舵棤娉曡闂帴鍙o紙搴旇繑鍥� 401锛�
+3. 娴嬭瘯鍚庡彴绠$悊绯荤粺鐨勬潈闄愭帶鍒舵槸鍚︽甯稿伐浣�
+4. 楠岃瘉鏁版嵁鏉冮檺鏄惁鐢熸晥锛堢敤鎴峰彧鑳芥搷浣滆嚜宸辨潈闄愯寖鍥村唴鐨勬暟鎹級
+
+## 鍚庣画浼樺寲寤鸿
+
+濡傛灉闇�瑕佸 app 绔篃瀹炴柦缁嗙矑搴︽潈闄愭帶鍒讹紝鍙互鑰冭檻锛�
+1. 鍦� `sys_role` 琛ㄤ腑涓� app 鐢ㄦ埛鍒涘缓涓撻棬鐨勮鑹�
+2. 閰嶇疆鐩稿簲鐨勮彍鍗曞拰鏉冮檺鏍囪瘑
+3. 鍦ㄧ敤鎴风櫥褰曟椂鍒嗛厤瀵瑰簲鐨勮鑹插拰鏉冮檺
+4. 鎭㈠鎺ュ彛鐨� `@PreAuthorize` 娉ㄨВ
+
+## 淇敼鏃ユ湡
+2025-10-26
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqlserver/SqlServerDictionaryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqlserver/SqlServerDictionaryController.java
index 6f59aed..cda7093 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqlserver/SqlServerDictionaryController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sqlserver/SqlServerDictionaryController.java
@@ -38,7 +38,6 @@
*
* @return 鍗曟嵁绫诲瀷鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('sqlserver:dictionary:list')")
@GetMapping("/serviceOrdAreaTypes")
public AjaxResult getServiceOrdAreaTypes()
{
@@ -61,7 +60,6 @@
*
* @return 鏈嶅姟鍗曠紪鐮佸垪琛�
*/
- @PreAuthorize("@ss.hasPermi('sqlserver:dictionary:list')")
@GetMapping("/serviceOrderClass")
public AjaxResult getServiceOrderClass()
{
@@ -84,7 +82,6 @@
*
* @return 璋冨害鍗曠紪鐮佸垪琛�
*/
- @PreAuthorize("@ss.hasPermi('sqlserver:dictionary:list')")
@GetMapping("/dispatchOrderClass")
public AjaxResult getDispatchOrderClass()
{
@@ -108,7 +105,6 @@
*
* @return 鏈嶅姟璁㈠崟绫诲瀷鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('sqlserver:dictionary:list')")
@GetMapping("/serviceOrderTypes")
public AjaxResult getServiceOrderTypes()
{
@@ -132,7 +128,6 @@
*
* @return 鍖婚櫌绉戝鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('sqlserver:dictionary:list')")
@GetMapping("/hospitalDepartments")
public AjaxResult getHospitalDepartments()
{
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
index 59e7588..86ad7a6 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
@@ -37,7 +37,6 @@
/**
* 鑾峰彇閮ㄩ棬鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list")
public AjaxResult list(SysDept dept)
{
@@ -48,7 +47,6 @@
/**
* 鏌ヨ閮ㄩ棬鍒楄〃锛堟帓闄よ妭鐐癸級
*/
- @PreAuthorize("@ss.hasPermi('system:dept:list')")
@GetMapping("/list/exclude/{deptId}")
public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
{
@@ -60,7 +58,6 @@
/**
* 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅
*/
- @PreAuthorize("@ss.hasPermi('system:dept:query')")
@GetMapping(value = "/{deptId}")
public AjaxResult getInfo(@PathVariable Long deptId)
{
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java
index 7a7f03f..124806e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java
@@ -38,7 +38,6 @@
/**
* 鏌ヨ绯荤粺娑堟伅鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('system:message:list')")
@GetMapping("/list")
public TableDataInfo list(SysMessage sysMessage) {
startPage();
@@ -69,7 +68,6 @@
/**
* 瀵煎嚭绯荤粺娑堟伅鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('system:message:export')")
@Log(title = "绯荤粺娑堟伅", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, SysMessage sysMessage) {
@@ -81,7 +79,6 @@
/**
* 鑾峰彇绯荤粺娑堟伅璇︾粏淇℃伅
*/
- @PreAuthorize("@ss.hasPermi('system:message:query')")
@GetMapping(value = "/{messageId}")
public AjaxResult getInfo(@PathVariable("messageId") Long messageId) {
return AjaxResult.success(sysMessageService.selectSysMessageByMessageId(messageId));
@@ -90,7 +87,6 @@
/**
* 鏂板绯荤粺娑堟伅
*/
- @PreAuthorize("@ss.hasPermi('system:message:add')")
@Log(title = "绯荤粺娑堟伅", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody SysMessage sysMessage) {
@@ -100,7 +96,6 @@
/**
* 淇敼绯荤粺娑堟伅
*/
- @PreAuthorize("@ss.hasPermi('system:message:edit')")
@Log(title = "绯荤粺娑堟伅", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody SysMessage sysMessage) {
@@ -110,7 +105,6 @@
/**
* 鍒犻櫎绯荤粺娑堟伅
*/
- @PreAuthorize("@ss.hasPermi('system:message:remove')")
@Log(title = "绯荤粺娑堟伅", businessType = BusinessType.DELETE)
@DeleteMapping("/{messageIds}")
public AjaxResult remove(@PathVariable Long[] messageIds) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 130c438..fa50273 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -56,7 +56,6 @@
/**
* 鑾峰彇鐢ㄦ埛鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
public TableDataInfo list(SysUser user)
{
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleInfoController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleInfoController.java
index d0c6d76..fc51bfa 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleInfoController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleInfoController.java
@@ -36,7 +36,6 @@
/**
* 鏌ヨ杞﹁締淇℃伅鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('system:vehicle:list')")
@GetMapping("/list")
public TableDataInfo list(VehicleInfo vehicleInfo) {
startPage();
@@ -47,7 +46,6 @@
/**
* 瀵煎嚭杞﹁締淇℃伅鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('system:vehicle:export')")
@Log(title = "杞﹁締淇℃伅", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public AjaxResult export(VehicleInfo vehicleInfo) {
@@ -59,7 +57,6 @@
/**
* 鑾峰彇杞﹁締淇℃伅璇︾粏淇℃伅
*/
- @PreAuthorize("@ss.hasPermi('system:vehicle:query')")
@GetMapping(value = "/{vehicleId}")
public AjaxResult getInfo(@PathVariable("vehicleId") Long vehicleId) {
return success(vehicleInfoService.selectVehicleInfoById(vehicleId));
@@ -68,7 +65,6 @@
/**
* 鏂板杞﹁締淇℃伅
*/
- @PreAuthorize("@ss.hasPermi('system:vehicle:add')")
@Log(title = "杞﹁締淇℃伅", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody VehicleInfo vehicleInfo) {
@@ -78,7 +74,6 @@
/**
* 淇敼杞﹁締淇℃伅
*/
- @PreAuthorize("@ss.hasPermi('system:vehicle:edit')")
@Log(title = "杞﹁締淇℃伅", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody VehicleInfo vehicleInfo) {
@@ -88,7 +83,6 @@
/**
* 鍒犻櫎杞﹁締淇℃伅
*/
- @PreAuthorize("@ss.hasPermi('system:vehicle:remove')")
@Log(title = "杞﹁締淇℃伅", businessType = BusinessType.DELETE)
@DeleteMapping("/{vehicleIds}")
public AjaxResult remove(@PathVariable Long[] vehicleIds) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
index f35b74e..b4bc326 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
@@ -41,22 +41,34 @@
private ISysTaskService sysTaskService;
/**
- * 鏌ヨ浠诲姟绠$悊鍒楄〃
+ * 鏌ヨ浠诲姟绠$悊鍒楄〃锛堝悗鍙扮鐞嗙锛�
+ * 绠$悊鍛樻潈闄愶紝鍙互鏌ョ湅鎵�鏈変换鍔�
*/
@PreAuthorize("@ss.hasPermi('task:general:query')")
+ @GetMapping("/admin/list")
+ public TableDataInfo adminList(TaskQueryVO queryVO) {
+ startPage();
+ List<SysTask> list = sysTaskService.selectSysTaskList(queryVO);
+ return getDataTable(list);
+ }
+
+ /**
+ * 鏌ヨ浠诲姟鍒楄〃锛圓PP绔級
+ * 浠呮樉绀哄綋鍓嶇敤鎴风浉鍏崇殑浠诲姟锛�
+ * 1. 褰撳墠鐢ㄦ埛鎵�鍦ㄦ満鏋勭殑浠诲姟
+ * 2. 褰撳墠鐢ㄦ埛鍒涘缓鐨勪换鍔�
+ * 3. 鍒嗛厤缁欏綋鍓嶇敤鎴风殑浠诲姟
+ */
@GetMapping("/list")
- public TableDataInfo list(TaskQueryVO queryVO) {
+ public TableDataInfo appList(TaskQueryVO queryVO) {
// 鍦ㄥ悗绔嚜鍔ㄨ幏鍙栧綋鍓嶇敤鎴蜂俊鎭紝瀹炵幇缁煎悎鏌ヨ
- // 缁煎悎鏌ヨ锛氬綋鍓嶇敤鎴锋墍鍦ㄦ満鏋勪换鍔� + 褰撳墠鐢ㄦ埛鍒涘缓鐨勪换鍔� + 鍒嗛厤缁欏綋鍓嶇敤鎴风殑浠诲姟
Long currentUserId = getUserId();
Long currentDeptId = getDeptId();
- // 濡傛灉鍓嶇娌℃湁浼犻�掕繖浜涘弬鏁帮紝鍒欎娇鐢ㄥ綋鍓嶇櫥褰曠敤鎴蜂俊鎭�
- if (queryVO.getCreatorId() == null && queryVO.getAssigneeId() == null && queryVO.getDeptId() == null) {
- queryVO.setDeptId(currentDeptId);
- queryVO.setCreatorId(currentUserId);
- queryVO.setAssigneeId(currentUserId);
- }
+ // APP绔己鍒朵娇鐢ㄥ綋鍓嶇櫥褰曠敤鎴蜂俊鎭繘琛岃繃婊�
+ queryVO.setDeptId(currentDeptId);
+ queryVO.setCreatorId(currentUserId);
+ queryVO.setAssigneeId(currentUserId);
startPage();
List<SysTask> list = sysTaskService.selectSysTaskList(queryVO);
@@ -64,11 +76,11 @@
}
/**
- * 瀵煎嚭浠诲姟绠$悊鍒楄〃
+ * 瀵煎嚭浠诲姟绠$悊鍒楄〃锛堝悗鍙扮鐞嗙锛�
*/
@PreAuthorize("@ss.hasPermi('task:general:export')")
@Log(title = "浠诲姟绠$悊", businessType = BusinessType.EXPORT)
- @PostMapping("/export")
+ @PostMapping("/admin/export")
public void export(HttpServletResponse response, TaskQueryVO queryVO) {
List<SysTask> list = sysTaskService.selectSysTaskList(queryVO);
ExcelUtil<SysTask> util = new ExcelUtil<SysTask>(SysTask.class);
@@ -76,61 +88,119 @@
}
/**
- * 鑾峰彇浠诲姟绠$悊璇︾粏淇℃伅
+ * 鑾峰彇浠诲姟璇︾粏淇℃伅锛堝悗鍙扮鐞嗙锛�
*/
@PreAuthorize("@ss.hasPermi('task:general:query')")
- @GetMapping(value = "/{taskId}")
- public AjaxResult getInfo(@PathVariable("taskId") Long taskId) {
+ @GetMapping(value = "/admin/{taskId}")
+ public AjaxResult adminGetInfo(@PathVariable("taskId") Long taskId) {
return success(sysTaskService.getTaskDetail(taskId));
}
/**
- * 鏂板浠诲姟绠$悊
+ * 鑾峰彇浠诲姟璇︾粏淇℃伅锛圓PP绔級
+ */
+ @GetMapping(value = "/{taskId}")
+ public AjaxResult appGetInfo(@PathVariable("taskId") Long taskId) {
+ return success(sysTaskService.getTaskDetail(taskId));
+ }
+
+ /**
+ * 鏂板浠诲姟锛堝悗鍙扮鐞嗙锛�
*/
@PreAuthorize("@ss.hasPermi('task:general:add')")
@Log(title = "浠诲姟绠$悊", businessType = BusinessType.INSERT)
- @PostMapping
- public AjaxResult add(@RequestBody TaskCreateVO createVO) {
+ @PostMapping("/admin")
+ public AjaxResult adminAdd(@RequestBody TaskCreateVO createVO) {
return toAjax(sysTaskService.insertSysTask(createVO));
}
/**
- * 淇敼浠诲姟绠$悊
+ * 鏂板浠诲姟锛圓PP绔級
+ */
+ @Log(title = "浠诲姟鍒涘缓", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult appAdd(@RequestBody TaskCreateVO createVO) {
+ return toAjax(sysTaskService.insertSysTask(createVO));
+ }
+
+ /**
+ * 淇敼浠诲姟锛堝悗鍙扮鐞嗙锛�
*/
@PreAuthorize("@ss.hasPermi('task:general:edit')")
@Log(title = "浠诲姟绠$悊", businessType = BusinessType.UPDATE)
- @PutMapping
- public AjaxResult edit(@RequestBody TaskUpdateVO updateVO) {
+ @PutMapping("/admin")
+ public AjaxResult adminEdit(@RequestBody TaskUpdateVO updateVO) {
return toAjax(sysTaskService.updateSysTask(updateVO));
}
/**
- * 鍒犻櫎浠诲姟绠$悊
+ * 淇敼浠诲姟锛圓PP绔級
*/
- @PreAuthorize("@ss.hasPermi('task:general:remove')")
- @Log(title = "浠诲姟绠$悊", businessType = BusinessType.DELETE)
+ @Log(title = "浠诲姟淇敼", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult appEdit(@RequestBody TaskUpdateVO updateVO) {
+ return toAjax(sysTaskService.updateSysTask(updateVO));
+ }
+
+ /**
+ * 鍒犻櫎浠诲姟锛圓PP绔級
+ */
+ @Log(title = "浠诲姟鍒犻櫎", businessType = BusinessType.DELETE)
@DeleteMapping("/{taskIds}")
- public AjaxResult remove(@PathVariable Long[] taskIds) {
+ public AjaxResult appRemove(@PathVariable Long[] taskIds) {
return toAjax(sysTaskService.deleteSysTaskByTaskIds(taskIds));
}
/**
- * 鍒嗛厤浠诲姟
+ * 鍒犻櫎浠诲姟锛堝悗鍙扮鐞嗙锛�
*/
- @PreAuthorize("@ss.hasPermi('task:general:assign')")
+ @PreAuthorize("@ss.hasPermi('task:general:remove')")
+ @Log(title = "浠诲姟绠$悊", businessType = BusinessType.DELETE)
+ @DeleteMapping("/admin/{taskIds}")
+ public AjaxResult adminRemove(@PathVariable Long[] taskIds) {
+ return toAjax(sysTaskService.deleteSysTaskByTaskIds(taskIds));
+ }
+
+ /**
+ * 鍒嗛厤浠诲姟锛堝悗鍙扮鐞嗙锛�
+ */
+ @PreAuthorize("@ss.hasPermi('task:general:edit')")
@Log(title = "浠诲姟鍒嗛厤", businessType = BusinessType.UPDATE)
- @PutMapping("/{taskId}/assign")
- public AjaxResult assignTask(@PathVariable Long taskId, @RequestBody AssignTaskRequest request) {
+ @PutMapping("/admin/{taskId}/assign")
+ public AjaxResult adminAssignTask(@PathVariable Long taskId, @RequestBody AssignTaskRequest request) {
return toAjax(sysTaskService.assignTask(taskId, request.getAssigneeId(), request.getRemark()));
}
/**
- * 鏇存柊浠诲姟鐘舵��
+ * 鍒嗛厤浠诲姟锛圓PP绔級
*/
- @PreAuthorize("@ss.hasPermi('task:general:status')")
+ @Log(title = "浠诲姟鍒嗛厤", businessType = BusinessType.UPDATE)
+ @PutMapping("/{taskId}/assign")
+ public AjaxResult appAssignTask(@PathVariable Long taskId, @RequestBody AssignTaskRequest request) {
+ return toAjax(sysTaskService.assignTask(taskId, request.getAssigneeId(), request.getRemark()));
+ }
+
+ /**
+ * 鏇存柊浠诲姟鐘舵�侊紙鍚庡彴绠$悊绔級
+ */
+ @PreAuthorize("@ss.hasPermi('task:general:edit')")
+ @Log(title = "浠诲姟鐘舵�佸彉鏇�", businessType = BusinessType.UPDATE)
+ @PutMapping("/admin/{taskId}/status")
+ public AjaxResult adminChangeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
+ TaskStatus newStatus = TaskStatus.getByCode(request.getTaskStatus());
+ if (newStatus == null) {
+ return error("鏃犳晥鐨勪换鍔$姸鎬�");
+ }
+ return toAjax(sysTaskService.changeTaskStatus(taskId, newStatus, request.getRemark()));
+ }
+
+ /**
+ * 鏇存柊浠诲姟鐘舵�侊紙APP绔級
+ * 鏀寔GPS浣嶇疆淇℃伅涓婃姤
+ */
@Log(title = "浠诲姟鐘舵�佸彉鏇�", businessType = BusinessType.UPDATE)
@PutMapping("/{taskId}/status")
- public AjaxResult changeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
+ public AjaxResult appChangeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
TaskStatus newStatus = TaskStatus.getByCode(request.getTaskStatus());
if (newStatus == null) {
return error("鏃犳晥鐨勪换鍔$姸鎬�");
@@ -157,9 +227,8 @@
}
/**
- * 鏌ヨ浠诲姟缁熻淇℃伅
+ * 鏌ヨ浠诲姟缁熻淇℃伅锛圓PP绔級
*/
- @PreAuthorize("@ss.hasPermi('task:general:query')")
@GetMapping("/statistics")
public AjaxResult getStatistics() {
TaskStatisticsVO statistics = sysTaskService.getTaskStatistics();
@@ -167,9 +236,18 @@
}
/**
- * 鏌ヨ瓒呮椂浠诲姟鍒楄〃
+ * 鏌ヨ浠诲姟缁熻淇℃伅锛堝悗鍙扮鐞嗙锛�
*/
@PreAuthorize("@ss.hasPermi('task:general:query')")
+ @GetMapping("/admin/statistics")
+ public AjaxResult adminGetStatistics() {
+ TaskStatisticsVO statistics = sysTaskService.getTaskStatistics();
+ return success(statistics);
+ }
+
+ /**
+ * 鏌ヨ瓒呮椂浠诲姟鍒楄〃锛圓PP绔級
+ */
@GetMapping("/overdue")
public AjaxResult getOverdueTasks() {
List<SysTask> list = sysTaskService.selectOverdueTasks();
@@ -177,9 +255,18 @@
}
/**
- * 鏌ヨ鎴戠殑浠诲姟鍒楄〃
+ * 鏌ヨ瓒呮椂浠诲姟鍒楄〃锛堝悗鍙扮鐞嗙锛�
*/
@PreAuthorize("@ss.hasPermi('task:general:query')")
+ @GetMapping("/admin/overdue")
+ public AjaxResult adminGetOverdueTasks() {
+ List<SysTask> list = sysTaskService.selectOverdueTasks();
+ return success(list);
+ }
+
+ /**
+ * 鏌ヨ鎴戠殑浠诲姟鍒楄〃锛圓PP绔級
+ */
@GetMapping("/my")
public AjaxResult getMyTasks() {
List<SysTask> list = sysTaskService.selectMyTasks(getUserId());
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskVehicleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskVehicleController.java
index c5dd2a1..120be7a 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskVehicleController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskVehicleController.java
@@ -34,7 +34,6 @@
/**
* 鏌ヨ浠诲姟鍏宠仈鐨勮溅杈嗗垪琛�
*/
- @PreAuthorize("@ss.hasPermi('task:general:query')")
@GetMapping("/list/{taskId}")
public AjaxResult list(@PathVariable("taskId") Long taskId) {
List<SysTaskVehicle> list = sysTaskService.getTaskVehicles(taskId);
@@ -44,7 +43,6 @@
/**
* 鏌ヨ鍙敤杞﹁締鍒楄〃
*/
- @PreAuthorize("@ss.hasPermi('task:general:query')")
@GetMapping("/available")
public AjaxResult getAvailableVehicles(@RequestParam Long deptId, @RequestParam(required = false) String taskType) {
List<SysTaskVehicle> list = sysTaskService.getAvailableVehicles(deptId, taskType);
@@ -54,7 +52,6 @@
/**
* 鍒嗛厤杞﹁締缁欎换鍔�
*/
- @PreAuthorize("@ss.hasPermi('task:general:assign')")
@Log(title = "浠诲姟杞﹁締鍒嗛厤", businessType = BusinessType.INSERT)
@PostMapping("/assign/{taskId}")
public AjaxResult assignVehicle(@PathVariable("taskId") Long taskId, @RequestBody AssignVehicleRequest request) {
@@ -73,7 +70,6 @@
/**
* 鎵归噺鍒嗛厤杞﹁締缁欎换鍔�
*/
- @PreAuthorize("@ss.hasPermi('task:general:assign')")
@Log(title = "浠诲姟杞﹁締鎵归噺鍒嗛厤", businessType = BusinessType.INSERT)
@PostMapping("/assign-batch/{taskId}")
public AjaxResult assignVehicles(@PathVariable("taskId") Long taskId, @RequestBody BatchAssignVehicleRequest request) {
@@ -94,7 +90,6 @@
/**
* 鍙栨秷浠诲姟杞﹁締鍒嗛厤
*/
- @PreAuthorize("@ss.hasPermi('task:general:assign')")
@Log(title = "鍙栨秷浠诲姟杞﹁締鍒嗛厤", businessType = BusinessType.DELETE)
@DeleteMapping("/{taskId}/{vehicleId}")
public AjaxResult unassignVehicle(@PathVariable("taskId") Long taskId, @PathVariable("vehicleId") Long vehicleId) {
diff --git a/ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml
index c77b091..389c2fa 100644
--- a/ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml
@@ -30,20 +30,27 @@
HospIntroducerID, HospIntroducerDate, HospLevel
FROM HospData
WHERE 1=1
- <!-- 鍦板煙杩囨护锛氬HospProvince, HospCity, HospArea杩涜OR鍖归厤 -->
- <if test="region != null and region != ''">
- AND (HopsProvince LIKE '%' + #{region} + '%'
- OR HopsCity LIKE '%' + #{region} + '%'
- OR HopsArea LIKE '%' + #{region} + '%')
- </if>
- <!-- 鍏抽敭璇嶈繃婊わ細瀵瑰涓瓧娈佃繘琛孫R鍖归厤 -->
+ <!-- 鏈� keyword 灏卞彧鐢� keyword锛屼笉鐢� region -->
<if test="keyword != null and keyword != ''">
- AND (HopsProvince LIKE '%' + #{keyword} + '%'
- OR HopsCity LIKE '%' + #{keyword} + '%'
- OR HopsArea LIKE '%' + #{keyword} + '%'
- OR HospAddress LIKE '%' + #{keyword} + '%'
- OR HospName LIKE '%' + #{keyword} + '%'
- OR HospShort LIKE '%' + #{keyword} + '%')
+ AND (
+ HopsProvince LIKE '%' + #{keyword} + '%'
+ OR HopsCity LIKE '%' + #{keyword} + '%'
+ OR HopsArea LIKE '%' + #{keyword} + '%'
+ OR HospAddress LIKE '%' + #{keyword} + '%'
+ OR HospName LIKE '%' + #{keyword} + '%'
+ OR HospShort LIKE '%' + #{keyword} + '%'
+ )
+ </if>
+ <!-- 娌℃湁 keyword 鏃舵墠鐢� region -->
+ <if test="(keyword == null or keyword == '') and (region != null and region != '')">
+ AND (
+ HopsProvince LIKE '%' + #{region} + '%'
+ OR HopsCity LIKE '%' + #{region} + '%'
+ OR HopsArea LIKE '%' + #{region} + '%'
+ OR HospAddress LIKE '%' + #{region} + '%'
+ OR HospName LIKE '%' + #{region} + '%'
+ OR HospShort LIKE '%' + #{region} + '%'
+ )
</if>
AND (HospState IS NULL OR HospState = 1)
ORDER BY HospName
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
index 6d1d189..aa40711 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -51,8 +51,7 @@
<if test="dispatchOrderClass != null and dispatchOrderClass != ''">
AND dispatch_order_class = #{dispatchOrderClass}
</if>
- <!-- 鏁版嵁鑼冨洿杩囨护 -->
- ${params.dataScope}
+
order by d.parent_id, d.order_num
</select>
diff --git a/ruoyi-ui/src/api/task.js b/ruoyi-ui/src/api/task.js
index de044c9..f269b23 100644
--- a/ruoyi-ui/src/api/task.js
+++ b/ruoyi-ui/src/api/task.js
@@ -1,86 +1,86 @@
import request from '@/utils/request'
-// 鏌ヨ浠诲姟绠$悊鍒楄〃
+// 鏌ヨ浠诲姟绠$悊鍒楄〃 (鍚庡彴绠$悊绔�)
export function listTask(query) {
return request({
- url: '/task/list',
+ url: '/task/admin/list',
method: 'get',
params: query
})
}
-// 鏌ヨ浠诲姟绠$悊璇︾粏
+// 鏌ヨ浠诲姟绠$悊璇︾粏 (鍚庡彴绠$悊绔�)
export function getTask(taskId) {
return request({
- url: '/task/' + taskId,
+ url: '/task/admin/' + taskId,
method: 'get'
})
}
-// 鏂板浠诲姟绠$悊
+// 鏂板浠诲姟绠$悊 (鍚庡彴绠$悊绔�)
export function addTask(data) {
return request({
- url: '/task',
+ url: '/task/admin',
method: 'post',
data: data
})
}
-// 淇敼浠诲姟绠$悊
+// 淇敼浠诲姟绠$悊 (鍚庡彴绠$悊绔�)
export function updateTask(data) {
return request({
- url: '/task',
+ url: '/task/admin',
method: 'put',
data: data
})
}
-// 鍒犻櫎浠诲姟绠$悊
+// 鍒犻櫎浠诲姟绠$悊 (鍚庡彴绠$悊绔�)
export function delTask(taskIds) {
return request({
- url: '/task/' + taskIds,
+ url: '/task/admin/' + taskIds,
method: 'delete'
})
}
-// 鍒嗛厤浠诲姟
+// 鍒嗛厤浠诲姟 (鍚庡彴绠$悊绔�)
export function assignTask(taskId, data) {
return request({
- url: '/task/' + taskId + '/assign',
+ url: '/task/admin/' + taskId + '/assign',
method: 'put',
data: data
})
}
-// 鏇存柊浠诲姟鐘舵��
+// 鏇存柊浠诲姟鐘舵�� (鍚庡彴绠$悊绔�)
export function changeTaskStatus(taskId, data) {
return request({
- url: '/task/' + taskId + '/status',
+ url: '/task/admin/' + taskId + '/status',
method: 'put',
data: data
})
}
-// 鏌ヨ浠诲姟缁熻淇℃伅
+// 鏌ヨ浠诲姟缁熻淇℃伅 (鍚庡彴绠$悊绔�)
export function getTaskStatistics() {
return request({
- url: '/task/statistics',
+ url: '/task/admin/statistics',
method: 'get'
})
}
-// 鏌ヨ瓒呮椂浠诲姟鍒楄〃
+// 鏌ヨ瓒呮椂浠诲姟鍒楄〃 (鍚庡彴绠$悊绔�)
export function getOverdueTasks() {
return request({
- url: '/task/overdue',
+ url: '/task/admin/overdue',
method: 'get'
})
}
-// 鏌ヨ鎴戠殑浠诲姟鍒楄〃
+// 鏌ヨ鎴戠殑浠诲姟鍒楄〃 (鍚庡彴绠$悊绔� - 浠呬緵鍙傝��)
export function getMyTasks() {
return request({
- url: '/task/my',
+ url: '/task/app/my',
method: 'get'
})
}
diff --git a/ruoyi-ui/src/views/task/general/detail.vue b/ruoyi-ui/src/views/task/general/detail.vue
index b1b7527..0450def 100644
--- a/ruoyi-ui/src/views/task/general/detail.vue
+++ b/ruoyi-ui/src/views/task/general/detail.vue
@@ -32,45 +32,92 @@
<!-- 鎬ユ晳杞繍浠诲姟鎵╁睍淇℃伅 -->
<el-descriptions v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo" title="鎬ユ晳杞繍淇℃伅" :column="2" border style="margin-top: 20px;">
- <el-descriptions-item label="鎮h�呭鍚�">{{ taskDetail.emergencyInfo.patientName }}</el-descriptions-item>
- <el-descriptions-item label="鎮h�呮�у埆">
- <dict-tag :options="dict.type.sys_user_sex" :value="taskDetail.emergencyInfo.patientGender"/>
+ <el-descriptions-item label="鑱旂郴浜�">
+ <span v-if="taskDetail.emergencyInfo.contactPerson">{{ taskDetail.emergencyInfo.contactPerson }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
</el-descriptions-item>
- <el-descriptions-item label="鎮h�呭勾榫�">{{ taskDetail.emergencyInfo.patientAge }}</el-descriptions-item>
- <el-descriptions-item label="鑱旂郴鐢佃瘽">{{ taskDetail.emergencyInfo.contactPhone }}</el-descriptions-item>
- <el-descriptions-item label="鎺ラ�佸尰闄�" :span="2">{{ taskDetail.emergencyInfo.hospitalName }}</el-descriptions-item>
- <el-descriptions-item label="灏辫瘖绉戝" :span="2">
- <dict-tag v-if="taskDetail.emergencyInfo.hospitalDepartment" :options="dict.type.hospital_department" :value="taskDetail.emergencyInfo.hospitalDepartment"/>
+ <el-descriptions-item label="鑱旂郴鐢佃瘽">
+ <span v-if="taskDetail.emergencyInfo.contactPhone">{{ taskDetail.emergencyInfo.contactPhone }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="鎮h�呭鍚�">
+ <span v-if="taskDetail.emergencyInfo.patientName">{{ taskDetail.emergencyInfo.patientName }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="鎮h�呮�у埆">
+ <dict-tag v-if="taskDetail.emergencyInfo.patientGender" :options="dict.type.sys_user_sex" :value="taskDetail.emergencyInfo.patientGender"/>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="韬唤淇℃伅" :span="2">
+ <span v-if="taskDetail.emergencyInfo.patientIdCard">{{ taskDetail.emergencyInfo.patientIdCard }}</span>
<span v-else style="color: #C0C4CC;">--</span>
</el-descriptions-item>
<el-descriptions-item label="鐥呮儏鎻忚堪" :span="2">
<span v-if="taskDetail.emergencyInfo.illnessDescription">{{ taskDetail.emergencyInfo.illnessDescription }}</span>
<span v-else style="color: #C0C4CC;">--</span>
</el-descriptions-item>
- <el-descriptions-item label="鐗规畩闇�姹�" :span="2">
- <span v-if="taskDetail.emergencyInfo.specialRequirements">{{ taskDetail.emergencyInfo.specialRequirements }}</span>
+ </el-descriptions>
+
+ <!-- 鏃х郴缁熷悓姝ヤ俊鎭紙浠呮�ユ晳杞繍浠诲姟鏄剧ず锛� -->
+ <el-descriptions v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo" title="鏃х郴缁熷悓姝ヤ俊鎭�" :column="2" border style="margin-top: 20px;">
+ <el-descriptions-item label="鏈嶅姟鍗曞悓姝ョ姸鎬�">
+ <el-tag v-if="taskDetail.emergencyInfo.syncStatus === 0" type="info" size="small">
+ <i class="el-icon-warning"></i> 鏈悓姝�
+ </el-tag>
+ <el-tag v-else-if="taskDetail.emergencyInfo.syncStatus === 1" type="warning" size="small">
+ <i class="el-icon-loading"></i> 鍚屾涓�
+ </el-tag>
+ <el-tag v-else-if="taskDetail.emergencyInfo.syncStatus === 2" type="success" size="small">
+ <i class="el-icon-success"></i> 鍚屾鎴愬姛
+ </el-tag>
+ <el-tag v-else-if="taskDetail.emergencyInfo.syncStatus === 3" type="danger" size="small">
+ <i class="el-icon-error"></i> 鍚屾澶辫触
+ </el-tag>
<span v-else style="color: #C0C4CC;">--</span>
</el-descriptions-item>
- <el-descriptions-item label="鏄惁闇�瑕佹媴鏋�">
- <el-tag v-if="taskDetail.emergencyInfo.needsStretcher == 1" type="success" size="small">鏄�</el-tag>
- <el-tag v-else type="info" size="small">鍚�</el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="鏄惁闇�瑕佽疆妞�">
- <el-tag v-if="taskDetail.emergencyInfo.needsWheelchair == 1" type="success" size="small">鏄�</el-tag>
- <el-tag v-else type="info" size="small">鍚�</el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="鏄惁闇�瑕佹哀姘�">
- <el-tag v-if="taskDetail.emergencyInfo.needsOxygen == 1" type="success" size="small">鏄�</el-tag>
- <el-tag v-else type="info" size="small">鍚�</el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="绱ф�ョ▼搴�">
- <el-tag v-if="taskDetail.emergencyInfo.urgencyLevel === 'HIGH'" type="danger" size="small">绱ф��</el-tag>
- <el-tag v-else-if="taskDetail.emergencyInfo.urgencyLevel === 'MEDIUM'" type="warning" size="small">涓�鑸�</el-tag>
- <el-tag v-else-if="taskDetail.emergencyInfo.urgencyLevel === 'LOW'" type="info" size="small">涓嶆��</el-tag>
+ <el-descriptions-item label="鏈嶅姟鍗曞彿">
+ <span v-if="taskDetail.emergencyInfo.legacyServiceOrdId">
+ <el-tag type="primary" size="small">{{ taskDetail.emergencyInfo.legacyServiceOrdId }}</el-tag>
+ </span>
<span v-else style="color: #C0C4CC;">--</span>
</el-descriptions-item>
- <el-descriptions-item label="闄悓浜烘暟">{{ taskDetail.emergencyInfo.companionCount || 0 }} 浜�</el-descriptions-item>
- <el-descriptions-item label="棰勪及璐圭敤">{{ taskDetail.emergencyInfo.estimatedCost || '--' }} 鍏�</el-descriptions-item>
+ <el-descriptions-item label="鏈嶅姟鍗曞悓姝ユ椂闂�">
+ <span v-if="taskDetail.emergencyInfo.syncTime">{{ parseTime(taskDetail.emergencyInfo.syncTime) }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="鏈嶅姟鍗曞悓姝ラ敊璇�" :span="1">
+ <span v-if="taskDetail.emergencyInfo.syncErrorMsg" style="color: #F56C6C;">{{ taskDetail.emergencyInfo.syncErrorMsg }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="璋冨害鍗曞悓姝ョ姸鎬�">
+ <el-tag v-if="taskDetail.emergencyInfo.dispatchSyncStatus === 0" type="info" size="small">
+ <i class="el-icon-warning"></i> 鏈悓姝�
+ </el-tag>
+ <el-tag v-else-if="taskDetail.emergencyInfo.dispatchSyncStatus === 1" type="warning" size="small">
+ <i class="el-icon-loading"></i> 鍚屾涓�
+ </el-tag>
+ <el-tag v-else-if="taskDetail.emergencyInfo.dispatchSyncStatus === 2" type="success" size="small">
+ <i class="el-icon-success"></i> 鍚屾鎴愬姛
+ </el-tag>
+ <el-tag v-else-if="taskDetail.emergencyInfo.dispatchSyncStatus === 3" type="danger" size="small">
+ <i class="el-icon-error"></i> 鍚屾澶辫触
+ </el-tag>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="璋冨害鍗曞彿">
+ <span v-if="taskDetail.emergencyInfo.legacyDispatchOrdId">
+ <el-tag type="primary" size="small">{{ taskDetail.emergencyInfo.legacyDispatchOrdId }}</el-tag>
+ </span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="璋冨害鍗曞悓姝ユ椂闂�">
+ <span v-if="taskDetail.emergencyInfo.dispatchSyncTime">{{ parseTime(taskDetail.emergencyInfo.dispatchSyncTime) }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="璋冨害鍗曞悓姝ラ敊璇�" :span="1">
+ <span v-if="taskDetail.emergencyInfo.dispatchSyncErrorMsg" style="color: #F56C6C;">{{ taskDetail.emergencyInfo.dispatchSyncErrorMsg }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </el-descriptions-item>
</el-descriptions>
<!-- 绂忕杞︿换鍔℃墿灞曚俊鎭� -->
diff --git a/ruoyi-ui/src/views/task/general/index.vue b/ruoyi-ui/src/views/task/general/index.vue
index 8988020..44fcef9 100644
--- a/ruoyi-ui/src/views/task/general/index.vue
+++ b/ruoyi-ui/src/views/task/general/index.vue
@@ -94,12 +94,13 @@
<el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
- <el-table-column label="浠诲姟缂栧彿" align="center" prop="taskCode">
+ <el-table-column label="浠诲姟缂栧彿" align="center" prop="taskCode" min-width="180">
<template slot-scope="scope">
<el-button
type="text"
@click="handleView(scope.row)"
v-hasPermi="['task:general:query']"
+ style="font-family: 'Courier New', monospace; font-size: 13px;"
>{{ scope.row.taskCode }}</el-button>
</template>
</el-table-column>
@@ -108,6 +109,24 @@
<dict-tag :options="dict.type.sys_task_type" :value="scope.row.taskType"/>
<el-tag v-if="scope.row.taskType === 'EMERGENCY_TRANSFER'" type="danger" size="mini" style="margin-left: 5px;">
<i class="el-icon-warning"></i>
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚屾鐘舵��" align="center" prop="syncStatus" width="120" v-if="hasEmergencyTask">
+ <template slot-scope="scope">
+ <span v-if="scope.row.taskType !== 'EMERGENCY_TRANSFER'" style="color: #C0C4CC;">--</span>
+ <el-tag v-else-if="!scope.row.emergencyInfo" type="info" size="mini">--</el-tag>
+ <el-tag v-else-if="scope.row.emergencyInfo.syncStatus === 0" type="info" size="mini">
+ <i class="el-icon-warning"></i> 鏈悓姝�
+ </el-tag>
+ <el-tag v-else-if="scope.row.emergencyInfo.syncStatus === 1" type="warning" size="mini">
+ <i class="el-icon-loading"></i> 鍚屾涓�
+ </el-tag>
+ <el-tag v-else-if="scope.row.emergencyInfo.syncStatus === 2" type="success" size="mini">
+ <i class="el-icon-success"></i> 宸插悓姝�
+ </el-tag>
+ <el-tag v-else-if="scope.row.emergencyInfo.syncStatus === 3" type="danger" size="mini">
+ <i class="el-icon-error"></i> 鍚屾澶辫触
</el-tag>
</template>
</el-table-column>
@@ -126,14 +145,11 @@
</el-table-column>
<el-table-column label="璁″垝寮�濮嬫椂闂�" align="center" prop="plannedStartTime" width="180">
<template slot-scope="scope">
- <span>{{ parseTime(scope.row.plannedStartTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+ <span v-if="scope.row.plannedStartTime">{{ parseTime(scope.row.plannedStartTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
</template>
</el-table-column>
- <el-table-column label="璁″垝缁撴潫鏃堕棿" align="center" prop="plannedEndTime" width="180">
- <template slot-scope="scope">
- <span>{{ parseTime(scope.row.plannedEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
- </template>
- </el-table-column>
+
<el-table-column label="鍒涘缓浜�" align="center" prop="creatorName" />
<el-table-column label="鎵ц浜�" align="center" prop="assigneeName" />
<el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
@@ -400,6 +416,8 @@
total: 0,
// 浠诲姟绠$悊琛ㄦ牸鏁版嵁
taskList: [],
+ // 鏄惁鏈夋�ユ晳杞繍浠诲姟锛堢敤浜庢帶鍒跺悓姝ョ姸鎬佸垪鏄剧ず锛�
+ hasEmergencyTask: false,
// 寮瑰嚭灞傛爣棰�
title: "",
// 鏄惁鏄剧ず寮瑰嚭灞�
@@ -472,6 +490,8 @@
listTask(this.queryParams).then(response => {
this.taskList = response.rows;
this.total = response.total;
+ // 妫�鏌ユ槸鍚︽湁鎬ユ晳杞繍浠诲姟锛岀敤浜庢帶鍒跺悓姝ョ姸鎬佺浉鍏冲垪鐨勬樉绀�
+ this.hasEmergencyTask = this.taskList.some(task => task.taskType === 'EMERGENCY_TRANSFER');
this.loading = false;
});
},
diff --git "a/ruoyi-ui/src/views/task/\346\227\247\347\263\273\347\273\237\345\220\214\346\255\245\347\212\266\346\200\201\346\230\276\347\244\272\345\212\237\350\203\275\350\257\264\346\230\216.md" "b/ruoyi-ui/src/views/task/\346\227\247\347\263\273\347\273\237\345\220\214\346\255\245\347\212\266\346\200\201\346\230\276\347\244\272\345\212\237\350\203\275\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..2eab9dc
--- /dev/null
+++ "b/ruoyi-ui/src/views/task/\346\227\247\347\263\273\347\273\237\345\220\214\346\255\245\347\212\266\346\200\201\346\230\276\347\244\272\345\212\237\350\203\275\350\257\264\346\230\216.md"
@@ -0,0 +1,164 @@
+# 鏃х郴缁熷悓姝ョ姸鎬佹樉绀哄姛鑳借鏄�
+
+## 涓�銆佸姛鑳芥杩�
+
+鍦� ruoyi-ui 椤圭洰鐨勪换鍔″垪琛ㄥ拰浠诲姟璇︽儏椤甸潰涓紝鏂板浜嗘棫绯荤粺鍚屾鐘舵�佸強鐩稿叧鍗曞彿鐨勬樉绀哄姛鑳斤紝鏂逛究绠$悊鍛樺疄鏃舵煡鐪嬫�ユ晳杞繍浠诲姟涓庢棫绯荤粺鐨勫悓姝ユ儏鍐点��
+
+## 浜屻�佹秹鍙婃枃浠�
+
+### 1. 浠诲姟鍒楄〃椤甸潰
+**鏂囦欢璺緞**: `ruoyi-ui/src/views/task/general/index.vue`
+
+**淇敼鍐呭**:
+- 鏂板 `hasEmergencyTask` 鏁版嵁灞炴�э紝鐢ㄤ簬鍒ゆ柇鍒楄〃涓槸鍚﹀寘鍚�ユ晳杞繍浠诲姟
+- 鏂板 **鍚屾鐘舵��** 鍒楋紝鏄剧ず鏈嶅姟鍗曞悓姝ョ姸鎬侊紙鏈悓姝ャ�佸悓姝ヤ腑銆佸凡鍚屾銆佸悓姝ュけ璐ワ級
+- 鏂板 **鏈嶅姟鍗曞彿** 鍒楋紝鏄剧ず鏃х郴缁熻繑鍥炵殑 ServiceOrdID
+- 鏂板 **璋冨害鍗曞彿** 鍒楋紝鏄剧ず鏃х郴缁熻繑鍥炵殑 DispatchOrdID
+- 杩欎簺鍒椾粎鍦ㄥ垪琛ㄤ腑瀛樺湪鎬ユ晳杞繍浠诲姟鏃舵樉绀猴紙`v-if="hasEmergencyTask"`锛�
+
+### 2. 浠诲姟璇︽儏椤甸潰
+**鏂囦欢璺緞**: `ruoyi-ui/src/views/task/general/detail.vue`
+
+**淇敼鍐呭**:
+- 鏂板 **鏃х郴缁熷悓姝ヤ俊鎭�** 鎻忚堪鍒楄〃鍖哄煙
+- 鏄剧ず鏈嶅姟鍗曞悓姝ョ姸鎬併�佹湇鍔″崟鍙枫�佸悓姝ユ椂闂淬�佸悓姝ラ敊璇俊鎭�
+- 鏄剧ず璋冨害鍗曞悓姝ョ姸鎬併�佽皟搴﹀崟鍙枫�佸悓姝ユ椂闂淬�佸悓姝ラ敊璇俊鎭�
+- 璇ュ尯鍩熶粎鍦ㄦ�ユ晳杞繍浠诲姟璇︽儏椤垫樉绀�
+
+## 涓夈�佸悓姝ョ姸鎬佽鏄�
+
+### 鍚屾鐘舵�佸�煎強鍚箟
+
+| 鐘舵�佸�� | 鍚箟 | 鍥炬爣棰滆壊 | 鏄剧ず鏂囨湰 |
+|--------|------|----------|----------|
+| 0 | 鏈悓姝� | 鐏拌壊锛坕nfo锛� | <i class="el-icon-warning"></i> 鏈悓姝� |
+| 1 | 鍚屾涓� | 姗欒壊锛坵arning锛� | <i class="el-icon-loading"></i> 鍚屾涓� |
+| 2 | 鍚屾鎴愬姛 | 缁胯壊锛坰uccess锛� | <i class="el-icon-success"></i> 宸插悓姝�/鍚屾鎴愬姛 |
+| 3 | 鍚屾澶辫触 | 绾㈣壊锛坉anger锛� | <i class="el-icon-error"></i> 鍚屾澶辫触 |
+
+### 鏈嶅姟鍗曞悓姝ヤ笌璋冨害鍗曞悓姝�
+
+**鏈嶅姟鍗曞悓姝�** (`syncStatus`):
+- 瀵瑰簲鏃х郴缁� `admin_save_19.gds` 鎺ュ彛
+- 鍚屾鎴愬姛鍚庤繑鍥� `ServiceOrdID`锛屽瓨鍌ㄥ湪 `legacy_service_ord_id` 瀛楁
+- 鐢� `LegacySystemSyncTask.syncPendingTasks()` 瀹氭椂浠诲姟鎵ц
+
+**璋冨害鍗曞悓姝�** (`dispatchSyncStatus`):
+- 瀵瑰簲鏃х郴缁� `admin_save_24.asp` 鎺ュ彛
+- 鍚屾鎴愬姛鍚庤繑鍥� `DispatchOrdID`锛屽瓨鍌ㄥ湪 `legacy_dispatch_ord_id` 瀛楁
+- 鐢� `LegacySystemSyncTask.syncPendingDispatchOrders()` 瀹氭椂浠诲姟鎵ц
+- 渚濊禆鏈嶅姟鍗曞悓姝ュ畬鎴愬悗鎵嶈兘鎵ц
+
+## 鍥涖�佹暟鎹潵婧�
+
+### 鍚庣瀹炰綋绫诲瓧娈�
+
+**SysTask 瀹炰綋** (`sys_task` 琛�):
+- `legacySynced`: 鏃х郴缁熷悓姝ユ爣璁帮紙0-鏈悓姝ワ紝1-宸插悓姝ワ級
+
+**SysTaskEmergency 瀹炰綋** (`sys_task_emergency` 琛�):
+
+鏈嶅姟鍗曠浉鍏�:
+- `legacyServiceOrdId`: 鏃х郴缁熸湇鍔″崟ID
+- `syncStatus`: 鏈嶅姟鍗曞悓姝ョ姸鎬�
+- `syncTime`: 鏈嶅姟鍗曞悓姝ユ椂闂�
+- `syncErrorMsg`: 鏈嶅姟鍗曞悓姝ラ敊璇俊鎭�
+
+璋冨害鍗曠浉鍏�:
+- `legacyDispatchOrdId`: 鏃х郴缁熻皟搴﹀崟ID
+- `dispatchSyncStatus`: 璋冨害鍗曞悓姝ョ姸鎬�
+- `dispatchSyncTime`: 璋冨害鍗曞悓姝ユ椂闂�
+- `dispatchSyncErrorMsg`: 璋冨害鍗曞悓姝ラ敊璇俊鎭�
+
+### 鍓嶇鏁版嵁璁块棶璺緞
+
+鍦ㄤ换鍔″垪琛ㄤ腑:
+```javascript
+// 鍚屾鐘舵��
+scope.row.emergencyInfo.syncStatus
+scope.row.emergencyInfo.dispatchSyncStatus
+
+// 鍗曞彿
+scope.row.emergencyInfo.legacyServiceOrdId
+scope.row.emergencyInfo.legacyDispatchOrdId
+```
+
+鍦ㄤ换鍔¤鎯呬腑:
+```javascript
+// 鏈嶅姟鍗曞悓姝ヤ俊鎭�
+taskDetail.emergencyInfo.syncStatus
+taskDetail.emergencyInfo.legacyServiceOrdId
+taskDetail.emergencyInfo.syncTime
+taskDetail.emergencyInfo.syncErrorMsg
+
+// 璋冨害鍗曞悓姝ヤ俊鎭�
+taskDetail.emergencyInfo.dispatchSyncStatus
+taskDetail.emergencyInfo.legacyDispatchOrdId
+taskDetail.emergencyInfo.dispatchSyncTime
+taskDetail.emergencyInfo.dispatchSyncErrorMsg
+```
+
+## 浜斻�佹樉绀洪�昏緫
+
+### 浠诲姟鍒楄〃鏄剧ず瑙勫垯
+
+1. **鍚屾鐘舵�佸垪銆佹湇鍔″崟鍙峰垪銆佽皟搴﹀崟鍙峰垪**浠呭湪鍒楄〃涓瓨鍦ㄦ�ユ晳杞繍浠诲姟鏃舵樉绀�
+2. 闈炴�ユ晳杞繍浠诲姟鍦ㄨ繖浜涘垪涓樉绀� `--`
+3. 鎬ユ晳杞繍浠诲姟鏍规嵁 `emergencyInfo` 瀛楁鍒ゆ柇:
+ - 濡傛灉 `emergencyInfo` 涓虹┖锛屾樉绀� `--`
+ - 濡傛灉 `emergencyInfo` 瀛樺湪锛屾牴鎹搴斿瓧娈垫樉绀哄叿浣撳唴瀹�
+
+### 浠诲姟璇︽儏鏄剧ず瑙勫垯
+
+1. **鏃х郴缁熷悓姝ヤ俊鎭�**鍖哄煙浠呭湪鎬ユ晳杞繍浠诲姟璇︽儏椤垫樉绀�
+2. 鏉′欢: `taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo`
+3. 鎵�鏈夊瓧娈典负绌烘椂鏄剧ず `--`
+4. 閿欒淇℃伅浠ョ孩鑹叉枃鏈樉绀�
+
+## 鍏�佷娇鐢ㄥ満鏅�
+
+### 1. 绠$悊鍛樼洃鎺у悓姝ョ姸鎬�
+绠$悊鍛樺彲浠ュ湪浠诲姟鍒楄〃涓揩閫熸煡鐪嬪摢浜涙�ユ晳杞繍浠诲姟宸插畬鎴愪笌鏃х郴缁熺殑鍚屾锛屽摢浜涘悓姝ュけ璐ラ渶瑕佸鐞嗐��
+
+### 2. 闂鎺掓煡
+褰撳悓姝ュけ璐ユ椂锛屽彲浠ュ湪浠诲姟璇︽儏椤垫煡鐪嬭缁嗙殑閿欒淇℃伅锛屽府鍔╂妧鏈汉鍛樺畾浣嶉棶棰樸��
+
+### 3. 鏁版嵁杩芥函
+閫氳繃鏈嶅姟鍗曞彿鍜岃皟搴﹀崟鍙凤紝鍙互鍦ㄦ棫绯荤粺涓煡璇㈠搴旂殑鍗曟嵁锛屽疄鐜版柊鏃х郴缁熸暟鎹殑鍙屽悜杩芥函銆�
+
+## 涓冦�佹敞鎰忎簨椤�
+
+1. **鏉冮檺鎺у埗**: 椤甸潰鏄剧ず閬靛惊鍘熸湁鐨勬潈闄愭帶鍒惰鍒�
+2. **鎬ц兘鑰冭檻**: 鍒楄〃鏌ヨ鏃堕渶瑕佸叧鑱� `sys_task_emergency` 琛紝纭繚 Mapper XML 涓凡姝g‘閰嶇疆鍏宠仈鏌ヨ
+3. **闈炴�ユ晳浠诲姟**: 鍏朵粬绫诲瀷浠诲姟锛堝绂忕杞︺�佹櫘閫氫换鍔★級涓嶆樉绀哄悓姝ヤ俊鎭�
+4. **瀹氭椂浠诲姟**: 鍚屾鐘舵�佺敱鍚庡彴瀹氭椂浠诲姟鏇存柊锛屽墠绔彧璐熻矗灞曠ず
+
+## 鍏�佸悗缁紭鍖栧缓璁�
+
+1. **鎵嬪姩閲嶈瘯鍔熻兘**: 鍦ㄨ鎯呴〉娣诲姞"閲嶆柊鍚屾"鎸夐挳锛屽厑璁哥鐞嗗憳鎵嬪姩瑙﹀彂鍚屾
+2. **鍚屾鏃ュ織**: 璁板綍姣忔鍚屾鐨勮缁嗘棩蹇楋紝鏂逛究闂杩芥函
+3. **娑堟伅閫氱煡**: 鍚屾澶辫触鏃堕�氳繃绯荤粺娑堟伅鎴栭偖浠堕�氱煡鐩稿叧浜哄憳
+4. **鎵归噺鍚屾**: 鍦ㄥ垪琛ㄩ〉鎻愪緵鎵归噺閲嶆柊鍚屾鍔熻兘
+
+## 涔濄�佺浉鍏冲畾鏃朵换鍔�
+
+### LegacySystemSyncTask
+
+**Cron 琛ㄨ揪寮�**:
+- 鏈嶅姟鍗曞悓姝�: `0 */10 * * * ?` (姣�10鍒嗛挓鎵ц涓�娆�)
+- 璋冨害鍗曞悓姝�: `0 5,15,25,35,45,55 * * * ?` (姣忓皬鏃剁殑5銆�15銆�25銆�35銆�45銆�55鍒嗘墽琛�)
+
+**閰嶇疆浣嶇疆**: `ruoyi-quartz` 妯″潡
+
+**浠诲姟閫昏緫**:
+1. 鏌ヨ鏈悓姝ユ垨鍚屾澶辫触鐨勬�ユ晳杞繍浠诲姟
+2. 璋冪敤鏃х郴缁� ASP 鎺ュ彛
+3. 鏇存柊鍚屾鐘舵�佸拰鍗曞彿
+4. 璁板綍鍚屾鏃堕棿鍜岄敊璇俊鎭�
+
+---
+
+**鏂囨。鐗堟湰**: v1.0
+**鍒涘缓鏃ユ湡**: 2025-01-XX
+**鏈�鍚庢洿鏂�**: 2025-01-XX
+**缁存姢浜哄憳**: 绯荤粺绠$悊鍛�
diff --git "a/\344\273\273\345\212\241\346\216\245\345\217\243\346\213\206\345\210\206\350\257\264\346\230\216.md" "b/\344\273\273\345\212\241\346\216\245\345\217\243\346\213\206\345\210\206\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..c196379
--- /dev/null
+++ "b/\344\273\273\345\212\241\346\216\245\345\217\243\346\213\206\345\210\206\350\257\264\346\230\216.md"
@@ -0,0 +1,422 @@
+# 浠诲姟鎺ュ彛鎷嗗垎璇存槑鏂囨。
+
+## 涓�銆佷慨鏀硅儗鏅�
+
+鍘熸湁鐨� `/task/list` 绛夋帴鍙e悓鏃惰 APP 绔拰鍚庡彴绠$悊绔娇鐢紝瀵艰嚧浠ヤ笅闂锛�
+1. **鏉冮檺娣蜂贡**锛氬悗鍙扮鐞嗗憳鏃犳硶鏌ョ湅鎵�鏈変换鍔★紝鍙兘鐪嬪埌褰撳墠鐢ㄦ埛鐩稿叧鐨勪换鍔�
+2. **涓氬姟閫昏緫鍐茬獊**锛欰PP 绔渶瑕佽繃婊ょ敤鎴锋暟鎹紝鍚庡彴闇�瑕佹煡鐪嬪叏閮ㄦ暟鎹�
+3. **瀹夊叏闅愭偅**锛欰PP 绔拰绠$悊绔叡鐢ㄦ帴鍙o紝鏉冮檺鎺у埗鍥伴毦
+
+## 浜屻�佽В鍐虫柟妗�
+
+**淇濈暀鍘熸湁 APP 绔帴鍙�**锛屽悓鏃舵柊澧炲悗鍙扮鐞嗙鐙珛鎺ュ彛锛�
+- **APP 绔帴鍙�**锛氫繚鎸佸師鏈夎矾寰� `/task/*`锛屾棤鏉冮檺娉ㄨВ锛岃嚜鍔ㄨ繃婊ゅ綋鍓嶇敤鎴锋暟鎹�
+- **鍚庡彴绠$悊绔帴鍙�**锛氭柊澧炶矾寰勫墠缂� `/task/admin/*`锛屽甫鏉冮檺娉ㄨВ锛岀鐞嗗憳鍙煡鐪嬫墍鏈夋暟鎹�
+
+## 涓夈�佹秹鍙婃枃浠�
+
+### 1. 鍚庣 Controller
+**鏂囦欢璺緞**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java`
+
+### 2. APP 绔� API
+**鏂囦欢璺緞**: `app/api/task.js`
+
+### 3. 鍚庡彴绠$悊绔� API
+**鏂囦欢璺緞**: `ruoyi-ui/src/api/task.js`
+
+## 鍥涖�佹帴鍙e鐓ц〃
+
+### 4.1 浠诲姟鍒楄〃鎺ュ彛
+
+| 鍔熻兘 | APP 绔� | 鍚庡彴绠$悊绔� | 璇存槑 |
+|------|--------|-----------|------|
+| 鏌ヨ浠诲姟鍒楄〃 | `GET /task/list` | `GET /task/admin/list` | APP绔繃婊ゅ綋鍓嶇敤鎴凤紝鍚庡彴鍙煡鐪嬪叏閮� |
+| 鏌ヨ浠诲姟璇︽儏 | `GET /task/{taskId}` | `GET /task/admin/{taskId}` | 鑾峰彇鍗曚釜浠诲姟璇︽儏 |
+| 鏂板浠诲姟 | `POST /task` | `POST /task/admin` | 鍒涘缓鏂颁换鍔� |
+| 淇敼浠诲姟 | `PUT /task` | `PUT /task/admin` | 鏇存柊浠诲姟淇℃伅 |
+| 鍒犻櫎浠诲姟 | `DELETE /task/{taskIds}` | `DELETE /task/admin/{taskIds}` | 鍒犻櫎浠诲姟 |
+
+### 4.2 浠诲姟鎿嶄綔鎺ュ彛
+
+| 鍔熻兘 | APP 绔� | 鍚庡彴绠$悊绔� | 璇存槑 |
+|------|--------|-----------|------|
+| 鍒嗛厤浠诲姟 | `PUT /task/{taskId}/assign` | `PUT /task/admin/{taskId}/assign` | 鍒嗛厤鎵ц浜� |
+| 鏇存柊鐘舵�� | `PUT /task/{taskId}/status` | `PUT /task/admin/{taskId}/status` | APP绔敮鎸丟PS浣嶇疆 |
+| 浠诲姟缁熻 | `GET /task/statistics` | `GET /task/admin/statistics` | 缁熻淇℃伅 |
+| 瓒呮椂浠诲姟 | `GET /task/overdue` | `GET /task/admin/overdue` | 瓒呮椂浠诲姟鍒楄〃 |
+| 鎴戠殑浠诲姟 | `GET /task/my` | - | 浠匒PP绔娇鐢� |
+
+### 4.3 瀵煎嚭鎺ュ彛
+
+| 鍔熻兘 | 鍚庡彴绠$悊绔� | 璇存槑 |
+|------|-----------|------|
+| 瀵煎嚭浠诲姟 | `POST /task/admin/export` | 浠呭悗鍙扮鐞嗙鏀寔 |
+| 瀵煎嚭浠诲姟锛堝吋瀹癸級 | `POST /task/export` | 鍏煎鏃ф帴鍙� |
+
+## 浜斻�佹牳蹇冨樊寮傝鏄�
+
+### 5.1 鍚庡彴绠$悊绔帴鍙g壒鐐�
+
+```java
+/**
+ * 鏌ヨ浠诲姟绠$悊鍒楄〃锛堝悗鍙扮鐞嗙锛�
+ * 绠$悊鍛樻潈闄愶紝鍙互鏌ョ湅鎵�鏈変换鍔�
+ */
+@PreAuthorize("@ss.hasPermi('task:task:list')")
+@GetMapping("/admin/list")
+public TableDataInfo adminList(TaskQueryVO queryVO) {
+ startPage();
+ List<SysTask> list = sysTaskService.selectSysTaskList(queryVO);
+ return getDataTable(list);
+}
+```
+
+**鐗圭偣**锛�
+- 鉁� 甯� `@PreAuthorize` 鏉冮檺娉ㄨВ
+- 鉁� 鐩存帴浣跨敤鍓嶇浼犻�掔殑鏌ヨ鏉′欢
+- 鉁� 绠$悊鍛樺彲浠ユ煡鐪嬫墍鏈変换鍔�
+- 鉁� 鏀寔鎸夐儴闂ㄣ�佸垱寤轰汉銆佹墽琛屼汉绛夋潯浠惰繃婊�
+
+### 5.2 APP 绔帴鍙g壒鐐�
+
+```java
+/**
+ * 鏌ヨ浠诲姟鍒楄〃锛圓PP绔級
+ * 浠呮樉绀哄綋鍓嶇敤鎴风浉鍏崇殑浠诲姟锛�
+ * 1. 褰撳墠鐢ㄦ埛鎵�鍦ㄦ満鏋勭殑浠诲姟
+ * 2. 褰撳墠鐢ㄦ埛鍒涘缓鐨勪换鍔�
+ * 3. 鍒嗛厤缁欏綋鍓嶇敤鎴风殑浠诲姟
+ */
+@GetMapping("/app/list")
+public TableDataInfo appList(TaskQueryVO queryVO) {
+ // 鍦ㄥ悗绔嚜鍔ㄨ幏鍙栧綋鍓嶇敤鎴蜂俊鎭紝瀹炵幇缁煎悎鏌ヨ
+ Long currentUserId = getUserId();
+ Long currentDeptId = getDeptId();
+
+ // APP绔己鍒朵娇鐢ㄥ綋鍓嶇櫥褰曠敤鎴蜂俊鎭繘琛岃繃婊�
+ queryVO.setDeptId(currentDeptId);
+ queryVO.setCreatorId(currentUserId);
+ queryVO.setAssigneeId(currentUserId);
+
+ startPage();
+ List<SysTask> list = sysTaskService.selectSysTaskList(queryVO);
+ return getDataTable(list);
+}
+```
+
+**鐗圭偣**锛�
+- 鉁� 鏃犳潈闄愭敞瑙o紙宸插湪 `permission.js` 涓厤缃櫧鍚嶅崟锛�
+- 鉁� 寮哄埗浣跨敤褰撳墠鐧诲綍鐢ㄦ埛淇℃伅杩囨护
+- 鉁� 鑷姩闄愬埗鏁版嵁鑼冨洿锛屼繚璇佹暟鎹畨鍏�
+- 鉁� 鐢ㄦ埛鍙兘鐪嬪埌鑷繁鐩稿叧鐨勪换鍔�
+
+### 5.3 鐘舵�佹洿鏂版帴鍙e樊寮�
+
+**APP 绔�**锛氭敮鎸� GPS 浣嶇疆淇℃伅涓婃姤
+```java
+@PutMapping("/app/{taskId}/status")
+public AjaxResult appChangeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
+ // ... 鐪佺暐鐘舵�佹牎楠�
+
+ // 濡傛灉鍖呭惈GPS浣嶇疆淇℃伅锛屼娇鐢ㄥ甫浣嶇疆鐨勬柟娉�
+ if (request.getLatitude() != null && request.getLongitude() != null) {
+ SysTaskLog locationLog = new SysTaskLog();
+ locationLog.setLatitude(request.getLatitude());
+ locationLog.setLongitude(request.getLongitude());
+ // ... 璁剧疆鍏朵粬浣嶇疆淇℃伅
+ return toAjax(sysTaskService.changeTaskStatusWithLocation(taskId, newStatus, request.getRemark(), locationLog));
+ }
+
+ return toAjax(sysTaskService.changeTaskStatus(taskId, newStatus, request.getRemark()));
+}
+```
+
+**鍚庡彴绠$悊绔�**锛氫粎鏀寔鍩烘湰鐘舵�佸彉鏇�
+```java
+@PreAuthorize("@ss.hasPermi('task:task:edit')")
+@PutMapping("/admin/{taskId}/status")
+public AjaxResult adminChangeTaskStatus(@PathVariable Long taskId, @RequestBody ChangeStatusRequest request) {
+ TaskStatus newStatus = TaskStatus.getByCode(request.getTaskStatus());
+ if (newStatus == null) {
+ return error("鏃犳晥鐨勪换鍔$姸鎬�");
+ }
+ return toAjax(sysTaskService.changeTaskStatus(taskId, newStatus, request.getRemark()));
+}
+```
+
+## 鍏�佸墠绔皟鐢ㄧず渚�
+
+### 6.1 APP 绔皟鐢�
+
+```javascript
+// app/api/task.js
+import request from '@/utils/request'
+
+// 鏌ヨ浠诲姟鍒楄〃锛圓PP绔級
+export function listTask(query) {
+ return request({
+ url: '/task/app/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 鏇存柊浠诲姟鐘舵�侊紙APP绔紝鏀寔GPS锛�
+export function changeTaskStatus(taskId, data) {
+ return request({
+ url: '/task/app/' + taskId + '/status',
+ method: 'put',
+ data: data // 鍙寘鍚� latitude, longitude 绛塆PS淇℃伅
+ })
+}
+```
+
+**浣跨敤绀轰緥**锛�
+```javascript
+// 鍦� APP 椤甸潰涓皟鐢�
+import { listTask, changeTaskStatus } from '@/api/task'
+
+// 鏌ヨ浠诲姟鍒楄〃
+listTask({ taskStatus: 'PENDING' }).then(response => {
+ // 鑷姩鍙繑鍥炲綋鍓嶇敤鎴风浉鍏崇殑浠诲姟
+ this.taskList = response.rows
+})
+
+// 鏇存柊浠诲姟鐘舵�佸苟涓婃姤GPS浣嶇疆
+changeTaskStatus(taskId, {
+ taskStatus: 'IN_PROGRESS',
+ remark: '宸插埌杈剧幇鍦�',
+ latitude: 23.1291,
+ longitude: 113.2644,
+ locationAddress: '骞垮窞甯傚ぉ娌冲尯'
+}).then(response => {
+ this.$modal.msgSuccess('鐘舵�佹洿鏂版垚鍔�')
+})
+```
+
+### 6.2 鍚庡彴绠$悊绔皟鐢�
+
+```javascript
+// ruoyi-ui/src/api/task.js
+import request from '@/utils/request'
+
+// 鏌ヨ浠诲姟鍒楄〃锛堝悗鍙扮鐞嗙锛�
+export function listTask(query) {
+ return request({
+ url: '/task/admin/list',
+ method: 'get',
+ params: query
+ })
+}
+
+// 鏇存柊浠诲姟鐘舵�侊紙鍚庡彴绠$悊绔級
+export function changeTaskStatus(taskId, data) {
+ return request({
+ url: '/task/admin/' + taskId + '/status',
+ method: 'put',
+ data: data
+ })
+}
+```
+
+**浣跨敤绀轰緥**锛�
+```javascript
+// 鍦ㄥ悗鍙扮鐞嗛〉闈腑璋冪敤
+import { listTask, changeTaskStatus } from '@/api/task'
+
+// 鏌ヨ浠诲姟鍒楄〃锛堢鐞嗗憳鍙煡鐪嬫墍鏈変换鍔★級
+listTask({
+ deptId: 101, // 鍙寚瀹氶儴闂�
+ taskStatus: 'PENDING'
+}).then(response => {
+ // 杩斿洖鎵�鏈夌鍚堟潯浠剁殑浠诲姟
+ this.taskList = response.rows
+})
+
+// 鏇存柊浠诲姟鐘舵��
+changeTaskStatus(taskId, {
+ taskStatus: 'COMPLETED',
+ remark: '浠诲姟宸插畬鎴�'
+}).then(response => {
+ this.$modal.msgSuccess('鐘舵�佹洿鏂版垚鍔�')
+})
+```
+
+## 涓冦�佹潈闄愰厤缃�
+
+### 7.1 鍚庡彴绠$悊绔潈闄�
+
+鍦� `ruoyi-ui/src/views/task/general/index.vue` 涓渶瑕侀厤缃潈闄愶細
+
+```javascript
+// 闇�瑕佺殑鏉冮檺鏍囪瘑
+const permissions = [
+ 'task:task:list', // 鏌ヨ浠诲姟鍒楄〃
+ 'task:task:query', // 鏌ヨ浠诲姟璇︽儏
+ 'task:task:add', // 鏂板浠诲姟
+ 'task:task:edit', // 淇敼浠诲姟
+ 'task:task:remove', // 鍒犻櫎浠诲姟
+ 'task:task:export' // 瀵煎嚭浠诲姟
+]
+```
+
+### 7.2 APP 绔潈闄愰厤缃�
+
+鍦� `app/permission.js` 涓厤缃櫧鍚嶅崟锛堟棤闇�鏉冮檺楠岃瘉锛夛細
+
+```javascript
+const whiteList = [
+ '/task/app/list',
+ '/task/app/my',
+ '/task/app/overdue',
+ '/task/app/statistics',
+ // ... 鍏朵粬APP绔帴鍙�
+]
+```
+
+## 鍏�佹暟鎹畨鍏ㄤ繚闅�
+
+### 8.1 APP 绔暟鎹殧绂�
+
+**瀹炵幇鏂瑰紡**锛�
+1. 鍚庣寮哄埗浣跨敤褰撳墠鐧诲綍鐢ㄦ埛鐨� `userId` 鍜� `deptId`
+2. 鍓嶇浼犻�掔殑杩囨护鏉′欢浼氳鍚庣瑕嗙洊
+3. SQL 鏌ヨ鏃朵娇鐢� OR 鏉′欢缁勫悎锛�
+ - `dept_id = currentDeptId`锛堝悓鏈烘瀯锛�
+ - `creator_id = currentUserId`锛堣嚜宸卞垱寤猴級
+ - `assignee_id = currentUserId`锛堝垎閰嶇粰鑷繁锛�
+
+**SQL 绀轰緥**锛�
+```xml
+<select id="selectSysTaskList" resultMap="SysTaskResult">
+ SELECT ... FROM sys_task t
+ WHERE 1=1
+ <if test="deptId != null">
+ AND (
+ t.dept_id = #{deptId}
+ OR t.creator_id = #{creatorId}
+ OR t.assignee_id = #{assigneeId}
+ )
+ </if>
+ <!-- 鍏朵粬鏉′欢 -->
+</select>
+```
+
+### 8.2 鍚庡彴绠$悊绔潈闄愭帶鍒�
+
+**瀹炵幇鏂瑰紡**锛�
+1. 浣跨敤 `@PreAuthorize` 娉ㄨВ杩涜鏉冮檺鏍¢獙
+2. 绠$悊鍛樺彲浠ヨ嚜鐢辨寚瀹氭煡璇㈡潯浠�
+3. 鏀寔璺ㄩ儴闂ㄣ�佽法鐢ㄦ埛鏌ヨ
+4. 閫氳繃瑙掕壊鏉冮檺鎺у埗璁块棶鑼冨洿
+
+## 涔濄�佽縼绉绘寚鍗�
+
+### 9.1 鐜版湁 APP 绔唬鐮佹棤闇�淇敼
+
+鐢变簬鍓嶇 API 鏂囦欢宸茬粡鏇存柊锛岀幇鏈夌殑 APP 椤甸潰浠g爜鏃犻渶淇敼锛�
+
+```javascript
+// 鍘熸湁浠g爜淇濇寔涓嶅彉
+import { listTask } from '@/api/task'
+
+listTask(query).then(response => {
+ // 鑷姩浣跨敤鏂扮殑 /task/app/list 鎺ュ彛
+})
+```
+
+### 9.2 鍚庡彴绠$悊绔唬鐮佹棤闇�淇敼
+
+鍚庡彴绠$悊椤甸潰浠g爜涔熸棤闇�淇敼锛�
+
+```javascript
+// 鍘熸湁浠g爜淇濇寔涓嶅彉
+import { listTask } from '@/api/task'
+
+listTask(query).then(response => {
+ // 鑷姩浣跨敤鏂扮殑 /task/admin/list 鎺ュ彛
+})
+```
+
+### 9.3 娴嬭瘯楠岃瘉
+
+**APP 绔祴璇�**锛�
+1. 鐧诲綍 APP锛屾煡鐪嬩换鍔″垪琛�
+2. 纭鍙兘鐪嬪埌鑷繁鐩稿叧鐨勪换鍔�
+3. 灏濊瘯鏇存柊浠诲姟鐘舵�侊紝楠岃瘉 GPS 浣嶇疆涓婃姤
+
+**鍚庡彴绠$悊绔祴璇�**锛�
+1. 鐧诲綍鍚庡彴绠$悊绯荤粺
+2. 浠ョ鐞嗗憳韬唤鏌ョ湅浠诲姟鍒楄〃
+3. 纭鍙互鐪嬪埌鎵�鏈変换鍔�
+4. 楠岃瘉鏉冮檺鎺у埗鏄惁鐢熸晥
+
+## 鍗併�佹敞鎰忎簨椤�
+
+### 10.1 鎺ュ彛鍏煎鎬�
+
+- 鉂� **涓嶅啀鏀寔** `/task/list` 绛夋棫鎺ュ彛璺緞
+- 鉁� 蹇呴』浣跨敤 `/task/app/` 鎴� `/task/admin/` 鍓嶇紑
+- 鉁� 鍓嶇 API 鏂囦欢宸叉洿鏂帮紝鏃犻渶鎵嬪姩淇敼椤甸潰浠g爜
+
+### 10.2 鏉冮檺閰嶇疆
+
+- 鉁� APP 绔帴鍙e凡閰嶇疆鐧藉悕鍗曪紝鏃犻渶鏉冮檺楠岃瘉
+- 鉁� 鍚庡彴绠$悊绔帴鍙i渶瑕佸搴旂殑鏉冮檺鏍囪瘑
+- 鈿狅笍 纭繚瑙掕壊鍒嗛厤浜嗘纭殑鏉冮檺
+
+### 10.3 鏁版嵁杩囨护
+
+- 鉁� APP 绔己鍒惰繃婊ゅ綋鍓嶇敤鎴锋暟鎹紝鍓嶇鏃犳硶缁曡繃
+- 鉁� 鍚庡彴绠$悊绔牴鎹潈闄愭煡鐪嬪搴旇寖鍥寸殑鏁版嵁
+- 鈿狅笍 涓嶈鍦� APP 绔娇鐢ㄥ悗鍙扮鐞嗙鎺ュ彛
+
+### 10.4 GPS 浣嶇疆淇℃伅
+
+- 鉁� 浠� APP 绔姸鎬佹洿鏂版帴鍙f敮鎸� GPS 浣嶇疆涓婃姤
+- 鉁� 鍚庡彴绠$悊绔姸鎬佹洿鏂颁笉闇�瑕佷綅缃俊鎭�
+- 鈿狅笍 GPS 瀛楁涓哄彲閫夛紝鏃犱綅缃椂涓嶅奖鍝嶇姸鎬佹洿鏂�
+
+## 鍗佷竴銆佸父瑙侀棶棰�
+
+### Q1: APP 绔兘鍚︽煡鐪嬪叾浠栭儴闂ㄧ殑浠诲姟锛�
+
+**绛�**锛氫笉鑳姐�侫PP 绔帴鍙e己鍒朵娇鐢ㄥ綋鍓嶇櫥褰曠敤鎴风殑閮ㄩ棬ID杩涜杩囨护锛屽嵆浣垮墠绔紶閫掑叾浠栭儴闂↖D锛屼篃浼氳鍚庣瑕嗙洊銆�
+
+### Q2: 鍚庡彴绠$悊鍛樺浣曟煡鐪嬫墍鏈変换鍔★紵
+
+**绛�**锛氫娇鐢ㄥ悗鍙扮鐞嗙鎺ュ彛 `/task/admin/list`锛屼笉浼犻�掍换浣曡繃婊ゆ潯浠跺嵆鍙煡鐪嬫墍鏈変换鍔°�傞渶瑕佺‘淇濈敤鎴锋嫢鏈� `task:task:list` 鏉冮檺銆�
+
+### Q3: 濡備綍鍖哄垎 APP 绔拰鍚庡彴绠$悊绔殑璋冪敤锛�
+
+**绛�**锛氶�氳繃鎺ュ彛璺緞鍓嶇紑鍖哄垎锛�
+- APP 绔細`/task/app/*`
+- 鍚庡彴绠$悊绔細`/task/admin/*`
+
+### Q4: 鏃х郴缁熺殑鎺ュ彛璋冪敤鏄惁鍙楀奖鍝嶏紵
+
+**绛�**锛氫笉鍙楀奖鍝嶃�傛棫绯荤粺鍚屾绛夊姛鑳戒娇鐢ㄧ殑鏄嫭绔嬬殑鎺ュ彛锛屼笌浠诲姟绠$悊鎺ュ彛鏃犲叧銆�
+
+### Q5: 濡備綍娣诲姞鏂扮殑浠诲姟鐩稿叧鎺ュ彛锛�
+
+**绛�**锛氶伒寰互涓嬭鍒欙細
+1. APP 绔帴鍙o細璺緞浣跨敤 `/task/app/*`锛屾棤鏉冮檺娉ㄨВ锛屽己鍒惰繃婊ゅ綋鍓嶇敤鎴�
+2. 鍚庡彴绠$悊绔帴鍙o細璺緞浣跨敤 `/task/admin/*`锛屾坊鍔犳潈闄愭敞瑙o紝鏀寔鍏ㄥ眬鏌ヨ
+
+## 鍗佷簩銆佹�荤粨
+
+閫氳繃鏈鎺ュ彛鎷嗗垎锛屽疄鐜颁簡锛�
+
+1. 鉁� **涓氬姟鍒嗙**锛欰PP 绔拰鍚庡彴绠$悊绔娇鐢ㄧ嫭绔嬫帴鍙�
+2. 鉁� **鏉冮檺娓呮櫚**锛氬悗鍙扮鐞嗙缁熶竴浣跨敤鏉冮檺娉ㄨВ
+3. 鉁� **鏁版嵁瀹夊叏**锛欰PP 绔己鍒惰繃婊ゅ綋鍓嶇敤鎴锋暟鎹�
+4. 鉁� **鍔熻兘鎵╁睍**锛欰PP 绔敮鎸� GPS 浣嶇疆涓婃姤
+5. 鉁� **浠g爜缁存姢**锛氭帴鍙h亴璐e崟涓�锛屾槗浜庣淮鎶�
+6. 鉁� **鍚戜笅鍏煎**锛氬墠绔唬鐮佹棤闇�淇敼锛岃嚜鍔ㄤ娇鐢ㄦ柊鎺ュ彛
+
+---
+
+**鏂囨。鐗堟湰**: v1.0
+**鍒涘缓鏃ユ湡**: 2025-01-XX
+**鏈�鍚庢洿鏂�**: 2025-01-XX
+**缁存姢浜哄憳**: 绯荤粺绠$悊鍛�
--
Gitblit v1.9.1