更改接单 派单逻辑,添加工单台页面

This commit is contained in:
赵毅 2025-08-11 16:43:20 +08:00
parent d49514d426
commit 3580ba2185
12 changed files with 531 additions and 388 deletions

View File

@ -38,6 +38,7 @@ export const apiArr = {
commInfo: "/api/v2/wechat/mpuser-crud/community-owner/info",//我的房产信息小区列表 commInfo: "/api/v2/wechat/mpuser-crud/community-owner/info",//我的房产信息小区列表
create: "/api/v2/wechat/community-owners/create",//创建新的业主信息 create: "/api/v2/wechat/community-owners/create",//创建新的业主信息
communityInfo: "/api/v2/community/get-one",//获取小区信息
getOrderList:"/api/v2/wechat/community-orders/get-all-list",//获取账单 getOrderList:"/api/v2/wechat/community-orders/get-all-list",//获取账单
getCommunityRoomList:"/api/v2/wechat/community-room/list", //获取房源列表 getCommunityRoomList:"/api/v2/wechat/community-room/list", //获取房源列表

View File

@ -1,19 +1,13 @@
<template> <template>
<div class="container"> <div class="container">
<div class="empty" v-if="communityList.length == 0"> <div class="empty" v-if="communityList.length == 0">
<image <image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_newEmpty.png" alt="" />
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_newEmpty.png"
alt=""
/>
<text>当前账户未绑定任何项目房源信息</text> <text>当前账户未绑定任何项目房源信息</text>
<button class="emptyBtn" @click="addCommunity">新增房产绑定</button> <button class="emptyBtn" @click="addCommunity">新增房产绑定</button>
<!-- <button class="emptyBtn2" @click="refresh">刷新</button> --> <!-- <button class="emptyBtn2" @click="refresh">刷新</button> -->
</div> </div>
<div v-else> <div v-else>
<div <div class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
class="searchBox"
:style="{ height: localHeight + 'px', paddingTop: top + 'px' }"
>
<div class="searchBox_add"> <div class="searchBox_add">
<div class="emptyCommunity" @click="addCommunity"> <div class="emptyCommunity" @click="addCommunity">
{{ communityVal }} {{ communityVal }}
@ -23,81 +17,49 @@
<div class="swiperBox1"> <div class="swiperBox1">
<swiper @animationfinish="swipers" autoplay circular> <swiper @animationfinish="swipers" autoplay circular>
<swiper-item <swiper-item v-for="(item, index) in bannerList" :key="index" @click="headerServerClick(item)">
v-for="(item, index) in bannerList"
:key="index"
@click="headerServerClick(item)"
>
<image :src="item.ad_picture" mode="aspectFill" /> <image :src="item.ad_picture" mode="aspectFill" />
</swiper-item> </swiper-item>
</swiper> </swiper>
<view class="dot"> <view class="dot">
<view <view :class="['dotItem', currentIdx == index ? 'active' : '']" v-for="(item, index) in bannerList"
:class="['dotItem', currentIdx == index ? 'active' : '']" :key="index">
v-for="(item, index) in bannerList"
:key="index"
>
</view> </view>
</view> </view>
</div> </div>
<div class="swiperBox2"> <div class="swiperBox2">
<swiper @animationfinish="swipers" autoplay circular> <swiper @animationfinish="swipers" autoplay circular>
<swiper-item <swiper-item v-for="(item, index) in streamerList" :key="index" @click="headerServerClick(item)">
v-for="(item, index) in streamerList" <image :src="item.ad_picture" mode="aspectFill" class="swiperBox2_img" />
:key="index"
@click="headerServerClick(item)"
>
<image
:src="item.ad_picture"
mode="aspectFill"
class="swiperBox2_img"
/>
</swiper-item> </swiper-item>
</swiper> </swiper>
</div> </div>
<view class="funcList"> <view class="funcList">
<u-grid :col="rowNum" :border="false"> <u-grid :col="rowNum" :border="false">
<u-grid-item <u-grid-item v-for="(item, index) in functionList" @click="jump(item.mini_program_url)" :key="index">
v-for="(item, index) in functionList"
@click="jump(item.mini_program_url)"
:key="index"
>
<image class="grid_Pic" :src="item.nav_icon" mode=""></image> <image class="grid_Pic" :src="item.nav_icon" mode=""></image>
<text class="grid_Text">{{ item.nav_name }}</text> <text class="grid_Text">{{ item.nav_name }}</text>
</u-grid-item> </u-grid-item>
</u-grid> </u-grid>
</view> </view>
<div <div v-for="(item, index) in tileList" :key="index" :class="['ads', index == 0 ? 'ads_first' : '']"
v-for="(item, index) in tileList" @click="headerServerClick(item)">
:key="index"
:class="['ads', index == 0 ? 'ads_first' : '']"
@click="headerServerClick(item)"
>
<image :src="item.ad_picture" mode="aspectFill" /> <image :src="item.ad_picture" mode="aspectFill" />
</div> </div>
<div class="tabs"> <div class="tabs">
<div <div v-for="(item, index) in categoryList" :key="index"
v-for="(item, index) in categoryList" :class="['tabItem', selectedTab === index ? 'active2' : '']" @click="selectTab(index, item)">
:key="index"
:class="['tabItem', selectedTab === index ? 'active2' : '']"
@click="selectTab(index, item)"
>
{{ item.category_name }} {{ item.category_name }}
</div> </div>
</div> </div>
<div class="newsList"> <div class="newsList">
<div <div class="newsItem" v-for="item in infoList" @click="detail(item)" :key="item.id">
class="newsItem"
v-for="item in infoList"
@click="detail(item)"
:key="item.id"
>
<div class="newsItem_left"> <div class="newsItem_left">
<div class="newsItem_left_tit">{{ item.title }}</div> <div class="newsItem_left_tit">{{ item.title }}</div>
<div class="newsItem_left_sub">{{ item.author }}</div> <div class="newsItem_left_sub">{{ item.author }}</div>
@ -114,19 +76,13 @@
<div class="bigAdsCon"> <div class="bigAdsCon">
<div class="bigAdsCon_img"> <div class="bigAdsCon_img">
<swiper @animationfinish="swipers" autoplay circular> <swiper @animationfinish="swipers" autoplay circular>
<swiper-item <swiper-item v-for="(item, index) in largePopList" :key="index" @click="headerServerClick(item)">
v-for="(item, index) in largePopList"
:key="index"
@click="headerServerClick(item)"
>
<image :src="item.ad_picture" mode="aspectFill" /> <image :src="item.ad_picture" mode="aspectFill" />
</swiper-item> </swiper-item>
</swiper> </swiper>
</div> </div>
<div class="close" @click="closeAds"> <div class="close" @click="closeAds">
<image <image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_close.png">
src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_close.png"
>
</image> </image>
</div> </div>
</div> </div>
@ -135,13 +91,7 @@
<div class="bigAds" v-if="ads2Show"> <div class="bigAds" v-if="ads2Show">
<div class="bigAdsCon2"> <div class="bigAdsCon2">
<div class="bigAdsCon2_img"> <div class="bigAdsCon2_img">
<swiper <swiper :current="currentSwiperIndex" @change="onSwiperChange" @animationfinish="swipers" autoplay circular>
:current="currentSwiperIndex"
@change="onSwiperChange"
@animationfinish="swipers"
autoplay
circular
>
<swiper-item v-for="(item, index) in popList" :key="index"> <swiper-item v-for="(item, index) in popList" :key="index">
<image :src="item.ad_picture" mode="aspectFill" /> <image :src="item.ad_picture" mode="aspectFill" />
</swiper-item> </swiper-item>
@ -214,6 +164,11 @@ export default {
}; };
}, },
async onLoad(options) { async onLoad(options) {
//
},
async onShow() {
//
// if (!uni.getStorageSync("changeCommData")) { // if (!uni.getStorageSync("changeCommData")) {
// return; // return;
// } // }
@ -246,8 +201,9 @@ export default {
return item.front_end_display != 1; return item.front_end_display != 1;
}); });
console.log("🚀 ~ onLoad ~ res.rows:", res.rows) console.log("🚀 ~ onLoad ~ res.rows:", res.rows)
uni.setStorageSync("changeCommData",{ name: res.rows[0].name, id: res.rows[0].community_id }) if (!uni.getStorageSync("changeCommData")) {
uni.setStorageSync("changeCommData", { name: res.rows[0].name, id: res.rows[0].community_id })
}
this.communityList = res.rows; this.communityList = res.rows;
}); });
const meun = menuButtonInfo(); const meun = menuButtonInfo();
@ -258,6 +214,7 @@ export default {
if (this.communityList.length == 0) { if (this.communityList.length == 0) {
this.communityVal = "添加我的房产"; this.communityVal = "添加我的房产";
} else { } else {
console.log("🚀 ~ onLoad ~ this.communityList:", this.communityList)
this.communityVal = uni.getStorageSync("changeCommData").name; this.communityVal = uni.getStorageSync("changeCommData").name;
} }
this.getfunctionNum(); this.getfunctionNum();

View File

@ -79,7 +79,7 @@ export default {
this.currentCommunity = e this.currentCommunity = e
uni.setStorageSync('changeCommData', { id: e.community_id, name: e.name }); uni.setStorageSync('changeCommData', { id: e.community_id, name: e.name });
uni.setStorageSync('currentCommunityAddr',e.addr); uni.setStorageSync('currentCommunityAddr',e.addr);
NavgateTo("/packages/community/index/index") NavgateTo("1")
}, },
}, },

