This commit is contained in:
2025-09-26 16:08:38 +08:00
parent 5208ce4fde
commit 39177fbd7d
10 changed files with 220 additions and 373 deletions

View File

@ -15,9 +15,6 @@
</el-form-item>
<el-form-item prop="password1">
<!-- <span class="svg-container">
<svg-icon icon="password" />
</span> -->
<el-input placeholder="请输入密码" name="password" :type="passwordType" v-model="loginForm.password">
<template #prepend>
<span class="svg-container">
@ -48,8 +45,7 @@
<!---登录按钮-->
<el-form-item style="height: 49px" v-if="!loginDialog">
<el-button @click="handleLogin" type="primary" style="width: 520px; height: 49px" :loading="loading"
native-type="submit">登录</el-button>
<el-button @click="handleLogin" type="primary" style="width: 520px; height: 49px" :loading="loading" native-type="submit">登录</el-button>
</el-form-item>
<el-form-item class="choosedept-wrap" v-if="loginDialog">
@ -68,6 +64,7 @@ export default {
};
</script>
<script setup>
import { qcckPost } from "@/api/qcckApi.js";
import { setItem } from "@/utils/storage";
import { ElNotification } from "element-plus";
import * as MOSTY from "@/components/MyComponents/index";
@ -100,19 +97,14 @@ const loginRules = ref({
kaptcha: [{ required: true, trigger: "blur", message: "验证码为必填项" }]
});
const handleClose = () => { };
const refreshToken = (e) => {
store
.dispatch("user/refreshToken", { deptId: e, jwtToken: authorization.value })
.then((res) => {
loading.value = false;
store.commit("user/setDeptId", e);
// window.location.href = '/'// 登录后操作
router.push("/");
})
.catch(() => {
loading.value = false;
});
store.dispatch("user/refreshToken", { deptId: e, jwtToken: authorization.value }).then((res) => {
loading.value = false;
store.commit("user/setDeptId", e);
router.push("/");
}).catch(() => {
loading.value = false;
});
};
// 处理密码框文本显示状态
const passwordType = ref("password");
@ -131,41 +123,38 @@ const router = useRouter();
const handleLogin = () => {
loginFromRef.value.validate((valid) => {
if (!valid) return false;
// setItem("token", "1255555888");
// setItem("isOatuh", 0);
// router.push("/");
loading.value = true;
store
.dispatch("user/login", loginForm.value)
.then((res) => {
loading.value = false;
// 登录后操作;
if (res.deptList.length === 1) {
window.location.href = "/";
} else {
deptList.value = [...res.deptList];
loginDialog.value = true;
authorization.value = res.jwtToken;
ElNotification({
title: "提示",
message: "请选择部门",
duration: 3000
});
}
})
.catch(() => {
loading.value = false;
});
store.dispatch("user/login", loginForm.value).then((res) => {
loading.value = false;
if (res.deptList.length === 1) {
getSfzhByGsid(res.idEntityCard)
} else {
deptList.value = [...res.deptList];
loginDialog.value = true;
authorization.value = res.jwtToken;
ElNotification({ title: "提示", message: "请选择部门", duration: 3000});
}
}).catch(() => {
loading.value = false;
});
});
};
const logout = () => {
store.dispatch("user/logout");
};
const getSfzhByGsid = (sfzh) => {
qcckPost({ sfzh }, "/mosty-base/baxx/cyry/queryBySfzh").then(res=>{
if(!res) {
ElNotification({ title: "提示", message: "无访问权限", duration: 3000});
store.dispatch("user/logout");
}else{
let obj = { sfzh:res.sfzh , xm:res.xm , pxgs:res.pxgs , pxgsid:res.pxgsid }
setItem("userInfo", JSON.stringify(obj));
window.location.href = "/";
}
})
}
onMounted(() => { });
const getKaptchaImg = () => {
const res =
`${process.env.VUE_APP_GATEWAY_BASE_URL}/mosty-base/kaptcha?date=` +
new Date();
const res = `${process.env.VUE_APP_GATEWAY_BASE_URL}/mosty-base/kaptcha?date=` + new Date();
kaptchaUrl.value = res;
};
</script>

View File

