Browse Source

计划bug处理

dev-v1.0.2
庄锐波 4 months ago
parent
commit
876a331487
  1. 16
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpTaskController.java
  2. 6
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpTaskVo.java
  3. 8
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpTaskService.java
  4. 64
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java
  5. 4
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml
  6. 3
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/task.js
  7. 329
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_manual.vue
  8. 175
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue
  9. 4
      zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application-prod.yml

16
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpTaskController.java

@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
/**
* 行政执法检查计划-任务
@ -70,4 +72,18 @@ public class AppEnfCpTaskController extends EfcodeCpTaskController {
EfcodeCpTaskVo detail = cpTaskService.queryMyTaskDetail(planId);
return R.ok(detail);
}
/**
* 批量查询任务列表中联合执法任务的关联单位信息(第二次请求)
*
* @param planIds 计划ID列表,逗号分隔
* @return Map: key=planId, value=关联的其他单位计划信息
*/
@GetMapping("/myListAssociatedPlans")
public R<Map<String, List<EfcodeCpTaskVo.AssociatedPlan>>> myListAssociatedPlans(
@RequestParam String planIds) {
List<String> planIdList = Arrays.asList(planIds.split(","));
Map<String, List<EfcodeCpTaskVo.AssociatedPlan>> result = cpTaskService.queryAssociatedPlansBatch(planIdList);
return R.ok(result);
}
}

6
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpTaskVo.java

