工单分配,维修人员,报修详情

This commit is contained in:
Zy
2026-05-21 10:55:27 +08:00
parent 5d0819183e
commit ac9379ab8a
14 changed files with 333 additions and 182 deletions

View File

@@ -3,7 +3,7 @@
* @Author: Zy * @Author: Zy
* @Date: 2026-05-19 16:29:20 * @Date: 2026-05-19 16:29:20
* @LastEditor: Zy * @LastEditor: Zy
* @LastEditTime: 2026-05-20 08:36:23 * @LastEditTime: 2026-05-20 10:45:01
*/ */
import request, { import request, {
get, get,
@@ -104,3 +104,30 @@ export function getTicketMainById(id) {
export function ticketComputed(data) { export function ticketComputed(data) {
return put('/manage/repair/order', filterParams(data)) return put('/manage/repair/order', filterParams(data))
} }
/**
* @description: 获取工单大厅 工单列表
* @param {RequestParams<{
* problemStatus:1|2
* }>} data
* @return { Promise<RowsResult<myOrderListType>>}
*/
export function getTicketHallList(data) {
return get('/manage/repair/order/orderlist', filterParams(data))
}
/**
* @description: 分配 维修人员 - 维修工单
* @param {*} data
* @return
*/
export function shareRepairUser(data) {
return post('/manage/repair/order/allocate', filterParams(data))
}

View File

@@ -34,7 +34,6 @@
/** /**
* 【全局】角色标识枚举 * 【全局】角色标识枚举
* @typedef {'manage'|'repair'|'inspection'|'EquipmentMaintenance'|'complainUser'} RoleKeyEnum * @typedef {'manage'|'repair'|'inspection'|'EquipmentMaintenance'|'complainUser'} RoleKeyEnum
*
* @enum {RoleKeyEnum} * @enum {RoleKeyEnum}
* @property {'manage'} manage - 物业管理员 * @property {'manage'} manage - 物业管理员
* @property {'repair'} repair - 小区维修人员 * @property {'repair'} repair - 小区维修人员

View File

@@ -4,6 +4,7 @@
<!-- 状态筛选标签 --> <!-- 状态筛选标签 -->
<TabsComponents <TabsComponents
:showBottomLine="false" :showBottomLine="false"
:activeValue="activeStatus"
:tabslist="statusTabs" :tabslist="statusTabs"
@update="switchStatus" @update="switchStatus"
></TabsComponents> ></TabsComponents>
@@ -125,9 +126,15 @@ function init() {
} }
onShow(() => { onShow(() => {
resetList()
})
function resetList() {
list.value = []
querySearch.value.pageNum = 1
querySearch.value.pageSize = 10
hasMore.value = true hasMore.value = true
init() init()
}) }
// actions // actions
function handleComplaint(id: string) { function handleComplaint(id: string) {

View File

@@ -66,12 +66,19 @@ function handleBlur(e) {
// 处理投诉 提交 // 处理投诉 提交
function handleSelecthouse() { function handleSelecthouse() {
putComplainProcess({ if (checkoutinfo.value.userId) {
id: form.value.complaintId, putComplainProcess({
handleContent: form.value.handleContent id: form.value.complaintId,
}).then(() => { handleContent: form.value.handleContent
uni.navigateBack() }).then(() => {
}) uni.navigateBack()
})
} else {
uni.showToast({
icon: 'error',
title: '选择处理人员'
})
}
} }
</script> </script>

View File

@@ -6,17 +6,19 @@
<view <view
@click="handleClick" @click="handleClick"
class="search_view flex-center" class="search_view flex-center"
v-if="!queryParmas.value.trim() && Searching" v-if="!queryParmas.keyword.trim() && Searching"
> >
<uni-icons type="search" size="34rpx" color="rgba(0,0,0,0.26)"></uni-icons> <uni-icons type="search" size="34rpx" color="rgba(0,0,0,0.26)"></uni-icons>
<text>请输入关键字进行搜索</text> <text>请输入关键字进行搜索</text>
</view> </view>
<uni-easyinput <uni-easyinput
@blur="handleInput" @blur="handleInput"
@change="handleSearch" @confirm="handleSearch"
@clear="handleClear"
@input="handleClear"
:focus="true" :focus="true"
ref="inputRef" ref="inputRef"
v-model="queryParmas.value" v-model="queryParmas.keyword"
v-else v-else
/> />
</view> </view>
@@ -67,6 +69,7 @@
import { ref, onMounted, getCurrentInstance } from 'vue' import { ref, onMounted, getCurrentInstance } from 'vue'
import { getSystemUsers_employee } from '@/api/common.js' import { getSystemUsers_employee } from '@/api/common.js'
import navBar from '@/components/navbar/navbar.vue' import navBar from '@/components/navbar/navbar.vue'
import { onShow } from '@dcloudio/uni-app'
let eventChannel = null let eventChannel = null
onMounted(() => { onMounted(() => {
@@ -81,11 +84,27 @@ function handleClick() {
} }
/** 判断 失去焦点时 切换回 view */ /** 判断 失去焦点时 切换回 view */
function handleInput() { function handleInput() {
if (queryParmas.value.value.trim()) { if (queryParmas.value.keyword.trim()) {
Searching.value = true Searching.value = true
resetList()
} else {
queryParmas.value.keyword = ''
Searching.value = false
resetList()
}
}
function handleSearch() {
if (queryParmas.value.keyword.trim()) {
resetList()
}
}
function handleClear() {
if (queryParmas.value.keyword.trim() === '') {
queryParmas.value.keyword = ''
Searching.value = true
resetList()
} }
} }
function handleSearch() {}
// ----------------------------------------- // -----------------------------------------
/* 选择列表 */ /* 选择列表 */
const searchlist = ref([]) const searchlist = ref([])
@@ -93,19 +112,10 @@ const searchlist = ref([])
const queryParmas = ref({ const queryParmas = ref({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
value: '' keyword: ''
}) })
const isLoading = ref(false) // 加载锁 const isLoading = ref(false) // 加载锁
const hasMore = ref(true) // 是否还有更多数据
const total = ref(21)
function scrolltolower() {
// 必须加这两个判断!
if (isLoading.value || !hasMore.value) {
return
}
queryParmas.value.pageNum += 1
getlist()
}
function getlist() { function getlist() {
// 2. 开启锁 // 2. 开启锁
if (isLoading.value) { if (isLoading.value) {
@@ -116,7 +126,7 @@ function getlist() {
title: '加载中', title: '加载中',
mask: true mask: true
}) })
getSystemUsers_employee('complainUser', queryParmas.value.value) getSystemUsers_employee('complainUser', queryParmas.value.keyword)
.then(res => { .then(res => {
searchlist.value = res.data searchlist.value = res.data
}) })
@@ -125,8 +135,15 @@ function getlist() {
uni.hideLoading() uni.hideLoading()
}) })
} }
getlist() onShow(() => {
getlist()
})
function resetList() {
searchlist.value = []
queryParmas.value.pageNum = 1
getlist()
}
//======================= //=======================
// 选中的人员id // 选中的人员id
const checkoutUserid = ref(null) const checkoutUserid = ref(null)