@ -18,40 +18,25 @@
</template>
<script setup>
import { ref, computed, reactive, getCurrentInstance } from 'vue'
import * as rule from "@/utils/rules.js";
import { ref, reactive, getCurrentInstance } from 'vue'
import { qcckPost } from "@/api/qcckApi.js";
import FormMessage from '@/components/aboutTable/FormMessage.vue'
const { proxy } = getCurrentInstance()
const { D_BAXX_GWLX } = proxy.$dict("D_BAXX_GWLX")
const title = ref('新增培训人员')
const loading = ref(false)
const disabled = ref(false)
const FormRef = ref(null)
const props = defineProps({
modelValue: {
type: Boolean,
default: false
},
dic: {
type: Object,
default: () => ({})
}
})
const emits = defineEmits(['update:modelValue', 'refresh'])
const dialogVisible = computed({
get() {
return props.modelValue
},
set(val) {
emits('update:modelValue', val)
}
})
const formData = ref({})
const dialogVisible = ref(false)
const emits = defineEmits(['refresh'])
const formList = reactive([
[
{ label: "姓名", prop: "xm", type: "input" },
@ -74,80 +59,34 @@ const formList = reactive([
{ label: "无犯罪记录证明", prop: "wfzzmjl", type: "upload", limit: 1 },
]
])
const rules = {
ryzpzm: [{ required: true, message: "请上传身份证正面", trigger: "change" }],
ryzpfm: [{ required: true, message: "请上传身份证反面", trigger: "change" }],
tjbg: [{ required: true, message: "请上传体检报告", trigger: "change" }],
wfzzmjl: [{ required: true, message: "请上传无犯罪记录证明", trigger: "change" }],
xm: [{ required: true, message: "请输入姓名", trigger: "change" }],
zjhm: [
{ required: true, message: "请输入证件号码", trigger: "change" },
{
validator: (rule, value, callback) => {
if (!value) {
callback()
} else {
const reg = /^(\d{15}|\d{17}[\dXx])$/;
if (!reg.test(value)) {
callback(new Error("请输入正确的身份证号码"))
} else {
callback()
}
}
}
}
],
lxdh: [
{ required: true, message: "请输入联系电话", trigger: "change" },
{
validator: (rule, value, callback) => {
if (!value) {
callback()
} else {
const reg = /^1[34578]\d{9}$/
if (!reg.test(value)) {
callback(new Error("请输入正确的手机号"))
} else {
callback()
}
}
}
}
],
...rule.phoneRule({ validator: true,message: "请输入联系电话",require: true }, "lxdh"), // 是否必填 是否进行校验`
...rule.identityCardRule({ validator: true,message: "请输入身份证号" ,require: true}, "zjhm"), // 是否必填 是否进行校验
jzdz: [{ required: true, message: "请输入居住地址", trigger: "change" }],
rzsj: [{ required: true, message: "请选择入职时间", trigger: "change" }],
pxgs: [{ required: true, message: "请选择所属保安公司", trigger: "change" }],
gw: [{ required: true, message: "请输入岗位", trigger: "change" }],
}
const formData = ref({})
const close = () => {
FormRef.value?.reset()
dialogVisible.value = false
dialogVisible.value = false;
}
const open = (row = {}, type = 'add') => {
disabled.value = false
dialogVisible.value = true
const fieldsToSplit = ['ryzpzm', 'ryzpfm', 'tjbg', 'wfzzmjl'];
fieldsToSplit.forEach(field => {
row[field] = typeof row[field] === 'string'
? row[field].split(',')
: row[field];
row[field] = typeof row[field] === 'string' ? row[field].split(',') : row[field];
});
formData.value = { ...row }
if (type === 'add') {
title.value = '新增申请人员'
} else if (type === 'upload') {
title.value = '上传资料'
} else {
disabled.value = true
title.value = '查看详情'
}
title.value = type === 'add' ? '新增申请人员' : (type === 'upload' ? '上传资料' : '查看详情')
disabled.value = title.value === '查看详情' ? true : false;
dialogVisible.value = true;
}
// 新增、编辑
@ -155,15 +94,9 @@ const save = () => {
FormRef.value.submit(() => {
loading.value = true;
const url = !formData.value?.id ? `/mosty-base/baxx/basq/add` : `/mosty-base/baxx/basq/edit`;
const params = { ...formData.value }
const fieldsToSplit = ['ryzpzm', 'ryzpfm', 'tjbg', 'wfzzmjl'];
fieldsToSplit.forEach(field => {
params[field] = params[field]
? params[field].join(',')
: '';
});
fieldsToSplit.forEach(field => { params[field] = params[field] ? params[field].join(',') : ''; });
qcckPost(params, url).then(() => {
loading.value = false;
proxy.$message.success("保存成功");

View File

@ -1,82 +1,101 @@
<template>
<el-dialog class="dialogWerapper" width="30%" v-model="modelValue" :title="title" @close="handleClose">
<form-message ref="FormRef" :disabled="disabled" v-model="formData" :rules="rules" :formList="formList" />
<el-dialog class="dialogWerapper" width="80%" v-model="visibleDialog" title="选择公司" @close="handleClose">
<div>
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData"
>
</MyTable>
</div>
<template #footer>
<el-button type="primary" v-if="!disabled" :loading="loading" @click="handleSubmit">确定</el-button>
<el-button @click="handleClose">取消</el-button>
<div class="flex just-center">
<el-button type="primary" :loading="loading" @click="handleSubmit">确定</el-button>
<el-button @click="handleClose">取消</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { computed, ref, reactive, getCurrentInstance } from 'vue';
import FormMessage from '@/components/aboutTable/FormMessage.vue'
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import MyTable from "@/components/aboutTable/MyTable.vue";
import { ref, reactive,getCurrentInstance } from 'vue';
import { qcckPost } from "@/api/qcckApi.js";
const emits = defineEmits(['refresh']);
const { proxy } = getCurrentInstance();
const { D_BAXX_DWLX } = proxy.$dict("D_BAXX_DWLX")
const props = defineProps({
modelValue: {
type: Boolean,
default: false
const visibleDialog = ref(false);
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "radio",
loading: false,
haveControls:false
},
})
const emits = defineEmits(['update:modelValue', 'refresh'])
const visible = computed({
get() {
return props.modelValue
tableHeight:500,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
set(val) {
emits('update:modelValue', val)
}
})
controlsWidth: 180,
tableColumn: [
{ label: "单位名称", prop: "dwmc" },
{ label: "信用代码", prop: "xydm" },
{ label: "场所名称", prop: "csmc" },
{ label: "场所电话", prop: "csLxdh" }
]
});
const title = ref('选择培训公司')
const loading = ref(false)
const disabled = ref(false)
const FormRef = ref(null)
const formData = ref({})
const formList = reactive([
[
{ label: "培训公司", prop: "pxgs", type: "select", options: D_BAXX_DWLX },
],
])
const rules = {
pxgs: [{ required: true, message: "请选择培训公司", trigger: "change" }],
}
const open = (row = {}, type = 'updata') => {
visible.value = true
disabled.value = false
formData.value = { ...row }
}
const loading = ref(false)
const handleClose = () => {
FormRef.value?.reset()
visible.value = false
formData.value = {};
visibleDialog.value = false;
}
const chooseData = (row) => {
formData.value.pxgsdm = row[0].id;
formData.value.pxgsid = row[0].id;
formData.value.pxgs = row[0].dwmc;
}
const handleSubmit = async () => {
try {
loading.value = true
await FormRef.value.submit(async () => {
await qcckPost({ ...formData.value }, `/mosty-base/baxx/basq/edit`)
proxy.$message.success('培训公司保存成功')
emits('refresh')
visible.value = false
})
} catch (error) {
console.log(error)
proxy.$message.error('培训公司保存失败')
} finally {
loading.value = false
}
if(!formData.value.pxgsid) return proxy.$message.error('请选择公司');
loading.value = true;
let data = { ...formData.value }
data.sfzh = data.zjhm;
await qcckPost(data, `/mosty-base/baxx/basq/edit`)
await qcckPost(data, `/mosty-base/baxx/pxry/add`)
loading.value = false
proxy.$message.success('培训公司保存成功')
emits('refresh')
handleClose()
}
defineExpose({ open })
function open(row) {
pageData.keyCount++;
formData.value = row;
visibleDialog.value = true;
getList();
}
function getList () {
pageData.tableConfiger.loading = true;
qcckPost({ }, "/mosty-base/baxx/dwgl/list").then((res) => {
let arr = res || []
pageData.tableData = arr.filter(item => item.type == '02')
pageData.tableConfiger.loading = false;
}).catch(() => {
pageData.tableConfiger.loading = false;
});
}
defineExpose({
open
})
</script>

View File

@ -19,14 +19,14 @@
{{ row?.sfpx === '01' ? `` : `` }}
</template>
<template #gw="{ row }">
<DictTag :value="row.gw" :options="D_BAXX_GWLX" />
<DictTag :value="row.gw" :tag="false" :options="D_BAXX_GWLX" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
<el-link type="success" @click="addEdit('upload', row)">上传资料</el-link>
<el-link type="danger" @click="handleDelete([row.id])">删除</el-link>
<el-link type="warning" @click="addEdit('view', row)">详情</el-link>
<el-link type="primary" @click="addEdit('select', row)">提交培训公司</el-link>
<el-link type="primary" @click="addEdit('select', row)" v-if="!row.pxgsdm">提交培训公司</el-link>
</template>
</MyTable>
<Pages @changeNo="changeNo" @changeSize="changeSize" :tableHeight="pageData.tableHeight" :pageConfiger="{
@ -34,10 +34,8 @@
total: pageData.total
}"></Pages>
</div>
<add-trainer-dialog v-model="isVisible" ref="trainerRef" @refresh="getList" />
<select-ttaning-dialog ref="selectTtaningRef" v-model="dialogVisible" @refresh="getList" />
<select-ttaning-dialog ref="selectTtaningRef" @refresh="getList" />
</div>
</template>
@ -46,18 +44,16 @@ import { getCurrentInstance, onMounted, reactive, ref } from "vue";
import MyTable from '@/components/aboutTable/MyTable.vue';
import Pages from '@/components/aboutTable/Pages.vue';
import Search from '@/components/aboutTable/Search.vue';
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { qcckPost } from "@/api/qcckApi.js";
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import AddTrainerDialog from "./components/addTrainerDialog.vue";
import selectTtaningDialog from "./components/selectTtaningDialog.vue";
const { proxy } = getCurrentInstance();
const { D_BAXX_GWLX } = proxy.$dict("D_BAXX_GWLX")
const trainerRef = ref(null);
const selectTtaningRef = ref(null);
const selectTtaningRef = ref();
const queryFrom = ref({});
const isVisible = ref(false);
const dialogVisible = ref(false);
const searchBox = ref(null);
const searchConfiger = ref([
{
@ -107,8 +103,7 @@ const pageData = reactive({
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 250;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
@ -116,7 +111,7 @@ const tabHeightFn = () => {
const addEdit = (type, row) => {
if (type === 'select') {
selectTtaningRef.value.open(row, type);
selectTtaningRef.value.open(row);
} else {
trainerRef.value.open(row, type);
}
@ -129,38 +124,26 @@ const onSearch = (value) => {
}
const getList = async () => {
try {
pageData.tableConfiger.loading = true;
const res = await qcckPost({
...pageData.pageConfiger,
...queryFrom.value
}, `/mosty-base/baxx/basq/page`)
if(res) {
pageData.tableData = res.records || [];
pageData.total = res.total;
}
} finally {
pageData.tableConfiger.loading = false;
}
pageData.tableConfiger.loading = true;
let data = { ...pageData.pageConfiger, ...queryFrom.value }
const res = await qcckPost(data, `/mosty-base/baxx/basq/page`)
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}
const handleDelete = async (ids) => {
await proxy.$modal.confirm("是否确认删除该培训人员?")
try {
await qcckPost({ idList: ids }, `/mosty-base/baxx/basq/remove`)
proxy.$modal.msgSuccess("删除成功");
await getList();
} catch (error) {
proxy.$modal.msgError("删除失败");
}
await qcckPost({ idList: ids }, `/mosty-base/baxx/basq/remove`)
proxy.$modal.msgSuccess("删除成功");
await getList();
}
const changeNo = (val) => {
pageData.pageConfiger.pageNum = val;
getList();
};
const changeSize = (val) => {
pageData.pageConfiger.pageSize = val;
getList();

View File

@ -13,10 +13,10 @@
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #sflz="{ row }">
<DictTag :value="row.newSflz" :options="D_BZ_SF" />
<span>{{ row.sflz == 1 ? '离职' : '在职' }}</span>
</template>
<template #gw="{ row }">
<DictTag :value="row.gw" :options="D_BAXX_GWLX" />
<DictTag :value="row.gw" :tag="false" :options="D_BAXX_GWLX" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
@ -150,21 +150,12 @@ const handleDelete = async (ids) => {
};
const getList = async () => {
try {
pageData.tableConfiger.loading = true;
const res = await qcckPost({
...pageData.pageConfiger,
...queryFrom.value
}, `/mosty-base/baxx/cyry/page`)
if(res) {
// 处理sflz为null默认为0
pageData.tableData = res.records?.map(i => ({ ...i, newSflz: i?.sflz === null ? 0 : i.sflz })) || [];
pageData.total = res.total;
}
} finally {
pageData.tableConfiger.loading = false;
}
pageData.tableConfiger.loading = true;
let params = { ...pageData.pageConfiger, ...queryFrom.value }
const res = await qcckPost(params, `/mosty-base/baxx/cyry/page`)
pageData.tableData = res.records || []
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}
const changeNo = (val) => {

View File

@ -13,10 +13,7 @@
<MyTable :tableData="pageData.tableData" :tableColumn="pageData.tableColumn" :tableHeight="pageData.tableHeight"
:key="pageData.keyCount" :tableConfiger="pageData.tableConfiger" :controlsWidth="pageData.controlsWidth">
<template #gw="{ row }">
<DictTag :value="row.gw" :options="D_BAXX_GWLX" />
</template>
<template #ssbags="{ row }">
<DictTag :value="row.ssbags" :options="D_BAXX_DWLX" />
<DictTag :value="row.gw" :tag="false" :options="D_BAXX_GWLX" />
</template>
<!-- 操作 -->
<template #controls="{ row }">
@ -91,14 +88,13 @@ const pageData = reactive({
{ label: "证件号码", prop: "sfzh" },
{ label: "联系方式", prop: "lxdh" },
{ label: "岗位", prop: "gw", showSolt: true },
{ label: "所属保安公司", prop: "ssbags", showSolt: true },
{ label: "所属保安公司", prop: "pxgs" },
]
});
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight =
window.innerHeight - searchBox.value.offsetHeight - 250;
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
@ -115,52 +111,28 @@ const onSearch = (value) => {
}
const getList = async () => {
try {
pageData.tableConfiger.loading = true;
const res = await qcckPost({
...pageData.pageConfiger,
...queryFrom.value,
sfxxpx: '01'
}, `/mosty-base/baxx/pxry/page`)
if(res) {
pageData.tableData = res.records || [];
pageData.total = res.total;
}
} finally {
pageData.tableConfiger.loading = false;
}
pageData.tableConfiger.loading = true;
let params = { ...pageData.pageConfiger, ...queryFrom.value, sfxxpx: '01' }
const res = await qcckPost(params, `/mosty-base/baxx/pxry/page`)
pageData.tableData = res.records || [];
pageData.total = res.total;
pageData.tableConfiger.loading = false;
}
// 提交培训
const handleSubmitTraining = async (row) => {
await proxy.$modal.confirm("是否确认提交该人员进行待培训?")
try {
await qcckPost({
...row,
sfxxpx: '02'
}, "/mosty-base/baxx/pxry/edit")
proxy.$modal.msgSuccess("提交培训成功");
await getList();
} catch (error) {
proxy.$modal.msgError("提交培训失败");
console.log(error)
}
await qcckPost({ ...row, sfxxpx: '02' }, "/mosty-base/baxx/pxry/edit")
proxy.$modal.msgSuccess("提交培训成功");
await getList();
};
// 删除
const handleDelete = async (ids) => {
await proxy.$modal.confirm("是否确认删除该培训人员?")
try {
await qcckPost({ idList: ids }, "/mosty-base/baxx/pxry/remove")
proxy.$modal.msgSuccess("删除成功");
await getList();
} catch (error) {
proxy.$modal.msgError("删除失败");
console.log(error)
}
await qcckPost({ idList: ids }, "/mosty-base/baxx/pxry/remove")
proxy.$modal.msgSuccess("删除成功");
await getList();
};
const changeNo = (val) => {