调整请假流程

This commit is contained in:
ywyonui 2025-07-26 21:29:04 +08:00
parent aaf1360f03
commit 2bf0fc57d8
12 changed files with 221 additions and 49 deletions

View File

@ -17,6 +17,13 @@ export const jsQjSpApi = async (params: any) => {
return await post("/api/jsQj/sp", params); return await post("/api/jsQj/sp", params);
}; };
/**
*
*/
export const jsQjCxtjApi = async (params: any) => {
return await post("/api/jsQj/cxtj", params);
};
/** /**
* *
*/ */

View File

@ -256,12 +256,15 @@ const goToDetail = (data: any) => {
font-size: 13px; font-size: 13px;
font-weight: bold; font-weight: bold;
color: #ffffff; color: #ffffff;
white-space: nowrap;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
flex: 1 0 1px; flex: 1 0 1px;
width: 100%; width: 60px;
word-break: break-all;
white-space: normal;
text-align: center;
padding: 0 10px;
&.db-xs-qj { &.db-xs-qj {
background-color: #447ade; background-color: #447ade;

View File

@ -21,7 +21,8 @@
<view class="teacher-details"> <view class="teacher-details">
<view class="teacher-name">{{ js.jsxm }}</view> <view class="teacher-name">{{ js.jsxm }}</view>
<view class="teacher-position">{{ js.dzzw }} {{ js.qtzw }}</view> <view class="teacher-position">{{ dzZwLabel }}</view>
<view class="teacher-position">{{ qtZwLabel }}</view>
<view class="teacher-class">{{ js.njz }}</view> <view class="teacher-class">{{ js.njz }}</view>
</view> </view>
</view> </view>
@ -89,17 +90,22 @@
<script lang="ts" setup> <script lang="ts" setup>
import { jsdfindJsByPhoneApi } from "@/api/base/server"; import { jsdfindJsByPhoneApi } from "@/api/base/server";
import { useDataStore } from "@/store/modules/data"; import { useCommonStore } from "@/store/modules/common";
import { useUserStore } from "@/store/modules/user"; import { useUserStore } from "@/store/modules/user";
import { imagUrl } from "@/utils"; import { imagUrl } from "@/utils";
import { hideLoading, showLoading } from "@/utils/uniapp"; import { hideLoading, showLoading } from "@/utils/uniapp";
import { set } from "lodash"; import { set } from "lodash";
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
const { logout, getUser, getJs, setJs } = useUserStore(); const { logout, getUser, getJs, setJs } = useUserStore();
const { getZwListByLx } = useCommonStore();
const jsTx = computed(() => imagUrl(getUser.profilePhoto)); const jsTx = computed(() => imagUrl(getUser.profilePhoto));
const js = computed(() => getJs); const js = computed(() => getJs);
const dzZwLabel = ref<any>("");
const qtZwLabel = ref<any>("");
// //
const jsWork = ref<any>({ const jsWork = ref<any>({
jf: 88, jf: 88,
@ -348,6 +354,33 @@ const handleGridItemClick = async (item: GridItem) => {
} }
}, 200); }, 200);
}; };
//
onMounted(async () => {
let dzZw: any = [];
let qtZw: any = [];
if (getJs.dzzw && typeof getJs.dzzw == "string") {
dzZw = getJs.dzzw.split(",");
}
if (getJs.qtzw && typeof getJs.qtzw == "string") {
qtZw = getJs.qtzw.split(",");
}
if (dzZw && dzZw.length){
const res = await getZwListByLx({ zwlx: '党政职务' });
dzZwLabel.value = dzZw.map((zwId: string) => {
const zw = res.result.find((zw: any) => zwId == zw.id);
return zw ? zw.zwmc : '';
}).join(', ');
};
if (qtZw && qtZw.length){
const res = await getZwListByLx({ zwlx: '其他职务' });
qtZwLabel.value = qtZw.map((zwId: string) => {
const zw = res.result.find((zw: any) => zwId == zw.id);
return zw ? zw.zwmc : '';
}).join(', ');
};
})
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@ -88,7 +88,7 @@ const [register, { getValue }] = useForm({
}, },
componentProps: { componentProps: {
data: [ data: [
{ value: 0, text: "同意" }, { value: 2, text: "同意" },
{ value: 1, text: "拒绝" }, { value: 1, text: "拒绝" },
], ],
}, },

