Commit 7d30c941 authored by 姬鋆屾's avatar 姬鋆屾

pref:添加考勤运维及考勤机管理模块;修改工作人员考核明细弹窗内得登记年月显示

parent eec7258d
#开发环境
NODE_ENV = "development"
# VUE_APP_API_BASE_URL= http://112.19.80.237:11039
VUE_APP_API_BASE_URL= http://192.168.0.98:11039
VUE_APP_API_BASE_URL= http://192.168.0.98:17500
# VUE_APP_API_BASE_URL= http://192.168.0.98:11039
VUE_APP_API_ZWFW_URL= http://112.19.80.237:11031
VUE_APP_PORTAL_URL = /portal_home
\ No newline at end of file
......@@ -278,7 +278,8 @@ export default {
this.$route.name == "perform/other/record/list" ||
this.$route.name == "perform/attend/appeal/list" ||
this.$route.name == "window/owner/list" ||
this.$route.name == "staff/perform/summary/list"
this.$route.name == "staff/perform/summary/list" ||
this.$route.name == "device/list"
) {
this.getArr();
}
......
......@@ -66,6 +66,7 @@ const router = new Router({
...restBuilder("attendance/group", "attendance/group"), // 考勤组信息
...restBuilder("attendance/class", "attendance/class"), // 考勤班次信息
...restBuilder("attendance/leave/record", "attendance/leave/record"), // 请假记录信息
...restBuilder("device", "device"), // 请假记录信息
...restBuilder(
"attendance/vacation/balance",
"attendance/vacation/balance"
......
......@@ -10,17 +10,19 @@
<div class="content_box">
<div class="text_line">
<div class="text_box">
<span style="width: 160px;">窗口 (单位) 名称:</span>
<span style="width: 160px">窗口 (单位) 名称:</span>
<span>{{ windowName || "--" }}</span>
</div>
<div class="text_box">
<span>登记年月:</span>
<span>{{
`${form.year ? form.year : "--"}-${
form.month
? [1, 2, 3, 4, 5, 6, 7, 8, 9].includes(form.month)
? "0" + form.month
: form.month
`${
form.timeType == 0
? form.year + "-" + form.month
: form.timeType == 1
? form.year + "年-第" + form.season + "季度"
: form.timeType == 2
? form.year
: "--"
}`
}}</span>
......@@ -28,7 +30,7 @@
</div>
<div class="text_line">
<div class="text_box">
<div style="width: 100%;">
<div style="width: 100%">
<el-table
:data="form.windowWorkmanPerformDetailList"
border
......@@ -185,7 +187,12 @@
<div class="hecha_title">
<span class="line"></span>
<span
style="font-size: 18px;font: bold;margin-bottom: 20px;color: #409eff;"
style="
font-size: 18px;
font: bold;
margin-bottom: 20px;
color: #409eff;
"
>核查情况</span
>
</div>
......@@ -195,7 +202,7 @@
<el-form-item label="政务服务管理科评荐意见:" prop="checkResult">
<div
v-if="form.view == '查看'"
style="display: flex; justify-content: space-between;"
style="display: flex; justify-content: space-between"
>
<span class="left">
{{ dict.manageCheckResult[form.manageCheckResult] }}
......
<template>
<!-- 弹出框表单 -->
<el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<Field
label="设备名称"
prop="deviceName"
v-model="form.deviceName"
placeholder="请输入设备名称"
/>
<Field
label="设备类型"
prop="deviceType"
v-model="form.deviceType"
type="select"
:enumData="dict.deviceType"
placeholder="请选择设备类型"
/>
<Field
label="Mac地址"
prop="deviceMac"
v-model="form.deviceMac"
placeholder="请输入Mac地址"
/>
<Field
label="设备型号"
prop="modelNum"
v-model="form.modelNum"
placeholder="请输入设备型号"
/>
<Field
label="设备厂商"
prop="deviceFirmname"
v-model="form.deviceFirmname"
placeholder="请输入设备厂商"
/>
<Field
label="分辨率"
prop="resolution"
v-model="form.resolution"
type="select"
:enumData="dict.resolution"
placeholder="请选择分辨率"
/>
<Field
label="设备IP"
prop="ip"
v-model="form.ip"
placeholder="请输入设备IP"
/>
<Field
label="端口号"
prop="port"
v-model="form.port"
placeholder="请输入设备端口"
/>
<Field
label="账号"
prop="manageUser"
v-model="form.manageUser"
placeholder="请输入账号"
/>
<Field
label="密码"
prop="managePWD"
v-model="form.managePWD"
placeholder="请输入密码"
/>
<Field
label="负责人"
prop="leadingOfficial"
v-model="form.leadingOfficial"
placeholder="请输入负责人"
/>
<Field
label="电话"
prop="telephone"
v-model="form.telephone"
placeholder="请输入电话"
/>
<Field
label="所在楼栋"
prop="building"
v-model="form.building"
type="select"
:enumData="dict.building"
placeholder="请选择所在楼栋"
/>
<Field
label="所在楼层"
prop="floor"
v-model="form.floor"
type="select"
:enumData="dict.floor"
placeholder="请选择所在楼层"
/>
<Field
label="设置位置"
prop="address"
v-model="form.address"
placeholder="请输入设置位置(X坐标,Y坐标)"
/>
<!-- <Field
label="经度"
prop="longitude"
v-model="form.longitude"
placeholder="请输入经度"
/>
<Field
label="纬度"
prop="latitude"
v-model="form.latitude"
placeholder="请输入纬度"
/> -->
<Field
label="备注"
prop="remark"
v-model="form.remark"
type="textarea"
placeholder="请输入备注"
/>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button
type="primary"
v-if="pageInfo.type !== 'view'"
@click="submitForm"
>确 定</el-button
>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</template>
<script>
import form from "@/assets/mixins/formdialog";
import dialogShow from "./dialogshow";
export default {
mixins: [form],
components: {
dialogShow,
},
data() {
return {
// 遮罩层
loading: true,
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 表单校验
rules: {},
};
},
methods: {
/** 编辑 */
edit(row) {
this.reset();
this.query = { id: row.id };
this.urls.currUrl = "device/edit";
this.getData();
this.pageInfo.type = "edit";
this.title = "修改设备信息";
},
/** 新增 */
add(row) {
this.reset();
this.urls.currUrl = "device/add";
this.getData();
this.pageInfo.type = "add";
this.title = "新增设备";
},
/** 查看*/
view(row) {
this.reset();
this.query = { id: row.id };
this.urls.currUrl = "device/view";
this.getData();
this.pageInfo.type = "view";
this.title = "设备信息详细";
},
/**取消按钮 */
cancel() {
this.open = false;
},
/**获取数据后弹框 */
afterRender(data) {
this.open = true;
},
afterSubmit(data) {
this.open = false;
this.$emit("ok");
},
// 表单重置
reset() {
this.form = {
deviceName: null,
deviceMac: "",
modelNum: null,
deviceFirmname: "",
resolution: null,
deviceType: null,
ip: null,
port: null,
manageUser: null,
managePWD: "",
leadingOfficial: null,
approver: "",
telephone: "",
building: null,
floor: null,
remark: "",
latitude: "",
longitude: "",
address: "",
};
this.resetForm("form");
},
resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
},
},
};
</script>
<template>
<!-- 弹出框表单 -->
<el-drawer
:title="title"
:visible.sync="open"
:direction="direction"
size="50%"
>
<div
style="padding: 20px; font-size: 15px; position: relative; height: 100%"
>
<div class="mt20">
<div class="search_box" style="text-align: end">
<SearchForm
:search="config.search"
@getData="onSubmit"
ref="search"
/>
</div>
<el-table
ref="multipleTable"
:data="tableData ? tableData : []"
tooltip-effect="dark"
style="width: 100%"
>
<el-table-column
v-for="(val, i) in config.columns"
:key="i"
:type="val.type"
:width="val.width"
:label="val.label"
:prop="val.prop"
:formatter="val.formatter"
:align="val.align ? val.align : 'center'"
>
</el-table-column>
</el-table>
<el-pagination
@current-change="handleCurrentChange"
:current-page.sync="page.current_page"
layout="total, prev, pager, next"
:total="page.total"
style="margin-top: 10px; width: 100%; text-align: end"
>
</el-pagination>
<el-button
@click="cancleFn"
style="position: absolute; bottom: 10px; right: 10px"
>关闭</el-button
>
</div>
</div>
</el-drawer>
</template>
<script>
import SearchForm from "@/components/SearchFormDrawer.vue";
export default {
name: "DeviceDetail",
components: { SearchForm },
created() {},
data() {
return {
tableData: [],
// 遮罩层
loading: true,
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
direction: "rtl",
toString: ["processResult", "errorStatus"],
dict: {},
urls: {
currUrl: "",
saveUrl: "attendance/device/save",
},
config: {
downloadUrl: "",
isshowTabPane: false,
search: [
{
name: "salaId",
type: "selectSalaId",
label: "大厅",
fuzzy: false,
},
{
name: "deptId",
type: "selectDeptId",
label: "部门",
fuzzy: false,
},
// {
// name: "classId",
// type: "select",
// label: "班次",
// fuzzy: false,
// },
{
name: "staffName",
type: "text",
label: "员工姓名",
fuzzy: true,
},
],
columns: [
{ type: "selection", width: 60 },
{
label: "序号",
width: 50,
formatter: (row, column, cellValue, index) => {
return index + 1;
},
},
{ label: "姓名", prop: "name" },
{ label: "工号", prop: "workNum" },
{ label: "所属大厅", prop: "salaName" },
{ label: "所属部门", prop: "deptName" },
{ label: "职位", prop: "positionName" },
{ label: "班次", prop: "className" },
{
label: "考勤时间",
prop: "attendanceTime",
formatter: this.formatterDate,
},
{ label: "考勤设备", prop: "deviceName" },
// {
// label: "操作",
// width: 100,
// formatter: (row) => {
// if (row.check) {
// return <span style="cursor:pointer;color:#ff0000">已选中</span>;
// } else {
// return <span style="cursor:pointer;color:#1890ff">选择</span>;
// }
// },
// },
],
},
btnLoading: false,
page: {
current_page: 1,
total: 0,
},
};
},
methods: {
handleCurrentChange(val) {
this.page.current_page = val;
this.$refs.search.onSubmit();
},
// 渲染前置处理
beforeRender(data) {
return data;
},
/** 编辑 */
edit(row) {
this.urls.currUrl = "device/edit";
this.open = true;
this.title =
"考勤数据 - " + row.deviceName + `(MAC地址${row.deviceMac})`;
},
/**获取数据后弹框 */
afterRender(data) {
this.open = true;
},
onSubmit() {},
cancleFn() {
this.open = false;
},
},
};
</script>
<template>
<div class="page">
<LayoutTable :data="tableData" :config="tableConfig" notDel notAdd>
<el-button
slot="table-head-left2"
style="margin-left: 10px"
size="mini"
type="primary"
@click="handleAdd"
>新增</el-button
>
<!-- <el-button
slot="table-head-left2"
style="margin-left: 10px"
icon="el-icon-tickets"
size="mini"
type="primary"
@click="doExport"
:disabled="isExport"
>导出</el-button
> -->
</LayoutTable>
<drawer-show ref="drawerShow" @ok="getData" />
<dialog-show ref="dialogform" @ok="getData" />
<div class="mask" v-if="progress">
<el-progress :stroke-width="26" :percentage="percent"></el-progress>
</div>
</div>
</template>
<script>
/** 表单弹出框模式需引入 */
import drawerShow from "./drawershow";
import dialogShow from "./dialogshow";
import table from "@/assets/mixins/table";
import {
getFirstDay,
getLastDay,
getdiffdate,
timestampToTime,
getMyDay,
} from "@/assets/utils/dateFormat.js";
export default {
name: "deviceList",
components: {
drawerShow,
dialogShow,
},
mixins: [table],
data() {
return {
// 进度展示值
percent: 0,
// 导出按钮加载状态
isExport: false,
// 是否显示进度条
progress: false,
// 表格配置项
config: {
isshowTabPane: true,
search: [
{
name: "deviceName",
type: "text",
label: "设备名称",
fuzzy: true,
},
],
columns: [
{ type: "selection", width: 60, fixed: "left" },
{ type: "index", label: "序号", width: 50, fixed: "left" },
{ label: "设备名称", prop: "deviceName", fixed: "left" },
{ label: "Mac地址", prop: "deviceMac" },
{
label: "设备地址",
prop: "address",
formatter: this.formatter,
show: true,
},
{
label: "分辨率",
prop: "resolution",
formatter: this.formatter,
show: true,
},
{ label: "负责人", prop: "leadingOfficial" },
{
label: "联系电话",
prop: "telephone",
formatter: this.formatter,
},
{
label: "设备状态",
prop: "status",
width: 160,
formatter: this.formatter,
},
{
label: "启用/停用",
prop: "enabled",
width: 100,
formatter: (row) => {
return (
<el-switch
v-model={row.enabled}
disabled={row.status == 0 ? true : false}
active-value={1}
inactive-value={0}
onChange={(val) => {
this.$post("/device/save?", {
id: row.id,
enabled: val ? "1" : "0",
}).then((res) => {
if (res.code == 1) {
this.$message.success(val ? "已启用" : "已停用");
this.getData();
}
});
}}
></el-switch>
);
},
},
{
label: "操作",
formatter: (row) => {
return (
<div>
{row.status == 0 ? (
<el-button
type="text"
size="mini"
onClick={() => {
this.$post("/device/save?", {
id: row.id,
status: "1",
}).then((res) => {
if (res.code == 1) {
this.$message.success("激活成功");
this.getData();
}
});
}}
>
激活123
</el-button>
) : (
""
)}
<el-button
type="text"
size="mini"
onClick={() => {
this.handle(row);
}}
>
数据
</el-button>
<el-button
type="text"
size="mini"
onClick={() => {
this.toEdit(row);
}}
>
编辑
</el-button>
<el-button
type="text"
size="mini"
style="color:#F56C6C"
onClick={() => {
this.handleDelete(row);
}}
>
删除
</el-button>
</div>
);
},
},
],
},
dialogVisible: false,
currentParams: {},
};
},
created() {},
methods: {
// 删除操作
handleDelete(row) {
this.$get("/device/delete?", { id: row.id }).then((res) => {
if (res.code == 1) {
this.$message.success("删除成功");
this.getData();
}
});
},
// 倒计时
countDown() {
if (this.percent == 95) {
let params = {};
for (let value of this.config.search) {
if (this.query[value.name]) {
params[value.name] = this.query[value.name];
}
}
if (this.selection.length > 0) {
params["idList"] = this.selection;
}
let that = this;
this.$download(
"/device/exportExcel",
{
...params,
},
{ type: "excel", name: "考勤机" }
)
.then(() => {
this.percent = 100;
this.progress = false;
that.isExport = false;
})
.catch((error) => {
this.isExport = false;
this.progress = false;
this.$message.error(error.message);
});
return;
} else {
this.percent = this.percent + 1;
let that = this;
setTimeout(function () {
that.countDown();
}, 100);
}
},
/** 导出Excel */
doExport() {
if (this.isExport == true) {
this.$message.info("数据正在导出中,请勿重复点击!");
return false;
}
this.isExport = true;
this.progress = true;
this.percent = 0;
this.countDown();
},
/** 重写新增方法 */
handleAdd(row) {
this.$refs.dialogform.add(row);
},
/** 重写编辑方法 */
toEdit(row) {
this.$refs.dialogform.edit(row);
},
/** 重写查看方法 */
toView(row) {
this.$refs.drawerShow.view(row);
},
// 处理
handle(err) {
this.$refs.drawerShow.edit(err);
},
},
};
</script>
<style lang="less" scoped>
.mask {
width: 100%;
height: 100vh;
position: fixed;
top: 0;
left: 0;
z-index: 99;
padding: 0 30%;
padding-top: 20%;
background: rgba(0, 0, 0, 0.6);
}
::v-deep .el-progress__text {
color: #409eff;
font-weight: 600;
}
</style>
......@@ -8,7 +8,8 @@ module.exports = {
hot: true, //自动保存
proxy: {
"/attendance": {
target: 'http://192.168.0.98:11039',
target: 'http://192.168.0.98:17500',
// target: 'http://192.168.0.98:11039',
// target: "http://112.19.80.237:11039",
// target: 'http://localhost:17500',
// target: "http://118.122.189.109:11039",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment