main
panliang 2024-04-27 23:09:57 +08:00
commit 9e0fbd41d4
12 changed files with 307 additions and 61 deletions

View File

@ -5,6 +5,10 @@ export default {
const userStore = useUserStoreWithOut()
if (userStore.isLogin) {
userStore.fetchUserInfo()
}else{
uni.reLaunch({
url: '/pages/login/index',
})
}
// #ifdef APP-PLUS
if (userStore.isLogin) {

View File

@ -1,9 +1,12 @@
<template>
<view class="card-shadow bg-white rounded-19rpx p-base space-y-10rpx" @click="goPath">
<view
class="card-shadow bg-white rounded-19rpx p-base space-y-10rpx"
@click="goPath"
>
<view class="text-30rpx"> 请假申请</view>
<view class="text-24rpx text-hex-999999 flex">
<view class="text-24rpx w-140rpx">请假类型</view>
<view class="">{{ item.type.name }}</view>
<view class="">{{ item.type?.name }}</view>
</view>
<view class="text-24rpx text-hex-999999 flex">
<view class="text-24rpx w-140rpx">请假事由</view>
@ -11,26 +14,44 @@
</view>
<view class="flex items-center text-hex-999999 flex">
<view class="text-24rpx w-140rpx"> 申请时间</view>
<view class="text-24rpx">{{ timeFormat(item.created_at, "yyyy-mm-dd hh:MM") }}</view>
<view class="text-24rpx">{{
timeFormat(item.created_at, 'yyyy-mm-dd hh:MM')
}}</view>
</view>
<view
:style="{
color: statusFun(item.workflow_check.check_status, 'workflow_check', 'color')
color: statusFun(
item.workflow_check.check_status,
'workflow_check',
'color'
),
}"
class="text-24rpx"
>{{ statusFun(item.workflow_check.check_status, "workflow_check", "name") }}</view
>{{
statusFun(item.workflow_check.check_status, 'workflow_check', 'name')
}}</view
>
</view>
</template>
<script setup>
import statusFun from "@/utils/status"
import { timeFormat } from "@climblee/uv-ui/libs/function/index"
import statusFun from '@/utils/status'
import { timeFormat } from '@climblee/uv-ui/libs/function/index'
const props = defineProps({
item: Object
item: Object,
type: Number,
subject_type: String,
})
const goPath = () => {
uni.navigateTo({
url: `/pages/ask-leave/detail?id=${props.item.id}`
})
const type = props.type
if (type == 0) {
uni.navigateTo({
url: `/pages/ask-leave/detail?id=${props.item.id}`,
})
}
if (type == 1) {
uni.navigateTo({
url: `/pages/audits/detail?id=${props.item.id}&type=${props.subject_type}`
})
}
}
</script>

View File

@ -28,7 +28,7 @@
<template v-slot="{ list }">
<view class="space-y-15rpx p-base">
<view v-for="(item, i) in list" :key="i">
<Item :item="item"></Item>
<Item :item="item" :type="0"></Item>
</view>
</view>
</template>
@ -39,11 +39,16 @@
:i="1"
:index="tabIndex"
:apiUrl="tabList[1].apiUrl"
:params="tabList[1].params"
>
<template v-slot="{ list }">
<view class="space-y-15rpx p-base">
<view v-for="(item, i) in list" :key="i">
<Item :item="item"></Item>
<Item
:item="item"
:type="1"
:subject_type="tabList[1].params.subject_type"
></Item>
</view>
</view>
</template>
@ -67,6 +72,7 @@ const tabList = ref([
apiUrl: '/workflow',
params: {
subject_type: 'holiday_applies',
include: 'employee,store,type',
},
},
])

View File

@ -1,10 +1,11 @@
<template>
<uv-form labelWidth="160rpx">
<uv-form labelWidth="200rpx">
<template v-for="(item, i) in columsList" :key="i">
<template v-if="item.show">
<uv-form-item
v-if="item.type == 'album'"
:label="item.title"
:labelWidth="item.labelWidth"
labelPosition="top"
>
<!-- {{ item.value }} -->
@ -23,6 +24,7 @@
v-else
:label="item.title"
:labelPosition="item.labelPosition"
:labelWidth="item.labelWidth"
>
<view
class="w-full text-hex-999"

View File

