This commit is contained in:
许允枞 2025-02-19 18:01:29 +08:00
parent 46f44a8046
commit 0d301e865d
46 changed files with 2681 additions and 1 deletions

View File

@ -0,0 +1,63 @@
<template>
<view class="my-header">
<view class="my-icons" @click="goback">
<slot></slot>
</view>
<view class="my-text">{{titles}}</view>
<view class="my-icons"></view>
</view>
</template>
<script>
export default {
data() {
return {
}
},
props: {
titles: String
},
mounted() {
},
methods:{
goback(){
uni.navigateBack()
}
}
}
</script>
<style scoped lang="scss">
.my-header {
width: 100%;
height: 200rpx;
// background: linear-gradient(180deg, #B2D2FC 0%, rgba(255, 255, 255, 0.84) 100%);
display: flex;
align-items: center;
justify-content: space-between;
color: #fff;
box-sizing: border-box;
padding: 0px 15px;
padding-top: 40px;
z-index: 99999;
background: linear-gradient( 180deg, #054DF3 0%, #55A3FF 100%);
position: fixed;
top: 0px;
.my-icons {
width: 20px;
}
.my-text {
font-weight: bold;
}
}
</style>

View File

@ -36,6 +36,13 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/manage/NewdeviceManage",
"style": {
"navigationBarTitleText": "设备管理",
"navigationStyle": "custom"
}
},
{
"path": "pages/authority/authority",
"style": {
@ -92,6 +99,13 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/manage/internalManagement",
"style": {
"navigationBarTitleText": "内部管理",
"navigationStyle": "custom"
}
},
{
"path": "pages/manage/deviceAdd",
"style": {
@ -113,6 +127,20 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/index/newindex",
"style": {
"navigationBarTitleText": "新首页",
"navigationStyle": "custom"
}
},
{
"path": "pages/index/addStaff",
"style": {
"navigationBarTitleText": "添加员工",
"navigationStyle": "custom"
}
},
{
"path": "pages/xiaoxi/xiaoxi",
"style": {
@ -190,6 +218,13 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/index/NewstaffManagement",
"style": {
"navigationBarTitleText": "新员工列表",
"navigationStyle": "custom"
}
},
{
"path": "pages/index/homecar",
"style": {
@ -410,6 +445,22 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/manage/workReport/reportList",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": true,
"navigationStyle": "custom"
}
},
{
"path": "pages/manage/workReport/reportDetals",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": true,
"navigationStyle": "custom"
}
},
{
"path": "pages/manage/workReport/workReportAdd",
"style": {

View File

@ -274,7 +274,7 @@
},
goselect(){
uni.reLaunch({
url:'/pages/index/synthesis'
url:'/pages/index/newindex'
})
},
//

View File

@ -0,0 +1,492 @@
<template>
<view class="container">
<headersVue :titles="titles"><u-icon name="arrow-left" color="#fff" size="18"></u-icon></headersVue>
<view class="content">
<view class="top_">
<view class="search_box">
<u-search placeholder="请输入员工姓名进行搜索" @search="getindex" :showAction="false" searchIconColor="#427FFE" v-model="workName"></u-search>
</view>
<scroll-view scroll-x="true" class="tap_box">
<view class="tap_list" :class="{ 'acColor': tapIndex == index}" v-for="(item,index) in tabList"
:key="index" @click="gettap(index,item.id)">
<view class=""> {{item.name}}</view>
<view class="gang" :class="{ 'actColor': tapIndex == index}"></view>
</view>
</scroll-view>
</view>
<view class="lsit_">
<view class="list_box" v-for="(item, index) in goodsList" :key="index">
<view class="checkbox_" @click="setIndex(item.id)">
<u-icon name="checkmark" color="#2979ff" size="18" v-if="workids.includes(item.id)"></u-icon>
</view>
<view class="right_box" >
<view class="d_s" @click="toInfo(item)">
<view class="user_">
<image :src="item.avatar" mode="" v-if="item.avatar"></image>
<image src="/static/imgs/yh.png" v-else mode=""></image>
</view>
<view class="name_">{{ item.nickname || item.username }}</view>
<view class="icon_"><u-text :lines="1" :text="item.roleNames" /></view>
</view>
<view class="d_b">
<view class="">
<text style="color: #8D90A6;">电话</text>
<text>{{ item.mobile || item.username }}</text>
</view>
<view class="tel_" @click="gettel(item)">
<image src="/static/imgs/tel.png" mode=""></image>
</view>
</view>
</view>
</view>
</view>
<view style="width: 100%; height: 128rpx; "></view>
</view>
<view class="bottom_">
<view class="bottom_left" @click="getdelete()">删除员工</view>
<view class="bottom_right" @click="goAdd()" >添加员工</view>
</view>
</view>
</template>
<script>
import headersVue from '../../components/header/headers.vue';
import request from "@/utils/request";
import config from "@/config";
export default {
data() {
return {
titles: "员工管理",
keyword:'',
List: [],
listIndex:[],
tapIndex:0,
tapList: [],
show: false,
status: 'loading',
msg: '3',
goodsList: [],
tabList: [],
renList: [],
baseUrl: "http://192.168.1.4:8080/lanan",
partnerId: '',
isListing: 1,
goodsTitle: "",
taplist: [{
Text: '已发布',
id: 1
},
{
Text: '待上架',
id: 0
},
],
pageNum: 1, //
pageSize: 10, //
totalPages: 0, //
realName: "",
phoneNum: "",
workName: "",
workids: [],
postid: '',
gwindex: 0,
gwid: 0,
roleId: undefined,
addRoleId: undefined,
education: null,
educationText: null,
idCard: null,
joinDate: null,
probationPeriod: null,
socialSecurityBuyDate: null,
educations: [],
showEducation: false,
showJoinedDate: false,
showFormalDate: false,
showSafeDate: false,
files: [],
showDriveType: false,
driverLicenseType: [],
driverLicenseTypeArr: [],
driverLicenseTypeArrStr: null
}
},
components:{
headersVue
},
onLoad() {
this.getDriveType()
this.gettab()
},
onReachBottom() {
if (this.pageNum >= this.totalPages) {
uni.showToast({
title: '没有下一页数据',
icon: 'none'
})
} else {
this.pageNum++
this.gettab()
}
},
methods:{
gettap(index, id) {
this.tapIndex = index
this.roleId = id
this.goodsList = []
this.pageNum = 1
this.getindex()
},
setIndex(num){
const index = this.workids.indexOf(num); //
if (index === -1) {
this.workids.push(num); //
} else {
this.workids.splice(index, 1); //
}
console.log(this.workids);
},
gettel(num) {
const value = num.mobile || num.username
uni.makePhoneCall({
phoneNumber: value //
});
},
toInfo(data){
uni.navigateTo({
url: '/pages/index/addStaff?id=' + data.id
})
},
async getdelete() {
if (this.workids == '') {
uni.showToast({
title: '请至少选择一名要删除的员工!',
icon: 'none'
})
return
} else {
// this.workids = this.workids.join(",")
}
let res = await request({
url: '/system/user/deleteUserByIds',
method: 'delete',
data: this.workids
})
if (res.code == 200) {
uni.showToast({
title: "操作成功",
})
this.pageNum = 1
this.goodsList = []
this.getindex()
}
},
getDriveType() {
return request({
url: '/common/down/getDriverLicenseType',
method: 'get'
}).then(res => {
//id
this.driverLicenseType = res.data
})
},
goAdd(){
uni.navigateTo({
url:'/pages/index/addStaff'
})
},
goManage(num){
if(num == 1){
uni.navigateTo({
url:'/pages/index/staffManagement'
})
}
},
async gettab() {
let res = await request({
url: '/system/role/pageByQuery',
method: 'get',
params: {
servicePackageId: 'jiance'
}
})
this.tabList = [{
name: '全部',
id: undefined
}]
this.tabList.push(...res.data)
this.roleId = this.tabList[0].id
this.renList = res.data
this.getindex()
},
async getindex() {
if (this.workName != '') {
this.pageNum = 1
this.goodsList = []
}
let data = {
nickname: this.workName,
roleId: this.roleId,
pageNo: this.pageNum, //
pageSize: this.pageSize, //
}
let res = await request({
url: '/system/role/selectListByRoleId',
method: 'get',
params: data
})
if (res.code == 200) {
if (this.pageNum != 1) {
this.goodsList = this.goodsList.concat(res.rows)
} else {
this.goodsList = res.rows
}
this.goodsList.forEach(item => {
if (item.avatar && !item.avatar.includes(config.baseImageUrl)){
item.avatar = config.baseImageUrl + (item.avatar[0] === '/' ? item.avatar : '/' + item.avatar)
}
})
let total = res.total
this.totalPages = Math.ceil(total / this.pageSize);
}
const newUsers = this.goodsList.filter(item => !item.roleName)
if (newUsers && newUsers.length > 0) {
const ids = newUsers.map(item => item.id)
request({
url: '/inspection/util/getRoleNameByIds?ids=' + ids,
method: 'get'
}).then(res => {
this.goodsList.filter(item => !item.roleName).map(item => {
this.$set(item, "roleName", res.data[item.id])
})
})
}
},
}
}
</script>
<style scoped lang="scss">
.icon_ {
background: #eaf2fe;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
padding: 5rpx 10rpx;
color: #427FFE;
font-size: 14px;
max-width: 200rpx; /* 限制最大宽度 */
white-space: nowrap; /* 不换行 */
overflow: hidden; /* 超出部分隐藏 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
flex-shrink: 0; /* 禁止挤压 */
}
.user_ {
width: 90rpx; /* 固定宽度 */
height: 90rpx; /* 固定高度 */
border-radius: 4rpx;
overflow: hidden;
margin-right: 20rpx;
flex-shrink: 0; /* 禁止挤压 */
}
.d_s {
display: flex;
align-items: center;
margin-bottom: 30rpx;
width: 100%; /* 确保宽度占满父容器 */
}
.name_ {
font-size: 32rpx;
color: #101A3E;
margin-right: 20rpx;
flex-shrink: 0; /* 禁止挤压 */
}
image{
width: 100%;
height: 100%;
}
.container{
background: #F1F3F6;
height: 100vh;
}
.content{
width: 100%;
box-sizing: border-box;
padding-top: 170rpx;
}
.top_{
width: 100%;
box-sizing: border-box;
padding: 20rpx;
background: #fff;
padding-bottom: 0px;
}
.tap_box {
width: 100%;
white-space: nowrap;
margin: 5px 0px;
box-sizing: border-box;
padding-bottom: 5px;
}
.tap_list {
color: #333333;
margin: 0px 10px;
display: inline-block;
}
.acColor {
font-weight: bold;
color: #5384fd;
}
.right_box{
width: 88%;
}
.gang {
width: 20px;
height: 4px;
margin-top: 5px;
// background-color: #5384fd;
border-radius: 30px;
margin: 5px auto;
}
.actColor {
background-color: #5384fd;
}
.search_box{
box-sizing: border-box;
padding-bottom: 20rpx;
border-bottom: 2rpx solid #F5F5F5;
margin-top: 30rpx;
}
.lsit_{
background: #F1F3F6;
box-sizing: border-box;
padding: 30rpx;
}
.list_box{
width: 100%;
background: #fff;
margin-bottom:30rpx ;
box-sizing: border-box;
padding: 20rpx;
display: flex;
}
.checkbox_{
width: 48rpx;
height: 48rpx;
border-radius: 8rpx;
border: 2rpx solid #E0E0E0;
margin-right: 15rpx;
display: flex;
align-items: center;
justify-content: center;
}
//.d_s{
// display: flex;
// align-items: center;
// margin-bottom: 30rpx;
//}
.d_b{
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
//.user_{
// width: 90rpx;
// height: 90rpx;
// border-radius: 4rpx;
// overflow: hidden;
// margin-right: 20rpx;
//}
//.icon_{
// background: #eaf2fe;
// border-radius: 8rpx;
// display: flex;
// align-items: center;
// justify-content: center;
// box-sizing: border-box;
// padding:5rpx 10rpx;
// color: #427FFE;
// font-size: 14px;
//
//
//}
.tel_{
width: 36rpx;
height: 36rpx;
}
//.name_{
// font-size: 32rpx;
// color: #101A3E;
// margin-right: 20rpx;
//}
.bottom_{
width: 100%;
height: 158rpx;
background: #FFFFFF;
box-shadow: 0rpx -1rpx 24rpx 0rpx rgba(0,0,0,0.1);
border-radius: 15px 15px 0px 0px;
position: fixed;
left: 0;
bottom: 0;
z-index: 999;
display: flex;
align-items: center;
justify-content: center;
}
.bottom_left{
width: 301rpx;
height: 78rpx;
border: 2rpx solid #427FFE;
display: flex;
align-items: center;
justify-content: center;
color: #427FFE;
font-size: 28rpx;
border-radius: 50px;
margin: 30rpx;
}
.bottom_right{
width: 301rpx;
height: 78rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
color: #fff;
background: #427FFE;
border: 2rpx solid #427FFE;
border-radius: 50px;
margin: 30rpx;
}
.roleName{
white-space: nowrap; /* 不换行 */
overflow: hidden; /* 超出部分隐藏 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
width: 200rpx; /* 根据需要设置宽度 */
}
</style>

598
pages/index/addStaff.vue Normal file
View File

@ -0,0 +1,598 @@
<template>
<view class="content">
<headersVue :titles="titles">
<u-icon name="arrow-left" color="#fff" size="18"></u-icon>
</headersVue>
<view class="container">
<view class="box_">
<view class="d_s" style="margin-bottom: 10px;" v-if="userId">
<view class="touxiang_">
<image src="/static/imgs/yh.png" mode=""></image>
</view>
<view class="">
<view class="name_">{{ staff.nickname }}</view>
<view class="d_s">
<view class="tel_">
<image src="/static/imgs/tel.png" mode=""></image>
</view>
<view class="telnum">手机号{{ staff.mobile }}</view>
</view>
</view>
</view>
<view class="d_b" v-if="!userId">
<view class="">姓名</view>
<input type="text" placeholder="请输入姓名" v-model="staff.nickname" style="text-align: right;"/>
</view>
<view class="d_b" v-if="!userId">
<view class="">手机号</view>
<input type="text" placeholder="请输入手机号" v-model="staff.mobile" style="text-align: right;"/>
</view>
<view class="d_b">
<view class="">学历</view>
<view class="" @click="showEducation = true">
{{ staff.educational != null ? this.staff.educational : '请选择学历' }} >
</view>
</view>
<view class="d_b">
<view class="">身份证号</view>
<input type="text" placeholder="请输入身份证号" v-model="staff.idCard" style="text-align: right;"/>
</view>
<view class="d_b">
<view class="">入职时间</view>
<view class="" @click="showJoinedDate = true">
{{ staff.joinDate != null ? this.staff.joinDate : '请选择入职时间' }} >
</view>
</view>
<view class="d_b">
<view class="">转正时间</view>
<view class="" @click="showFormalDate = true">
{{ staff.probationPeriod != null ? this.staff.probationPeriod : '请选择转正时间' }} >
</view>
</view>
<view class="d_b">
<view class="">购买保险时间</view>
<view class="" @click="showSafeDate = true">
{{ staff.socialSecurityBuyDate != null ? this.staff.socialSecurityBuyDate : '请选择购买保险时间' }} >
</view>
</view>
<view class="d_b">
<view class="">驾照类型</view>
<view class="" @click="showDriveType = true">
{{ driverLicenseTypeArrStr != null ? this.driverLicenseTypeArrStr : '请选择驾照类型' }} >
</view>
</view>
<view class="d_b" v-if="!userId">
<view class="">岗位</view>
<view class="" @click="showRole = true">
{{ roleName != null ? this.roleName : '请选择岗位' }} >
</view>
</view>
<view class="d_b" @click="handleUpload">
<view class="">附件</view>
<view class="lan_">上传附件
<image src="/static/imgs/add.png" mode=""></image>
</view>
</view>
<u-upload
ref="uploadRef"
:fileList="fileList1"
@afterRead="afterRead"
@delete="deletePic"
name="1"
multiple
:maxCount="10"
v-show="fileList1.length > 0"
>
</u-upload>
<view class="hui_box" v-if="fileList1.length == 0">
<image src="/static/imgs/wod.png" mode=""></image>
<view class="">
<view class="big_">附件格式 jpg/png</view>
<view class="sm_">100KB</view>
</view>
</view>
<view class="anniu" @click="submit">
{{ buttonTile }}
</view>
</view>
</view>
<u-picker :show="showEducation" ref="uPicker" :columns="[educations]"
@confirm="chooseEducation" @cancel="showEducation = false"
keyName="label"></u-picker>
<u-picker :show="showRole" ref="uPicker" :columns="[roles]"
@confirm="chooseRole" @cancel="showRole = false"
keyName="name"></u-picker>
<qianziyu-select
:show="showDriveType"
type="checkbox"
name="id"
:dataLists="driverLicenseType"
:showSearch=false
@cancel="showDriveType = false"
:checkboxData="driverLicenseTypeArr"
@submit="onsubmit"
@update:checkboxData="driverLicenseTypeArr = $event"
>
</qianziyu-select>
<u-datetime-picker
:show="showJoinedDate"
v-model="selectJoinDate"
@cancel="showJoinedDate = false"
@confirm="chooseJoinDate"
mode="date"
return-type='string'
></u-datetime-picker>
<u-datetime-picker
:show="showFormalDate"
v-model="selectProbationPeriod"
@cancel="showFormalDate = false"
@confirm="chooseFormalDate"
mode="date"
return-type='string'
></u-datetime-picker>
<u-datetime-picker
:show="showSafeDate"
v-model="selectSocialSecurityBuyDate"
@cancel="showSafeDate = false"
@confirm="chooseSafeDate"
mode="date"
return-type='string'
></u-datetime-picker>
</view>
</template>
<script>
import headersVue from '../../components/header/headers.vue';
import request from "@/utils/request";
import {formatDate, getDictDataByType} from "@/utils/utils";
import upload from "@/utils/upload";
import {baseImageUrl} from "@/config";
export default {
data() {
return {
titles: "新增员工",
staff: {
joinDate: null,
probationPeriod: null,
socialSecurityBuyDate: null,
},
fileList1: [],
selectJoinDate: new Date().toString(),
selectProbationPeriod: new Date().toString(),
selectSocialSecurityBuyDate: new Date().toString(),
buttonTile: '保存',
show: false,
showRole: false,
status: 'loading',
userId: undefined,
showEducation: false,
showJoinedDate: false,
showFormalDate: false,
showSafeDate: false,
showDriveType: false,
educations: [],
roles: [],
driverLicenseType: [],
driverLicenseTypeArr: [],
driverLicenseTypeArrStr: null,
roleName: null,
}
},
components: {
headersVue
},
onLoad(data) {
if (data.id) {
this.titles = '编辑员工'
this.userId = data.id
this.getInfoByUserId()
this.buttonTile = '修改'
}
this.getEducation()
this.getDriveType()
this.getRoles()
},
methods: {
cancelShow() {
this.show = !this.cancelShow
},
async getRoles() {
let res = await request({
url: '/system/role/pageByQuery',
method: 'get',
params: {
servicePackageId: 'jiance'
}
})
this.roles = res.data
},
onsubmit(selectedData) {
selectedData.map(item => item.id);
this.driverLicenseTypeArr = selectedData;
this.driverLicenseTypeArrStr = selectedData.map(item => item.id).join(',');
this.showDriveType = false; //
},
getDriveType() {
return request({
url: '/common/down/getDriverLicenseType',
method: 'get'
}).then(res => {
//id
this.driverLicenseType = res.data
})
},
submit() {
//
console.log(this.staff.fileList)
if (this.userId) {
this.update()
}else {
this.add()
}
},
update() {
//
const flag = this.validData()
if (!flag) {
return
}
this.staff.userId = this.userId
console.log(this.staff)
const data = {
...this.staff,
fileList: this.fileList1,
driverLicenseType: this.driverLicenseTypeArrStr,
driverLicenseTypeArr: this.driverLicenseTypeArr.map(item => item.id)
}
request({
url: '/inspectionStaff/update',
method: 'put',
data: data
}).then(res => {
uni.showToast({
title: "编辑成功"
})
this.getInfoByUserId()
})
},
async add() {
//
const flag = this.validData()
if (!flag) {
return
}
let data = {
nickname: this.staff.nickname,
mobile: this.staff.mobile,
username: this.staff.nickname,
status: 0,
userType: '01',
roleId: this.staff.roleId,
name: this.nickname,
joinDate: this.staff.joinDate,
idCard: this.staff.idCard,
educational: this.staff.educational,
probationPeriod: this.staff.probationPeriod,
socialSecurityBuyDate: this.staff.socialSecurityBuyDate,
driverLicenseTypeArr: this.driverLicenseTypeArr.map(item => item.id),
password: '123456'
}
let res = await request({
url: '/inspectionStaff/save',
method: 'post',
data: data
})
if (res.code == 200) {
let roleIds = []
roleIds.push(this.staff.roleId)
let resp = await request({
url: '/system/permission/assign-user-role',
method: 'post',
data: {
userId: res.data,
roleIds: roleIds
}
})
uni.showToast({
title: "添加成功"
})
this.show = false
this.getindex()
}
},
validData() {
if (!this.staff.nickname || !this.staff.mobile) {
uni.showToast({
title: '姓名和电话不能有空',
icon: 'none'
})
return false
}
if (!this.staff.roleId && !this.userId) {
uni.showToast({
title: '请选择岗位',
icon: 'none'
})
return false
}
return true
},
chooseJoinDate(e) {
this.$nextTick(() => {
this.staff.joinDate = formatDate(e.value)
this.selectJoinDate = this.staff.joinDate
})
this.showJoinedDate = false
console.log(this.staff)
},
chooseFormalDate(e) {
this.$nextTick(() => {
this.staff.probationPeriod = formatDate(e.value);
this.selectProbationPeriod = this.staff.probationPeriod
})
this.showFormalDate = false;
console.log(this.staff)
},
chooseSafeDate(e) {
this.$nextTick(() => {
this.staff.socialSecurityBuyDate = formatDate(e.value)
this.selectSocialSecurityBuyDate = this.staff.socialSecurityBuyDate
})
this.showSafeDate = false
console.log(this.staff)
},
async getInfoByUserId() {
const res = await request({
url: '/inspectionStaff/get',
params: {
id: this.userId
},
method: 'get'
})
this.staff = res.data
this.topName = this.staff?.nickname
if (res.data.driverLicenseType) {
this.driverLicenseTypeArrStr = res.data.driverLicenseType
res.data.driverLicenseTypeArr.forEach(item => {
let temp = {
id: item,
name: item
}
this.driverLicenseTypeArr.push(temp)
})
}
if (this?.staff?.fileList) {
this.fileList1 = []
this.staff.fileList.forEach((item) => {
const temp = {
name: item.name,
url: item.url.startsWith("http") ? item.url : baseImageUrl + '/' + item.url
}
this.fileList1.push(temp)
})
console.log('tupian', this.fileList1)
}
},
getEducation() {
if (!this.educations || this.educations.length === 0) {
this.getEducations()
}
const index = this.educations.findIndex(item => item.value === this.staff.education)
if (index !== -1) {
return this.educations[index].label
}
return ''
},
async getEducations() {
this.educations = await getDictDataByType("company_staff_edu")
},
chooseEducation(e) {
this.$set(this.staff, 'education', e.value[0].label)
this.staff.educational = e.value[0].label
this.showEducation = false
},
chooseRole(e) {
console.log(e)
this.staff.roleId = e.value[0].id
this.roleName = e.value[0].name
this.showRole = false
},
//
handleUpload() {
// ref u-upload
this.$refs.uploadRef.chooseFile();
},
//
deletePic(event) {
this[`fileList${event.name}`].splice(event.index, 1);
},
//
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,
status: "uploading",
message: "上传中",
});
});
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url);
let item = this[`fileList${event.name}`][fileListLen];
this[`fileList${event.name}`].splice(
fileListLen,
1,
Object.assign(item, {
status: "success",
message: "",
url: result,
})
);
fileListLen++;
}
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
// let a = uni.uploadFile({
// url: "http://192.168.2.21:7001/upload", //
// filePath: url,
// name: "file",
// formData: {
// user: "test",
// },
// success: (res) => {
// setTimeout(() => {
// resolve(res.data.data);
// }, 1000);
// },
// });
upload({
url: '/common/upload',
filePath: url,
}).then((res) => {
resolve(res.data.url);
console.log(this.fileList1)
this.forceRefreshFiles(); //
})
});
},
},
}
</script>
<style scoped lang="scss">
.content {
background: #f4f5f6;
height: 100vh;
}
.container {
width: 100%;
background: #f4f5f6;
box-sizing: border-box;
padding: 30rpx;
padding-top: 200rpx;
padding-bottom: 28px;
}
.box_ {
background: #FFFFFF;
width: 100%;
box-sizing: border-box;
padding: 30rpx;
border-radius: 8rpx;
}
.d_s {
display: flex;
align-items: center;
}
.d_b {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 30rpx 0rpx;
border-top: 2rpx solid #F5F6F9;
font-size: 28rpx;
color: #8D90A6;
}
.touxiang_ {
width: 90rpx;
height: 90rpx;
margin-right: 20rpx;
image {
width: 100%;
height: 100%;
}
}
.tel_ {
width: 30rpx;
height: 30rpx;
margin-right: 20rpx;
image {
width: 100%;
height: 100%;
}
}
.name_ {
font-size: 32rpx;
color: #101A3E;
margin-bottom: 5px;
}
.telnum {
font-size: 24rpx;
color: #366FFF;
}
.lan_ {
font-size: 28rpx;
color: #327DFB;
display: flex;
align-items: center;
image {
width: 36rpx;
height: 36rpx;
margin-left: 15rpx;
}
}
.hui_box {
width: 100%;
background: #F5F6F9;
border-radius: 16rpx;
box-sizing: border-box;
padding: 30rpx;
display: flex;
align-items: center;
image {
width: 90rpx;
height: 90rpx;
margin-right: 15rpx;
}
}
.big_ {
font-size: 28rpx;
color: #101A3E;
}
.sm_ {
font-size: 22rpx;
color: #8D90A6;
}
.anniu {
width: 622rpx;
height: 78rpx;
background: #427FFE;
border-radius: 50rpx;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
margin-top: 200rpx;
}
</style>