View File

@@ -3,7 +3,11 @@
<view class="page_padding"> <view class="page_padding">
<view class="inspection_record_box flex-1 flex flex-col"> <view class="inspection_record_box flex-1 flex flex-col">
<navBar @clickLeft="navBack" title="巡检记录"></navBar> <navBar @clickLeft="navBack" title="巡检记录"></navBar>
<TabsComponents :tabslist="tabslist" @update="handleChangeTabs"></TabsComponents> <TabsComponents
:activeValue="activeValue"
:tabslist="tabslist"
@update="handleChangeTabs"
></TabsComponents>
<view class="timebox"> <view class="timebox">
<view class="daybox flex items-center"> <view class="daybox flex items-center">
<uni-datetime-picker <uni-datetime-picker
@@ -87,6 +91,7 @@ const tabslist = [
value: 1 value: 1
} }
] ]
const activeValue = ref(2)
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@@ -167,6 +172,7 @@ function scrolltolower() {
} }
function handleChangeTabs(val: number) { function handleChangeTabs(val: number) {
activeValue.value = val
hasMore.value = true hasMore.value = true
queryParmas.value.status = val queryParmas.value.status = val
queryParmas.value.pageNum = 1 queryParmas.value.pageNum = 1
@@ -182,8 +188,17 @@ function init() {
onShow(() => { onShow(() => {
hasMore.value = true hasMore.value = true
init() resetList()
}) })
function resetList() {
list.value = []
queryParmas.value.status = 2
queryParmas.value.pageSize = 10
queryParmas.value.pageSize = 10
hasMore.value = true
init()
}
// 返回上一页 // 返回上一页
const navBack = () => { const navBack = () => {
uni.navigateBack() uni.navigateBack()

View File

@@ -2,7 +2,11 @@
<view class="page_padding"> <view class="page_padding">
<view class="today_inspection_page flex flex-col"> <view class="today_inspection_page flex flex-col">
<!-- 状态筛选标签 --> <!-- 状态筛选标签 -->
<TabsComponents :tabslist="tabslist" @update="handleTabs"></TabsComponents> <TabsComponents
:activeValue="activeValue"
:tabslist="tabslist"
@update="handleTabs"
></TabsComponents>
<!-- body --> <!-- body -->
<view class="inspection_body flex-1" v-if="list.length > 0"> <view class="inspection_body flex-1" v-if="list.length > 0">
<view <view

View File

@@ -56,6 +56,7 @@
<script setup> <script setup>
import { ref, getCurrentInstance, onMounted } from 'vue' import { ref, getCurrentInstance, onMounted } from 'vue'
import { getVillageHouseList_keyword } from '@/api/common.js' import { getVillageHouseList_keyword } from '@/api/common.js'
import { onShow } from '@dcloudio/uni-app'
const Searching = ref(true) const Searching = ref(true)
const queryParmas = ref({ const queryParmas = ref({
@@ -139,7 +140,10 @@ function getlist() {
uni.hideLoading() uni.hideLoading()
}) })
} }
getlist()
onShow(() => {
resetList()
})
// 重置list // 重置list
function resetList() { function resetList() {

View File

@@ -5,7 +5,11 @@
<view class="line"></view> <view class="line"></view>
<text class="title">仪表换新记录</text> <text class="title">仪表换新记录</text>
</view> </view>
<TabsComponents :tabslist="tabslist" @update="handleChangeTabs"></TabsComponents> <TabsComponents
:activeValue="activeValue"
:tabslist="tabslist"
@update="handleChangeTabs"
></TabsComponents>
<view class="instrument_body flex-1 flex"> <view class="instrument_body flex-1 flex">
<scroll-view scroll-y lower-threshold="160" @scrolltolower="scrolltolower"> <scroll-view scroll-y lower-threshold="160" @scrolltolower="scrolltolower">
<view <view
@@ -75,10 +79,11 @@ const tabslist = [
value: 1 value: 1
} }
] ]
const activeValue = ref(0)
// 切换tabs // 切换tabs
function handleChangeTabs(val: number) { function handleChangeTabs(val: number) {
queryParmas.value.deviceType = val queryParmas.value.deviceType = val
activeValue.value = val
if (val === 0) { if (val === 0) {
queryParmas.value.deviceType = undefined queryParmas.value.deviceType = undefined
} }
@@ -132,9 +137,7 @@ function getlist() {
}) })
} }
onShow(() => { onShow(() => {
infolist.value = [] resetList()
hasMore.value = true
getlist()
}) })
// 重置 // 重置