@ -3,10 +3,18 @@ export default {
//清洁任务
task_hygienes: {
data: [
// {
// title: '申请人',
// dataIndex: 'name',
// },
{
title: '审核状态',
dataIndex: 'workflow_check.check_status_text',
},
{
title: '未通过理由',
dataIndex: 'workflow_check.check_remarks',
labelPosition: 'top',
isShow: (item) => {
return item?.workflow_check?.check_status == 4
},
},
{
title: '所属门店',
dataIndex: 'check.subject.store.title',
@ -35,6 +43,7 @@ export default {
],
params: { include: 'check.subject.task,check.subject.storeMaster,check.subject.store' }
},
//报销
reimbursements: {
params: {
include: 'check.subject.type,check.subject.employee,check.subject.store',
@ -83,5 +92,163 @@ export default {
},
},
]
},
//升职
employee_promotions: {
params: {
include: 'employee,invitor,job',
},
data: [
{
title: '审核状态',
dataIndex: 'workflow_check.check_status_text',
},
{
title: '未通过理由',
dataIndex: 'workflow_check.check_remarks',
labelPosition: 'top',
isShow: (item) => {
return item?.workflow_check?.check_status == 4
},
}, {
title: '晋升职位',
dataIndex: 'job.name',
}, {
title: '推荐人',
dataIndex: 'invitor.name',
}, {
title: '申请人',
dataIndex: 'employee.name',
}, {
title: '年龄',
dataIndex: 'employee_data.age',
}, {
title: '性别',
dataIndex: 'employee_data.sex',
}, {
title: '学历',
dataIndex: 'employee_data.education',
}, {
title: '首次参加工作时间',
dataIndex: 'employee_data.first_work_time',
labelWidth: "250rpx"
}, {
title: '工作年限',
dataIndex: 'employee_data.work_years',
}, {
title: '本公司工作年限',
dataIndex: 'employee_data.work_years_in_company',
}, {
title: '员工自评',
dataIndex: 'employee_data.comment_self',
labelPosition: 'top',
}, {
title: '未来计划',
dataIndex: 'employee_data.plans',
labelPosition: 'top',
}, {
title: '推荐理由',
dataIndex: 'employee_data.reason',
labelPosition: 'top',
}]
},
//补卡申请
employee_sign_repairs: {
params: {
include: 'employee,store',
},
data: [{
title: '审核状态',
dataIndex: 'workflow_check.check_status_text',
},
{
title: '未通过理由',
dataIndex: 'workflow_check.check_remarks',
labelPosition: 'top',
isShow: (item) => {
return item?.workflow_check?.check_status == 4
},
}, {
title: '申请人',
dataIndex: 'employee.name',
}, {
title: '所属门店',
dataIndex: 'store.title',
}, {
title: '电话号码',
dataIndex: 'employee.phone'
}, {
title: '申请时间',
dataIndex: 'created_at',
format: timeFormat,
}, {
title: '补卡时间',
dataIndex: 'date',
format: (e) => timeFormat(e, 'yyyy-mm-dd hh:MM')
}, {
title: '补卡原因',
dataIndex: 'reason',
labelPosition: 'top',
}, {
title: '是否外勤',
dataIndex: 'sign_type',
format: (e) => {
return e == 1 ? '否' : '是'
}
}, {
title: '外勤事由',
dataIndex: 'outside_remarks',
labelPosition: 'top',
isShow: (item) => {
console.log(item);
return item?.sign_type == 2
}
}]
},
//请假申请
holiday_applies: {
params: {
include: 'employee,store,type'
},
data: [{
title: '审核状态',
dataIndex: 'workflow_check.check_status_text',
},
{
title: '未通过理由',
dataIndex: 'workflow_check.check_remarks',
labelPosition: 'top',
isShow: (item) => {
return item?.workflow_check?.check_status == 4
},
}, {
title: '申请人',
dataIndex: 'employee.name',
}, {
title: '所属门店',
dataIndex: 'store.title',
}, {
title: '电话号码',
dataIndex: 'employee.phone'
}, {
title: '申请时间',
dataIndex: 'created_at',
format: (e)=>timeFormat(e,'yyyy-mm-dd hh:MM'),
}, {
title: '请假类型',
dataIndex: 'type.name',
}, {
title: '请假开始时间',
dataIndex: 'start_at',
format: (e) => timeFormat(e, 'yyyy-mm-dd hh:MM'),
}, {
title: '请假结束时间',
dataIndex: 'end_at',
format: (e) => timeFormat(e, 'yyyy-mm-dd hh:MM'),
}, {
title: '请假原因',
dataIndex: 'reason',
labelPosition: 'top',
}]
}
}

View File

@ -10,9 +10,13 @@
:desc="timeFormat(item.checked_at, 'yyyy-mm-dd hh:MM:ss')"
>
<template #icon>
<view class="w-31rpx h-31rpx rounded-full mt-4rpx"
:class="[item.check_status==2 || item.check_status==3 ? 'bg-blue' : 'bg-gray-300']"
<view
class="w-31rpx h-31rpx rounded-full mt-4rpx"
:class="[
item.check_status == 2 || item.check_status == 3
? 'bg-blue'
: 'bg-gray-300',
]"
></view>
</template>
<template #title>
@ -27,6 +31,9 @@
}"
>{{ item.check_status_text }}</view
>
<view class="text-24rpx text-hex-999" v-if="item.check_status == 4">{{
item.remarks
}}</view>
</view>
</template>
<template #desc>

