zhxy-jsd/src/pages/view/hr/teacherProfile/PositionInfo.vue
2025-06-17 14:09:35 +08:00

303 lines
8.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<BasicLayout>
<view class="p-15">
<view v-if="education.xl.length > 0">
<template v-for="(item, index) in education.xl" :key="index">
<view class="po-re mb-15">
<BasicForm
:index="index"
v-model="item.value"
:schema="schema"
:key="`form-${index}-${forceUpdateKey}`"
:formsProps="{ labelWidth: 100 }"
/>
<view
@click="deleteMemberFamily(index, item.value)"
class="delete-icon"
>
<BasicIcon type="clear" size="30"/>
</view>
</view>
</template>
</view>
<view
class="flex-row items-center justify-center pb-10 pt-5"
style="border: 1px solid #e8e8e8"
@click="addEducation"
>
<uni-icons type="plus" size="16" color="#447ADE"></uni-icons>
<view class="ml-5 cor-447ADE">新增</view>
</view>
</view>
<template #bottom>
<view class="flex-row items-center pb-10 pt-5">
<u-button
text="测试计算"
class="ml-15 mr-7"
:plain="true"
@click="calculateAllPositionYears"
/>
<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>
</template>
</BasicLayout>
</template>
<script lang="ts" setup>
import {dicApi} from "@/api/system/dic";
import {useDataStore} from "@/store/modules/data";
import {navigateBack, navigateTo} from "@/utils/uniapp";
import {cloneDeep, map} from "lodash";
import dayjs from "dayjs";
// 计算任岗年限
const calculatePositionYears = (startDate: string, endDate?: string) => {
if (!startDate) return "";
const start = dayjs(startDate);
const end = endDate ? dayjs(endDate) : dayjs();
const years = end.diff(start, "year");
console.log("计算任岗年限:", {startDate, endDate, years});
// 确保0值也能显示转换为字符串
return years.toString();
};
// 强制重新渲染的键
const forceUpdateKey = ref(0);
// 更新指定项的任岗年限
const updatePositionYears = (itemValue: any) => {
const {gwrztime, gwpyjssj} = itemValue;
if (gwrztime) {
const years = calculatePositionYears(gwrztime, gwpyjssj);
itemValue.gwrznx = years;
}
};
const schema = reactive<FormsSchema[]>([
{
field: "gwlbId",
label: "岗位类别",
component: "BasicPicker",
componentProps: {
api: dicApi,
param: {pid: 260783972},
rangeKey: "dictionaryValue",
savaKey: "dictionaryCode",
},
},
{
field: "gwjbId",
label: "岗位级别",
component: "BasicPicker",
componentProps: {
api: dicApi,
param: {pid: 434953981},
rangeKey: "dictionaryValue",
savaKey: "dictionaryCode",
},
},
{
field: "gwrzkstime",
label: "岗位聘用开始时间",
component: "BasicDateTime",
componentProps: {
mode: "year-month",
ok: (e: any, attrs: any) => {
console.log("岗位聘用开始时间选择:", e, attrs);
const formIndex = attrs.index;
if (formIndex !== undefined && education.xl[formIndex]) {
// 获取当前表单项的结束时间
const endTime = education.xl[formIndex].value.gwrzjstime;
console.log("当前表单项数据:", education.xl[formIndex].value);
// 计算任岗年限
const years = calculatePositionYears(e.value, endTime);
// 更新任岗年限
education.xl[formIndex].value.gwrznx = years;
console.log("更新后的任岗年限:", education.xl[formIndex].value.gwrznx);
// 强制重新渲染
forceUpdateKey.value++;
}
},
},
},
{
field: "gwrzjstime",
label: "岗位聘用结束时间",
component: "BasicDateTime",
componentProps: {
mode: "year-month",
ok: (e: any, attrs: any) => {
console.log("岗位聘用结束时间选择:", e, attrs);
const formIndex = attrs.index;
if (formIndex !== undefined && education.xl[formIndex]) {
// 获取当前表单项的开始时间
const startTime = education.xl[formIndex].value.gwrzkstime;
console.log("当前表单项数据:", education.xl[formIndex].value);
if (startTime) {
// 计算任岗年限
const years = calculatePositionYears(startTime, e.value);
// 更新任岗年限
education.xl[formIndex].value.gwrznx = years;
console.log("更新后的任岗年限:", education.xl[formIndex].value.gwrznx);
// 强制重新渲染
forceUpdateKey.value++;
}
}
},
},
},
{
field: "gwrznx",
label: "岗位任职年限",
component: "BasicInput",
componentProps: {
disabled: true,
placeholder: "请选择岗位聘用时间",
},
},
// {
// field: "zrxk",
// label: "主任学科",
// component: "BasicInput",
// componentProps: {},
// },
// {
// field: "jrxk",
// label: "兼任学科",
// component: "BasicInput",
// componentProps: {},
// },
// {
// field: "bzrBjId",
// label: "班主任班级",
// component: "BasicDataPicker",
// componentProps: {
// api: findAllNjBjTreeApi,
// rangeKey: "title",
// savaKey: "key",
// },
// },
/*{
field: "dzzw",
label: "职务",
component: "BasicPicker",
componentProps: {
api: dicApi,
param: { pid: 1063530116 },
rangeKey: "dictionaryValue",
savaKey: "dictionaryCode",
},
},*/
]);
const education = reactive<any>({
xl: [{value: {}}],
});
const {getFile, setFile} = useDataStore();
if (getFile.rgqkList && getFile.rgqkList.length > 0) {
education.xl = map(getFile.rgqkList, (item) => {
return {value: item};
});
// 回显数据后直接使用数据库返回的gwrznx值不重新计算
nextTick(() => {
education.xl.forEach((item: any, index: number) => {
console.log(`回显数据-表单项${index}数据:`, {
gwrzkstime: item.value.gwrzkstime,
gwrzjstime: item.value.gwrzjstime,
gwrznx: item.value.gwrznx, // 直接使用数据库返回的值
来源: "数据库回显"
});
});
// 强制重新渲染确保界面更新
forceUpdateKey.value++;
});
}
// 手动触发计算所有项目的任岗年限
const calculateAllPositionYears = () => {
education.xl.forEach((item: any, index: number) => {
if (item.value.gwrzkstime) {
const years = calculatePositionYears(
item.value.gwrzkstime,
item.value.gwrzjstime
);
item.value.gwrznx = years;
console.log(`表单项${index}计算结果:`, {
gwrzkstime: item.value.gwrzkstime,
gwrzjstime: item.value.gwrzjstime,
gwrznx: years,
是否为0: years === "0"
});
} else {
// 没有开始时间时,清空任岗年限
item.value.gwrznx = "";
}
});
forceUpdateKey.value++;
};
function addEducation() {
education.xl.push({value: {}});
// 强制重新渲染
forceUpdateKey.value++;
}
function deleteMemberFamily(index: number, item: any) {
const list = cloneDeep(education.xl);
list.splice(index, 1);
education.xl = list;
// 强制重新渲染
forceUpdateKey.value++;
}
function submit() {
setFile({
...getFile,
rgqkList: map(education.xl, (item) => {
return item.value;
}),
});
navigateTo("/pages/view/hr/teacherProfile/ExperienceInfo");
}
// 组件挂载完成后处理回显数据
onMounted(() => {
// 如果有回显数据直接使用数据库返回的gwrznx值不重新计算
if (getFile.rgqkList && getFile.rgqkList.length > 0) {
nextTick(() => {
console.log("组件挂载后处理回显数据直接使用数据库返回的gwrznx值");
education.xl.forEach((item: any, index: number) => {
console.log(`挂载后-表单项${index}数据:`, {
gwrzkstime: item.value.gwrzkstime,
gwrzjstime: item.value.gwrzjstime,
gwrznx: item.value.gwrznx, // 直接使用数据库返回的值
来源: "数据库回显-挂载后"
});
});
forceUpdateKey.value++;
});
}
});
</script>
<style>
.delete-icon {
position: absolute;
right: -13px;
top: -14px;
z-index: 1;
}
</style>