lanan-repair-app/pages-warehouse/home/home.vue
2024-10-22 15:06:49 +08:00

693 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<!--<VNavigationBar style="position: relative;z-index: 99;" leftTitle="true" backgroundColor="rgba(0,0,0,0)" title-color="#fff" title=" "></VNavigationBar>-->
<view class="bodyTopBg"></view>
<view class="body">
<view class="userInfoBox" @click="showUserDetail">
<image v-if="''==userInfo.avatar || null == userInfo.avatar"
:src="defaultAvatar" mode="scaleToFill" style="width: 104rpx;height: 104rpx;border-radius: 50%;"
@error="avatarErr"></image>
<image v-else :src="imgUrlPrex+userInfo.avatar" mode="scaleToFill"
style="width: 104rpx;height: 104rpx;border-radius: 50%;" @error="avatarErr"></image>
<view class="userInfo">
<text class="userName">{{ userInfo.nickname }}</text>
<text class="userType">{{ userInfo.roleNames }}</text>
</view>
<image mode="aspectFita" src="/static/icons/more.png" style="width: 48rpx;height: 48rpx"></image>
</view>
<view class="body-top">
<view class="body-top-search">
<input class="body-top-search-input" placeholder="查询审批单" placeholder-style="font-size: 28rpx"
type="text">
<text>搜索</text>
</view>
<view class="body-top-tab">
<view v-for="(item, index) in tabList" :key="index" :class="{ active: active === index }"
class="body-top-tab-item">
{{ item.name }}
<view v-if="index === active" class="activeLine"></view>
</view>
</view>
</view>
<view class="todoListBox">
<scroll-view :refresher-triggered="isTriggered" @scrolltolower="onReachBottomCus" class="itemContent"
refresher-enabled
scroll-y="true" style="height: 100%" @refresherrefresh="onRefresherrefresh">
<view v-for="(item, index) in orderList" :key="index" class="orderItem">
<view class="order-top">
<view class="order-top-left">
<text class="order-top-name">{{ '牟科宇的配件审批单' }}</text>
<text class="order-top-date">{{ '2024-10-20 12:00' }}</text>
</view>
<text class="order-status">{{ '待审批' }}</text>
</view>
<view class="order-content">
<view>
客户信息:{{ '张三' }} {{ '157****6879' }}
</view>
<view>
车牌号:{{ '川A 184AO1' }}
</view>
<view>
车辆信息:{{ '一汽奥迪 2024款 A6L' }}
</view>
</view>
<view class="order-remark">
原因当前库存炫驰全合成机油S7 4L/ALL数量不足
</view>
<view class="order-footer">
<template>
<view class="order-btn no">拒绝审批</view>
<view class="order-btn yes">审批出库</view>
</template>
<template>
<view class="order-btn">配件出库</view>
<view class="order-btn">配件入库</view>
</template>
</view>
</view>
<!--<order-card v-for="(item, index) in orderList" :key="index" :order="item" @childEvent="onRefresherrefresh"-->
<!-- @startWork="startWork"></order-card>-->
<view v-if="orderList.length==0" style="text-align: center">
<image class="" src="@/static/images/nothing.png"></image>
</view>
</scroll-view>
</view>
</view>
<tabBarVue msg="1"></tabBarVue>
</view>
</template>
<script>
import tabBarVue from '@/components/tabBar/tabBar.vue'
import VNavigationBar from '@/components/VNavigationBar.vue'
import OrderCard from "@/components/orderCard.vue";
import config from '@/config'
import request from '@/utils/request';
import {builderOrder, formatTimestamp, saveTicketsRecords} from "@/utils/utils";
import {getToken, getUserInfo} from '@/utils/auth'
export default {
components: {
OrderCard,
tabBarVue,
VNavigationBar
},
data() {
return {
imgUrlPrex: config.baseImageUrl,
userInfo: {
avatar: undefined,
nickname: ''
},
tabList: [
{
name: '待审批'
},
{
name: '未通过'
},
{
name: '已审批'
}
],
active: 0,
menuList: [
{
title: '新建工单',
desc: '直接添加客户订单',
icon: require('@/static/icons/homeMenuIcon/menu1.png'),
path: '/pages-order/addOrder/addOrder'
},
{
title: '预约开单',
desc: '查询预约记录',
icon: require('@/static/icons/homeMenuIcon/menu1.png'),
path: '/pages-order/appointOrder/appointOrder'
}
],
bannerIndex: 0,
shopList: [],
bannerList: [],
richTextHtml: null,
pageNo: 1,
pageSize: 10,
total: 0,
//下来刷新状态
isTriggered: false,
orderList: [
{
orderNo: '1209840149750105501',
flag: 1, flagStr: '待处理', carNum: '川A 184AO1',
carModel: '一汽奥迪 2024款 A6L',
projectList: [
{name: '清洗内饰', id: 1},
{name: '内饰精洗除臭', id: 2},
{name: '烘干底板胶及脚垫', id: 3}
],
userName: '张三',
userPhone: '157****6879',
appointDate: '2024-10-20 12:00',
counselorName: '李相东'
},
],
defaultAvatar: require('@/static/icons/avatar.png')
}
},
onLoad() {
if (!getToken()) {
uni.reLaunch({
url: '/pages/login/login'
})
} else {
if (!this.$msgSocket) {
// this.$startMsgSocket(getTenantId(), getStrData("userId"))
}
}
},
onShow() {
if (!getToken()) {
uni.reLaunch({
url: '/pages/login/login'
})
} else {
//直接取缓存中的用户信息
this.userInfo = getUserInfo() || {
nickname: '用户',
roleNames: '角色'
}
// this.onRefresherrefresh()
}
},
methods: {
/**
* 上滑加载数据
*/
onReachBottomCus() {
//判断 如果页码*页容量大于等于总条数,提示该页数据加载完毕
if (this.pageNo * this.pageSize >= this.total) {
uni.$u.toast('没有更多数据了')
return
}
//页码+1,调用获取数据的方法获取第二页数据
this.pageNo++
//此处调用自己获取数据列表的方法
this.getOrderList()
},
/**
* 下拉刷新数据
*/
onRefresherrefresh() {
this.isTriggered = true
this.pageNo = 1
this.total = 0
this.orderList = []
this.getOrderList()
},
/**
* 开始施工
*/
startWork(id) {
let paramsObj = {ticketId: id}
//先查当前用户在本工单下有几个维修项目
request({
url: '/admin-api/repair/titem/listProject',
method: 'get',
params: paramsObj
}).then((res) => {
console.log(res)
if (res.code == 200 && res.data.length > 0) {
if (res.data.length == 1) {
//只有1个直接开始施工
this.startWorkRequest(id, "02", res.data[0].id, "02", "kssg", "开始施工")
} else {
uni.showActionSheet({
itemList: res.data.map(m => m.itemName),
success: ({
tapIndex
}) => {
this.startWorkRequest(id, "02", res.data[tapIndex].id, "02", "kssg", "开始施工")
}
})
}
} else {
uni.showToast({
title: '操作失败,请联系管理员',
icon: 'none'
})
}
})
},
/**
* 开始施工请求后台
*/
async startWorkRequest(id, ticketsWorkStatus, itemId, itemStatus, recordType, remark) {
try {
const result = await saveTicketsRecords(id, ticketsWorkStatus, itemId, itemStatus, recordType, remark, null);
console.error("result", result);
this.onRefresherrefresh()
} catch (error) {
console.error(error);
}
},
/**
* 查本人待处理工单
*/
getOrderList() {
let paramsObj = {pageNo: this.pageNo, pageSize: this.pageSize, isFinish: "0"}
request({
url: '/admin-api/repair/tickets/pageType',
method: 'get',
params: paramsObj
}).then((res) => {
console.log(res)
if (res.code == 200) {
let thisPageRecords = []
if (res.data && res.data.hasOwnProperty("records")) {
for (let i = 0; i < res.data.records.length; i++) {
let order = res.data.records[i]
let viewOrder = builderOrder(order)
if (order.booking) {
viewOrder['appointDate'] = formatTimestamp(order.createTime)
}
let projectList = []
if (order.itemList) {
for (let j = 0; j < order.itemList.length; j++) {
let itemObj = order.itemList[j]
if ("01" == itemObj.itemType) {
projectList.push({
id: itemObj.id,
name: itemObj.itemName
})
}
}
}
viewOrder['projectList'] = projectList
thisPageRecords.push(viewOrder)
}
}
//判断 如果获取的数据的页码不是第一页,就让之前赋值获取过的数组数据 concat连接 刚获取的第n页数据
if (this.pageNo != 1) {
this.orderList = this.orderList.concat(thisPageRecords)
} else {
this.orderList = thisPageRecords
}
//将获取的总条数赋值
this.total = res.data.total
this.isTriggered = false
}
})
},
gotoPage(menu) {
uni.navigateTo({
url: menu.path
})
},
avatarErr(err) {
console.log('err', err)
this.userInfo.avatar = this.defaultAvatar
},
showUserDetail() {
uni.navigateTo({
url: '/pages/my/myInfo'
})
}
}
}
</script>
<style lang="less" scoped>
* {
box-sizing: border-box;
}
.container {
height: 100%;
//background: linear-gradient(180deg, #0174F6 0%, rgba(1, 116, 246, 0) 100%);
display: flex;
flex-direction: column;
position: relative;
padding-top: 60rpx;
background-color: #F3F5F7;
.bodyTopBg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 500rpx;
background-image: url("@/static/bg.png");
background-size: 100% 100%;
background-repeat: no-repeat;
}
.body {
position: relative;
z-index: 10;
flex: 1;
height: 0;
overflow: auto;
padding-bottom: 30rpx;
display: flex;
flex-direction: column;
}
.userInfoBox {
margin: 0 32rpx 40rpx;
display: flex;
column-gap: 20rpx;
align-items: center;
.userInfo {
flex: 1;
width: 0;
.userName {
font-weight: bold;
font-size: 36rpx;
color: #333333;
display: block;
margin-bottom: 16rpx;
}
.userType {
font-size: 24rpx;
color: #0174F6;
display: inline-block;
border-radius: 24rpx 24rpx 24rpx 24rpx;
border: 1rpx solid #0174F6;
padding: 8rpx 16rpx;
}
}
}
.body-top {
width: 686rpx;
background: #FFFFFF;
border-radius: 8rpx 8rpx 8rpx 8rpx;
margin: 0 auto;
padding: 30rpx 30rpx 0;
.body-top-search {
height: 84rpx;
background: #F3F5F7;
border-radius: 12rpx 12rpx 12rpx 12rpx;
margin: 0 auto;
padding: 0 30rpx;
font-size: 28rpx;
display: flex;
align-items: center;
column-gap: 10rpx;
.body-top-search-input {
flex: 1;
width: 0;
}
}
.body-top-tab {
display: flex;
font-size: 28rpx;
.body-top-tab-item {
flex: 1;
width: 0;
text-align: center;
padding: 28rpx 0;
position: relative;
&.active {
color: #0174F6;
}
.activeLine {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 96rpx;
height: 6rpx;
background: #0174F6;
border-radius: 4rpx 4rpx 0rpx 0rpx;
}
}
}
}
.todoListBox {
flex: 1;
height: 0;
margin: 40rpx 32rpx;
}
.body-top-banner {
text-align: center;
}
.banner {
margin: 24rpx 0 0;
width: 686rpx;
height: 100%;
border-radius: 12rpx 12rpx 12rpx 12rpx;
background-color: #0174F6;
}
.menus {
margin: 30rpx auto 0;
box-sizing: border-box;
width: 686rpx;
padding: 40rpx 38rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 16rpx 0rpx rgba(10, 54, 104, 0.1);
border-radius: 12rpx 12rpx 12rpx 12rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.menu-item {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
row-gap: 22rpx;
font-size: 24rpx;
.menu-icon {
width: 48rpx;
height: 48rpx;
}
}
.info {
width: 686rpx;
margin: 38rpx auto 0;
display: flex;
align-items: center;
column-gap: 20rpx;
.info-icon {
width: 80rpx;
height: 80rpx;
}
.infoList {
flex: 1;
width: 0;
.infoItem {
display: flex;
align-items: center;
justify-content: space-between;
column-gap: 10rpx;
}
.infoIndex {
width: 12rpx;
height: 12rpx;
border-radius: 50%;
background-color: #333;
}
.infoText {
flex: 1;
width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 24rpx;
}
}
.more-icon {
width: 24rpx;
height: 24rpx;
}
}
.repairShop {
width: 686rpx;
margin: 38rpx auto 0;
.title {
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.shopList {
.shopItem {
padding: 30rpx 0;
border-bottom: 1rpx solid #DDDDDD;
display: flex;
align-items: center;
column-gap: 20rpx;
}
.shopImg {
width: 160rpx;
height: 100rpx;
border-radius: 8rpx 8rpx 8rpx 8rpx;
background-color: #999;
}
.shopInfo {
flex: 1;
width: 0;
}
.shopTitle {
font-weight: 500;
font-size: 28rpx;
color: #333333;
margin-bottom: 20rpx;
}
.shopDetail {
display: flex;
align-items: center;
font-size: 24rpx;
color: #666666;
column-gap: 10rpx;
}
.shopAddress {
flex: 1;
width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.line {
width: 2rpx;
height: 24rpx;
background-color: #858BA0;
}
.shopDistance {
flex-shrink: 0;
}
}
}
.orderItem {
background: #FFFFFF;
border-radius: 8rpx 8rpx 8rpx 8rpx;
padding: 0 30rpx 30rpx;
.order-top {
padding: 30rpx 0;
display: flex;
align-items: center;
column-gap: 10rpx;
border-bottom: 1rpx solid #DDDDDD;
.order-top-left {
flex: 1;
width: 0;
display: flex;
flex-direction: column;
row-gap: 16rpx;
.order-top-name {
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.order-top-date {
font-size: 24rpx;
color: #858BA0;
}
}
.order-status {
font-size: 24rpx;
color: #E8A321;
}
}
.order-content {
font-size: 28rpx;
color: #858BA0;
& > view {
margin-top: 30rpx;
}
.todoListBox {
}
}
.order-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
column-gap: 30rpx;
padding: 30rpx 0 0;
.order-btn {
width: 172rpx;
height: 60rpx;
border-radius: 30rpx 30rpx 30rpx 30rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
border: 2rpx solid #0174F6;
color: #0174F6;
&.no {
color: #333;
border: 2rpx solid #858BA0;
}
&.yes {
background: #0174F6;
border-radius: 30rpx 30rpx 30rpx 30rpx;
color: #FFFFFF;
}
}
}
.order-remark {
margin-top: 30rpx;
background: #FFEFEF;
border-radius: 4rpx 4rpx 4rpx 4rpx;
font-size: 28rpx;
color: #F92C2C;
padding: 20rpx;
}
}
}
</style>