View File

@ -1,13 +1,16 @@
<template>
<view class="card-shadow bg-white rounded-19rpx p-base space-y-10rpx" @click="goPath">
<view
class="card-shadow bg-white rounded-19rpx p-base space-y-10rpx"
@click="goPath"
>
<view class="text-30rpx">补卡申请</view>
<view class="text-24rpx text-hex-999999 flex">
<view class="text-24rpx w-140rpx">补卡原因</view>
<view class="">{{ item.reason }}</view>
<view class="text-24rpx text-hex-999999">
<text class="text-24rpx w-140rpx inline-block">补卡原因</text>
<text class="">{{ item.reason }}</text>
</view>
<view class="text-24rpx text-hex-999999 flex">
<view class="text-24rpx w-140rpx">补卡类别</view>
<view class="">{{ item.sign_time == 1 ? "上班打卡" : "下班打卡" }}</view>
<view class="">{{ item.sign_time == 1 ? '上班打卡' : '下班打卡' }}</view>
</view>
<view class="flex items-center text-hex-999999 flex">
<view class="text-24rpx w-140rpx"> 补卡时间</view>
@ -15,26 +18,40 @@
</view>
<view
:style="{
color: statusFun(item.workflow_check.check_status, 'workflow_check', 'color')
color: statusFun(
item.workflow_check.check_status,
'workflow_check',
'color'
),
}"
class="text-24rpx"
>{{ statusFun(item.workflow_check.check_status, "workflow_check", "name") }}</view
>{{
statusFun(item.workflow_check.check_status, 'workflow_check', 'name')
}}</view
>
</view>
</template>
<script setup>
import statusFun from "@/utils/status"
import { computed } from "vue"
import { timeFormat } from "@climblee/uv-ui/libs/function/index"
import statusFun from '@/utils/status'
import { computed } from 'vue'
import { timeFormat } from '@climblee/uv-ui/libs/function/index'
const props = defineProps({
item: Object
item: Object,
subject_type: String,
type: Number,
})
const valueFormat = computed(() => {
return timeFormat(props.item.date, "yyyy-mm-dd hh:MM")
return timeFormat(props.item.date, 'yyyy-mm-dd hh:MM')
})
const goPath = () => {
uni.navigateTo({
url: `/pages/make-card/detail?id=${props.item.id}`
})
if (props.type == 1) {
uni.navigateTo({
url: `/pages/audits/detail?id=${props.item.id}&type=${props.subject_type}`,
})
} else {
uni.navigateTo({
url: `/pages/make-card/detail?id=${props.item.id}`,
})
}
}
</script>

View File

@ -1,6 +1,6 @@
<template>
<view class="px-base" v-if="detail">
<CuNavbar title="加班审核">
<CuNavbar title="补卡详情">
<template v-if="!isEdit" #right>
<uv-icon color="white" @click="open" name="more-dot-fill"></uv-icon>
</template>
@ -10,47 +10,47 @@
<view>申请人</view>
<view class="text-hex-999999">{{ detail.employee.name }}</view>
</view>
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
<view class="py-20rpx flex items-center justify-between">
<view>所属门店</view>
<view class="text-hex-999999">{{ detail.store.title }}</view>
</view>
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
<view class="py-20rpx flex items-center justify-between">
<view>电话号码</view>
<view class="text-hex-999999">{{ detail.employee.phone }}</view>
</view>
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
<view class="py-20rpx flex items-center justify-between">
<view>申请时间</view>
<view class="text-hex-999999">{{ timeFormat(detail.created_at, "yyyy-mm-dd hh:MM") }}</view>
</view>
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
<view class="py-20rpx flex items-center justify-between">
<view>补卡时间</view>
<view class="text-hex-999999">{{ timeFormat(detail.date, "yyyy-mm-dd hh:MM") }}</view>
</view>
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
<view class="py-20rpx">
<view>补卡原因</view>
<view class="text-hex-999999 mt-20rpx">{{ detail.reason }}</view>
<text class="">补卡原因</text>
<text class="text-hex-999999 mt-20rpx">{{ detail.reason }}</text>
</view>
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
<view class="py-20rpx flex items-center justify-between">
<view>是否外勤</view>
<view class="text-hex-999999">{{ detail.sign_type == 1 ? "否" : "是" }}</view>
</view>
<template v-if="detail.sign_type == 2">
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
<view class="py-20rpx">
<view>外勤事由</view>
<view class="text-hex-999999 mt-20rpx">{{ detail.outside_remarks }}</view>
</view>
</template>
<uv-line></uv-line>
<uv-line color="#f5f5f5"></uv-line>
</view>
<view class="h-100rpx">
<!-- <view class="h-100rpx">
<view class="fixed bottom-0 left-0 right-0 h-120rpx bg-white flex items-center px-base space-x-30rpx">
<view class="flex-1">
<uv-button color="#999999" shape="circle" plain block> 拒绝 </uv-button>
@ -59,7 +59,7 @@
<uv-button type="primary" shape="circle" block> 通过 </uv-button>
</view>
</view>
</view>
</view> -->
<uv-picker ref="pickerRef" :columns="columns" @confirm="confirmPicker"></uv-picker>
<uv-modal ref="modalRef" title="提示" content="确定删除吗?" @confirm="onSubmit" :showCancelButton="true"></uv-modal>
</view>