View File

@ -122,6 +122,8 @@ export default {
uni.removeStorageSync('is_shop'); uni.removeStorageSync('is_shop');
uni.removeStorageSync('shopId'); uni.removeStorageSync('shopId');
uni.removeStorageSync('order_dispatch_permission'); uni.removeStorageSync('order_dispatch_permission');
uni.removeStorageSync('work_order_permission');
const button = uni.createSelectorQuery().select('#hiddenLoginBtn'); const button = uni.createSelectorQuery().select('#hiddenLoginBtn');
button.boundingClientRect().exec(); button.boundingClientRect().exec();
@ -230,6 +232,7 @@ export default {
if (item) { if (item) {
const { community_worker } = res; const { community_worker } = res;
uni.setStorageSync('order_dispatch_permission', community_worker && community_worker[0].order_dispatch_permission == 1 || false); uni.setStorageSync('order_dispatch_permission', community_worker && community_worker[0].order_dispatch_permission == 1 || false);
uni.setStorageSync('work_order_permission', community_worker && community_worker[0].work_order_permission == 1 || false);
uni.setStorageSync('phone', res.account); uni.setStorageSync('phone', res.account);
uni.hideLoading(); uni.hideLoading();
uni.showToast({ uni.showToast({

View File

@ -1,230 +1,203 @@
<template> <template>
<div class="container"> <view class="container">
<div <view class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
class="searchBox" <view class="searchBox_add">
:style="{ height: localHeight + 'px', paddingTop: top + 'px' }" <view class="searchBox_left">
> <u-icon bold color="#000" size="40" name="arrow-left" @click="headerBackClick"></u-icon>
<div class="searchBox_add"> </view>
<div class="searchBox_left"> <view class="searchBox_mid">工单详情</view>
<u-icon <view class="searchBox_right"></view>
bold </view>
color="#000" </view>
size="40"
name="arrow-left"
@click="headerBackClick"
></u-icon>
</div>
<div class="searchBox_mid">工单详情</div>
<div class="searchBox_right"></div>
</div>
</div>
<div class="repairMsg"> <view class="repairMsg">
<div :class="['orderItemTit', statusType[info.status].style]"> <view :class="['orderItemTit', statusType[info.status].style]">
<div class="orderItemTit_left">工单编号{{ info.order_code }}</div> <view class="orderItemTit_left">工单编号{{ info.order_code }}</view>
<div class="orderItemTit_right">{{ statusType[info.status].desc }}</div> <view class="orderItemTit_right">{{ statusType[info.status].desc }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">小区房源名称</div> <view class="row_label">小区房源名称</view>
<div class="row_con">{{ info.room.name }}</div> <view class="row_con">{{ info.room.name }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">报修类型</div> <view class="row_label">报修类型</view>
<div class="row_con">{{ info.ac.category_name }}</div> <view class="row_con">{{ info.ac.category_name }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">问题描述</div> <view class="row_label">问题描述</view>
<div class="row_con">{{ info.problem_description }}</div> <view class="row_con">{{ info.problem_description }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">联系人</div> <view class="row_label">联系人</view>
<div class="row_con">{{ info.contact_name }}</div> <view class="row_con">{{ info.contact_name }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">联系电话</div> <view class="row_label">联系电话</view>
<div class="row_con">{{ info.contact_phone }}</div> <view class="row_con">{{ info.contact_phone }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">上门时间</div> <view class="row_label">上门时间</view>
<div class="row_con">{{ info.service_time }}</div> <view class="row_con">{{ info.service_time }}</view>
</div> </view>
</div> </view>
<div class="repairMsg"> <view class="repairMsg">
<div class="row"> <view class="row">
<div class="row_label df">图片</div> <view class="row_label df">图片</view>
<div class="row_con"> <view class="row_con">
<view v-if="info.imagesList && info.imagesList.length == 0">暂无图片</view> <view v-if="info.imagesList && info.imagesList.length == 0">暂无图片</view>
<image <image v-else v-for="(item, index) in info.imagesList" :key="index" :src="item" mode=""
v-else @click="handlerPreviewImageClick(item)">
v-for="(item, index) in info.imagesList"
:key="index"
:src="item"
mode=""
@click="handlerPreviewImageClick(item)"
>
</image> </image>
</div> </view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label df">视频</div> <view class="row_label df">视频</view>
<div class="row_con"> <view class="row_con">
<view v-if="info.videosList && info.videosList.length == 0">暂无视频</view> <view v-if="info.videosList && info.videosList.length == 0">暂无视频</view>
<div v-else v-for="(item, index) in info.videosList" :key="index" class="videoBOX"> <view v-else v-for="(item, index) in info.videosList" :key="index" class="videoBOX">
<video id="myVideo" :src="item" playsinline webkit-playsinline></video> <video id="myVideo" :src="item" playsinline webkit-playsinline></video>
</div> </view>
</div> </view>
</div> </view>
<div class="row" v-if="info.assign_time"> <view class="row" v-if="info.assign_time">
<div class="row_label">指派时间</div> <view class="row_label">指派时间</view>
<div class="row_con noneBor">{{ info.assign_time }}</div> <view class="row_con noneBor">{{ info.assign_time }}</view>
</div> </view>
</div> </view>
<!-- 维修状态非带指派 --> <!-- 维修状态非带指派 -->
<div class="repairMsg" v-if="info.status !== 1"> <view class="repairMsg" v-if="info.status !== 1">
<div class="row"> <view class="row">
<div class="row_label">维修师傅</div> <view class="row_label">维修师傅</view>
<div class="row_con">{{ info.repairman_worker.name }}</div> <view class="row_con">{{ info.repairman_worker.name }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">师傅手机号</div> <view class="row_label">师傅手机号</view>
<div class="row_con">{{ info.repairman_worker.mobile }}</div> <view class="row_con">{{ info.repairman_worker.mobile }}</view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">师傅工号</div> <view class="row_label">师傅工号</view>
<div class="row_con noneBor">{{ info.repairman_worker.emp_no }}</div> <view class="row_con noneBor">{{ info.repairman_worker.emp_no }}</view>
</div> </view>
</div> </view>
<!-- 工单状态非带指派或者进行中 --> <!-- 工单状态非带指派或者进行中 -->
<div class="repairMsg" v-if="info.status !== 1 && info.status !== 2"> <view class="repairMsg" v-if="info.status !== 1 && info.status !== 2">
<div class="row"> <view class="row">
<div class="row_label df">维修图片</div> <view class="row_label df">维修图片</view>
<div class="row_con"> <view class="row_con">
<view v-if="info.repairImagesList && info.repairImagesList.length == 0">暂无图片</view> <view v-if="info.repairImagesList && info.repairImagesList.length == 0">暂无图片</view>
<image <image v-for="(item, index) in info.repairImagesList" :key="index" :src="item" mode=""
v-for="(item, index) in info.repairImagesList" @click="headerRepairImagesClick(item)" />
:key="index" </view>
:src="item" </view>
mode=""
@click="headerRepairImagesClick(item)"
/>
</div>
</div>
<div class="row"> <view class="row">
<div class="row_label df">维修视频</div> <view class="row_label df">维修视频</view>
<div class="row_con"> <view class="row_con">
<view v-if="info.repairVideosList && info.repairVideosList.length == 0">暂无视频</view> <view v-if="info.repairVideosList && info.repairVideosList.length == 0">暂无视频</view>
<div v-else v-for="(item, index) in info.repairVideosList" :key="index" class="videoBOX"> <view v-else v-for="(item, index) in info.repairVideosList" :key="index" class="videoBOX">
<video id="myVideo" :src="item" playsinline webkit-playsinline></video> <video id="myVideo" :src="item" playsinline webkit-playsinline></video>
</div> </view>
</div> </view>
</div> </view>
<div class="row"> <view class="row">
<div class="row_label">维修描述</div> <view class="row_label">维修描述</view>
<div class="row_con noneBor">{{ info.repair_description || '暂无描述' }}</div> <view class="row_con noneBor">{{ info.repair_description || '暂无描述' }}</view>
</div> </view>
</div> </view>
<div class="repairMsg" v-if="type === 'edit'"> <view class="repairMsg" v-if="type === 'edit'">
<div class="repairMedia"> <view class="repairMedia">
<div class="edit_row df"> <view class="edit_row df">
<div class="row_label">维修图片</div> <view class="row_label">维修图片</view>
<div class="row_con2"> <view class="row_con2">
<u-upload :fileList="imgList" name="imgList" @afterRead="afterReadImg" @delete="deletePic" multiple <u-upload :fileList="imgList" name="imgList" @afterRead="afterReadImg" @delete="deletePic" multiple
:maxCount="10"> :maxCount="10">
<div class="imgCon"> <view class="imgCon">
<image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_imageImg.png" mode="widthFix"></image> <image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_imageImg.png"
mode="widthFix"></image>
上传图片 上传图片
</div> </view>
</u-upload> </u-upload>
</div> </view>
</div> </view>
<div class="edit_row df"> <view class="edit_row df">
<div class="row_label">上传视频</div> <view class="row_label">上传视频</view>
<div class="row_con2"> <view class="row_con2">
<u-upload v-if="!videoList.url" :fileList="videoList" @afterRead="afterReadVideo" @delete="deleteVideo" name="videoList" <u-upload v-if="!videoList.url" :fileList="videoList" @afterRead="afterReadVideo" @delete="deleteVideo"
:maxCount="1" accept="video"> name="videoList" :maxCount="1" accept="video">
<div class="imgCon"> <view class="imgCon">
<image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_videoImg.png" mode="widthFix"></image> <image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/com_videoImg.png"
mode="widthFix"></image>
上传视频 上传视频
</div> </view>
</u-upload> </u-upload>
<div v-if="videoList.url" class="videoBOX"> <view v-if="videoList.url" class="videoBOX">
<video id="myVideo" :src="videoList.url" playsinline webkit-playsinline></video> <video id="myVideo" :src="videoList.url" playsinline webkit-playsinline></video>
<div class="mask" @click="playFullScreenVideo"> <view class="mask" @click="playFullScreenVideo">
<!-- <div class="mask_con"> <!-- <view class="mask_con">
<image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/local_play.png" mode="widthFix"></image> <image src="https://wechat-img-file.oss-cn-beijing.aliyuncs.com/property-img-file/local_play.png" mode="widthFix"></image>
</div> --> </view> -->
<div class="mask_cancel" @click="cancels">删除</div> <view class="mask_cancel" @click="cancels">删除</view>
</div> </view>
</div> </view>
</div> </view>
</div> </view>
</div> </view>
<div class="edit_row"> <view class="edit_row">
<div class="row_label">维修描述</div> <view class="row_label">维修描述</view>
<textarea placeholder="请输入维修描述" :value="repairRemarks" data-name="repairRemarks" @input="handlerInputClick" auto-height /> <textarea placeholder="请输入维修描述" :value="repairRemarks" data-name="repairRemarks" @input="handlerInputClick"
</div> auto-height />
</div> </view>
<div </view>
class="white_container" <view class="white_container" v-if="info.status == 2 && type === 'edit'" @click="headerChangeStateClick">
v-if="info.status == 2 && type === 'edit'" <view style="display: flex; justify-content: space-between">
@click="headerChangeStateClick" <view style="display: flex">
> <view class="white_label">工单状态</view>
<div style="display: flex; justify-content: space-between"> <view class="whit_desc">
<div style="display: flex">
<div class="white_label">工单状态</div>
<div class="whit_desc">
{{ orderState.desc }} {{ orderState.desc }}
</div> </view>
</div> </view>
<u-icon name="arrow-up" v-if="!orderSelect" /> <u-icon name="arrow-up" v-if="!orderSelect" />
<u-icon name="arrow-down" v-if="orderSelect" /> <u-icon name="arrow-down" v-if="orderSelect" />
</div> </view>
<view class="statePupop" v-if="orderSelect"> <view class="statePupop" v-if="orderSelect">
<view <view class="statePopop_label" v-for="(item, index) in orderStateList" :key="index"
class="statePopop_label" @click.stop="headerSelectClick(item)">{{ item.desc }}</view>
v-for="(item, index) in orderStateList" </view>
:key="index"
@click.stop="headerSelectClick(item)"
>{{ item.desc }}</view>
</view> </view>
</div>
<div class="btn_view" v-if="info.status == 1 && order_dispatch_permission"> <view class="btn_view" v-if="info.status == 1 && order_dispatch_permission">
<view class="btn" @click="headerTakeClick">接单</view>
<view class="btn" @click="headerSelectMasterClick">派单</view> <view class="btn" @click="headerSelectMasterClick">派单</view>
</div> </view>
<!-- 待派单状态 无派单权限按钮 -->
<div class="btn" v-else-if="info.status == 1" @click="headerTakeClick">接单</div>
<!-- 进行中状态编辑维修信息 -->
<div class="btn" v-if="info.status == 2" @click="headerEditClick">
{{ type === "edit" ? "确定" : "编辑" }}
</div>
<u-popup <view class="btn_view" v-if="info.status == 1 && work_order_permission && allow_grab_order">
:show="show" <view class="btn" @click="headerTakeClick">接单</view>
@close="close" </view>
round="50rpx" <!-- 待派单状态 无派单权限按钮 -->
style="height: 50%; overflow: hidden" <view class="btn" v-else-if="info.status == 1" @click="headerTakeClick">接单</view>
> <!-- 进行中状态编辑维修信息 -->
<view class="btn" v-if="info.status == 2" @click="headerEditClick">
{{ type === "edit" ? "确定" : "编辑" }}
</view>
<u-popup :show="show" @close="close" round="50rpx" style="height: 50%; overflow: hidden">
<view class="master_popup"> <view class="master_popup">
<view class="master_popup_title"> <view class="master_popup_title">
<view></view> <view></view>
@ -238,20 +211,21 @@
<view class="master_popup_tabel_left"> <view class="master_popup_tabel_left">
<view class="master_popup_label"> <view class="master_popup_label">
<view class="label">师傅名称</view> <view class="label">师傅名称</view>
<view>{{item.name}}</view> <view>{{ item.name }}</view>
</view> </view>
<view class="master_popup_label"> <view class="master_popup_label">
<view class="label">师傅手机号</view> <view class="label">师傅手机号</view>
<view>{{ item.mobile }}</view> <view>{{ item.mobile }}</view>
</view> </view>
</view> </view>
<radio :value="item.worker_id" @click="headerRadioClick" :data-name="item.worker_id" :checked="checked === item.worker_id" /> <radio :value="item.worker_id" @click="headerRadioClick" :data-name="item.worker_id"
:checked="checked === item.worker_id" />
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</u-popup> </u-popup>
</div> </view>
</template> </template>
<script> <script>
@ -313,6 +287,9 @@ export default {
show: false, show: false,
communityMasterList: [], communityMasterList: [],
order_dispatch_permission: false, order_dispatch_permission: false,
work_order_permission: false,
allow_grab_order: false,
repairRemarks: '', // repairRemarks: '', //
imgList: [], imgList: [],
videoList: {}, videoList: {},
@ -352,8 +329,8 @@ export default {
}, },
// //
async afterReadImg(e){ async afterReadImg(e) {
const { file} = e; const { file } = e;
console.log(e); console.log(e);
file.forEach(item => { file.forEach(item => {
upload(item.url, res => { upload(item.url, res => {
@ -373,7 +350,7 @@ export default {
deletePic(e) { deletePic(e) {
this.imgList.splice(e.index, 1); this.imgList.splice(e.index, 1);
}, },
afterReadVideo(e){ afterReadVideo(e) {
uploadVideo(e.file.url, res => { uploadVideo(e.file.url, res => {
this.videoList = { this.videoList = {
url: picUrl + res.data.url, url: picUrl + res.data.url,
@ -421,7 +398,7 @@ export default {
}, },
// input // input
handlerInputClick(e) { handlerInputClick(e) {
const { name} = e.currentTarget.dataset; const { name } = e.currentTarget.dataset;
this[name] = e.detail.value this[name] = e.detail.value
}, },
@ -504,13 +481,18 @@ export default {
console.log("1111", options); console.log("1111", options);
const order_dispatch_permission = uni.getStorageSync('order_dispatch_permission'); const order_dispatch_permission = uni.getStorageSync('order_dispatch_permission');
this.order_dispatch_permission = order_dispatch_permission; this.order_dispatch_permission = order_dispatch_permission;
const work_order_permission = uni.getStorageSync('work_order_permission');
this.work_order_permission = work_order_permission;
const allow_grab_order = uni.getStorageSync('allow_grab_order');
this.allow_grab_order = allow_grab_order;
const meun = menuButtonInfo(); const meun = menuButtonInfo();
this.top = meun.top; this.top = meun.top;
this.localHeight = meun.height; this.localHeight = meun.height;
this.init(options.id); this.init(options.id);
}, },
onShow() {}, onShow() { },
}; };
</script> </script>

View File

@ -0,0 +1,108 @@
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #ffffff;
}
.searchBox {
display: flex;
align-items: center;
/* position: absolute; */
left: 0;
z-index: 2;
}
.searchBox_add {
margin: 10rpx 20rpx;
}
.emptyCommunity {
font-size: 28rpx;
color: #222222;
width: auto;
height: 44rpx;
padding: 5rpx 15rpx;
border-radius: 100rpx 100rpx 100rpx 100rpx;
display: flex;
align-items: center;
justify-content: center;
}
/* 背景图片区域 */
.bg-image-container {
position: relative;
width: 100%;
height: 500rpx;
overflow: hidden;
}
.bg-image {
width: 100%;
height: 100%;
}
.search-box {
position: absolute;
bottom: 50rpx;
left: 50%;
transform: translateX(-50%);
width: 80%;
height: 70rpx;
background-color: rgba(255, 255, 255, 0.9);
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
}
.search-placeholder {
font-size: 26rpx;
color: #999999;
}
/* 工单台区域 */
.work-order-section {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* 创建3列等宽的网格 */
}
.work-order-card {
width: 246rpx;
height: 200rpx;
background-color: #ffffff;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border: 1rpx solid #f7f7f7;
}
.work-order-icon {
width: 100rpx;
height: 100rpx;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 10rpx;
}
.work-order-icon .iconfont {
color: #ffffff;
margin: 0;
}
.work-order-text {
font-size: 26rpx;
color: #333333;
font-weight: bold;
}
/* 适配不同屏幕尺寸 */
@media screen and (min-width: 768px) {
.container {
max-width: 768px;
margin: 0 auto;
}
}

View File

@ -0,0 +1,79 @@
<template>
<view class="container">
<view class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
<view class="searchBox_add">
<view class="emptyCommunity" @click="addCommunity">
{{ communityVal }}
</view>
</view>
</view>
<!-- 背景图片区域 -->
<view class="bg-image-container">
<image class="bg-image" src="http://localhost:8080/test.png" mode="aspectFill"></image>
<view class="search-box">
<text class="search-placeholder">输入工单号进入工单</text>
</view>
</view>
<view class="work-order-section">
<view v-for="(item, index) in 9" :key="index">
<view class="work-order-card" v-if="index == 0 && showWorkOrderSection"
@click="navigateToWorkOrderDashboard">
<image class="work-order-icon" src="http://localhost:8080/workOrder.png" mode="aspectFill" />
<text class="work-order-text">工单台</text>
</view>
<view class="work-order-card" v-else></view>
</view>
</view>
</view>
</template>
<script>
import {
request,
picUrl,
uniqueByField,
menuButtonInfo,
NavgateTo,
} from "../../../utils";
import { apiArr } from "../../../api/community";
export default {
data() {
return {
communityVal: "添加我的房产",
showWorkOrderSection: false
}
},
onLoad() {
const workOrderPermission = uni.getStorageSync('work_order_permission');
const orderDispatchPermission = uni.getStorageSync('order_dispatch_permission');
this.showWorkOrderSection = !(workOrderPermission === false && orderDispatchPermission === false);
},
async onShow(){
this.communityVal = uni.getStorageSync('changeCommData').name;
const params = {
community_id: uni.getStorageSync('changeCommData').id,
}
const res = await request(apiArr.communityInfo, "POST", params);
uni.setStorageSync('allow_grab_order', res.allow_grab_order == 1 ? true : false);
},
methods: {
addCommunity() {
NavgateTo("/packages/community/myCommunity/index");
},
//
navigateToWorkOrderDashboard() {
uni.navigateTo({
url: '/packages/workOrderDashboard/index/index'
});
}
}
}
</script>
<style scoped>
/* 引入外部CSS文件 */
@import url("./index.css");
</style>

View File

@ -1,85 +1,85 @@
<template> <template>
<view class="box"> <view class="box">
<div class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }"> <view class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
<div class="searchBox_add"> <view class="searchBox_add">
<div class="searchBox_left"> <view class="searchBox_left">
<u-icon bold color="#000" size="40" name="arrow-left" @click="headerBackClick"></u-icon> <u-icon bold color="#000" size="40" name="arrow-left" @click="headerBackClick"></u-icon>
</div> </view>
<div class="searchBox_mid">工作台</div> <view class="searchBox_mid">工单台</view>
<div class="searchBox_right"></div> <view class="searchBox_right"></view>
</div> </view>
</div> </view>
<div class="tabList"> <view class="tabList">
<div <view
:class="active == 1 ? 'tab active' : 'tab'" :class="active == 1 ? 'tab active' : 'tab'"
@click="headerTabsClick(1)" @click="headerTabsClick(1)"
> >
待指派 <span>({{awaitingNumb}})</span> 待指派 <span>({{awaitingNumb}})</span>
</div> </view>
<div <view
:class="active == 2 ? 'tab active' : 'tab'" :class="active == 2 ? 'tab active' : 'tab'"
@click="headerTabsClick(2)" @click="headerTabsClick(2)"
> >
进行中 <span>({{ underwayNum }})</span> 进行中 <span>({{ underwayNum }})</span>
</div> </view>
<div <view
:class="active == 4 ? 'tab active' : 'tab'" :class="active == 4 ? 'tab active' : 'tab'"
@click="headerTabsClick(4)" @click="headerTabsClick(4)"
> >
已作废 <span>({{ discardNum }})</span> 已作废 <span>({{ discardNum }})</span>
</div> </view>
<div <view
:class="active == 3 ? 'tab active' : 'tab'" :class="active == 3 ? 'tab active' : 'tab'"
@click="headerTabsClick(3)" @click="headerTabsClick(3)"
> >
已完成 <span>({{ doneNum }})</span> 已完成 <span>({{ doneNum }})</span>
</div> </view>
</div> </view>
<div class="orderList" v-for="(item, index) in list" :key="index"> <view class="orderList" v-for="(item, index) in list" :key="index">
<div class="orderItem" @click="handlerDetailClick(item.id)"> <view class="orderItem" @click="handlerDetailClick(item.id)">
<div :class="['orderItemTit', statusType[item.status].style]"> <view :class="['orderItemTit', statusType[item.status].style]">
<div class="orderItemTit_left">工单编号{{ item.order_code }}</div> <view class="orderItemTit_left">工单编号{{ item.order_code }}</view>
<div class="orderItemTit_right">{{ item.create_time }}</div> <view class="orderItemTit_right">{{ item.create_time }}</view>
</div> </view>
<div class="orderItem_row"> <view class="orderItem_row">
<div class="df"> <view class="df">
<div class="orderItem_row_label">小区房源名称</div> <view class="orderItem_row_label">小区房源名称</view>
<div class="orderItem_row_con">{{ item.room.name }}</div> <view class="orderItem_row_con">{{ item.room.name }}</view>
</div> </view>
<div :class="['orderItem_row_state', statusType[item.status].color]"> <view :class="['orderItem_row_state', statusType[item.status].color]">
{{ statusType[item.status].desc }} {{ statusType[item.status].desc }}
</div> </view>
</div> </view>
<div class="orderItem_row"> <view class="orderItem_row">
<div class="orderItem_row_label">报修类型</div> <view class="orderItem_row_label">报修类型</view>
<div class="orderItem_row_con">{{ item.ac.category_name }}</div> <view class="orderItem_row_con">{{ item.ac.category_name }}</view>
</div> </view>
<div class="orderItem_row"> <view class="orderItem_row">
<div class="orderItem_row_label">问题描述</div> <view class="orderItem_row_label">问题描述</view>
<div class="orderItem_row_con">{{ item.problem_description }}</div> <view class="orderItem_row_con">{{ item.problem_description }}</view>
</div> </view>
<div class="orderItem_row"> <view class="orderItem_row">
<div class="orderItem_row_label">上门时间</div> <view class="orderItem_row_label">上门时间</view>
<div class="orderItem_row_con">{{ item.service_time }}</div> <view class="orderItem_row_con">{{ item.service_time }}</view>
</div> </view>
<div class="orderItem_row"> <view class="orderItem_row">
<div class="orderItem_row_label">联系人</div> <view class="orderItem_row_label">联系人</view>
<div class="orderItem_row_con">{{ item.contact_name }}</div> <view class="orderItem_row_con">{{ item.contact_name }}</view>
</div> </view>
<div class="orderItem_row"> <view class="orderItem_row">
<div class="orderItem_row_label">联系人手机号</div> <view class="orderItem_row_label">联系人手机号</view>
<div class="orderItem_row_con">{{ item.contact_phone }}</div> <view class="orderItem_row_con">{{ item.contact_phone }}</view>
</div> </view>
</div> </view>
</div> </view>
</view> </view>
</template> </template>

View File

@ -95,6 +95,13 @@
"navigationBarTitleText": "", "navigationBarTitleText": "",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
},
{
"path": "guide/index",
"style": {
"navigationBarTitleText": "",
"navigationBarBackgroundColor": "#fff"
}
} }
] ]
}, },

View File

@ -367,7 +367,7 @@ export default {
goToWuye() { goToWuye() {
uni.navigateTo({ uni.navigateTo({
url: '/packages/workOrderDashboard/index/index' url: '/packages/workOrderDashboard/guide/index'
}) })
}, },

View File

@ -147,6 +147,8 @@ export default {
uni.removeStorageSync('is_shop'); uni.removeStorageSync('is_shop');
uni.removeStorageSync('shopId'); uni.removeStorageSync('shopId');
uni.removeStorageSync('order_dispatch_permission'); uni.removeStorageSync('order_dispatch_permission');
uni.removeStorageSync('work_order_permission');
uni.removeStorageSync('nickName'); uni.removeStorageSync('nickName');
uni.removeStorageSync('changeCommData'); uni.removeStorageSync('changeCommData');
console.error('用户拒绝授权:', event.detail.errMsg); console.error('用户拒绝授权:', event.detail.errMsg);
@ -159,6 +161,7 @@ export default {
}, { silent: false }).then(res => { }, { silent: false }).then(res => {
const { community_worker } = res; const { community_worker } = res;
uni.setStorageSync('order_dispatch_permission', community_worker && community_worker[0].order_dispatch_permission == 1 || false); uni.setStorageSync('order_dispatch_permission', community_worker && community_worker[0].order_dispatch_permission == 1 || false);
uni.setStorageSync('work_order_permission', community_worker && community_worker[0].work_order_permission == 1 || false);
uni.setStorageSync('nickName', res.nick_name); uni.setStorageSync('nickName', res.nick_name);
console.log(res) console.log(res)
}) })

View File

@ -232,6 +232,8 @@
uni.removeStorageSync('is_shop'); uni.removeStorageSync('is_shop');
uni.removeStorageSync('shopId'); uni.removeStorageSync('shopId');
uni.removeStorageSync('order_dispatch_permission'); uni.removeStorageSync('order_dispatch_permission');
uni.removeStorageSync('work_order_permission');
const button = uni.createSelectorQuery().select('#hiddenLoginBtn'); const button = uni.createSelectorQuery().select('#hiddenLoginBtn');
button.boundingClientRect().exec(); button.boundingClientRect().exec();
@ -372,6 +374,7 @@
if (item) { if (item) {
const { community_worker } = res; const { community_worker } = res;
uni.setStorageSync('order_dispatch_permission', community_worker && community_worker[0].order_dispatch_permission == 1 || false); uni.setStorageSync('order_dispatch_permission', community_worker && community_worker[0].order_dispatch_permission == 1 || false);
uni.setStorageSync('work_order_permission', community_worker && community_worker[0].work_order_permission == 1 || false);
uni.setStorageSync('phone', res.account); uni.setStorageSync('phone', res.account);
uni.hideLoading(); uni.hideLoading();
uni.showToast({ uni.showToast({