diff --git a/api/maintain-manage/maintain-manage.js b/api/maintain-manage/maintain-manage.js index 9ebca75..25d9def 100644 --- a/api/maintain-manage/maintain-manage.js +++ b/api/maintain-manage/maintain-manage.js @@ -100,10 +100,10 @@ export const maintainPlanList= (params) => { * 直接结束 * @returns {Promise} */ -export const finishPlan= (params) => { - // 后端 /finish 使用 @RequestParam("planNo"),必须放 query,不能放 JSON body - const planNo = params && params.planNo != null ? params.planNo : ''; - return post(`/app-api/app/garden/maintain-plan-commit/finish?planNo=${encodeURIComponent(planNo)}`, {}); +export const finishPlan= (params = {}) => { + // 后端 /finish 已改为 @RequestParam("commitId"),planNo 不再接收,必须放 query 且传本次养护ID + const commitId = params && params.commitId != null ? params.commitId : ''; + return post(`/app-api/app/garden/maintain-plan-commit/finish?commitId=${encodeURIComponent(commitId)}`, {}); }; /** diff --git a/pages-sub/daily/maintain-manage/add-record.vue b/pages-sub/daily/maintain-manage/add-record.vue index de64c15..4152411 100644 --- a/pages-sub/daily/maintain-manage/add-record.vue +++ b/pages-sub/daily/maintain-manage/add-record.vue @@ -130,7 +130,7 @@ - 提交 + 暂存 提交并结束本次任务 @@ -942,28 +942,35 @@ export default { commonUserList: [], remark: this.inspectForm.remark.trim(), } + // 子上报随结束一起提交:后端在同一事务里写 garden_work_record 并校验「至少一条子上报」。 + // clientSeq 幂等,重复点击不会重复计次。 + const workRecords = dynamicValues.length > 0 + ? [{ + clientSeq: this.clientSeq, + remark: this.inspectForm.remark.trim(), + fields: dynamicValues + }] + : [] - // 只调一次 /create-and-finish:后端会新增一条带完成时间的上报记录并更新完成次数, - // 若先调 maintainCreate 会多出一条重复记录 + // ① /create-and-finish 必传 commitId:没有进行中的本次养护就先建一条草稿(/create 会复用已有草稿) if (!this.commitId) { - const commitRes: any = await maintainCreateFinish(submitData) + const commitRes: any = await maintainCreate(submitData) // 兼容后端返回裸 id 或 {id:...} 两种形态 this.commitId = commitRes && typeof commitRes === 'object' ? commitRes.id : commitRes } - - // 动态字段挂到本次完成记录上;重试时 commitId 已缓存,只补写字段 - if (dynamicValues.length > 0 && this.commitId) { - await workRecordSubmit({ - businessType: this.paramsOptins.businessType, - bizType: 3, - bizId: this.commitId, - workTypeId: Number(this.paramsOptins.planTypeId), - clientSeq: this.clientSeq, - remark: this.inspectForm.remark.trim(), - fields: dynamicValues - }) + if (!this.commitId) { + uni.hideLoading() + uni.showToast({ title: '创建本次养护失败,请重试', icon: 'none' }) + return } + // ② 子上报 + 结束本次养护(同一事务,不会出现字段已存但任务未结束的中间态) + await maintainCreateFinish({ + ...submitData, + commitId: this.commitId, + workRecords + }) + uni.hideLoading() uni.showToast({ title: '提交并结束任务成功', icon: 'success', duration: 1000 }) setTimeout(() => { @@ -973,24 +980,19 @@ export default { uni.hideLoading() if (Array.isArray(error)) return console.error('提交并结束失败', error) - const backendMsg = error && error.msg - if (this.commitId) { - uni.showToast({ - title: backendMsg ? `养护记录已提交:${backendMsg}` : '养护记录已提交,结束任务接口失败', - icon: 'none', duration: 2500 - }) - } else if (!backendMsg) { - uni.showToast({ title: '提交失败,请重试', icon: 'none', duration: 2000 }) - } + // 业务错误 request.js 已弹过后端 msg(如「当前养护计划状态不允许此操作」),这里不重复弹 + if (error && error.msg) return + uni.showToast({ title: '提交失败,请重试', icon: 'none', duration: 2000 }) } finally { this.submitting = false } }, /** - * 提交养护记录 —— 双写两条链路: - * ① maintain-plan-commit/create:养护计划本身(描述 + 图片 + 人员),返回 commit.id + * 暂存养护记录(按钮文案「暂存」)—— 双写两条链路: + * ① maintain-plan-commit/create:养护计划本身(描述 + 图片 + 人员),返回 commit.id;后端只建草稿,不计数 * ② work-record/submit:动态字段值,bizId 用 ① 的 commit.id(旧接口的 VO 没有动态字段,会被 Jackson 静默丢弃) + * 计数只在「提交并结束」或列表「结束任务」时推进,见 submitAndFinish * 重试安全:commitId 一旦取到就缓存住,重试只补写 ②(② 自身按 clientSeq 幂等),避免重复创建养护记录 */ async submitInspect() { @@ -1039,10 +1041,11 @@ export default { } } uni.hideLoading() - uni.showToast({ title: '提交成功', icon: 'success', duration: 1000 }) + // 后端 /create 只建草稿、不推进完成次数,必须再点「提交并结束」或在列表点「结束任务」才计数 + uni.showToast({ title: '已暂存,请记得结束本次养护', icon: 'none', duration: 1500 }) setTimeout(() => { uni.reLaunch({ url: '/pages-sub/daily/maintain-manage/index' }) - }, 1000) + }, 1500) } catch (error) { uni.hideLoading() // 表单校验失败时 error 是字段数组(uview-plus 已提示),不重复弹 diff --git a/pages-sub/daily/maintain-manage/finish-plan-detail.vue b/pages-sub/daily/maintain-manage/finish-plan-detail.vue index 1a0e52d..a202d2e 100644 --- a/pages-sub/daily/maintain-manage/finish-plan-detail.vue +++ b/pages-sub/daily/maintain-manage/finish-plan-detail.vue @@ -199,14 +199,18 @@ const previewImage = (currentUrl, allUrls) => { /** * 获取工单详情 */ -const getOrderDetail = async (planNo: string) => { +const getOrderDetail = async (planNo: string, commitId?: string) => { try { loading.value = true; - let queryData = { + // 后端 page 接口支持 commitId 精确过滤:从上报记录列表点「查看」时只展示这一条 + let queryData: any = { planNo: planNo, - pageSize: 100, + pageSize: commitId ? 1 : 100, pageNo: 1, }; + if (commitId) { + queryData.commitId = commitId; + } const res = await detailList(queryData); console.log('接口返回:', res); @@ -527,9 +531,9 @@ const openGeo = (geo) => { // 页面加载 onLoad((options) => { - const {planNo} = options; + const {planNo, commitId} = options; if (planNo) { - getOrderDetail(planNo); + getOrderDetail(planNo, commitId); } else { loading.value = false; uni.showToast({title: '缺少工单ID', icon: 'none'}); diff --git a/pages-sub/daily/maintain-manage/now-list-page.vue b/pages-sub/daily/maintain-manage/now-list-page.vue index b06b0e2..5713dff 100644 --- a/pages-sub/daily/maintain-manage/now-list-page.vue +++ b/pages-sub/daily/maintain-manage/now-list-page.vue @@ -7,7 +7,7 @@ - 【第{{ index+1 }}次上报】{{ item.planName }}{{ item.planName }} + 【第{{ item.sortNum || (index + 1) }}次上报】{{ item.planName }} 提交时间:{{ timeFormat(item.createTime,'yyyy-mm-dd')}} 查看 @@ -73,7 +73,8 @@ const getReportList = async () => { const handleView = (item) => { console.log('查看详情', item) uni.navigateTo({ - url: `/pages-sub/daily/maintain-manage/finish-plan-detail?planNo=${item.planNo}` + // 后端 page 接口支持 commitId 精确过滤,必须带上,否则会把该计划全部上报都展示出来 + url: `/pages-sub/daily/maintain-manage/finish-plan-detail?planNo=${item.planNo}&commitId=${item.commitId}` }) } // 新增上报记录,把planNo带到新增页面 diff --git a/pages-sub/daily/maintain-manage/type-list-page.vue b/pages-sub/daily/maintain-manage/type-list-page.vue index fef0130..31b2e42 100644 --- a/pages-sub/daily/maintain-manage/type-list-page.vue +++ b/pages-sub/daily/maintain-manage/type-list-page.vue @@ -23,7 +23,7 @@ - 任务次数:第{{ item.plannum || 1 }}次 + 任务次数:第{{ item.planNum || 1 }}次 去作业 @@ -70,7 +70,7 @@ import { ref, computed } from 'vue' import { onShow, onUnload, onLoad } from '@dcloudio/uni-app' import { useUserStore } from '@/pinia/user'; -import { maintainPlanNum, finishPlan, invalidatePlan } from "@/api/maintain-manage/maintain-manage"; +import { maintainPlanNum, maintainPlanList, finishPlan, invalidatePlan } from "@/api/maintain-manage/maintain-manage"; import { timeFormat } from '@/uni_modules/uview-plus'; import { useUploadImgs } from '@/common/utils/useUploadImgs' const userStore = useUserStore(); @@ -259,19 +259,33 @@ const confirmEndTask = async () => { uni.showLoading({ title: '提交中...', mask: true }) try { - // 接口 finishPlan,传 planNo - await finishPlan({ - planNo: item.planNo + // ① 后端 /finish 只认 commitId:先找该计划编码下进行中的本次养护(commitState=1) + const page = await maintainPlanList({ + planNo: item.planNo, + pageNo: 1, + pageSize: 50 }) + const draft = (page && page.list ? page.list : []).find((r: any) => Number(r.commitState) === 1) + if (!draft || !draft.commitId) { + uni.hideLoading() + uni.showToast({ title: '还没有上报记录,请先去作业提交', icon: 'none' }) + return + } + // ② 按 commitId 结束本次养护(后端要求本次养护至少有一条有效子上报) + await finishPlan({ commitId: draft.commitId }) + // 先关 loading 再弹提示:微信端 showLoading/showToast 共用同一个 toast,顺序反了会把成功提示顶掉 + uni.hideLoading() uni.showToast({ title: '结束任务成功', icon: 'success' }) // 操作成功,重新加载数据,刷新列表 await loadData() pagingRef.value?.reload() } catch (err) { console.error('结束任务失败', err) + uni.hideLoading() + // 业务错误 request.js 已弹过后端 msg,这里不重复弹 + if (err && err.msg) return uni.showToast({ title: '结束任务失败,请重试', icon: 'none' }) } finally { - uni.hideLoading() currentEndTaskItem.value = null } }