View File

@ -39,7 +39,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="" v-if="qjData.dkfs != 2"> <view class="" v-if="qjData.dkfs != 2 && dkList && dkList.length">
<view class="dk-title pl-15 pr-15"> <view class="dk-title pl-15 pr-15">
<BasicTitle line title="代课明细" :isBorder="false" /> <BasicTitle line title="代课明细" :isBorder="false" />
</view> </view>
@ -85,10 +85,8 @@
<script setup lang="ts"> <script setup lang="ts">
import ProgressList from "./progressList.vue" import ProgressList from "./progressList.vue"
import { findQjById, findDkPageApi } from "@/api/base/jsQjApi"; import { findQjById, findDkPageApi } from "@/api/base/jsQjApi";
import { showToast } from "@/utils/uniapp"; import { useDataStore } from "@/store/modules/data";
import { useDicStore } from "@/store/modules/dic"; const { getDb } = useDataStore();
import { update } from "lodash";
const { findByPid } = useDicStore();
// //
const props = withDefaults(defineProps<{ const props = withDefaults(defineProps<{
@ -142,6 +140,9 @@ const init = async () => {
return item; return item;
}); });
} }
if (props.dbFlag) {
qjData.value.dbZy = getDb.dbZy;
}
}; };
// //

View File

@ -8,7 +8,7 @@
<BasicIcon type="refreshempty" size="25" /> <BasicIcon type="refreshempty" size="25" />
</view> </view>
</view> </view>
<view class="dk-tabs mb-10"> <view class="dk-tabs mb-10" v-if="dkList && dkList.length">
<BasicTabs class="type-tabs" <BasicTabs class="type-tabs"
ref="tabsRef" :list="tabList" bar-width="60px" scroll-count="4" ref="tabsRef" :list="tabList" bar-width="60px" scroll-count="4"
:current="curTabIndex" @change="switchTab" :current="curTabIndex" @change="switchTab"

View File

