detection-business/pages/staff/staff.vue
2025-04-11 17:55:17 +08:00

1274 lines
30 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="content">
<view style="width: 100%; height: 55px;"></view>
<view class="top-heder">
<!-- <view class="t-left" @click="getfan()">
<uni-icons type="left" size="18"></uni-icons>
</view> -->
<view class="t-input">
<!-- <uni-icons type="search" color="#BCBCBC" size="22"></uni-icons>-->
<u-search v-model="carNum" @custom="getList" @search="getList" clearabled
placeholder="搜索车牌号....."></u-search>
</view>
<view class="icon1" @click="goNotice()">
<image src="/static/imgs/staffxiaoxi.png" style="width: 50rpx;height: 50rpx;" mode=""></image>
<view class="msg-num" v-if="noReadNum>0">{{ noReadNum }}</view>
</view>
</view>
<view class="tap">
<scroll-view scroll-x="true" style="width: 100%;">
<view style="display: flex; align-items: center; white-space: nowrap;">
<view class="tap-box" v-for="(item, index) in tapList" :key="index" @click="tapqh(index)">
<view v-if="isExamine || !adminCanShow.includes(getValueByText(item.text))">
<view class="xhuihui" :class="{'xzhei': tapindex == index}"
style="white-space: nowrap;margin-right: 0.5rem">
{{ item.text }}{{ countMap.length !== 0 ? ('(' + countMap.get(getValueByText(item.text)) + ')') : '' }}
</view>
<view class="gang" v-if="tapindex == index"></view>
</view>
</view>
</view>
</scroll-view>
</view>
<view class="mub">
<view class="top-ail">
<scroll-view class="school-scroll-view" scroll-y @scrolltolower="onReachBottomCus"
:style="{ height: scrollHeight + 'px' }" refresher-enabled @refresherrefresh="onRefresherrefresh"
:refresher-triggered="isTriggered">
<view class="jsy" v-if="infoDatas.length == 0">
<u-empty mode="list">
</u-empty>
</view>
<view class="m-box" v-for="(item,index) in infoDatas" :key="index" v-else>
<view class="sshi" v-if="item.isPass == '0'">
<image v-if="item.status == 1" :src="imgurl + '/noPass.png'" mode=""></image>
<view v-else class="">
<text>重审中</text>
</view>
</view>
<view class="sshi" v-if="item.isPass == '1'">
<image :src="imgurl + '/pass.png'" mode=""></image>
</view>
<view class="m-top">
<view class="top-left" v-if="tapValue != '6'">
<view class="dhei" v-if="item.goodsName">{{ item.goodsName }}</view>
<text class="xhui" v-if="item.goodsTitle">车型:{{ item.goodsTitle }}</text>
<text class="xhui" style="margin-left: 50rpx;" v-if="item.skuName">
检测类型:{{ item.skuName }}
</text>
</view>
<view class="top-left" v-else>
<view class="dhei">待接车</view>
</view>
<view @click="callUser(item.buyPhone)" class="top-right" v-if="isShowClient">
<image src="../../static/detection/teel.png" mode=""></image>
</view>
</view>
<view class="">
<view v-if="isShowClient || isExamine">
<view class="on-input">
<uni-icons type="person" color="#999999" size="16"></uni-icons>
<text>客户:</text>
<text>{{ item.buyName ? item.buyName : "" }}</text>
</view>
<view class="on-input">
<uni-icons type="phone" color="#999999" size="16"></uni-icons>
<text>电话:</text>
<text>{{ item.buyPhone }}</text>
</view>
<!-- <view class="on-input">
<uni-icons type="map" color="#999999" size="16"></uni-icons>
<text>客户来源:</text>
<text>{{ item.customerSource }}</text>
</view> -->
<view class="on-input" v-if="item.otherPhone">
<uni-icons type="map" color="#999999" size="16"></uni-icons>
<text>代办人电话:</text>
<text>{{ item.otherPhone }}</text>
</view>
</view>
<view class="on-input">
<uni-icons type="map" color="#999999" size="16"></uni-icons>
<text>车牌号:</text>
<text>{{ item.carNum }}</text>
</view>
<view class="on-input" v-if="item.nodeNames">
<uni-icons type="more" color="#999999" size="16"></uni-icons>
<text class="single-line" v-if="!belowStandardShow.includes(tapValue)">检测内容:</text>
<text class="single-line" style="color: red;" v-else>需重审项目:</text>
<text class="multi-line"
:style="belowStandardShow.includes(tapValue) ? 'color:red' : ''">{{ item.nodeNames }}</text>
</view>
<view class="bottom-di">
<view class="button-container">
<u-button class="button" v-if="beginButtonShow.includes(tapValue)"
@click="orderTakingBefore(item)" size="10">
开始检测
</u-button>
<u-button class="button" v-if="cancelButtonShow.includes(tapValue)"
@click="cancelAnOrder(item)" size="10">
取消接单
</u-button>
<u-button class="button" v-if="meetCarButtonShow.includes(tapValue)"
@click="meetCarPhoto(item);openMeetCar = true" size="10">
接车拍照
</u-button>
<u-button class="button" v-if="meetCarButtonShow.includes(tapValue)"
@click="getMeetMan();meetCarPhoto(item);showMeetMan = true" size="10">
更换人员
</u-button>
<u-button class="button" @click="hge=true;getProject(item)"
v-if="isExamine && tapValue == '7'" size="10">重审项目</u-button>
<u-button class="button" v-if="!detailButtonNoShow.includes(tapValue)"
@click="godetails(item)" size="10">查看详情</u-button>
<u-button class="button" v-if="tapValue == '8'" @click="goMeetOrderCreate(item)"
size="10">创建订单</u-button>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
<u-popup :show="openMeetCar" @close="openMeetCar = false" :round="10">
<view class="popup-box">
<u--textarea v-model="remark" placeholder="请输入内容" border="bottom"></u--textarea>
<view class="on-inputx">
<text>施工图片:</text>
</view>
<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple
:maxCount="10"></u-upload>
<view class="bottomx" @click="submit()">
<uni-icons type="compose" color="#0174F6" size="20"></uni-icons>
<text>提交</text>
</view>
</view>
</u-popup>
<u-picker :show="showMeetMan" keyName="nickname" title="更换接车人" :columns="[columnsMeetMan]"
@confirm="confirmsMeetMan" @cancel="cancelsMeetMan"></u-picker>
<view class="lanniu-container2">
<u-picker :show="show" :columns="chooseWorkNodes" @confirm="confirms" @cancel="cancels"
keyName="label"></u-picker>
</view>
<view class="lanniu-container" v-if="isExamine">
<view class="lanniu" @click="gogogo">
<text>+ 添加线下订单</text>
</view>
<view class="lanniu" @click="gogogoOldOrder">
<text>+ 补录</text>
</view>
</view>
<view class="lanniu-container" v-else>
<view class="lanniu" @click="gogogoMeetCarOrder">
<text>接车</text>
</view>
</view>
<view style="width: 100%; height: 50px;"></view>
<tabBar :msg="msg"></tabBar>
<u-popup :show="hge" @close="closehge" :round="10">
<view class="popup-box">
<view v-if="isExamine">
<view class="t-title">重审/退办</view>
<view class="on-inputx">
<view class="anniu" :class="{'an':isRetrial == item.value}" v-for="(item,index) in cstb"
:key="index" @click="shenmowanyi(item.value,index)">
<text>{{ item.text }}</text>
</view>
</view>
<view class="t-title" v-if="tbindex == 1 && isRetrial == 1">选择复检的项目</view>
<view class="box_ on-inputx" v-if="tbindex == 1 && isRetrial == 1">
<view class="box_button " :class="{ 'box_button_x' :csId.includes(item.id) }"
v-for="item in selectProject" @click="clickProject(item)">{{ item.projectName }}
</view>
</view>
</view>
<view class="bottomx" @click="submitRecheck()">
<uni-icons type="compose" color="#0174F6" size="20"></uni-icons>
<text>提交</text>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import config from '@/config'
import request from '../../utils/request';
import tabBar from '../../components/staffTabBer/tabBar.vue'
import {
type
} from "../../uni_modules/uni-forms/components/uni-forms/utils";
import upload from "@/utils/upload";
import USearch from "@/uni_modules/uview-ui/components/u-search/u-search.vue";
import {
setStorageWithExpiry
} from '../../utils/auth';
export default {
data() {
return {
isShowClient: false,
msgSocket: this.$msgSocket,
imgurl: this.$imgeUrl,
baseUrl: this.$baseUrl,
infoDatas: {},
openMeetCar: false,
isTriggered: false,
selectedInfo: undefined,
partnerId: uni.getStorageSync("partnerId"),
goodsTitle: '',
tapindex: 0,
fileList1: [],
fileList2: [],
inspectionInfoId: undefined,
isExamine: false,
hge: false,
msg: '1',
carNum: '',
pageNum: 1, //第几页
noReadNum: 1,
pageSize: 20, //一页多少张
totalPages: 0, //总数
remark: '',
scrollHeight: 0,
selectProject: [],
// tapList: [
// {
// text: "待接受",
// value: "1"
// },
// {
// text: "进行中",
// value: "2"
// },
//
// {
// text: "已完成",
// value: "3",
// }
// ],
tapList: [
// {
// text: "待支付",
// value: "1"
// },
{
text: "待审核重检",
value: "7",
},
{
text: "待检测",
value: "1"
},
{
text: "接车转订单",
value: "8",
},
{
text: "待接车",
value: "6",
},
{
text: "检测中",
value: "2",
},
{
text: "待重检",
value: "3",
},
{
text: "待复检",
value: "4",
},
{
text: "已完成",
value: "5",
},
],
tapValue: 1,
chooseWorkNodes: [],
columnsMeetMan: [],
tbindex: 1,
isRetrial: 1,
show: false,
showMeetMan: false,
takingData: {
workNodeId: null,
id: null
},
beginButtonShow: ['1', '3', '4'],
cancelButtonShow: ['2'],
meetCarButtonShow: ['6'],
adminCanShow: ['7', '8'],
detailButtonNoShow: ['6', '8'],
belowStandardShow: ['7', '4'],
countMap: [],
csId: [],
cstb: [{
text: '重检',
value: "2"
}, {
text: '复检',
value: "1"
},
{
text: '退办理',
value: "0"
},
],
}
},
async onLoad() {
this.$startSocketConnect(uni.getStorageSync('userId'))
await this.isExamines()
this.msgInfo()
this.getWarnCount()
this.tapValue = this.isExamine ? this.tapList[0].value : this.tapList[1].value
this.tapindex = this.isExamine ? 0 : 1
this.getList()
uni.$on('refresh', () => {
this.getList()
})
},
onShow() {
// this.getList()
},
onReady() {
// 动态计算滚动区域高度
this.calculateScrollHeight();
},
watch: {
msgSocket(newVal, oldVal) {
console.log('msgSocket值发生变化', newVal, oldVal)
this.msgInfo()
},
deep: true,
},
onReachBottom() {
if (this.pageNum >= this.totalPages) {
uni.showToast({
title: '没有下一页数据',
icon: 'none'
})
} else {
this.pageNum++
this.getList()
}
},
components: {
USearch,
tabBar,
},
methods: {
calculateScrollHeight() {
// 获取屏幕高度
const screenHeight = uni.getSystemInfoSync().windowHeight;
// 获取顶部区域高度
const topHeight = 270;
// 计算滚动区域高度
this.scrollHeight = screenHeight - topHeight;
},
//查询重审可以选择的项目
getProject(data) {
this.inspectionInfoId = data.id
request({
url: '/system/info/getWeorkNodesById',
method: 'get',
params: {
inspectionId: data.id
}
}).then(res => {
this.selectProject = res.data
// 默认勾选上不合格的项目
this.csId = data.nodeIds
console.log('this.csId', this.csId);
})
},
closehge() {
this.hge = false
this.csId = []
},
goMeetOrderCreate(data) {
//将data设置缓存
setStorageWithExpiry('meetCarOrderData', data, 120)
uni.navigateTo({
url: `/pages/index/Neworder?meetCarId=${data.id}`
})
},
Nnimamadewen(value, index) {
this.geindex = index
this.type = value
},
shenmowanyi(value, index) {
this.tbindex = value
this.isRetrial = value
},
clickProject(data) {
//判断当前id是否存在csId数组里面
let index = this.csId.indexOf(data.id)
if (index !== -1) {
// 如果存在,则从数组中删除
this.csId.splice(index, 1);
} else {
// 如果不存在,则添加到数组中
this.csId.push(data.id);
}
console.log('this.csId', this.csId);
},
/**
* 上滑加载数据
*/
onReachBottomCus() {
//判断 如果页码*页容量大于等于总条数,提示该页数据加载完毕
if (this.pageNum >= this.totalPages) {
uni.$u.toast('没有更多数据了')
return
}
//页码+1,调用获取数据的方法获取第二页数据
this.pageNum++
//此处调用自己获取数据列表的方法
this.getList()
// 清理定时器
this.clearTime()
},
/**
* 下拉刷新数据
*/
onRefresherrefresh() {
this.isTriggered = true
this.pageNum = 1
this.total = 0
this.infoDatas = []
this.getList()
},
async getCount() {
await request({
url: '/system/info/getCountByType?partnerId=' + this.partnerId,
method: 'get'
}).then(res => {
this.countMap = new Map(Object.entries(res.data))
})
},
getWarnCount() {
request({
url: '/warnMsg/warnMsg/getCount',
method: 'get',
}).then(res => {
if (res.data) {
this.noReadNum = res.data
}
})
},
async submitRecheck(id) {
console.log(this.isRetrial);
let inspectionInfo = {
inspectionInfoId: this.inspectionInfoId,
id: this.workNodeId,
type: this.isRetrial,
}
let status = 0
if (this.isExamine && this.tbindex == 1 && this.isRetrial == 1) {
if (this.csId == '' || this.csId == undefined) {
uni.showToast({
title: '请选择要复检的项目',
icon: 'none'
})
return
}
const workNodes = []
this.csId.forEach(item => {
let a = {
id: item,
status: "3"
}
workNodes.push(a)
})
inspectionInfo.workNodes = workNodes
await request({
url: '/system/info/recheck',
method: 'post',
data: inspectionInfo
})
this.onRefresherrefresh()
this.closehge()
return
} else if (this.isExamine && this.tbindex == 2 && this.isRetrial == 2) {
//跳转到修改工单页面
status = 2
} else if (this.tbindex == 0 && this.isRetrial == 0) {
status = 1
}
inspectionInfo.selectType = status
let res = await request({
// url: '/partnerOwn/partner/stopInspection',
url: '/system/info/controls',
method: 'post',
data: inspectionInfo
})
if (res.code == 200) {
uni.showToast({
title: "成功",
})
}
this.onRefresherrefresh()
this.closehge()
console.log(data);
},
/** 接车拍照提交*/
submit(item) {
console.log('文件', this.fileList1)
console.log('infoid', this.selectedInfo)
request({
url: '/system/info/meetCarPhoto',
data: {
meetCarId: this.selectedInfo.id,
remark: this.remark,
sourceType: this.selectedInfo.sourceType,
dealImages: this.fileList1.map(item => item.url).join(',')
},
method: 'post'
}).then(res => {
if (res.code === 200) {
uni.showToast({
title: '提交成功',
icon: 'none',
duration: 2000
});
this.openMeetCar = false
this.remark = ''
this.fileList1 = []
this.onRefresherrefresh()
}
})
},
async afterRead(event) {
// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
let lists = [].concat(event.file)
let fileListLen = this[`fileList${event.name}`].length
lists.map((item) => {
this[`fileList${event.name}`].push({
...item,
})
})
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url)
console.log(result)
let item = this[`fileList${event.name}`][fileListLen]
this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
status: 'success',
message: '',
url: result
}))
fileListLen++
}
},
async uploadFilePromise(url) {
let res = await upload({
url: '/common/upload',
filePath: url,
})
return res.data.url
},
deletePic(event) {
this[`fileList${event.name}`].splice(event.index, 1)
},
goNotice() {
uni.navigateTo({
url: '/pages/xiaoxi/notice?type=staff'
})
},
confirms(e) {
this.takingData.workNodeId = e.value[0].value
this.show = false
this.orderTaking(this.takingData)
},
cancels() {
this.show = false
},
confirmsMeetMan(e) {
const selectedUserId = e.value[0].id
console.log('选择的工单id', this.selectedInfo)
console.log('selectedUserId', e)
//修改接车人
request({
url: '/system/info/updateLeadMan',
method: 'post',
data: {
id: this.selectedInfo.id,
meetManId: selectedUserId
}
}).then(res => {
if (res.code === 200) {
uni.showToast({
title: '更换成功',
icon: 'none',
duration: 2000
});
this.getList()
}
})
this.showMeetMan = false
},
cancelsMeetMan() {
this.showMeetMan = false
},
/*获取接车员信息*/
getMeetMan() {
console.log('执行了吗')
request({
url: '/system/role/getUsersByRoleCode',
method: 'get',
params: {
code: "jcjchc"
}
}).then(res => {
this.columnsMeetMan = res.data
})
},
// 让操作人选择要开始的项目
async orderTakingBefore(item) {
this.takingData = {
workNodeId: null,
id: item.id
}
let res = await request({
url: `/system/info/getWorkNodeByIdAndNow?id=${item.id}&status=${(this.tapValue === '4' ? "3" : "0")}${(this.tapValue === '3' ? "&flag=false" : "")}`,
method: 'get',
})
if (res.data) {
this.chooseWorkNodes = [Object.keys(res.data).map(key => ({
value: key,
label: res.data[key]
}))]
}
// this.chooseWorkNodes = [res.data.map(i => {
// return {
// label: i.projectName,
// value: i.id
// }
// })]
this.show = true
},
msgInfo() {
console.log(this.msgSocket, 'msgSocket')
if (this.msgSocket) {
console.log('消息回调启动成功')
this.msgSocket.onMessage(res => {
this.pageNum = 1
this.totalPages = 0
this.getList()
})
}
},
/**
* 根据 text 查找对应的 value
* @param {string} text - 要查找的文本
* @param {Array} list - 数据列表(默认使用 tapList
* @returns {string|null} 返回对应的 value找不到则返回 null
*/
getValueByText(text, list = this.tapList) {
const item = list.find(item => item.text === text);
return item ? item.value : null;
},
/*判断是否是收费登陆人*/
async isExamines() {
const res = await request({
url: '/system/info/isExamine',
method: 'get'
})
this.isExamine = res.data
},
callUser(phone) {
uni.makePhoneCall({
phoneNumber: phone //仅为示例
});
},
async getList() {
let res = await request({
url: '/system/info/geStelectInspection',
method: 'get',
params: {
partnerId: this.partnerId,
status: this.tapValue,
carNum: this.carNum,
pageSize: this.pageSize,
pageNum: this.pageNum,
}
})
if (res.code == 200) {
if (this.pageNum != 1) {
this.infoDatas = this.infoDatas.concat(res.rows)
} else {
this.infoDatas = res.rows
}
console.log('此时的tapindex', this.tapindex);
const ids = this.infoDatas.filter(item => !item.nodeNames).map(item => item.id)
if (this.tapValue != '6') {
if (!this.belowStandardShow.includes(this.tapValue)) {
if (ids && ids.length > 0) {
const response = await request({
url: "/partnerOwn/partner/getProjectByIds?ids=" + ids,
method: 'get'
})
if (response.data) {
const data = response.data
this.infoDatas.forEach(item => {
this.$set(item, 'nodeNames', data[item.id])
})
}
}
} else {
// 查询不合格的项目
if (ids && ids.length > 0) {
const response = await request({
url: `/partnerOwn/partner/getProjectBelowStandardByIds`,
method: 'get',
params: {
ids: ids.join(','),
status: this.tapValue == '4' ? '3' : '',
type: this.tapValue == '7' ? '0' : ''
}
})
if (response.data) {
const data = response.data
this.infoDatas.forEach(item => {
let nodeNamesArr = []
let nodeIds = []
if (data[item.id]) {
data[item.id].forEach(data => {
nodeNamesArr.push(data.name)
nodeIds.push(data.id)
})
const nodeNames = nodeNamesArr.join('、')
this.$set(item, 'nodeNames', nodeNames)
this.$set(item, 'nodeIds', nodeIds)
console.log('数据', item);
}
})
}
}
}
}
let total = res.total
this.totalPages = Math.ceil(total / this.pageSize);
}
await this.getCount()
this.isTriggered = false
},
getfan() {
uni.navigateBack()
},
godetails(item) {
uni.navigateTo({
url: `/pages/index/orderdetails?inspectionInfoId=${item.id}&workNodeId=${item.workNodeId}&workNodeStatus=${item.workNodeStatus}&type=staff`
})
},
orderTaking(data) {
request({
url: '/system/info/orderTaking',
method: 'post',
params: {
inspectionId: data.id,
workNodeId: data.workNodeId
}
}).then(res => {
if (res.code == 200) {
uni.showToast({
title: '接单成功',
icon: 'none'
})
// this.tapindex = 1
this.godetails({
id: data.id,
workNodeId: data.workNodeId,
workNodeStatus: 1
})
}
})
},
cancelAnOrder(data) {
request({
url: '/system/info/cancelAnOrder',
method: 'post',
params: {
inspectionId: data.id,
workNodeId: data.workNodeId
}
}).then(res => {
if (res.code == 200) {
uni.showToast({
title: '取消接单成功',
icon: 'none'
})
this.getList()
}
})
},
/**接车拍照 */
meetCarPhoto(data) {
this.selectedInfo = data
},
gogogo() {
uni.navigateTo({
url: '/pages/index/Neworder'
})
},
gogogoOldOrder() {
uni.navigateTo({
url: '/pages/index/oldOrder'
})
},
gogogoMeetCarOrder() {
uni.navigateTo({
url: '/pages/index/meetCarOrder'
})
},
tapqh(index) {
//如果是待接车
if (this.tapList[index].value == '6') {
this.isShowClient = true
} else {
this.isShowClient = false
}
this.tapValue = this.tapList[index].value
this.tapindex = index
this.infoDatas = []
this.pageNum = 1
this.getList()
}
}
}
</script>
<style scoped lang="scss">
.content {
box-sizing: border-box;
width: 100%;
height: calc(100vh);
background: white;
}
.sshi {
position: absolute;
bottom: 90rpx;
right: 20px;
width: 115px;
height: 115px;
box-sizing: border-box;
padding: 10px;
image {
width: 100%;
height: 100%;
}
}
.top-heder {
width: 100%;
height: 46px;
background: white;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
padding: 5px 15px;
}
.t-left {
width: 10%;
}
.t-input {
width: 85%;
//height: 36px;
//background: #F0F0F0;
//border-radius: 50px;
//box-sizing: border-box;
padding: 0 15px;
//display: flex;
//align-items: center;
}
.top-ail {
width: 100%;
box-sizing: border-box;
padding: 15px;
background-color: #F4F4F4;
}
.mub {
background-color: #F4F4F4;
// height: calc(100vh);
}
.tap {
width: 100%;
height: 44px;
background: #FFFFFF;
display: flex;
align-items: center;
justify-content: space-between;
}
.tap-box {
width: 50%;
}
.xhuihui {
width: 100%;
text-align: center;
font-size: 16px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #666666;
//margin-left: 0.5rem;
}
.gang {
width: 32px;
height: 4px;
background: #0D2E8D;
border-radius: 4px;
margin: 2px auto;
margin-left: 1rem;
}
.xzhei {
font-weight: bold !important;
color: #333333 !important;
}
.m-box {
position: relative;
background: #FFFFFF;
border-radius: 8px;
box-sizing: border-box;
padding: 15px 10px;
margin: 10px auto;
}
.m-top {
width: 100%;
box-sizing: border-box;
padding-bottom: 15px;
border-bottom: 1px solid #EEEEEE;
display: flex;
align-items: center;
justify-content: space-between;
}
.top-left {}
.top-right {
z-index: 9999;
width: 33px;
height: 33px;
border-radius: 50%;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
.dhei {
font-size: 16px;
font-weight: bold;
color: #333333;
margin-bottom: 5px;
}
.xhui {
font-size: 15px;
font-weight: 400;
color: #999999;
}
.on-input {
width: 100%;
display: flex;
align-items: center;
font-size: 15px;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #999999;
margin-bottom: 10px;
margin-top: 10px;
// justify-content: space-between;
}
.bottom-di {
display: flex;
justify-content: center;
align-items: center;
}
.button-container {
display: flex;
justify-content: space-between;
width: 100%;
}
.button {
width: 80%;
height: 45px;
background: linear-gradient(180deg, #3F61C0 0%, #0D2E8D 100%);
border-radius: 50px;
display: flex;
align-items: center;
justify-content: center;
color: white;
}
.ju {
font-size: 24px;
font-weight: 600;
color: #FF571A;
}
.lanniu-container {
width: 90%;
position: fixed;
bottom: 60px;
display: flex;
align-items: center;
justify-content: space-between;
/* 控制子元素之间的间距可以改为 center/space-around */
transform: translate(-50%);
left: 50%;
z-index: 10074;
}
.lanniu-container2 {
position: fixed;
display: flex;
align-items: center;
justify-content: space-between;
/* 控制子元素之间的间距可以改为 center/space-around */
z-index: 999999;
}
.lanniu {
display: flex;
align-items: center;
justify-content: center;
background: #0D2E8D;
color: white;
height: 44px;
border-radius: 8px;
font-weight: bold;
flex: 1;
/* 子元素均分宽度 */
margin: 0 5px;
/* 控制子元素之间的间距 */
}
.csz {
font-size: 20px;
font-weight: bold;
color: #FF571A;
}
/* 确保 "检测内容" 始终在一行 */
.single-line {
white-space: nowrap;
flex-shrink: 0;
}
/* 允许 item.nodeNames 多行显示 */
.multi-line {
white-space: pre-line;
/* 保留换行符但允许文本换行 */
word-break: break-all;
/* 长单词或 URL 会在必要时断开 */
}
.msg-num {
position: absolute;
right: -29rpx;
top: -20rpx;
color: white;
background: #d74a43;
padding: 5rpx 10rpx;
/* 使用 padding 确保有足够的空间 */
min-width: 35rpx;
/* 最小宽度 */
line-height: 1.2;
/* 调整行高以适应不同内容 */
text-align: center;
font-weight: 800;
font-size: 11px;
border-radius: 20rpx;
/* 椭圆效果 */
white-space: nowrap;
/* 确保文本不换行 */
}
.icon1 {
position: relative;
width: 56rpx;
height: 56rpx;
//margin-left: 30rpx;
.msg-num {
position: absolute;
right: -15rpx;
color: white;
background: #d74a43;
width: 35rpx;
height: 35rpx;
line-height: 35rpx;
text-align: center;
font-weight: 800;
font-size: 11px;
border-radius: 50%;
top: -15rpx;
}
}
.on-inputx {
width: 100%;
display: flex;
align-items: center;
margin: 15px auto;
}
.popup-box {
overflow: hidden;
border-radius: 8px;
box-sizing: border-box;
padding: 15px;
width: 100%;
background-color: white;
margin-bottom: 80rpx;
}
.bottomx {
margin: 0 auto;
width: 425rpx;
height: 76rpx;
border-radius: 6px 6px 6px 6px;
opacity: 1;
border: 1px solid #0174F6;
display: flex;
align-items: center;
justify-content: center;
//color: #0174F6;
}
.popup-box {
overflow: hidden;
border-radius: 8px;
box-sizing: border-box;
padding: 15px;
width: 100%;
background-color: white;
}
.t-title {
font-size: 17px;
font-weight: bold;
color: #333333;
}
.box_ {
width: 100%;
display: flex;
flex-wrap: wrap;
}
.box_button {
border-radius: 6px;
border: 1px solid #999;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
box-sizing: border-box;
padding: 5px 10px;
margin-right: 5px;
margin-bottom: 5px;
}
.box_button_x {
border-radius: 6px;
border: 1px solid #0D2E8D;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
box-sizing: border-box;
padding: 5px 10px;
margin-right: 5px;
margin-bottom: 5px;
background: #0D2E8D;
color: #fff;
}
.on-inputx {
width: 100%;
display: flex;
align-items: center;
margin: 15px auto;
}
.anniu {
box-sizing: border-box;
padding: 2px 10px;
margin: 0px 10px;
// background: linear-gradient(180deg, #3F61C0 0%, #0D2E8D 100%);
border: 1px solid #0D2E8D;
border-radius: 23px;
font-size: 15px;
color: #0D2E8D;
display: flex;
align-items: center;
justify-content: center;
}
.an {
box-sizing: border-box;
padding: 2px 10px;
margin: 0px 10px;
background: linear-gradient(180deg, #3F61C0 0%, #0D2E8D 100%) !important;
border-radius: 23px;
font-size: 15px;
color: white !important;
display: flex;
align-items: center;
justify-content: center;
}
</style>