feat: 完成审批模块请假、出差、外出、补卡、加班套件的封转
This commit is contained in:
parent
67996568f4
commit
3bfcf05ad9
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<view class="pb-3">
|
||||||
<view class="bg-white mx-4 p-2 rounded-2">
|
<view class="bg-white mx-4 p-2 rounded-2">
|
||||||
<Input
|
<Input
|
||||||
:id="0"
|
:id="0"
|
||||||
@ -76,6 +76,22 @@
|
|||||||
type="department"
|
type="department"
|
||||||
:multiple="true"
|
:multiple="true"
|
||||||
></MemberOrDepartment>
|
></MemberOrDepartment>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<Leave :id="12"></Leave>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<DatetimePickerGroup :id="13" type="businessTrip" unit="date"></DatetimePickerGroup>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<DatetimePickerGroup :id="14" type="goOut" unit="dateHalfDay"></DatetimePickerGroup>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<Overtime :id="15"></Overtime>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<DatetimePicker
|
||||||
|
:id="16"
|
||||||
|
type="datetime"
|
||||||
|
required
|
||||||
|
title="补卡时间"
|
||||||
|
@change="changeDate"
|
||||||
|
></DatetimePicker>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@ -88,8 +104,11 @@
|
|||||||
import Images from '@/pages/approval/components/Images.vue'
|
import Images from '@/pages/approval/components/Images.vue'
|
||||||
import Description from '@/pages/approval/components/Description.vue'
|
import Description from '@/pages/approval/components/Description.vue'
|
||||||
import MemberOrDepartment from '@/pages/approval/components/MemberOrDepartment.vue'
|
import MemberOrDepartment from '@/pages/approval/components/MemberOrDepartment.vue'
|
||||||
|
import Leave from '@/pages/approval/components/Leave.vue'
|
||||||
|
import DatetimePickerGroup from '@/pages/approval/components/DatetimePickerGroup.vue'
|
||||||
|
import Overtime from '@/pages/approval/components/Overtime.vue'
|
||||||
|
|
||||||
const columns = ref<Record<number, any>>([
|
const columns = ref<Record<number, string>>([
|
||||||
{
|
{
|
||||||
value: 0,
|
value: 0,
|
||||||
label: '男装'
|
label: '男装'
|
||||||
|
|||||||
@ -6,7 +6,9 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="py-2" @click="openDialog">
|
<view class="py-2" @click="openDialog">
|
||||||
<view class="flex flex-items-center flex-justify-between">
|
<view class="flex flex-items-center flex-justify-between">
|
||||||
<view>{{ text || placeholder }}</view>
|
<view :class="text ? 'custom-color-black' : 'color-#838589'">
|
||||||
|
{{ text || placeholder }}
|
||||||
|
</view>
|
||||||
<wd-icon name="arrow-right" color="rgba(0,0,0,0.25)" size="18px"></wd-icon>
|
<wd-icon name="arrow-right" color="rgba(0,0,0,0.25)" size="18px"></wd-icon>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@ -104,7 +106,31 @@
|
|||||||
},
|
},
|
||||||
placeholder: {
|
placeholder: {
|
||||||
type: String,
|
type: String,
|
||||||
default: '请输入'
|
default: '请选择'
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
disabledText: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
minDate: {
|
||||||
|
type: [Number, null],
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
maxDate: {
|
||||||
|
type: [Number, null],
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
minDateText: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
maxDateText: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -159,6 +185,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
const openDialog = () => {
|
const openDialog = () => {
|
||||||
|
if (props.disabled) {
|
||||||
|
uni.showToast({
|
||||||
|
title: props.disabledText,
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
if (!props.value) {
|
if (!props.value) {
|
||||||
if (text.value === '') {
|
if (text.value === '') {
|
||||||
timestamp.value = new Date().getTime()
|
timestamp.value = new Date().getTime()
|
||||||
@ -180,6 +213,20 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
const confirm = () => {
|
const confirm = () => {
|
||||||
|
if (props.minDate && timestamp.value < props.minDate) {
|
||||||
|
uni.showToast({
|
||||||
|
title: props.minDateText,
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (props.maxDate && timestamp.value > props.maxDate) {
|
||||||
|
uni.showToast({
|
||||||
|
title: props.maxDateText,
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
show.value = false
|
show.value = false
|
||||||
returnTimestamp.value = timestamp.value
|
returnTimestamp.value = timestamp.value
|
||||||
if (props.type === 'dateHalfDay') {
|
if (props.type === 'dateHalfDay') {
|
||||||
@ -193,4 +240,16 @@
|
|||||||
const afterLeave = () => {
|
const afterLeave = () => {
|
||||||
showPicker.value = false
|
showPicker.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clear = () => {
|
||||||
|
text.value = ''
|
||||||
|
date.value = ''
|
||||||
|
halfDay.value = ''
|
||||||
|
returnTimestamp.value = 0
|
||||||
|
emits('change', { id: props.id, value: returnTimestamp.value, text: text.value })
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
clear
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
110
src/pages/approval/components/DatetimePickerGroup.vue
Normal file
110
src/pages/approval/components/DatetimePickerGroup.vue
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<DatetimePicker
|
||||||
|
:id="1"
|
||||||
|
ref="startDatetimePicker"
|
||||||
|
title="开始时间"
|
||||||
|
@change="changeDate"
|
||||||
|
:max-date="endTimestamp"
|
||||||
|
max-date-text="开始时间不能晚于结束时间"
|
||||||
|
required
|
||||||
|
:disabled="disabled"
|
||||||
|
:disabled-text="disabledText"
|
||||||
|
:type="unit"
|
||||||
|
></DatetimePicker>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<DatetimePicker
|
||||||
|
:id="2"
|
||||||
|
title="结束时间"
|
||||||
|
ref="endDatetimePicker"
|
||||||
|
:min-date="startTimestamp"
|
||||||
|
min-date-text="结束时间不能早于开始时间"
|
||||||
|
@change="changeDate"
|
||||||
|
required
|
||||||
|
:type="unit"
|
||||||
|
:disabled="disabled"
|
||||||
|
:disabled-text="disabledText"
|
||||||
|
></DatetimePicker>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<Input
|
||||||
|
:id="3"
|
||||||
|
ref="inputComponent"
|
||||||
|
type="number"
|
||||||
|
:title="`${textMap[type]}时长${unit === 'datetime' ? '(小时)' : '(天)'}`"
|
||||||
|
required
|
||||||
|
:readonly="updateTime"
|
||||||
|
placeholder="自动计算"
|
||||||
|
@change="inputChange"
|
||||||
|
></Input>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import DatetimePicker from '@/pages/approval/components/DatetimePicker.vue'
|
||||||
|
import Input from '@/pages/approval/components/Input.vue'
|
||||||
|
|
||||||
|
const textMap = {
|
||||||
|
leave: '请假',
|
||||||
|
businessTrip: '出差',
|
||||||
|
goOut: '外出',
|
||||||
|
overtime: '加班'
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
id: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
unit: {
|
||||||
|
type: String,
|
||||||
|
default: 'date'
|
||||||
|
},
|
||||||
|
disabled: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
disabledText: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
updateTime: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const startTimestamp = ref(0)
|
||||||
|
const endTimestamp = ref(0)
|
||||||
|
|
||||||
|
const startDatetimePicker = ref(null)
|
||||||
|
const endDatetimePicker = ref(null)
|
||||||
|
const inputComponent = ref(null)
|
||||||
|
|
||||||
|
const changeDate = e => {
|
||||||
|
if (e.id === 1) {
|
||||||
|
startTimestamp.value = e.value
|
||||||
|
} else {
|
||||||
|
endTimestamp.value = e.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const inputChange = e => {
|
||||||
|
console.log('inputChange', e)
|
||||||
|
}
|
||||||
|
|
||||||
|
const clear = () => {
|
||||||
|
startDatetimePicker.value.clear()
|
||||||
|
endDatetimePicker.value.clear()
|
||||||
|
inputComponent.value.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
clear
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
||||||
@ -11,6 +11,7 @@
|
|||||||
:placeholder="placeholder"
|
:placeholder="placeholder"
|
||||||
:maxlength="type === 'text' ? 30 : 15"
|
:maxlength="type === 'text' ? 30 : 15"
|
||||||
v-model="text"
|
v-model="text"
|
||||||
|
:readonly="readonly"
|
||||||
@input="change(id, $event)"
|
@input="change(id, $event)"
|
||||||
></wd-input>
|
></wd-input>
|
||||||
</view>
|
</view>
|
||||||
@ -46,6 +47,10 @@
|
|||||||
placeholder: {
|
placeholder: {
|
||||||
type: String,
|
type: String,
|
||||||
default: '请输入'
|
default: '请输入'
|
||||||
|
},
|
||||||
|
readonly: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -56,6 +61,14 @@
|
|||||||
const change = (id, data) => {
|
const change = (id, data) => {
|
||||||
emits('change', { id, value: data.value })
|
emits('change', { id, value: data.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clear = () => {
|
||||||
|
text.value = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
clear
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
97
src/pages/approval/components/Leave.vue
Normal file
97
src/pages/approval/components/Leave.vue
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<SelectPicker
|
||||||
|
:id="0"
|
||||||
|
title="请假类型"
|
||||||
|
placeholder="请选择"
|
||||||
|
:columns="columns"
|
||||||
|
required
|
||||||
|
@change="changeSelect"
|
||||||
|
></SelectPicker>
|
||||||
|
<wd-divider color="#bcbfbe"></wd-divider>
|
||||||
|
<DatetimePickerGroup
|
||||||
|
ref="timeGroup"
|
||||||
|
type="leave"
|
||||||
|
:disabled="!leaveType"
|
||||||
|
:updateTime="updateTime"
|
||||||
|
:unit="leaveType?.unit ?? 'date'"
|
||||||
|
disabled-text="请选择请假类型"
|
||||||
|
:id="1"
|
||||||
|
></DatetimePickerGroup>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import SelectPicker from '@/pages/approval/components/SelectPicker.vue'
|
||||||
|
import DatetimePickerGroup from '@/pages/approval/components/DatetimePickerGroup.vue'
|
||||||
|
|
||||||
|
const leaveType = ref(null)
|
||||||
|
const timeGroup = ref(null)
|
||||||
|
|
||||||
|
const columns = ref<Record<number, string>>([
|
||||||
|
{
|
||||||
|
value: 0,
|
||||||
|
label: '年假',
|
||||||
|
unit: 'date'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 1,
|
||||||
|
label: '事假',
|
||||||
|
unit: 'dateHalfDay'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 2,
|
||||||
|
label: '病假',
|
||||||
|
unit: 'datetime'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 3,
|
||||||
|
label: '婚假',
|
||||||
|
unit: 'date',
|
||||||
|
limit: 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 4,
|
||||||
|
label: '产假',
|
||||||
|
unit: 'datetime',
|
||||||
|
limit: 24.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 5,
|
||||||
|
label: '陪产假',
|
||||||
|
unit: 'datetime'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 6,
|
||||||
|
label: '丧假',
|
||||||
|
unit: 'date'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 7,
|
||||||
|
label: '哺乳假',
|
||||||
|
unit: 'date'
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
id: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
updateTime: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const changeSelect = e => {
|
||||||
|
leaveType.value = e.value
|
||||||
|
timeGroup.value.clear()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.wd-divider {
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -6,7 +6,9 @@
|
|||||||
</view>
|
</view>
|
||||||
<view class="py-2" @click="toSelect">
|
<view class="py-2" @click="toSelect">
|
||||||
<view class="flex flex-items-center flex-justify-between">
|
<view class="flex flex-items-center flex-justify-between">
|
||||||
<view>{{ text || placeholder }}</view>
|
<view :class="text ? 'custom-color-black' : 'color-#838589'">
|
||||||
|
{{ text || placeholder }}
|
||||||
|
</view>
|
||||||
<wd-icon name="arrow-right" color="rgba(0,0,0,0.25)" size="18px"></wd-icon>
|
<wd-icon name="arrow-right" color="rgba(0,0,0,0.25)" size="18px"></wd-icon>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
43
src/pages/approval/components/Overtime.vue
Normal file
43
src/pages/approval/components/Overtime.vue
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<DatetimePicker
|
||||||
|
:id="0"
|
||||||
|
ref="startDatetimePicker"
|
||||||
|
title="加班日期"
|
||||||
|
@change="changeDate"
|
||||||
|
required
|
||||||
|
></DatetimePicker>
|
||||||
|
<wd-divider v-if="timestamp" color="#bcbfbe"></wd-divider>
|
||||||
|
<DatetimePickerGroup
|
||||||
|
v-if="timestamp"
|
||||||
|
type="overtime"
|
||||||
|
unit="datetime"
|
||||||
|
:id="1"
|
||||||
|
></DatetimePickerGroup>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import DatetimePickerGroup from '@/pages/approval/components/DatetimePickerGroup.vue'
|
||||||
|
import DatetimePicker from '@/pages/approval/components/DatetimePicker.vue'
|
||||||
|
|
||||||
|
const timestamp = ref<number>(0)
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
id: {
|
||||||
|
type: Number,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const changeDate = e => {
|
||||||
|
timestamp.value = e.value
|
||||||
|
console.log('changeDate', e)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.wd-divider {
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@ -12,7 +12,9 @@
|
|||||||
v-model="picker"
|
v-model="picker"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
size="large"
|
size="large"
|
||||||
/>
|
@change="change"
|
||||||
|
select-size="large"
|
||||||
|
></wd-select-picker>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@ -51,11 +53,17 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const emits = defineEmits(['change'])
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (props.value) {
|
if (props.value) {
|
||||||
picker.value = props.value
|
picker.value = props.value
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const change = ({ value }) => {
|
||||||
|
emits('change', { id: props.id, value: props.columns.find(item => item.value === value) })
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
@ -63,4 +71,34 @@
|
|||||||
padding: var(--wot-cell-wrapper-padding, 10px) 0;
|
padding: var(--wot-cell-wrapper-padding, 10px) 0;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.wd-radio-group),
|
||||||
|
:deep(.wd-checkbox-group) {
|
||||||
|
background-color: #ffffff;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.wd-action-sheet) {
|
||||||
|
background-color: #f3f5fa;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.uni-scroll-view-content) {
|
||||||
|
padding-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.wd-radio),
|
||||||
|
:deep(.wd-checkbox) {
|
||||||
|
position: relative;
|
||||||
|
padding: 1rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.wd-radio)::after,
|
||||||
|
:deep(.wd-checkbox)::after {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 4%;
|
||||||
|
width: 92%;
|
||||||
|
content: '';
|
||||||
|
border-bottom: 1px solid #efefef;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user