From 2ab727eb8a56077d9ad52112a9c8e97010b84b6d Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期一, 09 六月 2025 19:50:49 +0800 Subject: [PATCH] feat(eims): 优化保养计划和点检记录功能 --- eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStVo.java | 2 eims-ui-mobile/src/pages/maint/maint-order.vue | 60 ++++++++++- eims-ui-mobile/src/pages/maint/maint-st.vue | 89 ++++++++++++++--- eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java | 4 eims-ui-mobile/src/utils/RoleUtils.ts | 5 eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java | 2 eims-ui-mobile/src/pages/inspect/insp-record.vue | 53 +++++++++- eims-ui-mobile/src/pages/inspect/insp-st.vue | 48 +++++++-- 8 files changed, 216 insertions(+), 47 deletions(-) diff --git a/eims-ui-mobile/src/pages/inspect/insp-record.vue b/eims-ui-mobile/src/pages/inspect/insp-record.vue index 42d7841..c039bad 100644 --- a/eims-ui-mobile/src/pages/inspect/insp-record.vue +++ b/eims-ui-mobile/src/pages/inspect/insp-record.vue @@ -24,7 +24,7 @@ safeAreaInsetTop > <template #right> - <text v-if="isOperatorOrRepair()" class="text-white">鎻愪氦</text> + <text v-if="inspSt.status === '0'" class="text-white">鎻愪氦</text> </template> </wd-navbar> <wd-card type="rectangle"> @@ -61,9 +61,13 @@ </view> <view class="text-color-gray text-sm mt-2 flex"> <text>鐘舵�侊細</text> - <template v-if="dataCount > 0 && dataCount === checkCount"> + <template v-if="inspSt.status === '1'"> <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon> <text class="ml-1">宸插畬鎴�</text> + </template> + <template v-else-if="inspSt.status === '2'"> + <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon> + <text class="ml-1">宸茬‘璁�</text> </template> <template v-else> <wd-icon class="icon-color-base" name="detection" size="40rpx"></wd-icon> @@ -172,8 +176,9 @@ size="large" /> <!-- 鏂板鎻愪氦鎸夐挳 --> - <view class="flex justify-center mt-4"> - <wd-button type="primary" block size="large" @click="handleClickRight">鎻愪氦</wd-button> + <view class="flex justify-around mt-4"> + <wd-button type="primary" block size="large" v-if="inspSt.status === '0'" @click="handleClickRight">鎻愪氦</wd-button> + <wd-button type="success" block size="large" v-if="isLeader() && inspSt.status === '1'" @click="handleComplete">纭瀹屾垚</wd-button> </view> </view> </z-paging> @@ -217,6 +222,8 @@ specialNote: string runTimes: number faultTimes: number + verifyUser?: number | string + verifyTime?: string } const dataChange = ref(false) @@ -356,7 +363,11 @@ } function updateInspSt(resolve: any) { // 鏇存柊鐐规姹囨�� - inspSt.status = '1' + if (dataCount.value === selectedItems.value.length) { + inspSt.status = '1' + } else { + inspSt.status = '0' + } updateInspectSt(inspSt) .then((res: any) => { toast.success('鎿嶄綔鎴愬姛') @@ -371,6 +382,38 @@ } /** + * 纭瀹屾垚鎸夐挳鐐瑰嚮浜嬩欢 + */ +function handleComplete() { + if (!isLeader()) { + toast.info('鏃犳潈闄愭搷浣�'); + return; + } + const now = new Date(); + const data: any = Object.assign( + {}, + { + id: inspSt.id, + status: '2', + verifyUser: userStore?.userInfo?.userId, + verifyTime: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}` + }, + ) + updateInspectSt(data) + .then((res: any) => { + if (res?.code === 200) { + uni.$emit('insp-st-refresh') + goBack() + toast.success('鎿嶄綔鎴愬姛') + } + }) + .catch((res) => { + console.error(res) + toast.error('鎿嶄綔澶辫触') + }) +} + +/** * 鐐规璁板綍鏉$洰鐐瑰嚮浜嬩欢 * @param item */ diff --git a/eims-ui-mobile/src/pages/inspect/insp-st.vue b/eims-ui-mobile/src/pages/inspect/insp-st.vue index 0eb3a03..0ca9158 100644 --- a/eims-ui-mobile/src/pages/inspect/insp-st.vue +++ b/eims-ui-mobile/src/pages/inspect/insp-st.vue @@ -11,15 +11,11 @@ <template> <z-paging ref="paging" v-model="dataList" @query="queryList" show-refresher-update-time> <template #top> - <wd-drop-menu> - <wd-drop-menu-item v-model="viewMode" :options="viewModeList" @change="handleViewMode" /> - <wd-drop-menu-item - v-model="filterDate" - :options="filterDateList" - @change="handleFilterDate" - /> - <wd-drop-menu-item v-model="equName" :options="equList" @change="handleEquName" /> - </wd-drop-menu> + <wd-tabs v-model="activeTab" @change="handleTabChange"> + <wd-tab title="寰呯偣妫�"></wd-tab> + <wd-tab title="寰呯‘璁�"></wd-tab> + <wd-tab title="宸插畬鎴�"></wd-tab> + </wd-tabs> </template> <view class="bg-base"> <wd-card type="rectangle" v-for="(item, index) in dataList" :key="item.id"> @@ -40,7 +36,7 @@ </view> </view> </template> - <view class="flex h-[140rpx]" items-center> + <view class="flex h-[200rpx]" items-center> <image class="slot-img text-center" src="/static/images/camera.png" /> <view class="flex-1"> <view class="text-color-gray text-sm mt-1 flex"> @@ -57,9 +53,13 @@ </view> <view class="text-color-gray text-sm mt-2 flex"> <text>鐘舵�侊細</text> - <template v-if="item.recordCount === item.checkCount"> + <template v-if="item.status === '1'"> <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon> <text class="ml-1">宸插畬鎴�</text> + </template> + <template v-else-if="item.status === '2'"> + <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon> + <text class="ml-1">宸茬‘璁�</text> </template> <template v-else> <wd-icon class="icon-color-base" name="detection" size="40rpx"></wd-icon> @@ -76,13 +76,17 @@ </template> <script setup lang="ts"> -import { ref } from 'vue' import { getInspStList } from '@/service/inspect' import dayjs from 'dayjs' +// 鏍囩椤电浉鍏� +const activeTab = ref(0) // 榛樿閫変腑绗竴涓爣绛鹃〉锛堝緟鐐规锛� + +// 鍘熸湁鍙橀噺 const viewMode = ref<string>('Day') const equName = ref<string>('鎵�鏈夎澶�') const filterDate = ref<string>('1') +const status = ref<string>('0') // 榛樿涓哄緟鐐规鐘舵�� const viewModeList = ref<Record<string, any>[]>([ { label: '鏃ヨ鍥�', value: 'Day' }, @@ -94,6 +98,25 @@ ]) const equList = ref<Record<string, any>[]>([{ label: '鎵�鏈夎澶�', value: '鎵�鏈夎澶�' }]) + +// 鏍囩椤靛垏鎹㈠鐞嗗嚱鏁� +function handleTabChange({ index }) { + // 鏍规嵁鏍囩椤电储寮曡缃搴旂殑鐘舵�佸�� + if (index === 0) { + // 寰呯偣妫� + status.value = '0' + } else if (index === 1) { + // 寰呯‘璁� + status.value = '1' + } else if (index === 2) { + // 宸插畬鎴� + status.value = '2' + } + // 閲嶆柊鍔犺浇鏁版嵁 + reloadData() +} + +// 鍘熸湁鍑芥暟 function handleViewMode({ value }) { reloadData() } @@ -112,6 +135,7 @@ pageNum, pageSize, viewMode: viewMode.value, + status: status.value, // 娣诲姞鐘舵�佺瓫閫� } if (filterDate.value === '1') { params.planTime = dayjs().format('YYYY-MM-DD') diff --git a/eims-ui-mobile/src/pages/maint/maint-order.vue b/eims-ui-mobile/src/pages/maint/maint-order.vue index 88398ec..fe14b49 100644 --- a/eims-ui-mobile/src/pages/maint/maint-order.vue +++ b/eims-ui-mobile/src/pages/maint/maint-order.vue @@ -25,7 +25,7 @@ safeAreaInsetTop > <template #right> - <text v-if="isOperatorOrRepair()" class="text-white">鎻愪氦</text> + <text v-if="maintSt.status === '0'" class="text-white">鎻愪氦</text> </template> </wd-navbar> <wd-cell> @@ -48,7 +48,7 @@ </view> </view> </template> - <view class="flex h-[140rpx]" items-center> + <view class="flex" items-center> <image class="slot-img text-center" src="/static/images/camera.png" /> <view class="flex-1"> <view class="text-color-gray text-sm mt-1 flex"> @@ -60,14 +60,18 @@ <text class="mr-3">寰呬繚鍏�: {{ maintSt.dbyCount }}</text> | <text class="mx-3">淇濆吇涓�: {{ maintSt.byCount }}</text> - | - <text class="ml-3">寰呴獙璇�: {{ maintSt.dyzCount }}</text> +<!-- |--> +<!-- <text class="ml-3">寰呴獙璇�: {{ maintSt.dyzCount }}</text>--> </view> <view class="text-color-gray text-sm mt-2 flex"> <text>鐘舵�侊細</text> <template v-if="maintSt.status === '1'"> <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon> <text class="ml-1">宸插畬鎴�</text> + </template> + <template v-else-if="maintSt.status === '2'"> + <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon> + <text class="ml-1">宸茬‘璁�</text> </template> <template v-else> <wd-icon class="icon-color-base" name="detection" size="40rpx"></wd-icon> @@ -205,11 +209,16 @@ placeholder="璇疯緭鍏ョ壒璁颁簨椤�" clearable /> + <!-- 鏂板纭瀹屾垚鎸夐挳 --> + <view class="flex justify-around mt-4"> + <wd-button type="primary" block size="large" v-if="maintSt.status === '0'" @click="handleClickRight">鎻愪氦</wd-button> + <wd-button type="success" block size="large" v-if="isLeader() && maintSt.status === '1'" @click="handleComplete">纭瀹屾垚</wd-button> + </view> </view> <!-- 鏂板鎻愪氦鎸夐挳 --> - <view class="flex justify-center mt-4"> - <wd-button type="primary" block size="large" @click="handleClickRight">鎻愪氦</wd-button> - </view> +<!-- <view class="flex justify-center mt-4">--> +<!-- <wd-button type="primary" block size="large" @click="handleClickRight">鎻愪氦</wd-button>--> +<!-- </view>--> </z-paging> <!-- 澶囦欢閫夋嫨寮瑰嚭灞� --> @@ -340,7 +349,7 @@ } function loadSpareParts(value?: string) { - getSpareList({ name: value }).then((res: any) => { + getSpareList({ name: value, pageNum: 1, pageSize: 10 }).then((res: any) => { sparePartsList.value = res.rows }) @@ -498,7 +507,8 @@ .then((res: any) => { resolve(true) if (res?.code === 200) { - reloadData() + uni.$emit('maint-st-refresh') + goBack() toastSucces() } }) @@ -604,6 +614,38 @@ }); } +/** + * 纭瀹屾垚鎸夐挳鐐瑰嚮浜嬩欢 + */ +function handleComplete() { + if (!isLeader()) { + toast.info('鏃犳潈闄愭搷浣�'); + return; + } + const now = new Date(); + const data: any = Object.assign( + {}, + { + id: maintSt.id, + status: '2', + verifyUser: userStore?.userInfo?.userId , + verifyTime: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}` + }, + ) + updateMaintSt(data) + .then((res: any) => { + if (res?.code === 200) { + uni.$emit('maint-st-refresh') + goBack() + toastSucces() + } + }) + .catch((res) => { + console.error(res) + }) + +} + // 鏂板鏂规硶锛氳幏鍙栫姸鎬佹枃鏈� function getStatusText(maintFun: string): string { switch (maintFun) { diff --git a/eims-ui-mobile/src/pages/maint/maint-st.vue b/eims-ui-mobile/src/pages/maint/maint-st.vue index 6704e0b..4db3bdf 100644 --- a/eims-ui-mobile/src/pages/maint/maint-st.vue +++ b/eims-ui-mobile/src/pages/maint/maint-st.vue @@ -11,18 +11,19 @@ <template> <z-paging ref="paging" v-model="dataList" @query="queryList" show-refresher-update-time> <template #top> - <wd-drop-menu> - <wd-drop-menu-item v-model="equName" :options="equList" @change="handleEquName" /> - <wd-drop-menu-item - v-model="filterDate" - :options="filterDateList" - @change="handleFilterDate" - /> - <wd-drop-menu-item v-model="status" :options="statusList" @change="handleStatus" /> - </wd-drop-menu> + <wd-tabs v-model="activeTab" @change="handleTabChange"> + <wd-tab title="寰呬繚鍏�"></wd-tab> + <wd-tab title="寰呯‘璁�"></wd-tab> + <wd-tab title="宸插畬鎴�"></wd-tab> + </wd-tabs> </template> <view class="bg-base"> - <wd-card type="rectangle" v-for="(item, index) in dataList" :key="item.id"> + <wd-card + type="rectangle" + v-for="(item, index) in dataList" + :key="item.id" + :class="[getCardColorClass(item.planTime)]" + > <template #title> <view class="flex justify-between"> <view class="flex items-center menu-title-box"> @@ -40,7 +41,7 @@ </view> </view> </template> - <view class="flex h-[140rpx]" items-center> + <view class="flex" items-center> <image class="slot-img text-center" src="/static/images/camera.png" /> <view class="flex-1"> <view class="text-color-gray text-sm mt-1 flex"> @@ -52,14 +53,18 @@ <text class="mr-3">寰呬繚鍏�: {{ item.dbyCount }}</text> | <text class="mx-3">淇濆吇涓�: {{ item.byCount }}</text> - | - <text class="ml-3">寰呴獙璇�: {{ item.dyzCount }}</text> +<!-- |--> +<!-- <text class="ml-3">寰呴獙璇�: {{ item.dyzCount }}</text>--> </view> <view class="text-color-gray text-sm mt-2 flex"> <text>鐘舵�侊細</text> <template v-if="item.status === '1'"> <wd-icon class="icon-color-success" name="check-outline" size="34rpx"></wd-icon> <text class="ml-1">宸插畬鎴�</text> + </template> + <template v-else-if="item.status === '2'"> + <wd-icon class="icon-color-warning" name="check-outline" size="34rpx"></wd-icon> + <text class="ml-1">宸茬‘璁�</text> </template> <template v-else> <wd-icon class="icon-color-base" name="detection" size="40rpx"></wd-icon> @@ -76,7 +81,7 @@ </template> <script setup lang="ts"> -import { ref } from 'vue' +import { ref, computed } from 'vue' import { getMaintStList } from '@/service/maint' import dayjs from 'dayjs' @@ -99,12 +104,37 @@ params?: NonNullable<unknown> } +// 璁$畻宸ュ崟鍗$墖鐨勮儗鏅鑹茬被 +function getCardColorClass(planTime) { + if (!planTime) return '' + + const now = dayjs() + const planDate = dayjs(planTime) + const diffDays = planDate.diff(now, 'day') + + if (diffDays < 0) { + // 瓒呰繃璁″垝鏃堕棿锛岀孩鑹茶儗鏅� + return 'card-overdue' + } else if (diffDays <= 3) { + // 璺濈璁″垝鏃堕棿涓夊ぉ浠ュ唴锛岄粍鑹茶儗鏅� + return 'card-urgent' + } else { + // 姝e父鐘舵�侊紝鑳屾櫙棰滆壊涓嶅彉 + return '' + } +} + // 椤甸潰鍙傛暟锛屼笂涓〉闈紶閫掕繃鏉ョ殑鍙傛暟 const option = reactive<PageParams>({ assetNo: '', from: '', }) -const status = ref<string>('-1') + +// 鏍囩椤电浉鍏� +const activeTab = ref(0) // 榛樿閫変腑绗竴涓爣绛鹃〉锛堝緟淇濆吇锛� + +// 鍘熸湁鐘舵�� +const status = ref<string>('0') // 榛樿涓哄緟淇濆吇鐘舵�� const equName = ref<string>('-1') const filterDate = ref<string>('1') @@ -121,6 +151,25 @@ { label: '宸插畬鎴�', value: '3' }, ]) const equList = ref<Record<string, any>[]>([{ label: '鎵�鏈夎澶�', value: '-1' }]) + +// 鏍囩椤靛垏鎹㈠鐞嗗嚱鏁� +function handleTabChange({ index }) { + // 鏍规嵁鏍囩椤电储寮曡缃搴旂殑鐘舵�佸�� + if (index === 0) { + // 寰呬繚鍏� + status.value = '0' + } else if (index === 1) { + // 寰呯‘璁� + status.value = '1' + } else if (index === 2) { + // 宸插畬鎴� + status.value = '2' + } + // 閲嶆柊鍔犺浇鏁版嵁 + reloadData() +} + +// 鍘熸湁鍑芥暟 function handleStatus({ value }) {} function handleEquName({ value }) { console.log(value) @@ -185,6 +234,8 @@ function reloadData() { paging.value.reload() } + + onLoad((options) => { Object.assign(option, options) uni.$on('maint-st-refresh', reloadData) @@ -223,4 +274,12 @@ :deep(.wd-card__title-content) { padding: 24rpx 0 !important; } + +/* 宸ュ崟鍗$墖鑳屾櫙棰滆壊 */ +.card-urgent { + background-color: rgba(255, 204, 0, 0.1); /* 榛勮壊鑳屾櫙 */ +} +.card-overdue { + background-color: rgba(255, 0, 0, 0.1); /* 绾㈣壊鑳屾櫙 */ +} </style> diff --git a/eims-ui-mobile/src/utils/RoleUtils.ts b/eims-ui-mobile/src/utils/RoleUtils.ts index 3eac386..027a6fb 100644 --- a/eims-ui-mobile/src/utils/RoleUtils.ts +++ b/eims-ui-mobile/src/utils/RoleUtils.ts @@ -26,8 +26,9 @@ * 鐧诲綍瑙掕壊鏄搷浣滃伐鎴栫淮淇伐 */ export const isOperatorOrRepair = () => { - const roles = useUserStore()?.userInfo?.roles || [] - return roles.includes(ROLE_OPERATOR) || roles.includes(ROLE_REPAIR) + // const roles = useUserStore()?.userInfo?.roles || [] + // return roles.includes(ROLE_OPERATOR) || roles.includes(ROLE_REPAIR) + return true } /** diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java index cf189bb..287ef5c 100644 --- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/bo/EimsMaintPlanBo.java @@ -79,13 +79,13 @@ /** * 淇濆吇浜� */ - @NotNull(message = "淇濆吇浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "淇濆吇浜轰笉鑳戒负绌�", groups = { AddGroup.class, EditGroup.class }) private Long maintUser; /** * 淇濆吇閮ㄩ棬 */ - @NotNull(message = "淇濆吇閮ㄩ棬涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class }) +// @NotNull(message = "淇濆吇閮ㄩ棬涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class }) private Long maintDept; /** diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStVo.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStVo.java index 130b421..01b0efe 100644 --- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStVo.java +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/domain/vo/EimsMaintStVo.java @@ -57,7 +57,7 @@ * */ @ExcelProperty(value = "") - @JsonFormat(pattern = "yyyy-MM") + @JsonFormat(pattern = "yyyy-MM-dd") private Date planTime; /** *绋芥煡鏃ユ湡 diff --git a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java index 2e2b6af..ca5e691 100644 --- a/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java +++ b/eims/ruoyi-modules/lb-eims/src/main/java/org/dromara/eims/job/MaintPlanToOrderJob.java @@ -57,7 +57,7 @@ Date oldNext = planVo.getMaintNextTime(); int day = DateUtils.differentDays(today, oldNext); // 濡傛灉璁″垝鐢熸垚宸ュ崟鏃ユ湡澶т簬浠婂ぉ鍒欎笉鐢熸垚宸ュ崟 - if (day >= 1) { + if (day >= 10) { continue; } -- Gitblit v1.9.3