304 lines
8.3 KiB
Vue
304 lines
8.3 KiB
Vue
|
<template>
|
|||
|
<el-form :model="formData" label-width="auto" label-position="left">
|
|||
|
<FormMessage
|
|||
|
v-model="listQuery"
|
|||
|
:formList="formData"
|
|||
|
ref="elform"
|
|||
|
:rules="rules"
|
|||
|
>
|
|||
|
<!-- 自定义插槽(人员标签) -->
|
|||
|
<template #jsdwdm>
|
|||
|
<el-select
|
|||
|
v-model="listQuery.jsdwdm"
|
|||
|
placeholder="请选择处置接收单位"
|
|||
|
style="width: 240px"
|
|||
|
>
|
|||
|
<el-option
|
|||
|
v-for="item in deptList"
|
|||
|
:key="item.value"
|
|||
|
:label="item.label"
|
|||
|
:value="item.value.toString()"
|
|||
|
/>
|
|||
|
</el-select>
|
|||
|
</template>
|
|||
|
</FormMessage>
|
|||
|
|
|||
|
<!-- 审批流程 -->
|
|||
|
<div class="approval-flow">
|
|||
|
<div class="approval-flow">
|
|||
|
<div class="step" v-for="(item, index) in step" :key="`${index}step`">
|
|||
|
<div class="icon">
|
|||
|
<div class="circle"></div>
|
|||
|
<div class="line"></div>
|
|||
|
</div>
|
|||
|
<div>
|
|||
|
<div>{{ item.title }}</div>
|
|||
|
<div class="desc">
|
|||
|
<div class="description flexcc">
|
|||
|
<!-- 使用方案1 + 方案2 -->
|
|||
|
<div
|
|||
|
class="description-item"
|
|||
|
:class="{ 'disabled-item': item.default }"
|
|||
|
@click="!item.default && handleSelectStep(index)"
|
|||
|
>
|
|||
|
{{ item.sqrXm }}
|
|||
|
</div>
|
|||
|
<div class="description-item">{{ item.sqrSsbmmc }}</div>
|
|||
|
<div class="step-description" v-if="item.description">
|
|||
|
{{ item.description }}
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<ChooseUser
|
|||
|
v-model="chooseUserVisible"
|
|||
|
@choosedUsers="handleUserSelected"
|
|||
|
:roleIds="roleIds"
|
|||
|
/>
|
|||
|
</el-form>
|
|||
|
</template>
|
|||
|
|
|||
|
<script setup>
|
|||
|
import { reactive, ref, onMounted, getCurrentInstance, nextTick } from "vue";
|
|||
|
import FormMessage from "@/components/aboutTable/FormMessage.vue";
|
|||
|
import ChooseUser from "@/components/MyComponents/ChooseUser/index.vue";
|
|||
|
import DialogList from "@/views/backOfficeSystem/IntelligentControl/myControl/components/dialogList.vue";
|
|||
|
import { qcckPost, qcckPut } from "@/api/qcckApi.js";
|
|||
|
import MyTable from "@/components/aboutTable/MyTable.vue";
|
|||
|
import { fa } from "element-plus/es/locale.mjs";
|
|||
|
import { selectUserDeptPage } from "@/api/user-manage";
|
|||
|
|
|||
|
const { proxy } = getCurrentInstance();
|
|||
|
const { D_GS_BK_CZJSDWLX, D_GS_BK_TJFS, D_BZ_SF } = proxy.$dict(
|
|||
|
"D_GS_BK_CZJSDWLX",
|
|||
|
"D_GS_BK_TJFS",
|
|||
|
"D_BZ_SF"
|
|||
|
); //获取字典数据
|
|||
|
const listQuery = ref({}); //表单
|
|||
|
const chooseUserVisible = ref(false); //审批流程
|
|||
|
const roleIds = ref([]); //角色id
|
|||
|
let currentSelectedIndex = null;
|
|||
|
const deptList = ref([]); //部门列表
|
|||
|
const formData = ref([
|
|||
|
{
|
|||
|
label: "接收单位",
|
|||
|
prop: "jsdwdm",
|
|||
|
type: "slot"
|
|||
|
},
|
|||
|
{
|
|||
|
label: "处置接收单位类型",
|
|||
|
prop: "jsdwlx",
|
|||
|
type: "select",
|
|||
|
options: D_GS_BK_CZJSDWLX
|
|||
|
},
|
|||
|
{ label: "是否反馈", prop: "fkSf", type: "select", options: D_BZ_SF }
|
|||
|
]);
|
|||
|
const rules = reactive({
|
|||
|
bkBt: [{ required: true, message: "请选择处置接收单位", trigger: "blur" }],
|
|||
|
// bkObj: [{ required: true, message: "请选择提交方式", trigger: "blur" }],
|
|||
|
bkSjQs: [{ required: true, message: "请选择签收时间", trigger: "change" }]
|
|||
|
});
|
|||
|
const step = ref([
|
|||
|
{ sqrXm: "发起人", sqrSsbmmc: "发起部门", title: "发起申请", default: true },
|
|||
|
{
|
|||
|
sqrXm: "发起人",
|
|||
|
sqrSsbmmc: "发起部门",
|
|||
|
title: "审核确认",
|
|||
|
default: false,
|
|||
|
status: "", // 动态设置状态
|
|||
|
description: "" // 动态设置描述(如不通过原因)
|
|||
|
},
|
|||
|
{
|
|||
|
sqrXm: "发起人",
|
|||
|
sqrSsbmmc: "发起部门",
|
|||
|
title: "审批确认",
|
|||
|
default: false,
|
|||
|
status: "", // 动态设置状态
|
|||
|
description: "" // 动态设置描述(如不通过原因)
|
|||
|
}
|
|||
|
]);
|
|||
|
|
|||
|
onMounted(() => {
|
|||
|
getdepartmentList();
|
|||
|
});
|
|||
|
// 获取部门列表
|
|||
|
const getdepartmentList = () => {
|
|||
|
selectUserDeptPage().then((res) => {
|
|||
|
deptList.value = res?.records.map((item) => ({
|
|||
|
label: item.deptName,
|
|||
|
value: item.deptId
|
|||
|
}));
|
|||
|
// tableData.value = res?.records;
|
|||
|
});
|
|||
|
};
|
|||
|
// 处理选择的人员数据
|
|||
|
const handleUserSelected = (userData) => {
|
|||
|
if (currentSelectedIndex !== null) {
|
|||
|
step.value[currentSelectedIndex] = {
|
|||
|
...step.value[currentSelectedIndex],
|
|||
|
sqrXm: userData[0].userName,
|
|||
|
sqrSsbmmc: userData[0].deptName,
|
|||
|
userId: userData[0].id,
|
|||
|
rawData: userData[0] // 保留原始数据(可选)
|
|||
|
};
|
|||
|
if (currentSelectedIndex == 1) {
|
|||
|
// 同时更新listQuery(如果需要)
|
|||
|
listQuery.value = {
|
|||
|
...listQuery.value,
|
|||
|
shrSfzh: userData[0].idEntityCard,
|
|||
|
shrSsbmdm: userData[0].deptId,
|
|||
|
shrSsbmmc: userData[0].deptName,
|
|||
|
shrXm: userData[0].userName
|
|||
|
};
|
|||
|
} else if (currentSelectedIndex == 2) {
|
|||
|
// 同时更新listQuery(如果需要)
|
|||
|
listQuery.value = {
|
|||
|
...listQuery.value,
|
|||
|
sprSfzh: userData[0].idEntityCard,
|
|||
|
sprSsbmdm: userData[0].deptId,
|
|||
|
sprSsbmmc: userData[0].deptName,
|
|||
|
sprXm: userData[0].userName
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
console.log(step.value, "选择的数据");
|
|||
|
chooseUserVisible.value = false;
|
|||
|
};
|
|||
|
|
|||
|
// 点击步骤触发
|
|||
|
const handleSelectStep = (index) => {
|
|||
|
currentSelectedIndex = index;
|
|||
|
chooseUserVisible.value = true;
|
|||
|
};
|
|||
|
|
|||
|
// 2. 暴露获取数据的方法
|
|||
|
const getFormData = () => {
|
|||
|
// 可以在这里添加验证逻辑
|
|||
|
return {
|
|||
|
formData: listQuery.value
|
|||
|
};
|
|||
|
};
|
|||
|
// 接收父组件传入的数据并回显
|
|||
|
const setFormData = (data) => {
|
|||
|
listQuery.value = {
|
|||
|
...data // 假设 data 包含所有需要的字段
|
|||
|
};
|
|||
|
console.log(data, "部门");
|
|||
|
step.value = [
|
|||
|
{
|
|||
|
sqrXm: "发起人",
|
|||
|
sqrSsbmmc: "发起部门",
|
|||
|
title: "发起申请",
|
|||
|
default: true
|
|||
|
},
|
|||
|
{
|
|||
|
sqrXm: data.shrXm || "系统管理", // 审核人姓名
|
|||
|
sqrSsbmmc: data.shrSsbmmc || "西藏", // 审核部门
|
|||
|
title: "审核确认",
|
|||
|
status: "", // 动态设置状态
|
|||
|
description: "" // 动态设置描述(如不通过原因)
|
|||
|
},
|
|||
|
{
|
|||
|
sqrXm: data.sprXm || "测试", // 审批人姓名
|
|||
|
sqrSsbmmc: data.sprSsbmmc || "西藏", // 审批部门
|
|||
|
title: "审批确认",
|
|||
|
status: "", // 动态设置状态
|
|||
|
description: "" // 动态设置描述(如不通过原因)
|
|||
|
}
|
|||
|
];
|
|||
|
// 根据 bkZt 的值设置不同的状态
|
|||
|
switch (data.bkZt) {
|
|||
|
case "02": // 审核中
|
|||
|
step.value[1].status = "process";
|
|||
|
step.value[1].description = "审核中";
|
|||
|
break;
|
|||
|
case "03": // 审核不通过
|
|||
|
step.value[1].status = "error";
|
|||
|
step.value[1].description = `审核不通过(原因:${data.bkshBtgyy})`;
|
|||
|
break;
|
|||
|
case "04": // 审批中
|
|||
|
step.value[1].status = "finish"; // 审核已完成
|
|||
|
step.value[2].status = "process"; // 审批中
|
|||
|
step.value[2].description = "审批中";
|
|||
|
break;
|
|||
|
case "05": // 审批通过
|
|||
|
step.value[1].status = "finish"; // 审核已完成
|
|||
|
step.value[2].status = "finish"; // 审批已完成
|
|||
|
step.value[2].description = "审批通过";
|
|||
|
break;
|
|||
|
case "06": // 审批不通过
|
|||
|
step.value[1].status = "finish"; // 审核已完成
|
|||
|
step.value[2].status = "error"; // 审批不通过
|
|||
|
step.value[2].description = `审批不通过(原因:${data.bkshBtgyy})`;
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// 3. 暴露方法给父组件
|
|||
|
defineExpose({
|
|||
|
getFormData,
|
|||
|
setFormData
|
|||
|
});
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
.step {
|
|||
|
// position: relative;
|
|||
|
display: flex;
|
|||
|
gap: 5px;
|
|||
|
box-sizing: border-box;
|
|||
|
.desc {
|
|||
|
margin: 5px;
|
|||
|
color: #929090;
|
|||
|
// width: 350px;
|
|||
|
}
|
|||
|
.icon {
|
|||
|
// position: absolute;
|
|||
|
// top: 0;
|
|||
|
// left: 0;
|
|||
|
text-align: center;
|
|||
|
.circle {
|
|||
|
height: 14px;
|
|||
|
width: 14px;
|
|||
|
border-radius: 50%;
|
|||
|
background-color: rgb(196, 219, 240);
|
|||
|
}
|
|||
|
.line {
|
|||
|
margin: 0 auto;
|
|||
|
width: 0;
|
|||
|
height: calc(100% - 14px);
|
|||
|
border: 1px dashed rgb(196, 219, 240);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.unit-selection {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
gap: 20px;
|
|||
|
}
|
|||
|
.description {
|
|||
|
gap: 10px;
|
|||
|
}
|
|||
|
.description-item {
|
|||
|
width: 300px;
|
|||
|
height: 30px;
|
|||
|
padding: 0 20px;
|
|||
|
line-height: 30px;
|
|||
|
border: 1px solid #ccc;
|
|||
|
border-radius: 4px;
|
|||
|
color: rgb(131, 132, 135);
|
|||
|
box-sizing: border-box;
|
|||
|
}
|
|||
|
.disabled-item {
|
|||
|
cursor: not-allowed;
|
|||
|
opacity: 0.6;
|
|||
|
pointer-events: none;
|
|||
|
}
|
|||
|
</style>
|