From f29e2aae98bbb52672b67bff99556f3cf64d1bce Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期四, 26 六月 2025 15:45:40 +0800 Subject: [PATCH] feat(eims): 优化设备管理功能和界面 --- eims-ui-mobile/src/pages/maint/maint-st.vue | 209 ++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 169 insertions(+), 40 deletions(-) diff --git a/eims-ui-mobile/src/pages/maint/maint-st.vue b/eims-ui-mobile/src/pages/maint/maint-st.vue index 4104498..26848fd 100644 --- a/eims-ui-mobile/src/pages/maint/maint-st.vue +++ b/eims-ui-mobile/src/pages/maint/maint-st.vue @@ -1,6 +1,7 @@ <route lang="json5" type="page"> { layout: 'default', + needLogin: true, style: { navigationBarTitleText: '淇濆吇姹囨��', }, @@ -10,49 +11,67 @@ <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="status" :options="statusList" @change="handleStatus" /> - </wd-drop-menu> - <wd-divider></wd-divider> + <!-- 澧炲姞涓�涓悳绱㈡爮 --> + <wd-search v-model="searchValue" @search="handleSearch"> + <template #right-icon> + <wd-icon name="scan" size="34rpx"></wd-icon> + </template> + </wd-search> + <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"> - <view class="w-full h-[24rpx]"></view> - <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"> <view class="menu-indicator"></view> - <view class="ml-1 text-sm align-center">{{ item.equName }}</view> + <view class="ml-1 text-sm align-center w-[50%]"> + <wd-text :text="item.equName" :lines="1"></wd-text> + </view> <view class="text-color-gray ml-2 text-mini">{{ item.assetNo }}</view> </view> - <view class="flex items-center"> + <view class="flex items-center w-[20%] justify-end"> <text class="text-color-gray text-mini"> - {{ status === 'Day' ? item?.planTimeStr : item?.planTimeStr?.substring(0, 7) || '' }} + {{ item?.planTime }} </text> </view> </view> </template> - <view class="flex h-[100rpx]" 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-xs mt-1 flex"> - <text class="mr-3">鐐规鎬绘暟: {{ item.recordCount }}</text> + <view class="text-color-gray text-sm mt-1 flex"> + <text class="mr-3">鎬绘暟: {{ item.orderCount }}</text> | - <text class="mx-3">宸茬偣妫�: {{ item.checkCount }}</text> + <text class="mx-3">宸插畬鎴�: {{ item.dyzCount }}</text> | - <text class="ml-3">鏈偣妫�: {{ item.unCheckCount }}</text> + <text class="mx-3">寰呬繚鍏�: {{ item.dbyCount }}</text> </view> - <view class="text-color-gray text-xs mt-2 flex"> - <text class="mr-3">姝e父: {{ item.normalNum }}</text> - | - <text class="mx-3">寮傚父: {{ item.abNormalNum }}</text> - </view> - <view class="text-color-gray text-xs mt-2 flex"> +<!-- <view class="text-color-gray text-sm mt-2 flex">--> +<!-- <text class="mr-3">寰呬繚鍏�: {{ item.dbyCount }}</text>--> +<!-- |--> +<!--<!– <text class="mx-3">淇濆吇涓�: {{ item.byCount }}</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.recordCount === item.checkCount"> - <wd-icon class="icon-color-success" name="check-outline" size="40rpx"></wd-icon> + <template v-if="item.status === '1'"> + <wd-icon class="icon-color-warning" 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-success" name="check-outline" size="34rpx"></wd-icon> <text class="ml-1">宸插畬鎴�</text> </template> <template v-else> @@ -60,6 +79,7 @@ <text class="ml-1">杩涜涓�</text> </template> </view> + <view class="text-color-gray text-sm mt-2 flex">鍒涘缓鏃堕棿: {{ item.createTime }}</view> </view> <wd-button size="small" icon="edit-outline" @click.stop="itemClick(item)">鏄庣粏</wd-button> </view> @@ -69,30 +89,109 @@ </template> <script setup lang="ts"> -import { ref } from 'vue' +import { ref, computed } from 'vue' import { getMaintStList } from '@/service/maint' +import dayjs from 'dayjs' +const searchValue = ref<string>('') +/** + * 鍏朵粬椤甸潰浼犺繃鏉ョ殑鏁版嵁 + * assetNo: 璧勪骇缂栧彿 + * from: 鏄惁鏄壂鐮佽繘鏉ョ殑锛屽鏋滄槸鎵爜杩涙潵锛屽彧鑳芥煡璇㈠浐瀹氳澶囩殑鏁版嵁 + */ +interface PageParams { + assetNo?: string + from?: string +} interface QueryParams { pageNum: number pageSize: number + assetNo?: string equName?: string status?: string + params?: NonNullable<unknown> } -const status = ref<string>('-1') +// 璁$畻宸ュ崟鍗$墖鐨勮儗鏅鑹茬被 +function getCardColorClass(planTime) { + if (!planTime) return '' + + const now = dayjs() + const planDate = dayjs(planTime) + + // 鑾峰彇璁″垝鏃ユ湡鎵�鍦ㄦ湀浠界殑鏈�鍚庝竴澶� + const planMonthEnd = planDate.endOf('month') + + // 璁$畻褰撳墠鏃ユ湡涓庤鍒掓湀鏈堝簳鐨勫樊鍊硷紙澶╂暟锛� + const diffDays = planMonthEnd.diff(now, 'day') + + if (diffDays < 0) { + // 宸茬粡杩囦簡璁″垝鏈堢殑鏈堝簳锛岀孩鑹茶儗鏅� + return 'card-overdue' + } else if (diffDays <= 3) { + // 璺濈璁″垝鏈堟湀搴�3澶╀互鍐咃紝绾㈣壊鑳屾櫙 + return 'card-overdue' + } else if (diffDays <= 10) { + // 璺濈璁″垝鏈堟湀搴�10澶╀互鍐咃紝榛勮壊鑳屾櫙 + return 'card-urgent' + } else { + // 姝e父鐘舵�侊紝鑳屾櫙棰滆壊涓嶅彉 + return '' + } +} + +// 椤甸潰鍙傛暟锛屼笂涓〉闈紶閫掕繃鏉ョ殑鍙傛暟 +const option = reactive<PageParams>({ + assetNo: '', + from: '', +}) + +// 鏍囩椤电浉鍏� +const activeTab = ref(0) // 榛樿閫変腑绗竴涓爣绛鹃〉锛堝緟淇濆吇锛� + +// 鍘熸湁鐘舵�� +const status = ref<string>('0') // 榛樿涓哄緟淇濆吇鐘舵�� const equName = ref<string>('-1') +const filterDate = ref<string>('0') + +const filterDateList = ref<Record<string, any>[]>([ + { label: '鎵�鏈夋暟鎹�', value: '0' }, + { label: '褰撴湀鏁版嵁', value: '1' }, +]) const statusList = ref<Record<string, any>[]>([ - { label: '鍏ㄩ儴', value: '-1' }, + { label: '鎵�鏈夌姸鎬�', value: '-1' }, { label: '寰呬繚鍏�', value: '0' }, { label: '淇濆吇涓�', value: '1' }, { label: '寰呴獙璇�', value: '2' }, { 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) +} +function handleFilterDate({ value }) { + reloadData() } const paging = ref(null) @@ -101,23 +200,39 @@ const queryList = (pageNum?: number, pageSize?: number) => { // 杩欓噷鐨刾ageNo鍜宲ageSize浼氳嚜鍔ㄨ绠楀ソ锛岀洿鎺ヤ紶缁欐湇鍔″櫒鍗冲彲 // 杩欓噷鐨勮姹傚彧鏄紨绀猴紝璇锋浛鎹㈡垚鑷繁鐨勯」鐩殑缃戠粶璇锋眰锛屽苟鍦ㄧ綉缁滆姹傚洖璋冧腑閫氳繃paging.value.complete(璇锋眰鍥炴潵鐨勬暟缁�)灏嗚姹傜粨鏋滀紶缁檢-paging - const params: QueryParams = { + const queryParams: QueryParams = { pageNum, pageSize, equName: equName.value, status: status.value, + params: {}, } - if (equName.value === '-1') { - delete params.equName - } - if (status.value === '-1') { - delete params.status + if (filterDate.value === '1') { + // 鑾峰彇褰撳墠鏃ユ湡 + const now = dayjs() + queryParams.params = { + beginPlanTime: now.startOf('month').format('YYYY-MM-DD 00:00:00'), + endPlanTime: now.endOf('month').format('YYYY-MM-DD 23:59:59'), + } + } else { + queryParams.params = {} } - getMaintStList(params) + if (equName.value === '-1') { + delete queryParams.equName + } + if (status.value === '-1') { + delete queryParams.status + } + // 濡傛灉鏄粠鎵爜椤甸潰杩囨潵锛屽彧鑳芥煡璇㈠浐瀹氳澶囩殑鏁版嵁 + if (option?.from === 'scan') { + queryParams.assetNo = option.assetNo + } + queryParams.params.searchValue = searchValue.value + getMaintStList(queryParams) .then((res: any) => { // 璇峰嬁鍦ㄧ綉缁滆姹傚洖璋冧腑缁檇ataList璧嬪�硷紒锛佸彧闇�瑕佽皟鐢╟omplete灏卞彲浠ヤ簡 - paging.value.complete(res.rows) + paging.value.completeByTotal(res.rows, res.total) }) .catch((res) => { // 濡傛灉璇锋眰澶辫触鍐檖aging.value.complete(false)锛屼細鑷姩灞曠ず閿欒椤甸潰 @@ -128,21 +243,27 @@ } function itemClick(item) { - const inspCode = `${item.equId}_${item.planTime}_${status.value}` uni.navigateTo({ - url: `/pages/inspect/insp-record?id=${item.id}&inspCode=${inspCode}&specialNote=${item.specialNote ?? ''}&equName=${item.equName ?? ''}&assetNo=${item.assetNo ?? ''}&planTimeStr=${item.planTimeStr ?? ''}`, + url: `/pages/maint/maint-order?id=${item.id}`, }) +} + +function handleSearch () { + console.log('handleSearch') + paging.value.reload() } function reloadData() { paging.value.reload() } -onLoad(() => { - queryList() + + +onLoad((options) => { + Object.assign(option, options) uni.$on('maint-st-refresh', reloadData) }) onUnload(() => { - uni.$off('maint-st-refres', reloadData) + uni.$off('maint-st-refresh', reloadData) }) </script> @@ -160,7 +281,7 @@ height: 40rpx; } .text-mini { - font-size: 22rpx; + font-size: 24rpx; } .menu-indicator { @@ -175,4 +296,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> -- Gitblit v1.9.3