@ -22,12 +22,11 @@
import JsQjDkEdit from "./jsQjDkEdit.vue" import JsQjDkEdit from "./jsQjDkEdit.vue"
import { navigateBack } from "@/utils/uniapp"; import { navigateBack } from "@/utils/uniapp";
import { useForm } from "@/components/BasicForm/hooks/useForm"; import { useForm } from "@/components/BasicForm/hooks/useForm";
import { jsQjSqApi } from "@/api/base/jsQjApi"; import { jsQjSqApi, jsQjCxtjApi } from "@/api/base/jsQjApi";
import { showToast } from "@/utils/uniapp"; import { showToast } from "@/utils/uniapp";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { useUserStore } from "@/store/modules/user"; import { useUserStore } from "@/store/modules/user";
import { useDicStore } from "@/store/modules/dic"; import { useDicStore } from "@/store/modules/dic";
import { update } from "lodash";
const { getJs, getUser } = useUserStore(); const { getJs, getUser } = useUserStore();
const { findByPid } = useDicStore(); const { findByPid } = useDicStore();
@ -224,15 +223,17 @@ const submit = async () => {
params.dkList = []; params.dkList = [];
} }
} }
let submitApi = jsQjSqApi;
if (props.data && props.data.id) { if (props.data && props.data.id) {
params.id = props.data.id; params.id = props.data.id;
submitApi = jsQjCxtjApi
} else { } else {
params.id = null; params.id = null;
params.jsId = getJs.id; params.jsId = getJs.id;
params.jsName = getJs.jsxm; params.jsName = getJs.jsxm;
} }
uni.showLoading({ title: "提交中..." }); uni.showLoading({ title: "提交中..." });
await jsQjSqApi(params).then(() => { await submitApi(params).then(() => {
showToast({ title: "提交成功", icon: "success" }); showToast({ title: "提交成功", icon: "success" });
uni.reLaunch({ uni.reLaunch({
url: "/pages/base/service/index" url: "/pages/base/service/index"

View File

@ -1,17 +1,20 @@
<template> <template>
<view class="leave-page"> <view class="leave-page">
重新提交 <JsQjEdit :data="qjData" v-if="qjData.id" />
</view> </view>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import JsQjEdit from "./components/jsQjEdit.vue"
import { findQjById } from '@/api/base/jsQjApi'; import { findQjById } from '@/api/base/jsQjApi';
import { onLoad } from '@dcloudio/uni-app'; import { onLoad } from '@dcloudio/uni-app';
import { useDataStore } from "@/store/modules/data"; import { useDataStore } from "@/store/modules/data";
const { setData } = useDataStore(); const { setData, getData } = useDataStore();
const dbFlag = ref(false); const dbFlag = ref(false);
const qjData = computed(() => getData);
onLoad(async (data: any) => { onLoad(async (data: any) => {
// //
if (data && data.from && data.from == "db") { if (data && data.from && data.from == "db") {

View File

@ -1,6 +1,6 @@
<template> <template>
<BasicLayout> <BasicLayout>
<JsQjDetail :qjId="qjId" :dbFlag="false" /> <JsQjDetail :qjId="qjId" :dbFlag="dbFlag" />
</BasicLayout> </BasicLayout>
</template> </template>

View File

@ -1,33 +1,97 @@
<template> <template>
<view class="leave-page"> <BasicLayout>
教务处确认 <JsQjDetail :qjId="qjId" :dbFlag="dbFlag" v-if="qjId && qjId.length" />
</view> <template #bottom>
<view class="white-bg-color py-5">
<view class="flex-row items-center pb-10 pt-5">
<u-button
text="驳回"
class="ml-15 mr-7"
:plain="true"
@click="navigateBack"
/>
<u-button
text="转办"
class="ml-7 mr-7"
:plain="true"
@click="navigateBack"
/>
<u-button
text="同意"
class="mr-15 mr-7"
type="primary"
@click="submit"
/>
</view>
</view>
</template>
</BasicLayout>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { findQjById } from '@/api/base/jsQjApi'; import JsQjDetail from "./components/jsQjDetail.vue";
import { onLoad } from '@dcloudio/uni-app'; import { onLoad } from "@dcloudio/uni-app";
import { navigateBack } from "@/utils/uniapp";
import { useForm } from "@/components/BasicForm/hooks/useForm";
import { jsQjSpApi } from '@/api/base/jsQjApi';
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data"; import { useDataStore } from "@/store/modules/data";
const { setData } = useDataStore(); const { getJs } = useUserStore();
const { getData } = useDataStore();
const dbFlag = ref(false); const dbFlag = ref(false);
const qjId = ref<string>();
const [register, { getValue }] = useForm({
schema: [
{
field: "spStatus",
label: "审批意见",
component: "BasicCheckbox",
required: true,
componentProps: {
data: [
{ value: 2, text: "同意" },
{ value: 1, text: "拒绝" },
],
},
},
{
field: "spYj",
label: "审批说明",
component: "BasicInput",
required: true,
itemProps: {
labelPosition: "top",
},
componentProps: {
type: "textarea",
},
},
],
});
const submit = async () => {
const data = await getValue();
const params = { ...data };
params.qjId = qjId.value;
params.jsId = getJs.id;
uni.showLoading({ title: "审批中..." });
await jsQjSpApi(params);
uni.hideLoading();
navigateBack();
};
onLoad(async (data: any) => { onLoad(async (data: any) => {
// //
if (data && data.from && data.from == "db") { if (data && data.from && data.from == "db") {
qjId.value = data.id;
dbFlag.value = true; dbFlag.value = true;
const res = await findQjById({ id: data.id });
nextTick(() => {
setData(res.result);
});
} else { } else {
qjId.value = getData.id;
dbFlag.value = false; dbFlag.value = false;
} }
}); });
</script>
<style lang="scss" scoped> </script>
.leave-page {
height: 100vh;
}
</style>

View File

@ -1,33 +1,92 @@
<template> <template>
<view class="leave-page"> <BasicLayout>
负责人审批 <JsQjDetail :qjId="qjId" :dbFlag="dbFlag" v-if="qjId && qjId.length" />
</view> <template #bottom>
<view class="white-bg-color py-5">
<view class="divider"></view>
<view class="flex-row items-center pb-10 pt-5">
<u-button
text="取消"
class="ml-15 mr-7"
:plain="true"
@click="navigateBack"
/>
<u-button
text="提交"
class="mr-15 mr-7"
type="primary"
@click="submit"
/>
</view>
</view>
</template>
</BasicLayout>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { findQjById } from '@/api/base/jsQjApi'; import JsQjDetail from "./components/jsQjDetail.vue";
import { onLoad } from '@dcloudio/uni-app'; import { onLoad } from "@dcloudio/uni-app";
import { navigateBack } from "@/utils/uniapp";
import { useForm } from "@/components/BasicForm/hooks/useForm";
import { jsQjSpApi } from '@/api/base/jsQjApi';
import { useUserStore } from "@/store/modules/user";
import { useDataStore } from "@/store/modules/data"; import { useDataStore } from "@/store/modules/data";
const { setData } = useDataStore(); const { getJs } = useUserStore();
const { getData } = useDataStore();
const dbFlag = ref(false); const dbFlag = ref(false);
const qjId = ref<string>();
const [register, { getValue }] = useForm({
schema: [
{
field: "spStatus",
label: "审批意见",
component: "BasicCheckbox",
required: true,
componentProps: {
data: [
{ value: 2, text: "同意" },
{ value: 1, text: "拒绝" },
],
},
},
{
field: "spYj",
label: "审批说明",
component: "BasicInput",
required: true,
itemProps: {
labelPosition: "top",
},
componentProps: {
type: "textarea",
},
},
],
});
const submit = async () => {
const data = await getValue();
const params = { ...data };
params.qjId = qjId.value;
params.jsId = getJs.id;
uni.showLoading({ title: "审批中..." });
await jsQjSpApi(params);
uni.hideLoading();
navigateBack();
};
onLoad(async (data: any) => { onLoad(async (data: any) => {
// //
if (data && data.from && data.from == "db") { if (data && data.from && data.from == "db") {
qjId.value = data.id;
dbFlag.value = true; dbFlag.value = true;
const res = await findQjById({ id: data.id });
nextTick(() => {
setData(res.result);
});
} else { } else {
qjId.value = getData.id;
dbFlag.value = false; dbFlag.value = false;
} }
}); });
</script>
<style lang="scss" scoped> </script>
.leave-page {
height: 100vh;
}
</style>

View File

@ -57,6 +57,7 @@ export const useCommonStore = defineStore({
// 根据职务类型获取职务列表 // 根据职务类型获取职务列表
async getZwListByLx(params: any): Promise<any> { async getZwListByLx(params: any): Promise<any> {
if (!this.data.zw || !this.data.zw[params.zwlx]) { if (!this.data.zw || !this.data.zw[params.zwlx]) {
this.data.zw = this.data.zw || {};
this.data.zw[params.zwlx] = await zwGetListByLxApi(params); this.data.zw[params.zwlx] = await zwGetListByLxApi(params);
} }
return Promise.resolve(this.data.zw[params.zwlx]); return Promise.resolve(this.data.zw[params.zwlx]);