|
|
@@ -41,6 +41,9 @@
|
|
|
|
|
|
<div class="task-card__body">
|
|
|
<div class="info-line">
|
|
|
+ 触发条件:{{ item.fw_trigger || '--' }}
|
|
|
+ </div>
|
|
|
+ <div class="info-line">
|
|
|
{{ t("workExecute.farmSituation") }}{{ item.analysisSummary }}
|
|
|
</div>
|
|
|
<div class="info-line">
|
|
|
@@ -94,11 +97,17 @@ import wx from "weixin-js-sdk";
|
|
|
|
|
|
|
|
|
// ---------- 常量 ----------
|
|
|
-/** zoneId / date 临时固定,后续改为当前分区 / 当天 */
|
|
|
+/** zoneId / farmId / date 临时固定,后续改为当前分区 / 当天 */
|
|
|
const QUERY = {
|
|
|
zoneId: 41,
|
|
|
+ farmId: 321,
|
|
|
date: "2025-09-11",
|
|
|
};
|
|
|
+/** 任务类型:fw_tasks 标准化农事 / weather_work 气象农事 */
|
|
|
+const TASK_KIND = {
|
|
|
+ NORMAL: "normal",
|
|
|
+ WEATHER: "weather",
|
|
|
+};
|
|
|
const COMPLETED_STATUS_RE = /已完成|已执行|已认证|本人完成/;
|
|
|
|
|
|
const { t } = useI18n();
|
|
|
@@ -131,6 +140,13 @@ function getMiniUserId() {
|
|
|
return store.state.home.miniUserId || localStorage.getItem("MINI_USER_ID");
|
|
|
}
|
|
|
|
|
|
+/** 与图片一致:zone_id / farm_id / trigger_date(临时写死,后续改当前分区) */
|
|
|
+const resolveQueryParams = () => ({
|
|
|
+ zone_id: QUERY.zoneId,
|
|
|
+ farm_id: QUERY.farmId,
|
|
|
+ trigger_date: filterDate.value || QUERY.date,
|
|
|
+});
|
|
|
+
|
|
|
const isCompletedStatus = (status) => COMPLETED_STATUS_RE.test(String(status || ""));
|
|
|
|
|
|
const formatExecuteDate = (dateStr) => {
|
|
|
@@ -144,36 +160,51 @@ const buildPointWkt = (lng, lat, index = 0) => {
|
|
|
return `POINT(${Number(lng) + offset} ${Number(lat) + offset * 0.6})`;
|
|
|
};
|
|
|
|
|
|
-/** 将扁平 fw_tasks 映射为卡片;日期优先用任务自身 date,否则用接口 data.date */
|
|
|
-const mapFwTasks = (fwTasks, dateStr, lat, lng, zoneId) => {
|
|
|
- const list = Array.isArray(fwTasks) ? fwTasks : [];
|
|
|
- return list
|
|
|
- .filter((task) => task)
|
|
|
- .map((task, index) => {
|
|
|
- const executeDateFull = task.date || dateStr;
|
|
|
- const completed = isCompletedStatus(task.fw_status);
|
|
|
- return {
|
|
|
- id: `${task.manual_id || task.mechanical_id || "fw"}_${index}_${executeDateFull}`,
|
|
|
- status: completed ? "completed" : "pending",
|
|
|
- title: task.fw_name || "",
|
|
|
- isHighRisk: false,
|
|
|
- isNormal: true,
|
|
|
- isAbnormal: false,
|
|
|
- isWeather: false,
|
|
|
- cornerTip: task.fw_status || (completed ? "已完成" : "待执行"),
|
|
|
- analysisSummary: task.fw_simple_explain || "",
|
|
|
- areaCode: zoneId ? `分区 ${zoneId}` : "",
|
|
|
- farmName: task.fw_name || "",
|
|
|
- executeDate: formatExecuteDate(executeDateFull),
|
|
|
- executeDateFull,
|
|
|
- zoneId,
|
|
|
- manualId: task.manual_id,
|
|
|
- mechanicalId: task.mechanical_id,
|
|
|
- latitude: lat,
|
|
|
- longitude: lng,
|
|
|
- wkt: buildPointWkt(lng, lat, index),
|
|
|
- };
|
|
|
- });
|
|
|
+/** 单条任务映射为卡片;kind 区分标准化 / 气象 */
|
|
|
+const mapTaskItem = (task, index, { dateStr, lat, lng, zoneId, kind }) => {
|
|
|
+ const executeDateFull = task.date || dateStr;
|
|
|
+ const completed = isCompletedStatus(task.fw_status);
|
|
|
+ const isWeather = kind === TASK_KIND.WEATHER;
|
|
|
+ const prefix = isWeather ? "weather" : "fw";
|
|
|
+ return {
|
|
|
+ id: `${prefix}_${task.manual_id || task.mechanical_id || index}_${executeDateFull}`,
|
|
|
+ status: completed ? "completed" : "pending",
|
|
|
+ title: task.fw_name || "",
|
|
|
+ isHighRisk: false,
|
|
|
+ isNormal: !isWeather,
|
|
|
+ isAbnormal: false,
|
|
|
+ isWeather,
|
|
|
+ cornerTip: task.fw_status || (completed ? "已完成" : "待执行"),
|
|
|
+ analysisSummary: task.fw_simple_explain || task.fw_explain || "",
|
|
|
+ areaCode: zoneId ? `分区 ${zoneId}` : "",
|
|
|
+ farmName: task.fw_name || "",
|
|
|
+ executeDate: formatExecuteDate(executeDateFull),
|
|
|
+ executeDateFull,
|
|
|
+ zoneId,
|
|
|
+ manualId: task.manual_id,
|
|
|
+ mechanicalId: task.mechanical_id,
|
|
|
+ latitude: lat,
|
|
|
+ longitude: lng,
|
|
|
+ wkt: buildPointWkt(lng, lat, index),
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
+/** 合并 fw_tasks(标准化)+ weather_work(气象) */
|
|
|
+const mapZoneTaskList = (data) => {
|
|
|
+ const dateStr = resolveRangeStart(data);
|
|
|
+ const lat = data.latitude ?? 22.970229;
|
|
|
+ const lng = data.longitude ?? 113.746646;
|
|
|
+ const zoneId = data.zone_id ?? QUERY.zoneId;
|
|
|
+ const ctx = { dateStr, lat, lng, zoneId };
|
|
|
+ const normalList = (Array.isArray(data.fw_tasks) ? data.fw_tasks : [])
|
|
|
+ .filter(Boolean)
|
|
|
+ .map((task, index) => mapTaskItem(task, index, { ...ctx, kind: TASK_KIND.NORMAL }));
|
|
|
+ const weatherList = (Array.isArray(data.weather_work) ? data.weather_work : [])
|
|
|
+ .filter(Boolean)
|
|
|
+ .map((task, index) =>
|
|
|
+ mapTaskItem(task, normalList.length + index, { ...ctx, kind: TASK_KIND.WEATHER })
|
|
|
+ );
|
|
|
+ return { list: [...normalList, ...weatherList], lat, lng, dateStr, zoneId };
|
|
|
};
|
|
|
|
|
|
const resolveRangeStart = (data) => {
|
|
|
@@ -221,35 +252,23 @@ const syncCalendar = (data) => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
-const fetchFwTasks = async () => {
|
|
|
+const fetchZoneFwTaskList = async () => {
|
|
|
try {
|
|
|
- const res = await VE_API.questionnaire.getFwTasks({
|
|
|
- zone_id: QUERY.zoneId,
|
|
|
- date: QUERY.date,
|
|
|
- });
|
|
|
+ const params = resolveQueryParams();
|
|
|
+ const res = await VE_API.questionnaire.getZoneFwTaskList(params);
|
|
|
const data = res?.data;
|
|
|
if (!data) {
|
|
|
taskList.value = [];
|
|
|
mapCenterPoint.value = null;
|
|
|
- calendarRef.value?.setStartDate?.(QUERY.date);
|
|
|
- calendarRef.value?.selectDateByValue?.(QUERY.date);
|
|
|
+ calendarRef.value?.setStartDate?.(params.trigger_date);
|
|
|
+ calendarRef.value?.selectDateByValue?.(params.trigger_date);
|
|
|
calendarRef.value?.setSolarTerm?.([]);
|
|
|
refreshMapMarkers();
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- const lat = data.latitude ?? 22.970229;
|
|
|
- const lng = data.longitude ?? 113.746646;
|
|
|
- const dateStr = resolveRangeStart(data);
|
|
|
+ const { list, lat, lng, dateStr } = mapZoneTaskList(data);
|
|
|
mapCenterPoint.value = `POINT(${lng} ${lat})`;
|
|
|
-
|
|
|
- taskList.value = mapFwTasks(
|
|
|
- data.fw_tasks,
|
|
|
- dateStr,
|
|
|
- lat,
|
|
|
- lng,
|
|
|
- data.zone_id ?? QUERY.zoneId
|
|
|
- );
|
|
|
+ taskList.value = list;
|
|
|
filterDate.value = dateStr;
|
|
|
syncCalendar(data);
|
|
|
nextTick(() => refreshMapMarkers());
|
|
|
@@ -266,7 +285,10 @@ const handleTabChange = (key) => {
|
|
|
};
|
|
|
|
|
|
const handleDateSelect = (date) => {
|
|
|
- filterDate.value = date ?? QUERY.date;
|
|
|
+ const next = date ?? QUERY.date;
|
|
|
+ if (filterDate.value === next) return;
|
|
|
+ filterDate.value = next;
|
|
|
+ fetchZoneFwTaskList();
|
|
|
};
|
|
|
|
|
|
const handleForward = (item) => {
|
|
|
@@ -295,7 +317,10 @@ const buildFwTaskQuery = (item) => ({
|
|
|
lat: item?.latitude,
|
|
|
lng: item?.longitude,
|
|
|
fw_name: item?.title || item?.farmName || "",
|
|
|
+ isNormal: item?.isNormal ? 1 : 0,
|
|
|
isAbnormal: item?.isAbnormal ? 1 : 0,
|
|
|
+ isWeather: item?.isWeather ? 1 : 0,
|
|
|
+ isHighRisk: item?.isHighRisk ? 1 : 0,
|
|
|
});
|
|
|
|
|
|
const handleViewDetail = (item) => {
|
|
|
@@ -327,7 +352,7 @@ const initMap = () => {
|
|
|
onMounted(() => {
|
|
|
checkFarmCalendarPopup();
|
|
|
nextTick(async () => {
|
|
|
- await fetchFwTasks();
|
|
|
+ await fetchZoneFwTaskList();
|
|
|
initMap();
|
|
|
});
|
|
|
});
|