View File

@@ -7,6 +7,7 @@
<!-- 状态筛选标签 --> <!-- 状态筛选标签 -->
<TabsComponents <TabsComponents
:tabslist="statusTabs" :tabslist="statusTabs"
:activeValue="activeStatus"
:options="{ label: 'label', value: 'value' }" :options="{ label: 'label', value: 'value' }"
@update="switchStatus" @update="switchStatus"
></TabsComponents> ></TabsComponents>
@@ -40,49 +41,50 @@
> >
<!-- 标题 + 状态标签 --> <!-- 标题 + 状态标签 -->
<view class="card-header"> <view class="card-header">
<text class="card-title">{{ record.title }}</text> <text class="card-title">{{ record.item }}</text>
<view <view
class="status-tag" class="status-tag"
:class="{ :class="{
pending: record.repairStatus === 0, pending: record.problemStatus === statusMap.pending,
processing: record.repairStatus === 1, processing: record.problemStatus === statusMap.processing,
completed: record.repairStatus === 2 completed: record.problemStatus === statusMap.completed
}" }"
> >
{{ getStatusText(record.repairStatus) }} {{ getStatusText(record.problemStatus) }}
</view> </view>
</view> </view>
<!-- 类型标签 --> <!-- 类型标签 -->
<view class="tag-group"> <view class="tag-group" v-if="record.maintenanceItemName || record.projectTypeStr">
<view class="tag-item">{{ record.reportType }}</view> <view class="tag-item" v-if="record.projectTypeStr">{{ record.projectTypeStr }}</view>
<view class="tag-item">{{ record.category }}</view> <view class="tag-item" v-if="record.maintenanceItemName">{{
record.maintenanceItemName
}}</view>
</view> </view>
<!-- 内容 --> <!-- 内容 -->
<view class="card-content"> <view class="card-content">
{{ record.content }} {{ record.problem }}
</view> </view>
<!-- 工单图片 --> <!-- 工单图片 -->
<view class="card-image" v-if="record.images.length > 0"> <view class="card-image" v-if="record.repairImageUrlList.length > 0">
<image <image
lazy-load lazy-load
v-for="(item, index) in record.images" v-for="(item, index) in record.repairImageUrlList"
:key="index" :key="index"
:src="item" :src="item"
class="images" class="images"
mode="scaleToFill" mode="scaleToFill"
@tap="handlePrivew(record.images)"
></image> ></image>
</view> </view>
<!-- 底部信息 --> <!-- 底部信息 -->
<view class="card-footer"> <view class="card-footer">
<text class="create-time">{{ record.createTime }}</text> <text class="create-time">{{ record.createTime }}</text>
<text v-if="record.repairStatus === 1" class="repairman" <text v-if="record.problemStatus === statusMap.processing" class="repairman"
>维修师傅:{{ record.repairman }}</text >维修师傅:{{ record.repairName }}</text
> >
<view class="share" v-if="record.repairStatus === 0"> <view class="share" v-if="record.problemStatus === statusMap.pending">
<text>分配</text> <text>分配</text>
</view> </view>
</view> </view>
@@ -94,41 +96,44 @@
<script setup> <script setup>
import { ref, computed, nextTick } from 'vue' import { ref, computed, nextTick } from 'vue'
import { onReady } from '@dcloudio/uni-app' import { onReady, onShow } from '@dcloudio/uni-app'
import TabsComponents from '@/components/tabs/tabs.vue' import TabsComponents from '@/components/tabs/tabs.vue'
import NavBar from '@/components/navbar/navbar.vue' import NavBar from '@/components/navbar/navbar.vue'
import { getTicketHallList } from '@/api/ticket.js'
// 导航栏/标签高度(适配不同设备) // 导航栏/标签高度(适配不同设备)
// 筛选状态 // 筛选状态
const activeStatus = ref('0') // 全部/待分配/待解决/已完成 const activeStatus = ref(-1) // 全部/待分配/待解决/已完成
const activeType = ref('all') // 全部/公共报修/个人报修 const activeType = ref(-1) // 全部/公共报修/个人报修
// 0 已提交 1已分配 2维修完成
// 状态筛选选项 // 状态筛选选项
const statusTabs = ref([ const statusTabs = ref([
{ label: '全部', value: 0 }, { label: '全部', value: -1 },
{ label: '待分配', value: 1 }, { label: '待分配', value: 0 },
{ label: '待解决', value: 2 }, { label: '待解决', value: 1 },
{ label: '已完成', value: 3 } { label: '已完成', value: 2 }
]) ])
// 类型筛选选项 // 类型筛选选项
const typeTabs = ref([ const typeTabs = ref([
{ label: '全部', value: 'all' }, { label: '全部', value: -1 },
{ label: '公共报修', value: 'public' }, { label: '公共报修', value: 0 },
{ label: '个人报修', value: 'private' } { label: '个人报修', value: 1 }
]) ])
// 模拟上报记录数据(实际项目替换为接口请求) // 模拟上报记录数据(实际项目替换为接口请求)
const reportRecords = ref([]) const reportRecords = ref([])
const queryParmas = ref({ const queryParmas = ref({
pageNum: 1, pageNum: 1,
pageSize: 5 pageSize: 5,
itemType: undefined, // -1 全部/ 0 公共报修/ 1 个人报修
problemStatus: undefined // 0 已提交 1已分配 2维修完成
}) })
const isLoading = ref(false) // 加载锁 const isLoading = ref(false) // 加载锁
const hasMore = ref(true) // 是否还有更多数据 const hasMore = ref(true) // 是否还有更多数据
const total = ref(21) const total = ref(0)
function scrolltolower() { function scrolltolower() {
// 必须加这两个判断! // 必须加这两个判断!
if (isLoading.value || !hasMore.value) { if (isLoading.value || !hasMore.value) {
@@ -137,68 +142,85 @@ function scrolltolower() {
queryParmas.value.pageNum += 1 queryParmas.value.pageNum += 1
getlist() getlist()
} }
function getlist() { function getlist() {
// 1. 如果正在加载或没有更多数据,直接返回
if (isLoading.value || !hasMore.value) return if (isLoading.value || !hasMore.value) return
// 2. 开启锁
isLoading.value = true isLoading.value = true
uni.showLoading({ uni.showLoading({
title: '加载中', title: '加载中',
mask: true mask: true
}) })
const { pageNum, pageSize } = queryParmas.value getTicketHallList(queryParmas.value)
.then(res => {
const startId = (pageNum - 1) * pageSize + 1 reportRecords.value = [...reportRecords.value, ...res.rows]
const arr = Array.from({ length: pageSize }).map((_, index) => { reportRecords.value.forEach(item => {
const realId = startId + index // ✅ 修复 ID 错误 item.repairImageUrlList = item.repairImageUrl
? item.repairImageUrl.split(',').filter(item => item)
// ✅ 随机生成 0、1、2 : []
const randomStatus = Math.floor(Math.random() * 3) })
return { total.value = res.total
id: realId, hasMore.value = reportRecords.value.length < total.value
title: '标题巴拉巴拉巴拉' + startId + 1, })
status: 'completed', .catch(err => {
reportType: '公共报修', uni.showToast({
category: '路灯', icon: 'error',
content: '1栋楼下道路路灯不亮,并且有的亮度不够,请物业公司及时更换,防止发生意外事故。', title: '网络错误'
createTime: '2026-08-01 10:05:46', })
images: ['https://picsum.photos/93', 'https://picsum.photos/93', 'https://picsum.photos/93'], })
repairman: '张三', .finally(() => {
repairStatus: randomStatus // 0 待分配,1待解决 2已完成 isLoading.value = false
} uni.hideLoading()
}) })
// 追加数据(正确方式)
reportRecords.value = [...reportRecords.value, ...arr]
// 判断是否还有更多
hasMore.value = reportRecords.value.length < total.value
isLoading.value = false
uni.hideLoading()
} }
getlist()
onShow(() => {
resetList()
})
function resetList() { function resetList() {
reportRecords.value = [] reportRecords.value = []
queryParmas.value.pageNum = 1 queryParmas.value.pageNum = 1
queryParmas.value.pageSize = 5
hasMore.value = true hasMore.value = true
getlist() getlist()
} }
// 切换状态(全部/待分配/待解决/已完成)筛选 // 切换状态(全部/待分配/待解决/已完成)筛选
const switchStatus = value => { const switchStatus = value => {
activeStatus.value = value activeStatus.value = value
if (value === -1) {
queryParmas.value.problemStatus = undefined
} else {
queryParmas.value.problemStatus = value
}
resetList() resetList()
} }
// 切换类型(公共/个人)筛选 // 切换类型(公共/个人)筛选
const switchType = value => { const switchType = value => {
activeType.value = value activeType.value = value
if (value === -1) {
queryParmas.value.itemType = undefined
} else {
queryParmas.value.itemType = value
}
resetList() resetList()
} }
const statusMap = ['待分配', '待解决', '已完成'] const statusMap = {
已提交: '待分配',
已分配: '待解决',
已完成: '已完成',
pending: '已提交',
processing: '已分配',
completed: '已完成'
}
// 获取状态文本 // 获取状态文本
const getStatusText = status => { const getStatusText = status => {
return statusMap[status] || '' return statusMap[status] || ''
} }
// 返回上一页 // 返回上一页
const navBack = () => { const navBack = () => {
uni.navigateBack() uni.navigateBack()
@@ -334,10 +356,11 @@ function handlePrivew(imgs) {
.card-title { .card-title {
margin-right: 20rpx; margin-right: 20rpx;
font-weight: 450;
font-size: 32rpx; font-weight: 400;
color: #222222; color: #222222;
line-height: 40rpx; line-height: 40rpx;
font-size: 32rpx;
} }
/* 状态标签 */ /* 状态标签 */
@@ -389,11 +412,11 @@ function handlePrivew(imgs) {
/* 内容 */ /* 内容 */
.card-content { .card-content {
margin-bottom: 20rpx; margin-bottom: 20rpx;
font-weight: 450; letter-spacing: 2rpx;
font-weight: 400;
font-size: 28rpx; font-size: 28rpx;
color: #666666; color: #666666;
line-height: 40rpx; line-height: 40rpx;
letter-spacing: 2rpx;
} }
/* 图片 */ /* 图片 */
.card-image { .card-image {
@@ -417,6 +440,12 @@ function handlePrivew(imgs) {
font-size: 28rpx; font-size: 28rpx;
color: #999; color: #999;
} }
.create-time {
font-weight: 400;
font-size: 28rpx;
color: #999999;
line-height: 40rpx;
}
.share { .share {
width: 127rpx; width: 127rpx;
height: 44rpx; height: 44rpx;
@@ -431,6 +460,9 @@ function handlePrivew(imgs) {
} }
.repairman { .repairman {
color: #999; font-weight: 400;
font-size: 28rpx;
color: #999999;
line-height: 40rpx;
} }
</style> </style>

View File

@@ -5,6 +5,7 @@
<view class="hall_body flex-1 flex flex-col"> <view class="hall_body flex-1 flex flex-col">
<!-- 状态筛选标签 --> <!-- 状态筛选标签 -->
<TabsComponents <TabsComponents
:activeValue="activeStatus"
:tabslist="statusTabs" :tabslist="statusTabs"
:options="{ label: 'label', value: 'value' }" :options="{ label: 'label', value: 'value' }"
@update="switchStatus" @update="switchStatus"
@@ -156,7 +157,7 @@ function getlist() {
}) })
} }
onShow(() => { onShow(() => {
getlist() resetList()
}) })
function resetList() { function resetList() {
reportRecords.value = [] reportRecords.value = []

View File

@@ -142,7 +142,7 @@
import { ref } from 'vue' import { ref } from 'vue'
import { onLoad, onShow } from '@dcloudio/uni-app' import { onLoad, onShow } from '@dcloudio/uni-app'
import Stops from '@/components/stops/stops.vue' import Stops from '@/components/stops/stops.vue'
import { getTicketMainById } from '@/api/ticket.js' import { getTicketMainById, shareRepairUser } from '@/api/ticket.js'
// -------------------------------------- // --------------------------------------
/** 维修步骤:0提交 1分配 2维修完成 / 待解决 3记录完成 完成*/ /** 维修步骤:0提交 1分配 2维修完成 / 待解决 3记录完成 完成*/
const currentStep = ref(2) const currentStep = ref(2)
@@ -246,7 +246,31 @@ function handleStop(row) {
/** 选择维修人员 */ /** 选择维修人员 */
function handleSelecthouse() { function handleSelecthouse() {
uni.navigateTo({ uni.navigateTo({
url: '/pageSubPack/ticket/shareUser' url: '/pageSubPack/ticket/shareUser',
events: {
backData: data => {
const repairid = data.checkoutUserid
if (repairid) {
shareRepairUser({
id: repairInfo.value.id,
repairId: repairid
})
.then(res => {
uni.showToast({
icon: 'success',
title: '分配成功'
})
getTicketById()
})
.catch(() => {
uni.showToast({
icon: 'error',
title: '网络异常'
})
})
}
}
}
}) })
} }

View File

@@ -6,44 +6,41 @@
<view <view
@click="handleClick" @click="handleClick"
class="search_view flex-center" class="search_view flex-center"
v-if="!queryParmas.value.trim() && Searching" v-if="!queryParmas.keyword.trim() && Searching"
> >
<uni-icons type="search" size="34rpx" color="rgba(0,0,0,0.26)"></uni-icons> <uni-icons type="search" size="34rpx" color="rgba(0,0,0,0.26)"></uni-icons>
<text>请输入关键字进行搜索</text> <text>请输入关键字进行搜索</text>
</view> </view>
<uni-easyinput <uni-easyinput
@blur="handleInput" @blur="handleInput"
@change="handleSearch" @confirm="handleSearch"
@clear="handleClear"
@input="handleClear"
:focus="true" :focus="true"
ref="inputRef" ref="inputRef"
v-model="queryParmas.value" v-model="queryParmas.keyword"
v-else v-else
/> />
</view> </view>
<!-- 已经选择人数 --> <!-- 已经选择人数 -->
<view class="checkoutedUser_box"> <view class="checkoutedUser_box">
<text>已选({{ checkoutUserid ? 1 : 0 }}/1)</text> <text>已选({{ checkoutUserid ? 1 : 0 }}/1)</text>
<text class="checkoutUseName" v-if="checkoutInfo">{{ checkoutInfo.name }}</text> <text class="checkoutUseName" v-if="checkoutInfo">{{ checkoutInfo.nickName }}</text>
</view> </view>
<!-- srcoll --> <!-- srcoll -->
<scroll-view <scroll-view scroll-y="true" class="flex-1 overflow-auto">
scroll-y="true"
class="flex-1 overflow-auto"
lower-threshold="60"
@scrolltolower="scrolltolower"
>
<radio-group @change="radioChange"> <radio-group @change="radioChange">
<label v-for="(item, index) in searchlist" :key="index"> <label v-for="(item, index) in searchlist" :key="index">
<view <view
class="item flex items-center justify-between" class="item flex items-center justify-between"
:class="{ :class="{
active: checkoutUserid === item.id active: checkoutUserid === item.userId
}" }"
> >
<view class=""> <view class="">
<view class="info"> <view class="info">
<text>姓名:</text> <text>姓名:</text>
<text>{{ item.name }}</text> <text>{{ item.nickName }}</text>
</view> </view>
<view class="info"> <view class="info">
<text>角色:</text> <text>角色:</text>
@@ -51,10 +48,10 @@
</view> </view>
<view class="info"> <view class="info">
<text>手机号码:</text> <text>手机号码:</text>
<text>{{ item.phone }}</text> <text>{{ item.phonenumber }}</text>
</view> </view>
</view> </view>
<radio color="#4d5dfa" :value="item.id" /> <radio color="#4d5dfa" :value="item.userId" />
</view> </view>
</label> </label>
</radio-group> </radio-group>
@@ -71,6 +68,9 @@
<script setup> <script setup>
import { ref, onMounted, getCurrentInstance } from 'vue' import { ref, onMounted, getCurrentInstance } from 'vue'
import navBar from '@/components/navbar/navbar.vue' import navBar from '@/components/navbar/navbar.vue'
import { getSystemUsers_employee } from '@/api/common.js'
import { onShow } from '@dcloudio/uni-app'
const Searching = ref(true) const Searching = ref(true)
/** 点击时切换到input,并聚焦 */ /** 点击时切换到input,并聚焦 */
function handleClick() { function handleClick() {
@@ -78,73 +78,74 @@ function handleClick() {
} }
/** 判断 失去焦点时 切换回 view */ /** 判断 失去焦点时 切换回 view */
function handleInput() { function handleInput() {
if (queryParmas.value.value.trim()) { if (queryParmas.value.keyword.trim()) {
Searching.value = true Searching.value = true
resetList()
} else {
queryParmas.value.keyword = ''
Searching.value = false
resetList()
}
}
function handleSearch() {
if (queryParmas.value.keyword.trim()) {
resetList()
}
}
function handleClear() {
if (queryParmas.value.keyword.trim() === '') {
queryParmas.value.keyword = ''
Searching.value = true
resetList()
} }
} }
function handleSearch() {}
// ----------------------------------------- // -----------------------------------------
/* 选择列表 */ /* 选择列表 */
const searchlist = ref([]) const searchlist = ref([])
const queryParmas = ref({ const queryParmas = ref({
pageNum: 1, keyword: '',
pageSize: 10, roleKey: 'repair'
value: ''
}) })
const isLoading = ref(false) // 加载锁 const isLoading = ref(false) // 加载锁
const hasMore = ref(true) // 是否还有更多数据 const hasMore = ref(true) // 是否还有更多数据
const total = ref(21)
function scrolltolower() {
// 必须加这两个判断!
if (isLoading.value || !hasMore.value) {
return
}
queryParmas.value.pageNum += 1
getlist()
}
function getlist() { function getlist() {
// 1. 如果正在加载或没有更多数据,直接返回 // 1. 如果正在加载或没有更多数据,直接返回
if (isLoading.value || !hasMore.value) return if (isLoading.value) return
// 2. 开启锁 // 2. 开启锁
isLoading.value = true isLoading.value = true
uni.showLoading({ uni.showLoading({
title: '加载中', title: '加载中',
mask: true mask: true
}) })
const { pageNum, pageSize } = queryParmas.value
const startId = (pageNum - 1) * pageSize + 1 const { keyword, roleKey } = queryParmas.value
const arr = Array.from({ length: pageSize }).map((_, index) => { getSystemUsers_employee(roleKey, keyword)
const realId = startId + index .then(res => {
const randomStatus = Math.floor(Math.random() * 3) searchlist.value = res.data
return { })
name: '张三' + realId, .finally(() => {
roleName: '维修人员', isLoading.value = false
phone: '19578012123', uni.hideLoading()
id: realId })
}
})
// 追加数据(正确方式)
searchlist.value = [...searchlist.value, ...arr]
// 判断是否还有更多
hasMore.value = searchlist.value.length < total.value
isLoading.value = false
uni.hideLoading()
} }
getlist()
onShow(() => {
resetList()
})
function resetList() { function resetList() {
reportRecords.value = [] searchlist.value = []
queryParmas.value.pageNum = 1 queryParmas.value.pageNum = 1
hasMore.value = true
getlist() getlist()
} }
//searchlist---------------------- //searchlist----------------------
const checkoutUserid = ref(null) const checkoutUserid = ref(null)
const checkoutInfo = ref(null) const checkoutInfo = ref(null)
function radioChange(val) { function radioChange(val) {
checkoutUserid.value = Number(val.detail.value) checkoutUserid.value = val.detail.value
const find = searchlist.value.find(item => item.id === Number(val.detail.value)) const find = searchlist.value.find(item => item.userId === val.detail.value)
if (find) { if (find) {
checkoutInfo.value = find checkoutInfo.value = find
} }
@@ -161,11 +162,13 @@ onMounted(() => {
/* 确定派单 */ /* 确定派单 */
function handleSelecthouse() { function handleSelecthouse() {
// api // api
eventChannel.emit('backData', { if (eventChannel) {
checkoutUserid: checkoutUserid.value eventChannel.emit('backData', {
}) checkoutUserid: checkoutUserid.value
// 3. 返回上一页 })
uni.navigateBack() // 3. 返回上一页
uni.navigateBack()
}
} }
// =========================================== // ===========================================
</script> </script>

View File

@@ -153,8 +153,12 @@
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import { onLoad, onUnload } from '@dcloudio/uni-app' import { onLoad, onUnload } from '@dcloudio/uni-app'
import { getCurrentVillage,getTodayInspection,getNewNoticeData,getBannarList} from '../../api/api.js' import {
getCurrentVillage,
getTodayInspection,
getNewNoticeData,
getBannarList
} from '../../api/api.js'
// 列表数据状态 // 列表数据状态
const current = ref(0) const current = ref(0)
@@ -242,17 +246,19 @@ const currentVillageData = () => {
.catch(() => {}) .catch(() => {})
} }
// 获取今日巡检数据 // 获取今日巡检数据
const getInspectionData = () =>{ const getInspectionData = () => {
getTodayInspection().then(res =>{ getTodayInspection()
if(res.code === 200){ .then(res => {
if(res.data){ if (res.code === 200) {
allCount.value = res.data.totalTasks if (res.data) {
pendingCount.value = res.data.unfinishedTasks allCount.value = res.data.totalTasks
InspectedCount.value = res.data.completedTasks pendingCount.value = res.data.unfinishedTasks
}else{ InspectedCount.value = res.data.completedTasks
} else {
allCount.value = 0 allCount.value = 0
pendingCount.value = 0 pendingCount.value = 0
InspectedCount.value = 0 InspectedCount.value = 0
}
} }
}) })
.catch(err => { .catch(err => {
@@ -272,14 +278,16 @@ const getNoticeData = () => {
.catch(() => {}) .catch(() => {})
} }
// 获取bannar图 // 获取bannar图
function getbannarData(){ function getbannarData() {
getBannarList().then(res => { getBannarList()
if (res.code === 200 && res.data) { .then(res => {
bannerList.value = res.data if (res.code === 200 && res.data) {
}else{ bannerList.value = res.data
bannerList.value = [] } else {
} bannerList.value = []
}).catch(() => {}) }
})
.catch(() => {})
} }
// 接收选择小区返回的参数 // 接收选择小区返回的参数