From 09e6dc3fb7266620fafb5e341808a8eb36e080a1 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期六, 13 十二月 2025 22:51:52 +0800
Subject: [PATCH] feat:增加企业微信消息提醒
---
ruoyi-ui/src/views/task/general/detail.vue | 611 +++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 548 insertions(+), 63 deletions(-)
diff --git a/ruoyi-ui/src/views/task/general/detail.vue b/ruoyi-ui/src/views/task/general/detail.vue
index b1b7527..036d380 100644
--- a/ruoyi-ui/src/views/task/general/detail.vue
+++ b/ruoyi-ui/src/views/task/general/detail.vue
@@ -8,7 +8,7 @@
<!-- 鍩烘湰淇℃伅 -->
<el-descriptions title="鍩烘湰淇℃伅" :column="2" border>
- <el-descriptions-item label="浠诲姟缂栧彿">{{ taskDetail.taskCode }}</el-descriptions-item>
+ <el-descriptions-item label="浠诲姟缂栧彿">{{ taskDetail.showTaskCode }}</el-descriptions-item>
<el-descriptions-item label="浠诲姟绫诲瀷">
<dict-tag :options="dict.type.sys_task_type" :value="taskDetail.taskType"/>
</el-descriptions-item>
@@ -32,46 +32,265 @@
<!-- 鎬ユ晳杞繍浠诲姟鎵╁睍淇℃伅 -->
<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.patientContact">{{ taskDetail.emergencyInfo.patientContact }}</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.patientPhone">{{ taskDetail.emergencyInfo.patientPhone }}</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-if="taskDetail.emergencyInfo.patientCondition">{{ taskDetail.emergencyInfo.patientCondition }}</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>
- <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>
- <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>
+
+ <!-- 鏃х郴缁熷悓姝ヤ俊鎭紙浠呮�ユ晳杞繍浠诲姟鏄剧ず锛� -->
+ <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="鏈嶅姟鍗曞彿">
+ <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="鏈嶅姟鍗曠紪鐮�">
+ <span v-if="taskDetail.emergencyInfo.serviceCode">
+ <el-tag type="success" size="small">{{ taskDetail.emergencyInfo.serviceCode }}</el-tag>
+ </span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </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.dispatchCode">
+ <el-tag type="success" size="small">{{ taskDetail.emergencyInfo.dispatchCode }}</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>
+
+ <!-- 鏀粯淇℃伅锛堜粎鎬ユ晳杞繍浠诲姟鏄剧ず锛� -->
+ <el-card v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && paymentInfo" class="box-card" style="margin-top: 20px;">
+ <div slot="header" class="clearfix">
+ <span>鏀粯淇℃伅</span>
+ </div>
+
+ <!-- 鏀粯姒傝 -->
+ <el-descriptions :column="3" border>
+ <el-descriptions-item label="鍩烘湰浠锋牸">
+ <span style="color: #409EFF; font-weight: bold;">楼{{ paymentInfo.transferPrice || '0.00' }}</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="闄勫姞璐圭敤鎬婚">
+ <span style="color: #E6A23C; font-weight: bold;">楼{{ paymentInfo.additionalAmount || '0.00' }}</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="鎬婚噾棰�">
+ <span style="color: #67C23A; font-weight: bold;">楼{{ paymentInfo.totalAmount || '0.00' }}</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="宸叉敮浠橀噾棰�">
+ <span style="color: #67C23A; font-weight: bold;">楼{{ paymentInfo.paidAmount || '0.00' }}</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="鍓╀綑鏈粯閲戦">
+ <span style="color: #F56C6C; font-weight: bold;">楼{{ getRemainingAmount() }}</span>
+ </el-descriptions-item>
+ <el-descriptions-item label="鏀粯鐘舵��">
+ <el-tag v-if="getRemainingAmount() <= 0" type="success" size="small">
+ <i class="el-icon-success"></i> 宸茬粨娓�
+ </el-tag>
+ <el-tag v-else-if="paymentInfo.paidAmount > 0" type="warning" size="small">
+ <i class="el-icon-warning"></i> 閮ㄥ垎鏀粯
+ </el-tag>
+ <el-tag v-else type="info" size="small">
+ <i class="el-icon-warning"></i> 鏈敮浠�
+ </el-tag>
+ </el-descriptions-item>
+ </el-descriptions>
+
+ <!-- 闄勫姞璐圭敤鏄庣粏 -->
+ <div style="margin-top: 20px;">
+ <h4 style="margin-bottom: 10px;">闄勫姞璐圭敤鏄庣粏</h4>
+ <el-table :data="paymentInfo.additionalFees" border>
+ <el-table-column label="璐圭敤绫诲瀷" align="center" prop="feeType" width="120">
+ <template slot-scope="scope">
+ <dict-tag :options="dict.type.task_additional_fee_type" :value="scope.row.feeType"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="璐圭敤鍚嶇О" align="center" prop="feeName" />
+ <el-table-column label="鍗曚环" align="center" prop="unitAmount" width="120">
+ <template slot-scope="scope">
+ <span>楼{{ scope.row.unitAmount }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏁伴噺" align="center" prop="quantity" width="80" />
+ <el-table-column label="灏忚" align="center" prop="totalAmount" width="120">
+ <template slot-scope="scope">
+ <span style="color: #E6A23C; font-weight: bold;">楼{{ scope.row.totalAmount }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚屾鐘舵��" align="center" width="120">
+ <template slot-scope="scope">
+ <el-tag v-if="scope.row.syncStatus === 0" type="info" size="small">
+ <i class="el-icon-warning"></i> 鏈悓姝�
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 1" type="warning" size="small">
+ <i class="el-icon-loading"></i> 鍚屾涓�
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 2" type="success" size="small">
+ <i class="el-icon-success"></i> 鍚屾鎴愬姛
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 3" type="danger" size="small">
+ <i class="el-icon-error"></i> 鍚屾澶辫触
+ </el-tag>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="澶囨敞" align="center" prop="remark" show-overflow-tooltip>
+ <template slot-scope="scope">
+ <span v-if="scope.row.remark">{{ scope.row.remark }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 绌虹姸鎬佹彁绀� -->
+ <div v-if="!paymentInfo.additionalFees || paymentInfo.additionalFees.length === 0" style="text-align: center; padding: 40px 0; color: #909399;">
+ <i class="el-icon-document" style="font-size: 48px; display: block; margin-bottom: 12px;"></i>
+ <span>鏆傛棤闄勫姞璐圭敤</span>
+ </div>
+ </div>
+
+ <!-- 宸叉敮浠樿褰� -->
+ <div style="margin-top: 20px;">
+ <h4 style="margin-bottom: 10px;">宸叉敮浠樿褰�</h4>
+ <el-table :data="paymentInfo.paidPayments" border>
+ <el-table-column label="鍟嗘埛璁㈠崟鍙�" align="center" prop="outTradeNo" width="200" show-overflow-tooltip />
+ <el-table-column label="鏀粯閲戦" align="center" prop="settlementAmount" width="120">
+ <template slot-scope="scope">
+ <span style="color: #67C23A; font-weight: bold;">楼{{ scope.row.settlementAmount }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏀粯鏂瑰紡" align="center" prop="paymentMethod" width="120">
+ <template slot-scope="scope">
+ <dict-tag :options="dict.type.task_payment_method" :value="scope.row.paymentMethod"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏀粯鐘舵��" align="center" prop="payStatus" width="120">
+ <template slot-scope="scope">
+ <el-tag v-if="scope.row.payStatus === 'PAID'" type="success" size="small">
+ <i class="el-icon-success"></i> 宸叉敮浠�
+ </el-tag>
+ <el-tag v-else-if="scope.row.payStatus === 'PENDING'" type="warning" size="small">
+ <i class="el-icon-time"></i> 寰呮敮浠�
+ </el-tag>
+ <el-tag v-else-if="scope.row.payStatus === 'FAILED'" type="danger" size="small">
+ <i class="el-icon-error"></i> 澶辫触
+ </el-tag>
+ <el-tag v-else type="info" size="small">
+ {{ scope.row.payStatus }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="浜ゆ槗鍙�" align="center" prop="tradeNo" width="150" show-overflow-tooltip />
+ <el-table-column label="鏀粯鏃堕棿" align="center" prop="payTime" width="180">
+ <template slot-scope="scope">
+ <span v-if="scope.row.payTime">{{ parseTime(scope.row.payTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚屾鐘舵��" align="center" width="120">
+ <template slot-scope="scope">
+ <el-tag v-if="scope.row.syncStatus === 0" type="info" size="small">
+ <i class="el-icon-warning"></i> 鏈悓姝�
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 1" type="warning" size="small">
+ <i class="el-icon-loading"></i> 鍚屾涓�
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 2" type="success" size="small">
+ <i class="el-icon-success"></i> 鍚屾鎴愬姛
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 3" type="danger" size="small">
+ <i class="el-icon-error"></i> 鍚屾澶辫触
+ </el-tag>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="澶囨敞" align="center" prop="remark" show-overflow-tooltip>
+ <template slot-scope="scope">
+ <span v-if="scope.row.remark">{{ scope.row.remark }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 绌虹姸鎬佹彁绀� -->
+ <div v-if="!paymentInfo.paidPayments || paymentInfo.paidPayments.length === 0" style="text-align: center; padding: 40px 0; color: #909399;">
+ <i class="el-icon-document" style="font-size: 48px; display: block; margin-bottom: 12px;"></i>
+ <span>鏆傛棤鏀粯璁板綍</span>
+ </div>
+ </div>
+ </el-card>
<!-- 绂忕杞︿换鍔℃墿灞曚俊鎭� -->
<el-descriptions v-if="taskDetail.taskType === 'WELFARE' && taskDetail.welfareInfo" title="绂忕杞︽湇鍔′俊鎭�" :column="2" border style="margin-top: 20px;">
@@ -99,11 +318,53 @@
</el-descriptions>
<!-- 鎿嶄綔鎸夐挳 -->
- <div style="margin-top: 20px; text-align: center;">
+ <!-- <div style="margin-top: 20px; text-align: center;">
<el-button type="primary" @click="handleEdit" v-hasPermi="['task:general:edit']">缂栬緫浠诲姟</el-button>
<el-button type="success" @click="handleAssign" v-hasPermi="['task:general:assign']">鍒嗛厤浠诲姟</el-button>
<el-button type="warning" @click="handleStatusChange" v-hasPermi="['task:general:status']">鐘舵�佸彉鏇�</el-button>
<el-button type="info" @click="handleVehicleAssign" v-hasPermi="['task:general:assign']">鍒嗛厤杞﹁締</el-button>
+ </div> -->
+ </el-card>
+
+ <!-- 鎵ц浜哄憳鍒楄〃 -->
+ <el-card class="box-card" style="margin-top: 20px;">
+ <div slot="header" class="clearfix">
+ <span>鎵ц浜哄憳</span>
+ </div>
+
+ <el-table :data="taskDetail.assignees" v-loading="assigneeLoading">
+ <el-table-column label="搴忓彿" align="center" width="60">
+ <template slot-scope="scope">
+ <span>{{ scope.$index + 1 }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="濮撳悕" align="center" prop="userName">
+ <template slot-scope="scope">
+ <span>{{ scope.row.userName }}</span>
+ <el-tag v-if="scope.row.isPrimary === '1'" type="warning" size="mini" style="margin-left: 8px;">
+ <i class="el-icon-star-on"></i> 璐熻矗浜�
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="瑙掕壊绫诲瀷" align="center" prop="userType" width="120">
+ <template slot-scope="scope">
+ <el-tag v-if="scope.row.userType === 'driver'" type="primary" size="small">鍙告満</el-tag>
+ <el-tag v-else-if="scope.row.userType === 'doctor'" type="success" size="small">鍖荤敓</el-tag>
+ <el-tag v-else-if="scope.row.userType === 'nurse'" type="info" size="small">鎶ゅ+</el-tag>
+ <el-tag v-else type="" size="small">{{ scope.row.userType }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+ <template slot-scope="scope">
+ <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 绌虹姸鎬佹彁绀� -->
+ <div v-if="!taskDetail.assignees || taskDetail.assignees.length === 0" style="text-align: center; padding: 40px 0; color: #909399;">
+ <i class="el-icon-user" style="font-size: 48px; display: block; margin-bottom: 12px;"></i>
+ <span>鏆傛棤鎵ц浜哄憳</span>
</div>
</el-card>
@@ -156,11 +417,38 @@
</div>
<el-table :data="taskDetail.attachments" v-loading="attachmentLoading">
- <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName" />
- <el-table-column label="鏂囦欢绫诲瀷" align="center" prop="fileType" />
- <el-table-column label="鏂囦欢澶у皬" align="center" prop="fileSize">
+ <el-table-column label="缂╃暐鍥�" align="center" width="120">
<template slot-scope="scope">
- <span>{{ formatFileSize(scope.row.fileSize) }}</span>
+ <el-image
+ v-if="isImage(scope.row.fileType)"
+ :src="scope.row.fileUrl"
+ :preview-src-list="[scope.row.fileUrl]"
+ fit="cover"
+ style="width: 80px; height: 80px; border-radius: 4px; cursor: pointer;"
+ >
+ <div slot="error" class="image-slot">
+ <i class="el-icon-picture-outline" style="font-size: 40px; color: #C0C4CC;"></i>
+ </div>
+ </el-image>
+ <div v-else style="text-align: center;">
+ <i class="el-icon-document" style="font-size: 40px; color: #909399;"></i>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column label="涓氬姟鍒嗙被" align="center" prop="attachmentCategory" width="150">
+ <template slot-scope="scope">
+ <dict-tag :options="dict.type.sys_attachment_category" :value="scope.row.attachmentCategory"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚屾鐘舵��" align="center" width="120">
+ <template slot-scope="scope">
+ <el-tag v-if="scope.row.syncedToImageData === 0" type="info" size="small">
+ <i class="el-icon-warning"></i> 鏈悓姝�
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncedToImageData === 1" type="success" size="small">
+ <i class="el-icon-success"></i> 宸插悓姝�
+ </el-tag>
+ <span v-else style="color: #C0C4CC;">--</span>
</template>
</el-table-column>
<el-table-column label="涓婁紶鏃堕棿" align="center" prop="uploadTime" width="180">
@@ -187,6 +475,74 @@
</template>
</el-table-column>
</el-table>
+ </el-card>
+
+ <!-- 闄勫姞璐圭敤鍒楄〃 -->
+ <el-card class="box-card" style="margin-top: 20px;">
+ <div slot="header" class="clearfix">
+ <span>闄勫姞璐圭敤鍒楄〃</span>
+ </div>
+
+ <el-table :data="additionalFeeList" v-loading="feeLoading">
+ <el-table-column label="璐圭敤绫诲瀷" align="center" prop="feeType" width="120">
+ <template slot-scope="scope">
+ <dict-tag :options="dict.type.task_additional_fee_type" :value="scope.row.feeType"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="璐圭敤鍚嶇О" align="center" prop="feeName" />
+ <el-table-column label="鍗曚环" align="center" prop="unitAmount" width="120">
+ <template slot-scope="scope">
+ <span>楼{{ scope.row.unitAmount }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏁伴噺" align="center" prop="quantity" width="80" />
+ <el-table-column label="鎬婚噾棰�" align="center" prop="totalAmount" width="120">
+ <template slot-scope="scope">
+ <span style="color: #E6A23C; font-weight: bold;">楼{{ scope.row.totalAmount }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚屾鐘舵��" align="center" width="120">
+ <template slot-scope="scope">
+ <el-tag v-if="scope.row.syncStatus === 0" type="info" size="small">
+ <i class="el-icon-warning"></i> 鏈悓姝�
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 1" type="warning" size="small">
+ <i class="el-icon-loading"></i> 鍚屾涓�
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 2" type="success" size="small">
+ <i class="el-icon-success"></i> 鍚屾鎴愬姛
+ </el-tag>
+ <el-tag v-else-if="scope.row.syncStatus === 3" type="danger" size="small">
+ <i class="el-icon-error"></i> 鍚屾澶辫触
+ </el-tag>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍚屾鏃堕棿" align="center" prop="syncTime" width="180">
+ <template slot-scope="scope">
+ <span v-if="scope.row.syncTime">{{ parseTime(scope.row.syncTime, '{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="createdTime" width="180">
+ <template slot-scope="scope">
+ <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍒涘缓鑰�" align="center" prop="createdBy" width="100" />
+ <el-table-column label="澶囨敞" align="center" prop="remark" show-overflow-tooltip>
+ <template slot-scope="scope">
+ <span v-if="scope.row.remark">{{ scope.row.remark }}</span>
+ <span v-else style="color: #C0C4CC;">--</span>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 绌虹姸鎬佹彁绀� -->
+ <div v-if="!additionalFeeList || additionalFeeList.length === 0" style="text-align: center; padding: 40px 0; color: #909399;">
+ <i class="el-icon-document" style="font-size: 48px; display: block; margin-bottom: 12px;"></i>
+ <span>鏆傛棤闄勫姞璐圭敤</span>
+ </div>
</el-card>
<!-- 鎿嶄綔鏃ュ織 -->
@@ -341,33 +697,54 @@
</el-dialog>
<!-- 涓婁紶闄勪欢瀵硅瘽妗� -->
- <el-dialog title="涓婁紶闄勪欢" :visible.sync="uploadOpen" width="500px" append-to-body>
- <el-upload
- class="upload-demo"
- drag
- :action="uploadUrl"
- :headers="uploadHeaders"
- :data="uploadData"
- :on-success="handleUploadSuccess"
- :on-error="handleUploadError"
- :before-upload="beforeUpload"
- multiple>
- <i class="el-icon-upload"></i>
- <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
- <div class="el-upload__tip" slot="tip">鍙兘涓婁紶jpg/png/pdf/doc/docx鏂囦欢锛屼笖涓嶈秴杩�10MB</div>
- </el-upload>
+ <el-dialog title="涓婁紶闄勪欢" :visible.sync="uploadOpen" width="500px" append-to-body @close="cancelUpload">
+ <el-form ref="uploadForm" :model="uploadForm" :rules="uploadRules" label-width="100px">
+ <el-form-item label="涓氬姟鍒嗙被" prop="category">
+ <el-select v-model="uploadForm.category" placeholder="璇烽�夋嫨涓氬姟鍒嗙被" clearable style="width: 100%;">
+ <el-option
+ v-for="dict in dict.type.sys_attachment_category"
+ :key="dict.value"
+ :label="dict.label"
+ :value="dict.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="闄勪欢" prop="files">
+ <el-upload
+ ref="upload"
+ class="upload-demo"
+ :action="uploadUrl"
+ :headers="uploadHeaders"
+ :data="uploadData"
+ :on-success="handleUploadSuccess"
+ :on-error="handleUploadError"
+ :before-upload="beforeUpload"
+ :file-list="fileList"
+ :auto-upload="false"
+ multiple
+ drag>
+ <i class="el-icon-upload"></i>
+ <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+ <div class="el-upload__tip" slot="tip">鍙兘涓婁紶jpg/png/pdf/doc/docx鏂囦欢锛屼笖涓嶈秴杩�100MB</div>
+ </el-upload>
+ </el-form-item>
+ </el-form>
+ <div slot="footer" class="dialog-footer">
+ <el-button type="primary" @click="submitUpload">纭� 瀹�</el-button>
+ <el-button @click="cancelUpload">鍙� 娑�</el-button>
+ </div>
</el-dialog>
</div>
</template>
<script>
-import { getTask, updateTask, assignTask, changeTaskStatus, uploadAttachment, deleteAttachment, getTaskVehicles, getAvailableVehicles, assignVehiclesToTask, unassignVehicleFromTask } from "@/api/task";
+import { getTask, updateTask, assignTask, changeTaskStatus, uploadAttachment, deleteAttachment, getTaskVehicles, getAvailableVehicles, assignVehiclesToTask, unassignVehicleFromTask, getPaymentInfo } from "@/api/task";
import { listUser } from "@/api/system/user";
import { getToken } from "@/utils/auth";
export default {
name: "TaskDetail",
- dicts: ['sys_task_type', 'sys_task_status', 'sys_vehicle_type', 'sys_task_vehicle_status', 'sys_user_sex', 'hospital_department'],
+ dicts: ['sys_task_type', 'sys_task_status', 'sys_vehicle_type', 'sys_task_vehicle_status', 'sys_user_sex', 'hospital_department', 'sys_attachment_category', 'task_additional_fee_type', 'task_payment_method'],
data() {
return {
// 浠诲姟璇︽儏
@@ -386,6 +763,12 @@
vehicleAssignOpen: false,
// 鏄惁鏄剧ず涓婁紶瀵硅瘽妗�
uploadOpen: false,
+ // 涓婁紶琛ㄥ崟
+ uploadForm: {
+ category: null
+ },
+ // 鏂囦欢鍒楄〃
+ fileList: [],
// 缂栬緫琛ㄥ崟
editForm: {},
// 鍒嗛厤琛ㄥ崟
@@ -401,8 +784,14 @@
// 鍔犺浇鐘舵��
vehicleLoading: false,
attachmentLoading: false,
+ feeLoading: false,
+ assigneeLoading: false,
+ // 闄勫姞璐圭敤鍒楄〃
+ additionalFeeList: [],
+ // 鏀粯淇℃伅
+ paymentInfo: null,
// 涓婁紶鐩稿叧
- uploadUrl: process.env.VUE_APP_BASE_API + "/task/attachment/upload/" + this.$route.params.taskId,
+ uploadUrl: process.env.VUE_APP_BASE_API + "/task/attachment/upload/" + (new URLSearchParams(window.location.search).get('taskId') || ''),
uploadHeaders: {
Authorization: "Bearer " + getToken()
},
@@ -433,19 +822,60 @@
vehicleIds: [
{ required: true, message: "杞﹁締涓嶈兘涓虹┖", trigger: "change" }
]
+ },
+ uploadRules: {
+ category: [
+ { required: true, message: "涓氬姟鍒嗙被涓嶈兘涓虹┖", trigger: "change" }
+ ]
}
};
},
created() {
this.getTaskDetail();
this.getUserList();
+ this.getAdditionalFeeList();
+ // 鍒濆鍖栦笂浼燯RL
+ this.uploadUrl = process.env.VUE_APP_BASE_API + "/task/attachment/upload/" + this.$route.params.taskId;
},
methods: {
/** 鑾峰彇浠诲姟璇︽儏 */
getTaskDetail() {
getTask(this.$route.params.taskId).then(response => {
this.taskDetail = response.data;
+ // 浠诲姟璇︽儏鍔犺浇瀹屾垚鍚庯紝鍔犺浇鏀粯淇℃伅
+ // console.log("TaskDetail", this.taskDetail);
+ this.loadPaymentInfo();
});
+ },
+ /** 鑾峰彇闄勫姞璐圭敤鍒楄〃 */
+ getAdditionalFeeList() {
+ this.feeLoading = true;
+ getPaymentInfo(this.$route.params.taskId).then(response => {
+ this.additionalFeeList = response.data.additionalFees || [];
+ this.feeLoading = false;
+ }).catch(() => {
+ this.feeLoading = false;
+ });
+ },
+ /** 鍔犺浇鏀粯淇℃伅 */
+ loadPaymentInfo() {
+ //EMERGENCY_TRANSFER
+ if (this.taskDetail.taskType === 'EMERGENCY_TRANSFER') {
+ getPaymentInfo(this.$route.params.taskId).then(response => {
+ // console.log("PaymentInfo", response.data);
+ this.paymentInfo = response.data;
+ }).catch(() => {
+ this.paymentInfo = null;
+ });
+ }
+ },
+ /** 璁$畻鍓╀綑鏈粯閲戦 */
+ getRemainingAmount() {
+ if (!this.paymentInfo) return '0.00';
+ const total = parseFloat(this.paymentInfo.totalAmount || 0);
+ const paid = parseFloat(this.paymentInfo.paidAmount || 0);
+ const remaining = total - paid;
+ return remaining > 0 ? remaining.toFixed(2) : '0.00';
},
/** 鑾峰彇鐢ㄦ埛鍒楄〃 */
getUserList() {
@@ -507,6 +937,10 @@
},
/** 涓婁紶闄勪欢 */
handleUpload() {
+ this.uploadForm = {
+ category: null
+ };
+ this.fileList = [];
this.uploadOpen = true;
},
/** 鍙栨秷杞﹁締鍒嗛厤 */
@@ -601,22 +1035,67 @@
},
/** 涓婁紶鍓嶆鏌� */
beforeUpload(file) {
+ // 妫�鏌ユ槸鍚﹂�夋嫨浜嗕笟鍔″垎绫�
+ if (!this.uploadForm.category) {
+ this.$message.error('璇峰厛閫夋嫨涓氬姟鍒嗙被!');
+ return false;
+ }
+
+ // 鏇存柊uploadData锛岀‘淇濇瘡娆′笂浼犻兘甯︽湁category鍙傛暟
+ this.uploadData = {
+ category: this.uploadForm.category
+ };
+
const isValidType = ['image/jpeg', 'image/png', 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'].includes(file.type);
- const isLt10M = file.size / 1024 / 1024 < 10;
+ const isLt10M = file.size / 1024 / 1024 < 100;
if (!isValidType) {
this.$message.error('鍙兘涓婁紶 JPG/PNG/PDF/DOC/DOCX 鏍煎紡鐨勬枃浠�!');
+ return false;
}
if (!isLt10M) {
- this.$message.error('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!');
+ this.$message.error('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 100MB!');
+ return false;
}
- return isValidType && isLt10M;
+ return true;
+ },
+ /** 鎻愪氦涓婁紶 */
+ submitUpload() {
+ this.$refs["uploadForm"].validate(valid => {
+ if (valid) {
+ // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘枃浠�
+ const fileList = this.$refs.upload.uploadFiles;
+ if (!fileList || fileList.length === 0) {
+ this.$message.warning('璇烽�夋嫨瑕佷笂浼犵殑鏂囦欢');
+ return;
+ }
+
+ // 瑙﹀彂涓婁紶
+ this.$refs.upload.submit();
+ }
+ });
+ },
+ /** 鍙栨秷涓婁紶 */
+ cancelUpload() {
+ this.uploadOpen = false;
+ this.uploadForm = {
+ category: null
+ };
+ this.fileList = [];
+ if (this.$refs.upload) {
+ this.$refs.upload.clearFiles();
+ }
},
/** 涓婁紶鎴愬姛 */
handleUploadSuccess(response, file, fileList) {
- this.$modal.msgSuccess("涓婁紶鎴愬姛");
- this.uploadOpen = false;
- this.getTaskDetail();
+ // 妫�鏌ユ槸鍚︽墍鏈夋枃浠堕兘涓婁紶瀹屾垚
+ const allDone = fileList.every(f => f.status === 'success' || f.status === 'fail');
+
+ if (allDone) {
+ this.$modal.msgSuccess("涓婁紶鎴愬姛");
+ this.cancelUpload();
+ this.getTaskDetail();
+ }
},
/** 涓婁紶澶辫触 */
handleUploadError(err, file, fileList) {
@@ -640,6 +1119,12 @@
return typeItem ? typeItem.label : vehicleType;
}
return vehicleType;
+ },
+ /** 鍒ゆ柇鏄惁涓哄浘鐗囩被鍨� */
+ isImage(fileType) {
+ if (!fileType) return false;
+ const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'];
+ return imageTypes.includes(fileType.toLowerCase());
}
}
};
--
Gitblit v1.9.1