View File

@ -28,7 +28,7 @@
<template v-slot="{ list }">
<view class="space-y-15rpx p-base">
<view v-for="(item, i) in list" :key="i">
<Item :item="item"></Item>
<Item :item="item" :type="0"></Item>
</view>
</view>
</template>
@ -44,7 +44,11 @@
<template v-slot="{ list }">
<view class="space-y-15rpx p-base">
<view v-for="(item, i) in list" :key="i">
<Item :item="item"></Item>
<Item
:item="item"
:type="1"
:subject_type="tabList[1].params.subject_type"
></Item>
</view>
</view>
</template>
@ -54,7 +58,7 @@
<script setup>
import CuNavbar from '@/components/cu-navbar/index'
import { ref } from 'vue'
import { onPageScroll, onReachBottom, onShow,onLoad } from '@dcloudio/uni-app'
import { onPageScroll, onReachBottom, onShow, onLoad } from '@dcloudio/uni-app'
import useMescrollMore from '@/uni_modules/mescroll-uni/hooks/useMescrollMore.js'
import MescrollItem from '@/components/mescroll-api/more.vue'
import Item from './components/item.vue'
@ -81,13 +85,12 @@ const { tabIndex, getMescroll, scrollToLastY } = useMescrollMore(
onReachBottom
)
onLoad(()=>{
uni.$on('make-card:update',()=>{
onLoad(() => {
uni.$on('make-card:update', () => {
getMescroll(0).resetUpScroll()
})
})
const goPath = (url) => {
uni.navigateTo({
url,

View File

@ -269,8 +269,9 @@ const onSubmit = async () => {
const params = {
...form,
}
const resData = await http.request({
url: `/hr/promotion/${props.id}/apply`,
url: `/hr/promotion/${props.id}`,
method: 'POST',
header: {
Accept: 'application/json',

View File

@ -13,10 +13,14 @@
>{{ item.promotion_status_text }}</view
>
</view>
<view class="text-24rpx text-hex-999999 flex">
<view class="text-24rpx text-hex-999999 flex" v-if="type==0 || type==2">
<view class="w-140rpx">推荐人</view>
<view class="">{{ item?.invitor?.name }}</view>
</view>
<view class="text-24rpx text-hex-999999 flex" v-if="type==1 || type==2">
<view class="w-140rpx">申请人</view>
<view class="">{{ item?.employee?.name }}</view>
</view>
<view class="text-24rpx text-hex-999999 flex">
<view class="w-140rpx">晋升职位</view>
<view class="">{{ item.job.name }}</view>
@ -50,8 +54,21 @@ const props = defineProps({
const onOption = (e) => {}
const onClick = () => {
let url
if (props.type == 3) {
// tab==0
//1 =
//tab===1
//2 =
let url = ''
const tab = props.type
if (
(tab == 0 && props.item.promotion_status == 1) ||
(tab == 1 && props.item.promotion_status == 2)
) {
url = `/pages/work/create?id=${props.item.id}&type=${tab}`
} else if (tab === 2) {
url = `/pages/audits/detail?id=${props.item.id}&type=${props.subject_type}`
} else {
url = `/pages/work/detail?id=${props.item.id}`
}

View File

@ -1,6 +1,6 @@
<template>
<view>
<CuNavbar title="升职申请"> </CuNavbar>
<CuNavbar title="升职申请"> </CuNavbar>
<uv-sticky bgColor="#fff">
<uv-tabs
:activeStyle="{ color: '#ee2c37' }"
@ -84,6 +84,7 @@ const tabList = ref([
apiUrl: '/workflow',
params: {
subject_type: 'employee_promotions',
include: 'employee,invitor,job',
},
},
])
@ -99,7 +100,7 @@ const { tabIndex, getMescroll, scrollToLastY } = useMescrollMore(
)
onLoad(() => {
uni.$on('work:submit', ()=>{
uni.$on('work:submit', () => {
getMescroll(tabIndex.value).resetUpScroll()
})
})