@ -103,6 +103,12 @@ public class EfcodeCpTaskVo implements Serializable {
@com.baomidou.mybatisplus.annotation.TableField(exist = false)
private String enforceUserNames;
/**
* 执法人员电话(多个逗号分隔)
*/
@com.baomidou.mybatisplus.annotation.TableField(exist = false)
private String enforceUserTels;
/**
* 被检查企业/机构信用代码
*/

8
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpTaskService.java

@ -95,6 +95,14 @@ public interface IEfcodeCpTaskService {
*/
EfcodeCpTaskVo queryMyTaskDetail(String planId);
/**
* 批量查询关联计划信息(用于列表页第二次请求加载联合执法关联单位信息)
*
* @param planIds 计划ID列表(通常为isUnion=1的任务对应的planId)
* @return Map: key=planId, value=该计划关联的其他单位信息
*/
java.util.Map<String, List<EfcodeCpTaskVo.AssociatedPlan>> queryAssociatedPlansBatch(List<String> planIds);
/**
* 强制创建任务(忽略其他条件),根据计划信息直接生成任务记录并回写 plan.task_id
*

64
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpTaskServiceImpl.java

@ -21,8 +21,10 @@ import com.zdxt.enforcementcode.service.IEfcodeCpTaskService;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 行政执法检查计划-任务Service业务层处理
@ -180,6 +182,68 @@ public class EfcodeCpTaskServiceImpl implements IEfcodeCpTaskService {
return detail;
}
/**
* 批量查询关联计划信息(用于列表页第二次请求加载联合执法关联单位信息)
*/
@Override
public Map<String, List<EfcodeCpTaskVo.AssociatedPlan>> queryAssociatedPlansBatch(List<String> planIds) {
Map<String, List<EfcodeCpTaskVo.AssociatedPlan>> result = new HashMap<>();
if (planIds == null || planIds.isEmpty()) {
return result;
}
// 1. 查询这些planId对应的计划,获取各自的taskId
List<EfcodeCpPlan> sourcePlans = cpPlanMapper.selectList(
Wrappers.<EfcodeCpPlan>lambdaQuery()
.in(EfcodeCpPlan::getId, planIds)
.eq(EfcodeCpPlan::getIsDelete, 0L)
.isNotNull(EfcodeCpPlan::getTaskId)
);
if (sourcePlans == null || sourcePlans.isEmpty()) {
return result;
}
// 2. 收集所有taskId,并建立 planId -> taskId 的映射
Map<String, String> planToTask = new HashMap<>();
List<String> taskIds = new ArrayList<>();
for (EfcodeCpPlan p : sourcePlans) {
planToTask.put(p.getId(), p.getTaskId());
if (!taskIds.contains(p.getTaskId())) {
taskIds.add(p.getTaskId());
}
}
// 3. 查询所有相关taskId下的计划(排除当前用户的planId)
List<EfcodeCpPlan> allRelatedPlans = cpPlanMapper.selectList(
Wrappers.<EfcodeCpPlan>lambdaQuery()
.in(EfcodeCpPlan::getTaskId, taskIds)
.notIn(EfcodeCpPlan::getId, planIds)
.eq(EfcodeCpPlan::getIsDelete, 0L)
);
if (allRelatedPlans == null || allRelatedPlans.isEmpty()) {
return result;
}
// 4. 按taskId分组
Map<String, List<EfcodeCpPlan>> groupedByTask = allRelatedPlans.stream()
.collect(Collectors.groupingBy(EfcodeCpPlan::getTaskId));
// 5. 映射回各planId
for (Map.Entry<String, String> entry : planToTask.entrySet()) {
String planId = entry.getKey();
String taskId = entry.getValue();
List<EfcodeCpPlan> otherPlans = groupedByTask.get(taskId);
if (otherPlans != null && !otherPlans.isEmpty()) {
List<EfcodeCpTaskVo.AssociatedPlan> associated = new ArrayList<>();
for (EfcodeCpPlan p : otherPlans) {
EfcodeCpTaskVo.AssociatedPlan ap = new EfcodeCpTaskVo.AssociatedPlan();
ap.setBureauDeptName(p.getBureauDeptName());
ap.setEnforceUserNames(p.getEnforceUserNames());
ap.setEnforceUserTels(p.getEnforceUserTels());
ap.setEnforceContent(p.getEnforceContent());
associated.add(ap);
}
result.put(planId, associated);
}
}
return result;
}
/**
* 强制创建任务(忽略其他条件),根据计划信息直接生成任务记录并回写 plan.task_id
*

4
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpTaskMapper.xml

@ -16,7 +16,9 @@
p.enforce_content,
p.enterprise_name,
p.is_union,
p.bureau_dept_name
p.bureau_dept_name,
p.enforce_user_names,
p.enforce_user_tels
FROM efcode_cp_task t
INNER JOIN efcode_cp_plan p ON p.task_id = t.id
<where>

3
zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/task.js

@ -13,4 +13,7 @@ export const getMyTaskDates = (yearMonth, success, error) => _get(taskBaseUrl +
// 我的任务详情(通过 planId 查询)
export const getMyTaskDetail = (planId, success, error) => _get(taskBaseUrl + "/myDetail", { planId }, success, error);
// 批量查询联合执法任务的关联单位信息(第二次请求)
export const getMyTaskAssociatedPlans = (planIds, success, error) => _get(taskBaseUrl + "/myListAssociatedPlans", { planIds }, success, error);
// endregion

329
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/reserve/cp_reserve_manual.vue

@ -25,8 +25,7 @@
v-for="item in reserveList"
:key="item.id"
class="reserve-card"
:class="{ 'approved-card': item.opStatus === 1, 'rejected-card': item.opStatus === 2, 'pending-card': item.opStatus === 3, 'selected-card': selectedId === item.id }"
@click="onSelectCard(item)"
:class="{ 'approved-card': item.opStatus === 1, 'rejected-card': item.opStatus === 2, 'pending-card': item.opStatus === 3 }"
>
<div class="card-header">
<div class="card-label" :class="{ 'sent-label': isSentByMe(item) }">
@ -38,76 +37,60 @@
</div>
<!-- 预约单位信息 -->
<div class="unit-section">
<div class="unit-section-title">预约单位</div>
<div class="unit-info">
<div class="info-row">
<div class="label">执法单位:</div>
<div class="value">{{ item.bureauDeptName || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法人员:</div>
<div class="value">{{ item.enforceUserNames || '-' }}</div>
</div>
<div class="info-row">
<div class="label">联系电话:</div>
<div class="value">{{ item.enforceUserTels || '-' }}</div>
</div>
<div class="info-row">
<div class="label">计划时间:</div>
<div class="value">{{ formatPlanDate(item.planDate) }} {{ getPlanTimeText(item.planTime) }}</div>
</div>
<div class="info-row">
<div class="label">企业名称:</div>
<div class="value">{{ item.enterpriseName || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法事项:</div>
<div class="value">{{ item.enforceContent || '-' }}</div>
</div>
<div class="info-divider"></div>
<div class="unit-block">
<div class="unit-block-header">
<span class="unit-block-tag">预约单位</span>
</div>
<div class="unit-block-title">{{ item.enterpriseName || item.bureauDeptName || '-' }}</div>
<div class="unit-block-subtitle">{{ formatPlanDate(item.planDate) }} {{ getPlanTimeText(item.planTime) }}</div>
<div class="unit-block-divider"></div>
<div class="info-row">
<div class="label">执法单位:</div>
<div class="value">{{ item.bureauDeptName || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法人员:</div>
<div class="value">{{ item.enforceUserNames || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法事项:</div>
<div class="value">{{ item.enforceContent || '-' }}</div>
</div>
</div>
<!-- 被约单位信息 -->
<div class="unit-section">
<div class="unit-section-title">被约单位</div>
<div class="unit-info">
<div class="info-row">
<div class="label">执法单位:</div>
<div class="value">{{ item.targetBureauDeptName || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法人员:</div>
<div class="value">{{ item.targetEnforceUserNames || '-' }}</div>
</div>
<div class="info-row">
<div class="label">联系电话:</div>
<div class="value">{{ item.targetEnforceUserTels || '-' }}</div>
</div>
<div class="info-row">
<div class="label">计划时间:</div>
<div class="value">{{ formatPlanDate(item.targetPlanDate) }} {{ getPlanTimeText(item.targetPlanTime) }}</div>
</div>
<div class="info-row">
<div class="label">企业名称:</div>
<div class="value">{{ item.targetEnterpriseName || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法事项:</div>
<div class="value">{{ item.targetEnforceContent || '-' }}</div>
</div>
<div class="info-divider"></div>
<div class="unit-block unit-block-target">
<div class="unit-block-header">
<span class="unit-block-tag unit-block-tag-target">被约单位</span>
</div>
<div class="unit-block-title">{{ item.targetEnterpriseName || item.targetBureauDeptName || '-' }}</div>
<div class="unit-block-subtitle">联合单位</div>
<div class="unit-block-divider"></div>
<div class="info-row">
<div class="label">执法单位:</div>
<div class="value">{{ item.targetBureauDeptName || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法人员:</div>
<div class="value">{{ item.targetEnforceUserNames || '-' }}</div>
</div>
<div class="info-row">
<div class="label">执法事项:</div>
<div class="value">{{ item.targetEnforceContent || '-' }}</div>
</div>
<div class="info-row">
<div class="label">计划时间:</div>
<div class="value">{{ formatPlanDate(item.targetPlanDate) }} {{ getPlanTimeText(item.targetPlanTime) }}</div>
</div>
</div>
<div class="info-row">
<div class="info-row reserve-time-row">
<div class="label">预约时间:</div>
<div class="value">{{ formatDate(item.reserveTime) }}</div>
</div>
<!-- 选中且待确认状态且收到的预约才显示操作按钮(我发起的不能操作) -->
<div v-if="item.opStatus === 3 && selectedId === item.id && !isSentByMe(item)" class="card-actions">
<!-- 待确认状态且收到的预约才显示操作按钮(我发起的不能操作) -->
<div v-if="item.opStatus === 3 && !isSentByMe(item)" class="card-actions">
<div class="actions-left">
<div v-if="item.opMessage" class="action-item message-action" @click.stop="onShowMessage(item)">
<van-icon name="chat-o" />
@ -141,7 +124,6 @@ import { getReserveList, approveReserveByManual, rejectReserveByManual } from '@
import useCommon from '@/store/Common.js';
const commonStore = useCommon();
const selectedId = ref(null);
const reserveList = ref([]);
const loading = ref(false);
const finished = ref(false);
@ -205,13 +187,10 @@ const isSentByMe = (item) => {
return String(item.senderId) === String(commonStore.userId);
};
// 选中卡片(再次点击取消选中)
const onSelectCard = (item) => {
if (item.opStatus !== 3 || isSentByMe(item)) return; // 非待确认或我发起的不可选
selectedId.value = selectedId.value === item.id ? null : item.id;
// 操作后置处理
const afterOperate = (item, action) => {
onRefresh();
};
// 下拉刷新
const onRefresh = () => {
pageNum.value = 1;
finished.value = false;
@ -304,13 +283,6 @@ const onReject = (item) => {
});
}).catch(() => {});
};
// 操作后置处理
const afterOperate = (item, action) => {
// TODO: 可在此处扩展后置逻辑,如通知、跳转等
selectedId.value = null;
onRefresh();
};
</script>
<style lang="less" scoped>
@ -352,88 +324,58 @@ const afterOperate = (item, action) => {
.reserve-card {
background: #fff;
border-radius: 14px;
padding: 16px;
padding: 0;
box-shadow: 0 4px 16px rgba(44, 116, 190, 0.12), 0 1px 4px rgba(0, 0, 0, 0.06);
border: 2.5px solid #1a5fb4;
overflow: hidden;
}
.approved-card {
border: 1.5px solid rgba(7, 193, 96, 0.4);
}
> .card-header {
padding: 12px 16px;
background: linear-gradient(135deg, #0d4fad 0%, #1565c8 50%, #1e7fe0 100%);
.rejected-card {
border: 1.5px solid rgba(238, 10, 36, 0.35);
}
.pending-card {
border: 1.5px solid rgba(35, 130, 207, 0.35);
}
.selected-card {
background: radial-gradient(circle at 78% 5%, rgba(65, 188, 255, 0.75) 0, rgba(65, 188, 255, 0.25) 20%, transparent 42%),
linear-gradient(135deg, #064ec6 0%, #0b63d9 48%, #268ee5 100%) !important;
border-color: transparent;
.card-header .card-label {
background: rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.85);
}
.card-header .status {
color: #f0b66c !important;
}
.plan-title {
color: #fff;
}
.info-row .label {
color: #fff;
}
.info-row .value {
color: rgba(255, 255, 255, 0.7);
&.msg {
color: rgba(255, 255, 255, 0.8);
.card-label {
background: rgba(255, 255, 255, 0.18);
color: rgba(255, 255, 255, 0.9);
}
}
.unit-section {
border-color: rgba(255, 255, 255, 0.15);
}
.card-label.sent-label {
background: rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.85);
}
.unit-section-title {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.9);
.status {
color: rgba(255, 255, 255, 0.85) !important;
}
}
.info-divider {
border-bottom-color: rgba(255, 255, 255, 0.15);
> .reserve-time-row {
margin: 0 16px;
padding: 10px 0;
}
.card-actions {
border-top-color: rgba(255, 255, 255, 0.18);
> .card-actions {
margin: 0 16px;
padding-bottom: 14px;
}
}
.message-action {
color: rgba(255, 255, 255, 0.85);
}
.approved-card {
border-color: #07c160;
}
.approve-action {
color: #fff;
}
.rejected-card {
border-color: #ee0a24;
}
.reject-action {
color: rgba(255, 255, 255, 0.8);
}
.pending-card {
border-color: #1a5fb4;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 14px;
margin-bottom: 0;
}
.card-label {
@ -496,29 +438,112 @@ const afterOperate = (item, action) => {
}
}
.unit-section {
margin-bottom: 12px;
border: 1px solid #eef2f7;
border-radius: 10px;
overflow: hidden;
.unit-block {
background: linear-gradient(135deg, #0d4fad 0%, #1565c8 50%, #1e7fe0 100%);
padding: 14px 16px;
margin-bottom: 0;
border-bottom: 1px solid rgba(255,255,255,0.12);
.unit-block-tag {
background: rgba(255, 255, 255, 0.18);
color: rgba(255, 255, 255, 0.9);
}
.unit-block-title {
color: #fff;
}
.unit-block-subtitle {
color: rgba(255, 255, 255, 0.7);
}
.unit-block-divider {
border-bottom-color: rgba(255, 255, 255, 0.2);
}
.label {
color: rgba(255, 255, 255, 0.85);
}
.value {
color: rgba(255, 255, 255, 0.75);
}
}
.unit-section-title {
font-size: 14px;
font-weight: 600;
.unit-block-target {
padding: 14px 16px;
border-bottom: none;
background: #fff;
.unit-block-tag {
background: #fff7e6;
color: #fa8c16;
}
.unit-block-title {
color: #111;
}
.unit-block-subtitle {
color: #999;
}
.unit-block-divider {
border-bottom-color: #eef2f7;
}
.label {
color: #333;
}
.value {
color: #8a8a8a;
}
}
.unit-block-header {
margin-bottom: 6px;
}
.unit-block-tag {
display: inline-block;
font-size: 12px;
font-weight: 500;
color: #1f75c9;
background: #f0f7ff;
padding: 8px 12px;
border-bottom: 1px solid #eef2f7;
background: #e8f3ff;
padding: 2px 8px;
border-radius: 8px;
}
.unit-block-tag-target {
color: #fa8c16;
background: #fff7e6;
}
.unit-info {
padding: 10px 12px;
.unit-block-title {
font-size: 15px;
font-weight: 700;
color: #111;
line-height: 1.5;
margin-bottom: 4px;
}
.unit-block-subtitle {
font-size: 13px;
color: #999;
margin-bottom: 10px;
}
.unit-block-divider {
border-bottom: 1px solid #eef2f7;
margin-bottom: 10px;
}
.info-divider {
margin-top: 8px;
border-bottom: 1px dashed #c0c4cc;
.reserve-time-row {
margin-top: 0;
padding-top: 10px;
padding-bottom: 4px;
border-top: 1px solid #eef2f7;
}
.card-actions {

175
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/task/cp_task_mine.vue

@ -68,20 +68,49 @@
>
<div class="task-time-col">
<div class="time-label">{{ getTimeLabel(item) }}</div>
<div class="time-date">{{ getShortDate(item) }}</div>
</div>
<div class="task-info-col">
<div class="task-content-col">
<div class="task-title-row">
<span class="task-title">{{ item.enforceContent }}</span>
<span class="task-title">{{ item.enterpriseName || '-' }}</span>
<span v-if="item.isUnion === 1" class="union-badge">联</span>
</div>
<div class="task-detail">
<van-icon name="wap-home-o" size="14" />
<span>{{ item.enterpriseName }}</span>
</div>
<div class="task-detail">
<div class="task-time-info">
<van-icon name="clock-o" size="14" color="#999" />
<span>{{ formatPlanDate(item) }} {{ getTimeRange(item) }}</span>
</div>
<div class="task-divider"></div>
<div class="task-detail-section">
<div class="detail-row">
<div class="detail-label">执法事项:</div>
<div class="detail-value">{{ item.enforceContent || '-' }}</div>
</div>
<div class="detail-row">
<div class="detail-label">执法单位:</div>
<div class="detail-value">{{ item.bureauDeptName || '-' }}</div>
</div>
<div class="detail-row">
<div class="detail-label">执法人员:</div>
<div class="detail-value">{{ formatUserInfo(item.enforceUserNames, item.enforceUserTels) }}</div>
</div>
</div>
<!-- 联合执法关联计划 -->
<template v-if="item.associatedPlans && item.associatedPlans.length">
<div v-for="(ap, apIdx) in item.associatedPlans" :key="apIdx" class="task-detail-section">
<div class="detail-row">
<div class="detail-label">执法事项:</div>
<div class="detail-value">{{ ap.enforceContent || '-' }}</div>
</div>
<div class="detail-row">
<div class="detail-label">执法单位:</div>
<div class="detail-value">{{ ap.bureauDeptName || '-' }}</div>
</div>
<div class="detail-row">
<div class="detail-label">执法人员:</div>
<div class="detail-value">{{ formatUserInfo(ap.enforceUserNames, ap.enforceUserTels) }}</div>
</div>
</div>
</template>
</div>
</div>
</div>
@ -102,7 +131,7 @@
<script setup name="cpTaskMine">
import { useRouter, useRoute } from 'vue-router';
import { getMyTaskList, getMyTaskDates } from '@/api/enforcement/task';
import { getMyTaskList, getMyTaskDates, getMyTaskAssociatedPlans } from '@/api/enforcement/task';
const router = useRouter();
const route = useRoute();
@ -315,6 +344,25 @@ const formatPlanDate = (item) => {
return formatDateStr(date);
};
// 格式化执法人员信息(姓名+电话)
const formatUserInfo = (names, tels) => {
if (!names) return '-';
const nameArr = names.split(',');
const telArr = tels ? tels.split(',') : [];
return nameArr.map((n, i) => {
const tel = telArr[i] ? ' ' + telArr[i].trim() : '';
return n.trim() + tel;
}).join('\n');
};
// 获取短日期(MM-dd)
const getShortDate = (item) => {
const d = item.planActualDate || item.planDate;
if (!d) return '';
const str = typeof d === 'string' ? d : formatDateStr(new Date(d));
return str.substring(5, 10);
};
// 加载任务日期(月份打点)
const loadTaskDates = () => {
const ym = formatYearMonth();
@ -341,6 +389,8 @@ const loadTaskList = () => {
loading.value = false;
if (res.code === 200 && res.data) {
taskList.value = res.data;
// 第二次请求:加载联合执法任务的关联单位信息
loadAssociatedPlans();
} else {
taskList.value = [];
}
@ -352,6 +402,29 @@ const loadTaskList = () => {
);
};
// 加载联合执法关联计划(第二次请求)
const loadAssociatedPlans = () => {
// 筛选出联合执法任务的planId
const unionPlanIds = taskList.value
.filter(item => item.isUnion === 1 && item.planId)
.map(item => item.planId);
if (unionPlanIds.length === 0) return;
getMyTaskAssociatedPlans(
unionPlanIds.join(','),
(res) => {
if (res.code === 200 && res.data) {
// 将关联计划数据合并到对应的任务项中
const map = res.data;
taskList.value.forEach(item => {
if (item.planId && map[item.planId]) {
item.associatedPlans = map[item.planId];
}
});
}
}
);
};
// 初始化
onMounted(() => {
loadTaskDates();
@ -525,50 +598,56 @@ onMounted(() => {
.task-list {
display: flex;
flex-direction: column;
gap: 12px;
gap: 16px;
}
.task-card {
display: flex;
background: #fff;
border-radius: 14px;
padding: 16px;
box-shadow: 0 2px 10px rgba(44, 116, 190, 0.07);
gap: 14px;
gap: 12px;
}
.task-time-col {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-width: 48px;
justify-content: flex-start;
min-width: 40px;
flex-shrink: 0;
padding-top: 10px;
.time-label {
font-size: 14px;
font-size: 15px;
font-weight: 700;
color: #2382cf;
color: #1a1a2e;
}
.time-date {
font-size: 12px;
color: #999;
margin-top: 2px;
}
}
.task-info-col {
.task-content-col {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 6px;
background: #fff;
border-left: 3px solid #2382cf;
border-radius: 10px;
padding: 14px 16px;
box-shadow: 0 2px 10px rgba(44, 116, 190, 0.07);
}
.task-title-row {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 6px;
}
.task-title {
font-size: 15px;
font-weight: 600;
font-weight: 700;
color: #1a1a2e;
overflow: hidden;
text-overflow: ellipsis;
@ -590,18 +669,54 @@ onMounted(() => {
flex-shrink: 0;
}
.task-detail {
.task-time-info {
display: flex;
align-items: center;
gap: 4px;
font-size: 13px;
color: #393838;
overflow: hidden;
color: #999;
margin-bottom: 10px;
}
.task-divider {
border-bottom: 1px dashed #999;
margin-bottom: 10px;
}
.task-detail-section {
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px dashed #999;
span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
&:last-child {
border-bottom: none;
margin-bottom: 0;
padding-bottom: 0;
}
}
.detail-row {
display: flex;
align-items: flex-start;
margin-bottom: 6px;
font-size: 14px;
line-height: 1.6;
&:last-child {
margin-bottom: 0;
}
}
.detail-label {
width: 72px;
flex-shrink: 0;
color: #222;
font-weight: 500;
}
.detail-value {
flex: 1;
color: #444;
white-space: pre-line;
}
</style>

4
zdxt-web-server/zdxt-gateway-web-server/src/main/resources/application-prod.yml

@ -30,14 +30,14 @@ spring:
- StripPrefix=0
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: supervision-service
uri: http://10.76.108.9:18001
uri: http://10.76.108.9:18000
predicates:
- Path=/sup-ep/**
filters:
- StripPrefix=0
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin, RETAIN_UNIQUE
- id: enforcement-service
uri: http://10.76.108.8:18002
uri: http://10.76.108.8:18000
predicates:
- Path=/enf-ep/**
filters:

Loading…
Cancel
Save