575
pages/index/newindex.vue Normal file
View File

@ -0,0 +1,575 @@
<template>
<view class="content">
<view class="top_">
<view class="logo_imgs">
<image src="/static/imgs/logo.png" mode=""></image>
</view>
<view class="t_box">
<view class="d_s">
<view class="picture_">
<image @click="showUserDetail" style="width: 104rpx;height: 104rpx;border-radius: 50%;"
v-if="userInfo && userInfo.avatar === null" :src="defaultAvatar" mode="scaleToFill" @error="avatarErr"></image>
<image @click="showUserDetail" style="width: 104rpx;height: 104rpx;border-radius: 50%;" v-else
:src="userInfo.avatar" mode="scaleToFill" @error="avatarErr"></image>
</view>
<view class="">
<view class="name_">
{{ userInfo.nickname }}
</view>
<view class="bqing_">{{ userInfo.roleNames }}</view>
</view>
</view>
<view class="d_s">
<view class="icon1" @click="goNotice()">
<image src="/static/imgs/xiaoxi.png" mode=""></image>
</view>
<view class="icon1">
<image src="/static/imgs/gengduo.png" mode=""></image>
</view>
</view>
</view>
</view>
<view class="three_">
<view class="three_box1">
<view class="">当日订单</view>
<view class="num_">{{ threenum.todayOrderNum }}</view>
</view>
<view class="three_box2">
<view class="">合规合格</view>
<view class="num_">{{ threenum.hgNum }}</view>
</view>
<view class="three_box3">
<view class="">双燃料合格</view>
<view class="num_">{{ threenum.srlNum }}</view>
</view>
</view>
<view class="hang_"></view>
<view class="jg_box">
<view class="jg_top">2024-12-30 星期一 11:05</view>
<view class="jg_ds">
<view class="jg_ys">
<image src="/static/imgs/jg1.png" mode="" @click="goordermanage"></image>
<view class="">订单管理</view>
</view>
<view class="jg_ys">
<image src="/static/imgs/jg2.png" mode=""></image>
<view class="">业务统计</view>
</view>
<view class="jg_ys">
<image src="/static/imgs/jg3.png" mode=""></image>
<view class="">通知公告</view>
</view>
<view class="jg_ys" @click="goInternalManagement">
<image src="/static/imgs/jg4.png" mode=""></image>
<view class="">内部管理</view>
</view>
<view class="jg_ys" @click="show =!show">
<image src="/static/imgs/jg5.png" mode=""></image>
<view class="">更多功能</view>
</view>
</view>
<view class="jg_bt" v-if="show">
<view class="jg_ys1">
<image src="/static/imgs/jg6.png" mode=""></image>
<view class="">发布商品</view>
</view>
<view class="jg_ys1">
<image src="/static/imgs/jg7.png" mode=""></image>
<view class="">商品管理</view>
</view>
<view class="jg_ys1">
<image src="/static/imgs/jg8.png" mode=""></image>
<view class="">订单核销</view>
</view>
<view class="jg_ys1">
<image src="/static/imgs/jg9.png" mode=""></image>
<view class="">优惠券</view>
</view>
<view class="jg_ys1">
<image src="/static/imgs/jg10.png" mode=""></image>
<view class="">使用说明</view>
</view>
</view>
</view>
<view class="hang_"></view>
<view class="list_">
<view class="title_">预约记录</view>
<view class="box_" v-for="(item,index) in 10" :key="index">
<view class="box_ds">
<view class="box_title">小型汽车含5座</view>
<image src="/static/imgs/ns.png" style="width: 88rpx; height: 44rpx; " mode=""></image>
</view>
<view class="box_bd">
<view class="box_ds">
<image src="/static/imgs/car.png" style="width: 36rpx; height: 36rpx; " mode=""></image>
<view class="size_">车牌号鲁A00000</view>
</view>
<image src="/static/imgs/tel.png" style="width: 36rpx; height: 36rpx; " mode=""></image>
</view>
<view class="bd">
<view class="left_">预约人</view>
<view class="right_">王五</view>
</view>
<view class="bd">
<view class="left_">电话</view>
<view class="right_">128 1234 5678</view>
</view>
<view class="bd">
<view class="left_">预约时间</view>
<view class="right_">2025年01月01日</view>
</view>
<view class="bd">
<view class="left_">客户来源</view>
<view class="right_">代办</view>
</view>
</view>
</view>
</view>
</template>
<script>
import {getStorageWithExpiry, setStorageWithExpiry} from "@/utils/auth";
import request from "@/utils/request";
import config from "@/config";
export default {
data() {
return {
titles: "首页",
msg: "1",
List: [],
show: false,
status: 'loading',
warnMsg: [],
chuan: '',
titlemodeal: '通知',
isWorking: false,
user: {},
baseUrl: '',
animate: false,
partnerId: '',
threenum: {},
showScroll: true,
scrollDuration: 3000, //
items: [],
ping: [],
dateStr: '',
week: '',
is_mandatory: false,
url: 'http://159.75.168.143:88/apk/lanan.apk',
title: '版本升级',
contents: '新版本上线了,根据您自己的选择是否升级',
appAndPick: {
appointNum: 0,
pickNum: 0
},
baseImageUrl: this.$baseImageUrl,
noReadNum: 1,
userInfo: {},
defaultAvatar: require('@/static/icons/avatar.png'),
}
},
onShow() {
// this.actList = ["1", "1", "1", "1", "1", ]
// this.status = "nomore"
this.getUserInfo()
this.getindex()
// this.getwarnMsglist()
this.getbottom()
this.getUserInfo()
this.getWarnCount()
this.getAppointAndPickNum()
},
onPullDownRefresh() {
console.log("刷新");
uni.stopPullDownRefresh()
},
onReachBottom() {
// this.show = true
setTimeout(() => {
console.log("加载执行");
}, 2000)
},
methods: {
goInternalManagement(){
uni.navigateTo({
url:'/pages/manage/internalManagement'
})
},
goordermanage(){
uni.navigateTo({
url:'/pages/index/ordermanage'
})
},
goNotice(){
uni.navigateTo({
url:'/pages/notice/notice'
})
},
goback() {
uni.navigateBack()
},
showUserDetail(){
uni.navigateTo({
url: '/pages/index/UserInfo'
})
},
avatarErr(err) {
console.log('err', err)
this.userInfo.avatar = this.defaultAvatar
},
getUserInfo() {
let roleNames = getStorageWithExpiry("roleNames")
if (!roleNames){
request({
url: '/inspection/util/getRoleName',
method: 'get'
}).then(res => {
roleNames = res.data
setStorageWithExpiry("roleNames", roleNames)
})
}
const data = getStorageWithExpiry("userInfo")
if (!data) {
request({
url: '/system/user/profile/get',
method: 'get'
}).then(res => {
this.userInfo = res.data
if (this.userInfo.avatar) {
this.userInfo.avatar = config.baseImageUrl + this.userInfo.avatar
}
this.userInfo.roleNames = roleNames
setStorageWithExpiry("userInfo", this.userInfo)
})
} else {
this.userInfo = data
}
},
getWarnCount(){
request({
url: '/warnMsg/warnMsg/getCount',
method: 'get',
}).then(res => {
if (res.data){
this.noReadNum = res.data
}
})
},
async getAppointAndPickNum() {
let res = await request({
url: '/partnerOwn/partner/getAppointAndPickNum',
method: 'get'
})
if (res.code == 200) {
this.appAndPick = res.data
}
},
//
async getbottom() {
let data = {
partnerId: uni.getStorageSync('partnerId')
}
let res = await request({
url: '/appInspection/news/newMsgNum',
method: 'get',
params: data
})
if (res.code == 200) {
this.chuan = res.data
}
},
async getindex() {
//
let res = await request({
url: '/partnerOwn/partner/shopInfo',
method: 'get',
})
this.user = res.data
this.partnerId = res.data.partnerId
uni.setStorageSync('partnerId', res.data.partnerId)
if (res.data.isWorking == "0") {
this.isWorking = false
}
if (res.data.isWorking == "1") {
this.isWorking = true
}
//
let reszj = await request({
url: '/partnerOwn/partner/statisticsInfo?partnerId=' + this.partnerId,
method: 'get',
})
let nums = {
orderAmount: reszj.data.orderAmount / 100,
orderNum: reszj.data.orderNum,
todayOrderAmount: reszj.data.todayOrderAmount / 100,
todayOrderNum: reszj.data.todayOrderNum,
workedNum: reszj.data.workedNum,
workingNum: reszj.data.workingNum,
srlNum: reszj.data.srlNum,
hgNum: reszj.data.hgNum,
}
this.threenum = nums
//
// let resxf = await request({
// url:'/partnerOwn/partner/orderInfo?partnerId='+this.partnerId,
// method: 'get',
// })
// this.items = resxf.data
//
let resrx = await request({
url: '/partnerOwn/partner/hotGoodsList?partnerId=' + this.partnerId,
method: 'get',
})
this.ping = resrx.data
// this.getswitch()
},
}
}
</script>
<style scoped lang="scss">
image {
width: 100%;
height: 100%;
}
.content {}
.top_ {
width: 100%;
height: 284rpx;
background: linear-gradient(180deg, #054DF3 0%, #55A3FF 100%);
box-sizing: border-box;
padding: 30rpx;
padding-top: 80rpx;
}
.logo_imgs {
width: 160rpx;
height: 40rpx;
margin: 20rpx 0rpx;
}
.t_box {
display: flex;
align-items: center;
justify-content: space-between;
}
.picture_ {
overflow: hidden;
width: 90rpx;
height: 90rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.d_s {
display: flex;
}
.name_ {
font-size: 32rpx;
color: #FFFFFF;
margin-bottom: 10rpx;
}
.bqing_ {
border-radius: 16rpx;
border: 2rpx solid #FFFFFF;
box-sizing: border-box;
color: #FFFFFF;
font-size: 22rpx;
padding: 2px 5px;
}
.icon1 {
width: 56rpx;
height: 56rpx;
margin-left: 30rpx;
}
.three_ {
width: 100%;
box-sizing: border-box;
padding: 30rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.jg_box {
width: 100%;
box-sizing: border-box;
padding: 30rpx;
}
.list_ {
width: 100%;
box-sizing: border-box;
padding: 30rpx;
}
.three_box1 {
width: 216rpx;
height: 116rpx;
background-image: url('/static/imgs/t1.png');
background-size: 100% 100%;
box-sizing: border-box;
padding: 14rpx 18rpx;
font-size: 24rpx;
color: #101A3E;
}
.three_box2 {
width: 216rpx;
height: 116rpx;
background-image: url('/static/imgs/t2.png');
background-size: 100% 100%;
box-sizing: border-box;
padding: 14rpx 18rpx;
font-size: 24rpx;
color: #101A3E;
}
.three_box3 {
width: 216rpx;
height: 116rpx;
background-image: url('/static/imgs/t3.png');
background-size: 100% 100%;
box-sizing: border-box;
padding: 14rpx 18rpx;
font-size: 24rpx;
color: #101A3E;
}
.num_ {
font-size: 36rpx;
color: #101A3E;
margin-top: 20rpx;
}
.hang_ {
width: 100%;
height: 30rpx;
background: #F7F8FC;
}
.jg_top {
font-size: 32rpx;
color: #000000;
box-sizing: border-box;
padding-bottom: 30rpx;
border-bottom: 1px solid #F5F5F5;
}
.jg_ds {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 30rpx 0rpx;
border-bottom: 1px solid #F5F5F5;
}
.jg_bt {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 30rpx 0rpx;
}
.jg_ys {
font-size: 24rpx;
color: #101A3E;
text-align: center;
image {
width: 80rpx;
height: 80rpx;
margin-bottom: 5rpx;
}
}
.jg_ys1 {
font-size: 24rpx;
color: #101A3E;
text-align: center;
image {
width: 48rpx;
height: 48rpx;
margin-bottom: 5rpx;
}
}
.title_{
font-size: 32rpx;
color: #000000;
margin-bottom: 30rpx;
}
.box_{
width: 100%;
box-sizing: border-box;
padding: 30rpx;
background: #F7F8FC;
border-radius: 8rpx;
margin-bottom: 30rpx;
}
.box_ds{
display: flex;
align-items: center;
}
.box_bd{
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 24rpx;
box-sizing: border-box;
padding-bottom: 20rpx;
border-bottom: 1px solid #E3ECFB;
}
.bd{
display: flex;
align-items: center;
justify-content: space-between;
font-size: 28rpx;
margin: 20rpx 0rpx;
}
.box_title{
font-size: 32rpx;
color: #101A3E;
margin-right: 10rpx;
}
.size_{
font-size: 24rpx;
color: #366FFF;
margin-left: 10rpx;
}
.left_{
font-size: 28rpx;
color: #8D90A6;
}
.right_{
font-size: 28rpx;
color: #101A3E;
}
</style>

View File

@ -0,0 +1,102 @@
<template>
<view class="">
<headersVue :titles="titles"><u-icon name="arrow-left" color="#fff" size="18"></u-icon></headersVue>
<view class="content">
<view class="box_">
<view class="box_list">
<view class="">
<image src="/static/imgs/s1.png" mode=""></image>
<view class="name_">底检设备</view>
<view class="">100</view>
</view>
</view>
<view class="box_list">
<view class="">
<image src="/static/imgs/s2.png" mode=""></image>
<view class="name_">底检设备</view>
<view class="">100</view>
</view>
</view>
<view class="box_list">
<view class="">
<image src="/static/imgs/s3.png" mode=""></image>
<view class="name_">底检设备</view>
<view class="">100</view>
</view>
</view>
<view class="box_list">
<view class="">
<image src="/static/imgs/s4.png" mode=""></image>
<view class="name_">底检设备</view>
<view class="">100</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import headersVue from '../../components/header/headers.vue';
export default {
data() {
return {
titles: "设备管理",
List: [],
show: false,
status: 'loading',
}
},
components:{
headersVue
},
}
</script>
<style scoped lang="scss">
.content{
background: #F7F8FC;
width: 100%;
height: 100vh;
box-sizing: border-box;
padding: 30rpx;
padding-top: 200rpx;
}
.box_{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.box_list{
width: 328rpx;
height: 396rpx;
background: #fff;
border-radius: 18px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
margin-bottom: 30rpx;
image{
width: 130rpx;
height: 130rpx;
}
}
.name_{
font-size: 28rpx;
color: #000000;
}
.num_{
font-size: 36rpx;
color: #000000;
}
</style>

View File

@ -0,0 +1,134 @@
<template>
<view class="">
<headersVue :titles="titles"><u-icon name="arrow-left" color="#fff" size="18"></u-icon></headersVue>
<view class="content">
<!-- <view class="top_"></view> -->
<view class="box_" @click="goManage(1)">
<view class="ds">
<image src="/static/imgs/nb1.png" mode=""></image>
<view class="">员工管理</view>
</view>
<view class="anniu">
去查看
</view>
</view>
<view class="box_" @click="goManage(2)">
<view class="ds">
<image src="/static/imgs/nb2.png" mode=""></image>
<view class="">设备管理</view>
</view>
<view class="anniu">
去查看
</view>
</view>
<view class="box_">
<view class="ds">
<image src="/static/imgs/nb3.png" mode=""></image>
<view class="">资料管理</view>
</view>
<view class="anniu">
去查看
</view>
</view>
<view class="box_" @click="goManage(4)">
<view class="ds">
<image src="/static/imgs/nb4.png" mode=""></image>
<view class="">工作汇报</view>
</view>
<view class="anniu">
去查看
</view>
</view>
</view>
</view>
</template>
<script>
import headersVue from '../../components/header/headers.vue';
export default {
data() {
return {
titles: "内部管理",
msg: "1",
List: [],
show: false,
status: 'loading',
}
},
components:{
headersVue
},
methods:{
goManage(num){
if(num == 1){
uni.navigateTo({
url:'/pages/index/NewstaffManagement'
})
}
if(num == 2){
uni.navigateTo({
url:'/pages/manage/NewdeviceManage'
})
}
if (num == 4) {
uni.navigateTo({
url: '/pages/manage/workReport/reportList'
})
}
}
}
}
</script>
<style scoped lang="scss">
.content{
background: #F7F8FC;
width: 100%;
height: 100vh;
box-sizing: border-box;
padding: 30rpx;
padding-top: 200rpx;
}
.box_{
width: 100%;
height: 128rpx;
background-image: url('/static/imgs/box_.png');
background-size: 100% 100%;
box-sizing: border-box;
padding: 24rpx;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 32rpx;
color: #000000;
margin-bottom: 30rpx;
image{
width: 80rpx;
height: 80rpx;
margin-right: 20rpx;
}
}
.ds{
display: flex;
align-items: center;
}
.anniu{
width: 144rpx;
height: 66rpx;
background: #327DFB;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 28rpx;
color: #FFFFFF;
border-radius: 50px;
}
</style>

View File

@ -0,0 +1,434 @@
<template>
<view class="content">
<headersVue :titles="titles">
<u-icon name="arrow-left" color="#fff" size="18"></u-icon>
</headersVue>
<view class="container">
<view class="box_">
<view class="title_">
<text style="color: red;">*</text>
汇报主题
</view>
<u--input placeholder="请输入" border="surround" v-model="report.reportTopic"></u--input>
<view class="x_"></view>
<view class="" @click="show =! show">
<text class="h_">汇报时间</text>
{{ formatDateTimeToMinute(report.reportTime) }}
</view>
<view class="x_"></view>
<view class="d_s" @click="isShowReportTo = true">
<text class="h_">汇报给{{ reportTosStr }}</text>
<view class="j_">+</view>
</view>
<view class="x_"></view>
<view class="title_">
<text style="color: red;">*</text>
汇报内容
</view>
<u--textarea v-model="report.reportContent" placeholder="请输入内容"></u--textarea>
<view class="x_"></view>
<view class="d_b" @click="handleUpload">
<view class="">附件</view>
<view class="lan_">上传附件
<image src="/static/imgs/add.png" mode=""></image>
</view>
</view>
<u-upload
ref="uploadRef"
:fileList="fileList1"
@afterRead="afterRead"
@delete="deletePic"
name="1"
multiple
:maxCount="10"
v-show="fileList1.length > 0"
>
</u-upload>
<view class="hui_box" v-if="fileList1.length == 0">
<image src="/static/imgs/wod.png" mode=""></image>
<view class="">
<view class="big_">附件格式pdf/jpg/png</view>
<view class="sm_">100KB</view>
</view>
</view>
<view class="anniu" @click="onSubmit">
{{ buttonTitle}}
</view>
</view>
</view>
<u-datetime-picker
:show="show"
@cancel="show = false"
@confirm="selectReportTime"
v-model="report.reportTime"
mode="datetime"
></u-datetime-picker>
<qianziyu-select
:show="isShowReportTo"
type="checkbox"
name="nickname"
:dataLists="reportToList"
:showSearch=false
@cancel="isShowReportTo = false"
:checkboxData="report.reportTos"
@submit="onReportToSubmit"
popupTitle='汇报对象选择'
@update:checkboxData="report.reportTos = $event"
>
</qianziyu-select>
</view>
</template>
<script>
import headersVue from '../../../components/header/headers.vue';
import request from "@/utils/request";
import {formatDateTimeToMinute} from "@/utils/utils";
import upload from "@/utils/upload";
export default {
data() {
return {
titles: "汇报",
List: [],
show: false,
status: 'loading',
value: '',
value1: Number(new Date()),
value2: '',
show1: false,
report: {
reportTopic: '',
reportContent: '',
reportTime: formatDateTimeToMinute(new Date()),
reportTos: [],
servicePackageId: "jiance",
},
isShowReportTo: false,
reportToList: [],
reportTosStr:null,
fileList1: [],
buttonTitle:"保存",
}
},
components: {
headersVue
},
onLoad(data) {
if (data.id) {
this.buttonTitle="修改"
console.log(data.id)
this.getWorkReport(data.id)
}
this.getReportTo()
},
methods: {
formatDateTimeToMinute,
cancelShow() {
this.show = !this.show
},
async getReportTo() {
await request({
url: '/work/report/queryReportTo',
method: 'get',
params: {
dictType: "ins_report_role"
}
}).then(res => {
this.reportToList = res.data
})
},
onReportToSubmit(selectedData) {
this.isShowReportTo = false
this.report.reportTos = selectedData
this.reportTosStr = selectedData.map(item => item.nickname).join(',')
},
selectReportTime(e) {
this.report.reportTime = formatDateTimeToMinute(e.value)
this.show = false
},
//
handleUpload() {
// ref u-upload
this.$refs.uploadRef.chooseFile();
},
//
deletePic(event) {
this[`fileList${event.name}`].splice(event.index, 1);
},
//
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,
status: "uploading",
message: "上传中",
});
});
for (let i = 0; i < lists.length; i++) {
const result = await this.uploadFilePromise(lists[i].url);
let item = this[`fileList${event.name}`][fileListLen];
this[`fileList${event.name}`].splice(
fileListLen,
1,
Object.assign(item, {
status: "success",
message: "",
url: result,
})
);
fileListLen++;
}
},
uploadFilePromise(url) {
return new Promise((resolve, reject) => {
// let a = uni.uploadFile({
// url: "http://192.168.2.21:7001/upload", //
// filePath: url,
// name: "file",
// formData: {
// user: "test",
// },
// success: (res) => {
// setTimeout(() => {
// resolve(res.data.data);
// }, 1000);
// },
// });
upload({
url: '/common/upload',
filePath: url,
}).then((res) => {
resolve(res.data.url);
this.forceRefreshFiles(); //
})
});
},
/** 表单提交 */
onSubmit() {
console.log('提交的数据:', this.report.reportTime)
//
const isValid = this.checkForm()
if (!isValid) {
return
}
//
this.report.filePath = this.fileList1
.map(item => item.url.replace(/^https?:\/\/[^/]+\/minio\//, '')) // 去除域名和 minio/
.join(',');
this.report.reportTos = this.report.reportTos.map(item => item.id)
let url = '/work/report/create'
let method = 'post'
if (this.type === 'edit') {
url = '/work/report/update'
method = 'put'
}
request({
url: url,
method: method,
data: this.report
}).then(res => {
if (res.code === 200) {
uni.showToast({
title: '保存成功',
icon: 'none',
duration: 2000
});
setTimeout(() => {
//
uni.navigateBack({
delta: 1, //
success: () => {
//
uni.reLaunch({
url: '/pages/manage/workReport/workReport' //
});
}
});
}, 2000);
}
})
},
/** 校验 */
checkForm() {
if (this.report.reportTos.length === 0) {
if (!this.report.reportTopic) {
uni.showToast({
title: '请输入汇报主题',
icon: 'none',
duration: 2000
});
return false
}
uni.showToast({
title: '请选择汇报对象',
icon: 'none',
duration: 2000
});
return false
}
if (!this.report.reportContent) {
uni.showToast({
title: '请输入汇报内容',
icon: 'none',
duration: 2000
});
return false
}
return true
},
/** 获取汇报对象 */
async getWorkReport(id) {
await request({
url: '/work/report/get?id=' + id,
method: 'get'
}).then(res => {
this.report = res.data
// ID report.reportTos
this.report.reportTos = this.reportToList.filter(item => res.data.reportTos.includes(item.id));
this.reportTosStr = this.report.reportTos.map(item => item.nickname).join(',')
if (res.data.filePath) {
this.fileList1 = res.data.filePath.split(',').map(item => {
return {
url: this.baseImageUrl + "/" + item
}
})
}
})
},
},
}
</script>
<style scoped lang="scss">
.content {
width: 100%;
box-sizing: border-box;
padding-top: 200rpx;
background: #f4f5f6;
height: 100vh;
}
.container {
background: #f4f5f6;
box-sizing: border-box;
padding: 30rpx;
}
.box_ {
width: 100%;
background: #fff;
box-sizing: border-box;
padding: 30rpx;
}
.title_ {
font-size: 28rpx;
color: #101A3E;
margin-bottom: 10px;
}
.x_ {
width: 100%;
height: 2rpx;
background: #f4f5f6;
margin: 30rpx 0rpx;
}
.h_ {
font-size: 28rpx;
color: #8D90A6;
}
.d_s {
display: flex;
align-items: center;
}
.j_ {
width: 40rpx;
height: 40rpx;
background: #D9E0EC;
display: flex;
align-items: center;
color: #fff;
line-height: 40rpx;
justify-content: center;
}
.d_b {
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 30rpx 0rpx;
border-top: 2rpx solid #F5F6F9;
font-size: 28rpx;
color: #8D90A6;
}
.telnum {
font-size: 24rpx;
color: #366FFF;
}
.lan_ {
font-size: 28rpx;
color: #327DFB;
display: flex;
align-items: center;
image {
width: 36rpx;
height: 36rpx;
margin-left: 15rpx;
}
}
.hui_box {
width: 100%;
background: #F5F6F9;
border-radius: 16rpx;
box-sizing: border-box;
padding: 30rpx;
display: flex;
align-items: center;
image {
width: 90rpx;
height: 90rpx;
margin-right: 15rpx;
}
}
.big_ {
font-size: 28rpx;
color: #101A3E;
}
.sm_ {
font-size: 22rpx;
color: #8D90A6;
}
.anniu {
width: 622rpx;
height: 78rpx;
background: #427FFE;
border-radius: 50rpx;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
margin-top: 200rpx;
}
</style>

View File

@ -0,0 +1,221 @@
<template>
<view class="content">
<headersVue :titles="titles">
<u-icon name="arrow-left" color="#fff" size="18"></u-icon>
</headersVue>
<view class="top_">
<view class="search_box">
<u-search placeholder="请输入汇报人姓名或汇报主题进行搜索" @search="getReportList" @clear="getReportList" :showAction="false" searchIconColor="#427FFE" v-model="queryParams.topicOrUserName"></u-search>
</view>
</view>
<view class="container">
<view class="c_box" v-for="(item,index) in reportList" :key="index" @click="goDetails(item)">
<view class="c_ds" style="margin-bottom: 15px;">
<view class="touxiang_">
<image :src="baseImageUrl + '/' + item.avatar" mode="" v-if="item.avatar"></image>
<image src="/static/imgs/yh.png" mode="" v-else></image>
</view>
<view class="name_">{{ item.userName}}</view>
<view class="icon_">{{ item.reportTopic }}</view>
</view>
<view class="c_ds">
<view class="" style="color: #8D90A6;">汇报时间</view>
<view class="">{{ formatDateChinese(item.reportTime) }}</view>
</view>
</view>
</view>
<view style="width: 100%; height: 60px; "></view>
<view class="bottom_" @click="goDetails()">
<view class="bottom_box">填写汇报</view>
</view>
</view>
</template>
<script>
import headersVue from '../../../components/header/headers.vue';
import config from "@/config";
import {formatDateChinese, formatDateTimeToMinute} from "@/utils/utils";
import request from "@/utils/request";
export default {
data() {
return {
titles: "汇报列表",
List: [],
show: false,
status: 'loading',
reportList: [],
showPopup: false, //
//
queryParams: {
pageNo: 1,
pageSize: 10,
reportTopic: null,
reportTime: [],
createTime: [],
userName: null,
servicePackageId: "jiance",
dictType: 'ins_high_rise',
topicOrUserName: '',
},
showStarTime: false,
showEndTime: false,
baseImageUrl: config.baseImageUrl,
totalPages: 0,
reportTimeStr: [],
}
},
components: {
headersVue
},
onLoad() {
this.getReportList();
},
onReachBottom() {
if (this.queryParams.pageNo >= this.totalPages) {
uni.showToast({
title: '没有下一页数据',
icon: 'none'
})
} else {
this.queryParams.pageNo++
this.getReportList()
}
},
methods: {
formatDateChinese,
formatDateTimeToMinute,
//
getReportList() {
request({
url: "/work/report/page",
method: "GET",
params: this.queryParams,
}).then((res) => {
if (this.queryParams.pageNo != 1) {
this.reportList = this.reportList.concat(res.data.records);
} else {
this.reportList = res.data.records;
}
let total = res.total;
this.totalPages = Math.ceil(total / this.queryParams.pageSize);
});
},
goDetails(data) {
if (!data) {
uni.navigateTo({
url: '/pages/manage/workReport/reportDetals'
})
}else {
console.log('id', data)
uni.navigateTo({
url: '/pages/manage/workReport/reportDetals?id=' + data.id
})
}
}
}
}
</script>
<style scoped lang="scss">
.content {
width: 100%;
box-sizing: border-box;
padding-top: 200rpx;
background: #f4f5f6;
height: 100vh;
}
.container {
box-sizing: border-box;
padding: 30rpx;
background: #f4f5f6;
}
.search_box{
box-sizing: border-box;
padding-bottom: 20rpx;
border-bottom: 2rpx solid #F5F5F5;
}
.top_{
width: 100%;
box-sizing: border-box;
padding: 20rpx;
background: #fff;
padding-bottom: 0px;
}
.c_box {
width: 100%;
background: #fff;
box-sizing: border-box;
padding: 20px;
margin-bottom: 30rpx;
}
.c_ds {
display: flex;
align-items: center;
}
.touxiang_ {
width: 90rpx;
height: 90rpx;
margin-right: 20rpx;
image {
width: 100%;
height: 100%;
}
}
.name_ {
font-size: 32rpx;
color: #101A3E;
margin-right: 20rpx;
}
.icon_ {
background: #eaf2fe;
box-sizing: border-box;
padding: 5rpx 10rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 16rpx;
color: #427FFE;
}
.bottom_ {
width: 100%;
height: 158rpx;
background: #FFFFFF;
box-shadow: 0rpx -1rpx 24rpx 0rpx rgba(0, 0, 0, 0.1);
border-radius: 15px 15px 0px 0px;
position: fixed;
left: 0;
bottom: 0;
z-index: 999;
display: flex;
align-items: center;
justify-content: center;
}
.bottom_box {
width: 600rpx;
height: 78rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
color: #fff;
background: #427FFE;
border: 2rpx solid #427FFE;
border-radius: 50px;
margin: 30rpx;
}
</style>

BIN
static/imgs/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

BIN
static/imgs/box_.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
static/imgs/car.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/imgs/gengduo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

BIN
static/imgs/jg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
static/imgs/jg10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
static/imgs/jg2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
static/imgs/jg3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
static/imgs/jg4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
static/imgs/jg5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
static/imgs/jg6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
static/imgs/jg7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
static/imgs/jg8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
static/imgs/jg9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
static/imgs/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
static/imgs/nb1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
static/imgs/nb2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
static/imgs/nb3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
static/imgs/nb4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
static/imgs/ns.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
static/imgs/num1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
static/imgs/num2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/imgs/num3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
static/imgs/s1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
static/imgs/s2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
static/imgs/s3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/imgs/s4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/imgs/t1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

BIN
static/imgs/t2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 991 B

BIN
static/imgs/t3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/imgs/tel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 B

BIN
static/imgs/touxiang.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
static/imgs/wod.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
static/imgs/xiaoxi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/imgs/yh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -33,6 +33,16 @@ export function formatDate(timestamp) {
// 组合成日期时间字符串
return `${year}-${month}-${day}`;
}
export function formatDateChinese(timestamp) {
// 将时间戳转换为Date对象
const date = new Date(timestamp);
// 获取年月日时分秒
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
// 组合成日期时间字符串
return `${year}${month}${day}`;
}
export function formatDateTimeToMinute(timestamp) {
// 将时间戳转换为 Date 对象