Commit a760226d authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents 93941c96 fbafa87d
#开发环境
NODE_ENV = "development"
VUE_APP_API_BASE_URL=http://192.168.0.98:11039
\ No newline at end of file
......@@ -6,3 +6,4 @@ VUE_APP_API_BASE_URL=/basics_api
VUE_APP_PORTAL_URL = /portal_home
VUE_APP_PORTAL_PORT = 11039
VUE_APP_API_BASE_URL = http://192.168.0.98:11039
......@@ -36,6 +36,7 @@ export default {
res.entity = this.util_toDateStr(res.entity, this.toDate);
this.form = Object.assign({}, this.form, res.entity);
this.dict = Object.assign({}, this.dict, res.dict);
// 部门格式化处理
this.afterRender(res);
})
.catch(error => {
......
......@@ -7,7 +7,7 @@ const tagsMap = {
1: 'danger',
0: 'success'
};
const baseUrl= process.env.VUE_APP_API_BASE_URL+'/'
export default {
mounted() {
this.getData();
......@@ -58,7 +58,7 @@ export default {
this.tableData = this.beforeRender(
Object.assign({}, this.tableData, data)
)
console.log(this.tableData,'')
console.log(this.tableData,'fffff')
this.afterRender(this.tableData);
})
.catch(error => {
......@@ -280,6 +280,65 @@ export default {
return val
}
},
// 格式化处理异常状态
formattereErrorStatus(row,column,val){
const content = formatter(this.tableData, column, val)
if (content) {
return <el-tag size="mini" type="danger">{this.util_formatter('errorStatus', val)}</el-tag>
} else {
return val
}
},
// 格式化处理状态
formattereDealStatus(row,column,val){
const content = formatter(this.tableData, column, val)
if (content) {
return <el-tag size="mini">{this.util_formatter('processStatus', val)}</el-tag>
} else {
return val
}
},
// 考勤组人数
formatterGroupPerson(row,column,val){
const content = formatter(this.tableData, column, val)
if (content) {
return Number(row.personNum) + Number(row.personNumNo)
} else {
return val
}
},
// 考勤类型
formatterattendType(row,column,val){
const content = formatter(this.tableData, column, val)
if (content) {
return <el-tag size="mini">{this.util_formatter('type', val)}</el-tag>
} else {
return val
}
},
// 请假类型
formatterLeaveType(row,column,val){
const content = formatter(this.tableData, column, val)
if (content) {
return <el-tag size="mini">{this.util_formatter('leaveType', val)}</el-tag>
} else {
return val
}
},
// 格式化图片展示
formatterPic(row, column, val){
const content = formatter(this.tableData, column, val)
if (content) {
return <el-image
src={val.indexOf('http') == -1?baseUrl+val:val}
preview-src-list={val.indexOf('http') == -1?baseUrl+val:val}
style="width: 100px"></el-image>
} else {
return val
}
},
// 多选表格行
handleSelectionChange(val) {
this.selection = val.map(i => i.id);
......
......@@ -32,11 +32,13 @@ instance.interceptors.request.use(config => {
// 测试用
//http://192.168.0.98:11039/
const hostname = '192.168.0.98'
const port = '11039'
// 温
// http://192.168.0.116/17500
const hostname = '192.168.0.116'
const port = '17500'
// 动态修改请求地址
console.log(hostname,baseURL,port)
if (config.url.startsWith('/')) {
// 字符串以 / 开头
config.url = `http://${hostname}:${port}${baseURL}${config.url}`;
......
......@@ -174,4 +174,39 @@ export const getTreeIds = (tree, nodeId, config) => {
}
/**
* 根据树子节点ID查找所有父节点ID
* @param {array} dataSource 树形结构数据源
* @param {number} nodeId 子节点ID
* @returns {array} 包含所有父节点ID的数组,按照从根节点到直接父节点的顺序排序
*/
export const findParentIds = (dataSource, nodeId) => {
const parentIds = []; // 用于存储所有父节点ID的数组
// 定义一个递归函数,用于遍历整棵树并查找子节点的所有父节点
function traverse(node, nodeId) {
if (node.id === nodeId) { // 如果当前节点的ID等于子节点的ID,则表示已经找到了子节点,可以开始向上查找父节点
return true; // 返回true表示已经找到了子节点
}
if (node.children) { // 如果当前节点有子节点,则继续遍历子节点
for (const childNode of node.children) {
if (traverse(childNode, nodeId)) { // 如果在子节点中找到了子节点的父节点,则将当前节点的ID添加到父节点ID数组中,并返回true表示已经找到了子节点
parentIds.push(node.id);
return true;
}
}
}
return false; // 如果当前节点不是子节点的父节点,则返回false
}
// 从根节点开始遍历整棵树,并调用递归函数查找子节点的所有父节点
for (const node of dataSource) {
if (traverse(node, nodeId)) { // 如果在当前节点的子树中找到了子节点的父节点,则直接退出循环
break;
}else{
if(node.children && node.children.length>0){
traverse(node.children, nodeId)
}
}
}
return parentIds; // 返回所有父节点ID的数组
}
......@@ -11,6 +11,7 @@
<el-input :disabled='disabled' :placeholder='placeholder' v-model="field" @change="emit" :rows='rows' @input="emit" v-if='type === "textarea"' type='textarea' :autosize="textareaSize" :class="inputClass"></el-input>
<!-- 一级 -->
<el-select :disabled='disabled' v-model="field" @change="emit" :multiple='multiple' :filterable='filterable' :clearable='clearable' v-if='type === "select"'>
<el-option
v-for="($label, $value) in enumData"
......@@ -20,6 +21,16 @@
></el-option>
</el-select>
<!-- 多级 -->
<el-cascader :disabled='disabled' v-model="field" @change="emit" :options="enumData" :clearable='clearable'
:props="{label:'label',value:'id',multiple:multiple}"
v-if='type === "cascader"'>
</el-cascader>
<!-- 联级选择 -->
<el-cascader-panel :disabled='disabled' v-model="field" @change="emit" :options="enumData" :clearable='clearable'
:props="{label:'label',value:'id',multiple:multiple}" v-if='type === "cascaderpanel"'></el-cascader-panel>
<el-radio-group :disabled='disabled' v-model="field" @change="emit" v-if='type === "radio"'>
<el-radio
v-for='($label, $value) in enumData'
......@@ -81,6 +92,10 @@ export default {
type: String,
default: '',
},
multiple:{
type: Boolean,
default: false,
},
// 字段所需的枚举类型
enumData: {
type: Object,
......@@ -125,6 +140,7 @@ export default {
this.$emit('input', this.newVal)
this.$emit('change', this.newVal)
this.$emit('focus')
this.$emit('cascaderChange',this.newVal)
}
},
computed: {
......
......@@ -18,7 +18,8 @@
</div>
</el-image>
<div v-else class="image">
<el-image :src="value" :style="`width:150px;height:150px;`" fit="fill"/>
<el-image :src="value.indexOf('http') == -1?baseUrl+value:value"
:style="`width:150px;height:150px;`" fit="fill"/>
<div class="mask">
<div class="actions">
<span title="预览" @click.stop="dialogVisible = true">
......@@ -32,7 +33,7 @@
</div>
</el-upload>
<el-dialog :visible.sync="dialogVisible" title="预览" width="800" append-to-body>
<img :src="value" style="display: block; max-width: 100%; margin: 0 auto;">
<img :src="value.indexOf('http') == -1?baseUrl+value:value" style="display: block; max-width: 100%; margin: 0 auto;">
</el-dialog>
</div>
</template>
......@@ -41,8 +42,9 @@
export default {
data() {
return {
baseUrl:process.env.VUE_APP_API_BASE_URL+'/',
dialogVisible: false,
uploadImgUrl: "/m/file/commonupload", // 上传的图片服务器地址
uploadImgUrl: process.env.VUE_APP_API_BASE_URL+"/attendance/file/commonupload", // 上传的图片服务器地址
};
},
props: {
......@@ -55,6 +57,9 @@ export default {
type: String,
default: '',
}
},
mounted(){
},
methods: {
removeImage() {
......
......@@ -37,6 +37,8 @@ const router = new Router({
...restBuilder('user', 'system/user'), // 用户管理 -- 管理用户
...restBuilder('param', 'system/param'), // 系统管理--参数管理
// ...restBuilder('task', 'system/task'), // 系统管理--任务管理
// 绩效负责人
...restBuilder('workman','workman'),
//部门
...restBuilder('dept', 'dept'),//部门
......@@ -63,9 +65,7 @@ const router = new Router({
...restBuilder('attendance/class', 'attendance/class'),// 考勤班次信息
...restBuilder('attendance/leave/record', 'attendance/leave/record'),// 请假记录信息
...restBuilder('attendance/vacation/balance', 'attendance/vacation/balance'),// 员工假期余额信息
// 绩效负责人
...restBuilder('attendance/group/responsible','attendance/group/responsible'),
//以下为基础路由配置
builder('blank', 'blank'),
......
......@@ -77,22 +77,22 @@
{type: "index",label: "序号",width: 50},
{label: "班次名称", prop: "className"},
{label: "考勤时间", prop: "className"},
// {label: "考勤班次详细信息",
// width: 120,
// prop: "subColumns",
// formatter: (row) => {
// let widthsize = this.columnSet.reduce((pre, cur) => {
// return pre + Number(cur.width);
// }, 50);
// return (
// <el-popover placement="right" width={widthsize} trigger="click">
// {this.renderTable(row.attendanceClassDetailList)}
// <el-button type="text" slot="reference">详细</el-button>
// </el-popover>
// );
// },
// },
// {label: "考勤时间", prop: "className"},
{label: "考勤班次详细信息",
width: 120,
prop: "subColumns",
formatter: (row) => {
let widthsize = this.columnSet.reduce((pre, cur) => {
return pre + Number(cur.width);
}, 50);
return (
<el-popover placement="right" width={widthsize} trigger="click">
{this.renderTable(row.attendanceClassDetailList)}
<el-button type="text" slot="reference">详细</el-button>
</el-popover>
);
},
},
{
label: "操作",
width: 240,
......
......@@ -83,13 +83,13 @@
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
{label: "考勤组名称", prop: "personNum",formatter: this.formatter},
{label: "考勤组名称", prop: "groupName"},
{label: "人数", prop: "personNum",formatter: this.formatter},
{label: "人数", prop: "personNum",formatter: this.formatterGroupPerson},
{label: "负责人", prop: "personNum",formatter: this.formatter},
{label: "负责人", prop: "personNum"},//未
{label: "类型", prop: "type",formatter: this.formatter},
{label: "类型", prop: "type",formatter: this.formatterattendType},
// {label: "创建用户", prop: "createUserId", formatter: this.formatter},
......@@ -97,7 +97,7 @@
// {label: "考勤方式", prop: "attendanceType"},
{label: "考勤时间", prop: "attendanceType"},
{label: "考勤时间", prop: "attendanceType"},//未
// {label: "考勤组人员信息",
// width: 120,
......
......@@ -4,15 +4,27 @@
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<Field label="姓名" prop="responsibleName" v-model="form.responsibleName" placeholder="请输入负责人名称"/>
<Field label="电话号码" prop="responsibleName" v-model="form.responsibleName" placeholder="请输入电话号码"/>
<Field label="考勤组" prop="groupId" v-model="form.groupId" placeholder="请输入考勤组"/>
<Field label="考勤组名称" prop="groupName" v-model="form.groupName" placeholder="请输入考勤组名称"/>
<Field label="负责人ID" prop="responsibleId" v-model="form.responsibleId" placeholder="请输入负责人ID"/>
<Field label="负责人类型" prop="responsibleType" v-model="form.responsibleType" type="select" :enumData="dict.responsibleType" placeholder="请选择负责人类型"/>
<Field label="备注" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注"/>
<Field label="电话号码" prop="phoneNumber" v-model="form.phoneNumber" placeholder="请输入电话号码"/>
<Field label="工号" prop="workNum" v-model="form.workNum" placeholder="请输入工号"/>
<Field label="所属部门" prop="deptId" v-model="form.deptId" type="select"/>
<!-- <Field label="考勤组" prop="groupId" v-model="form.groupId" placeholder="请输入考勤组"/> -->
<!-- <Field label="考勤组名称" prop="groupName" v-model="form.groupName" placeholder="请输入考勤组名称"/> -->
<!-- <Field label="负责人ID" prop="responsibleId" v-model="form.responsibleId" placeholder="请输入负责人ID"/> -->
<!-- <Field label="负责人类型" prop="responsibleType" v-model="form.responsibleType" type="select" :enumData="dict.responsibleType" placeholder="请选择负责人类型"/> -->
<!-- <Field label="备注" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注"/> -->
</el-row>
<el-form-item label="上传图片" prop="photoPath">
<el-upload
class="avatar-uploader"
action="https://jsonplaceholder.typicode.com/posts/"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload">
<img v-if="form.photoPath" :src="form.photoPath" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">确 定</el-button>
......@@ -27,7 +39,7 @@
export default {
mixins: [form],
components: {
dialogShow ,
dialogShow
},
data() {
return {
......@@ -40,14 +52,15 @@
toString:[
"responsibleType",
],
imageUrl:'',
// 表单校验
rules: {
responsibleName: [
{required: true,message: "请输入负责人名称", trigger: "blur" },
{max: 64,message: "最多只能录入64个字符",trigger: "blur",},
],
createTime: [
{required: true,message: "选择创建时间" },
phoneNumber: [
{required: true,message: "输入电话号码", trigger: "blur"},
],
}
};
......@@ -111,6 +124,41 @@
this.$refs[refName].resetFields();
}
},
uploadFn(val){
console.log(val)
},
handleAvatarSuccess(file){
},
beforeAvatarUpload(file){
}
},
};
}
</script>
<style scoped lang='less'>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 150px;
height: 150px;
line-height: 150px;
text-align: center;
border: 1px dashed #d9d9d9;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>
......@@ -46,23 +46,37 @@
label: "负责人名称",
fuzzy: true
},
{
name: "deptId",
type: "select",
label: "请选择部门",
fuzzy: true
},
],
columns: [
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
{label: "照片", prop: "photoPath"},
{label: "负责人名称", prop: "responsibleName"},
{label: "负责人类型", prop: "responsibleType",formatter: this.formatter},
{label: "工号", prop: "workNum"},
{label: "所属部门", prop: "deptName"},
{label: "电话号码", prop: "phoneNumber"},
// {label: "负责人类型", prop: "responsibleType",formatter: this.formatter},
{label: "创建用户", prop: "createUserId", formatter: this.formatter},
// {label: "创建用户", prop: "createUserId", formatter: this.formatter},
{
label: "操作",
width: 240,
formatter: row => {
return (
<table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
);
<table-buttons noAdd noView row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
)
}
}
]
......
......@@ -13,8 +13,8 @@
<Field label="结束时间" prop="endTime" v-model="form.endTime" type="date" />
<Field label="时长,单位秒" prop="duration" v-model="form.duration" placeholder="请输入时长,单位秒"/>
<Field label="请假事由" prop="reason" v-model="form.reason" type="textarea" placeholder="请输入请假事由"/>
<Field label="审批负责人Id" prop="approverId" v-model="form.approverId" placeholder="请输入审批负责人Id"/>
<Field label="审批负责人" prop="approver" v-model="form.approver" placeholder="请输入审批负责人"/>
<!-- <Field label="审批负责人Id" prop="approverId" v-model="form.approverId" placeholder="请输入审批负责人Id"/> -->
<Field label="审批负责人" prop="approver" v-model="form.approver" type="select" placeholder="请选择审批负责人"/>
<Field label="附件" prop="attachment" v-model="form.attachment" type="textarea" placeholder="请输入附件"/>
<Field label="附件路径" prop="attachmentPath" v-model="form.attachmentPath" type="textarea" placeholder="请输入附件路径"/>
<Field label="备注" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注"/>
......
......@@ -4,31 +4,31 @@
:title="title"
:visible.sync="open"
:direction="direction"
size="50%">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<Field label="请假人" prop="leavePersonId" v-model="form.leavePersonId" placeholder="请输入请假人id"/>
<!-- <Field label="请假人" prop="leavePerson" v-model="form.leavePerson" placeholder="请输入请假人"/> -->
<Field label="所属部门" prop="deptId" v-model="form.deptId" placeholder="请输入所属部门id"/>
<!-- <Field label="所属部门" prop="deptName" v-model="form.deptName" type="textarea" placeholder="请输入所属部门"/> -->
<Field label="电话号码" prop="phoneNumber" v-model="form.phoneNumber" placeholder="请输入电话号码"/>
<Field label="请假类型" prop="leaveType" v-model="form.leaveType" type="select" :enumData="dict.leaveType" placeholder="请选择请假类型"/>
<Field label="开始时间" prop="startTime" v-model="form.startTime" type="date" />
<Field label="结束时间" prop="endTime" v-model="form.endTime" type="date" />
<Field label="时长" prop="duration" v-model="form.duration" placeholder="请输入时长,单位秒"/>
<Field label="请假事由" prop="reason" v-model="form.reason" type="textarea" placeholder="请输入请假事由"/>
<Field label="审批负责人" prop="approverId" v-model="form.approverId" placeholder="请输入审批负责人Id"/>
<!-- <Field label="审批负责人" prop="approver" v-model="form.approver" placeholder="请输入审批负责人"/> -->
<!-- <Field label="附件" prop="attachment" v-model="form.attachment" type="textarea" placeholder="请输入附件"/> -->
<Field label="备注" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注"/>
</el-row>
<el-form-item label="附件路径" prop="attachmentPath">
<FileUpload @input="uploadFn" />
</el-form-item>
<form-buttons @submit='submitForm' noCancelBtn />
</el-form>
size="60%">
<div style="padding:15px">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<!-- <Field label="请假人" prop="leavePersonId" v-model="form.leavePersonId" placeholder="请输入请假人"/> -->
<Field label="请假人" prop="leavePerson" v-model="form.leavePerson" placeholder="请输入请假人"/>
<Field label="所属部门" prop="deptId" v-model="form.deptId" type="select" placeholder="请选择所属部门"/>
<!-- <Field label="所属部门" prop="deptName" v-model="form.deptName" type="textarea" placeholder="请输入所属部门"/> -->
<Field label="电话号码" prop="phoneNumber" v-model="form.phoneNumber" placeholder="请输入电话号码"/>
<Field label="请假类型" prop="leaveType" v-model="form.leaveType" type="select" :enumData="dict.leaveType" placeholder="请选择请假类型"/>
<Field label="开始时间" prop="startTime" v-model="form.startTime" type="date" />
<Field label="结束时间" prop="endTime" v-model="form.endTime" type="date" />
<Field label="时长" prop="duration" v-model="form.duration" placeholder="请输入时长"/>
<Field label="请假事由" prop="reason" v-model="form.reason" type="textarea" placeholder="请输入请假事由"/>
<Field label="审批负责人" prop="approverId" type="select" v-model="form.approverId" placeholder="请选择审批负责人"/>
<!-- <Field label="审批负责人" prop="approver" v-model="form.approver" placeholder="请输入审批负责人"/> -->
<!-- <Field label="附件" prop="attachment" v-model="form.attachment" type="textarea" placeholder="请输入附件"/> -->
<Field label="备注" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注"/>
</el-row>
<el-form-item label="附件路径" prop="attachmentPath">
<FileUpload @input="uploadFn" />
</el-form-item>
<form-buttons @submit='submitForm' noCancelBtn />
</el-form>
</div>
</el-drawer>
</template>
......
......@@ -91,25 +91,25 @@
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
{label: "请假人id", prop: "leavePersonId", formatter: this.formatter},
// {label: "请假人id", prop: "leavePersonId", formatter: this.formatter},
{label: "请假人", prop: "leavePerson"},
{label: "所属部门id", prop: "deptId", formatter: this.formatter},
// {label: "所属部门id", prop: "deptId", formatter: this.formatter},
{label: "所属部门", prop: "deptName"},
{label: "电话号码", prop: "phoneNumber"},
{label: "请假类型", prop: "leaveType",formatter: this.formatter},
{label: "请假类型", prop: "leaveType",formatter: this.formatterLeaveType},
{label: "开始时间", prop: "startTime", formatter: this.formatterDate},
{label: "结束时间", prop: "endTime", formatter: this.formatterDate},
{label: "时长,单位秒", prop: "duration",formatter: this.formatter},
{label: "时长", prop: "duration",formatter: this.formatter},
{label: "审批负责人Id", prop: "approverId", formatter: this.formatter},
// {label: "审批负责人Id", prop: "approverId", formatter: this.formatter},
{label: "审批负责人", prop: "approver"},
......
......@@ -117,19 +117,19 @@
{type: "index",label: "序号",width: 50},
{label: "员工姓名", prop: "staffName"},
{label: "工号", prop: "staffName"},
{label: "工号", prop: "workNum"},
{label: "部门", prop: "staffName"},
{label: "考勤组", prop: "staffName"},
{label: "班次", prop: "staffName"},
{label: "异常状态", prop: "errorStatus",formatter: this.formatter},
{label: "考勤组", prop: "deptName"},
{label: "班次", prop: "shiftsName"},
{label: "异常状态", prop: "errorStatus",formatter: this.formattereErrorStatus},
{label: "异常时间", prop: "errorDateTime", formatter: this.formatterDate},
{label: "处理结果", prop: "errorDateTime", formatter: this.formatterDate},
{label: "处理结果", prop: "processResult", formatter: this.formatterDate},
{label: "上下班时间", prop: "goOffDateTime", formatter: this.formatterDate},
{label: "实际打卡时间", prop: "actualAttendanceDateTime", formatter: this.formatterDate},
{label: "处理时间", prop: "operDateTime", formatter: this.formatterDate},
{label: "处理状态", prop: "processStatus",formatter: this.formatter},
{label: "处理人", prop: "processStatus",formatter: this.formatter},
{label: "备注", prop: "createUserId", formatter: this.formatter},
{label: "处理状态", prop: "processStatus",formatter: this.formattereDealStatus},
{label: "处理人", prop: "opertor"},
{label: "备注", prop: "remark"},
{
label: "操作",
width: 240,
......
......@@ -226,14 +226,14 @@
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
{label: "员工姓名", prop: "staffName"},
{label: "工号", prop: "staffName"},
{label: "部门", prop: "staffName"},
{label: "考勤组", prop: "staffName"},
{label: "职位", prop: "staffName"},
{label: "班次", prop: "staffName"},
{label: "工号", prop: "workNum"},
{label: "部门", prop: "deptName"},
{label: "考勤组", prop: "attendanceGroupName"},
{label: "职位", prop: "positionName"},
{label: "班次", prop: "shiftsName"},
{label: "考勤时间", prop: "attendanceDate",formatter: this.formatterDate},
{label: "考勤点名称", prop: "staffName"},
{label: "事件源", prop: "staffName"},
{label: "考勤点名称", prop: "attendanceAddress"},
{label: "事件源", prop: "eventSource"},
{
label: "操作",
width: 240,
......
......@@ -309,10 +309,10 @@
{type: "index",label: "序号",width: 50},
{label: "打卡日期", prop: "attendanceDate", formatter: this.formatterDate},
{label: "员工姓名", prop: "staffName"},
{label: "考勤组", prop: "staffName"},
{label: "部门", prop: "staffName"},
{label: "职位", prop: "staffName"},
{label: "班次", prop: "staffName"},
{label: "考勤组", prop: "attendanceGroupName"},
{label: "部门", prop: "deptName"},
{label: "职位", prop: "positionName"},
{label: "班次", prop: "shiftsName"},
{label: "考勤打卡记录详细信息",
width: 120,
prop: "subColumns",
......
......@@ -158,7 +158,7 @@
{label: "窗口类别", prop: "windowCategory"},
{label:"部门",prop:"bumentId"},
{label:"部门",prop:"deptName"},
{label: "员工姓名", prop: "staffName"},
......@@ -232,7 +232,11 @@
setcolum:[],
isdialog:false,
checkList:[],
drawerhistory:false
drawerhistory:false,
// 动态新增列表
addColumn:[
]
};
}
};
......
......@@ -7,28 +7,9 @@
size="50%">
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<!-- <Field label="父id" prop="parentId" v-model="form.parentId" placeholder="请输入父id"/> -->
<!-- <Field label="祖级列表" prop="ancestors" v-model="form.ancestors" type="textarea" placeholder="请输入祖级列表"/> -->
<!-- <Field label="部门名称" prop="deptName" v-model="form.deptName" type="textarea" placeholder="请输入部门名称"/> -->
<!-- <Field label="上级部门" prop="deptStatus" v-model="form.deptStatus" type="select" :enumData="dict.deptStatus" placeholder="请选择上级部门"/> -->
<!-- <Field label="负责人" prop="deptStatus" v-model="form.deptStatus" type="select" :enumData="dict.deptStatus" placeholder="请选择员工"/> -->
<!-- <Field label="部门状态" prop="deptStatus" v-model="form.deptStatus" type="select" :enumData="dict.deptStatus" placeholder="请选择部门状态"/> -->
<!-- <Field label="顺序" prop="orderNum" v-model="form.orderNum" placeholder="请输入顺序"/> -->
<!-- <Field label="备注" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注"/> -->
<el-form-item label="部门名称" prop="deptName">
<el-input placeholder="请输入部门名称" clearable v-model="form.deptName"></el-input>
</el-form-item>
<el-form-item label="上级部门">
<el-select placeholder="请选择上级部门" clearable v-model="form">
<el-option></el-option>
</el-select>
</el-form-item>
<el-form-item label="负责人">
<el-select placeholder="请选择员工" clearable>
<el-option></el-option>
</el-select>
</el-form-item>
<Field label="部门名称" prop="deptName" v-model="form.deptName" type="textarea" placeholder="请输入部门名称"/>
<Field label="上级部门" prop="parentId" v-model="form.parentId" type="select" :enumData="dict.deptName" placeholder="请选择上级部门"/>
<Field label="负责人" prop="workId" v-model="form.workId" type="select" :enumData="dict.workName" placeholder="请选择员工"/>
</el-row>
<form-buttons @submit='submitForm' noCancelBtn />
......@@ -64,23 +45,13 @@
],
// 表单校验
rules: {
ancestors: [
{required: true,message: "请输入祖级列表", trigger: "blur" },
{max: 256,message: "最多只能录入256个字符",trigger: "blur",},
],
deptName: [
{required: true,message: "请输入部门名称", trigger: "blur" },
{max: 256,message: "最多只能录入256个字符",trigger: "blur",},
],
deptStatus: [
{required: true,message: "请输入部门状态", trigger: "blur" },
],
orderNum: [
{required: true,message: "请输入顺序", trigger: "blur" },
],
createTime: [
{required: true,message: "请选择创建时间" },
],
parentId: [
{required: true,message: "请输入部门", trigger: "change" },
]
}
};
},
......
<template>
<div class="page">
<LayoutTable :data="tableData" :config="tableConfig" notSearch></LayoutTable>
<div className="page">
<el-card style="height:80vh">
<LayoutTable notPagination :data="tableData" ref="layoutTable" :config="tableConfig" notSearch></LayoutTable>
</el-card>
<drawer-show ref="drawerform" @ok="getData" />
</div>
</template>
<script>
/** 表单弹出框模式需引入 */
import {handleTree} from "@/assets/utils/table";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import drawerShow from "./drawershow";
import table from "@/assets/mixins/table";
export default {
name: "DeptList",
components: {
drawerShow
},
drawerShow,
Treeselect
},
mixins: [table],
created() {
this.query={"page":1,"size":-1}
},
methods: {
/** 重写新增方法 */
toAdd(row) {
this.$refs.drawerform.add(row);
this.$refs.drawerform.add(row,this.menuOptions);
},
/** 重写编辑方法 */
toEdit(row) {
this.$refs.drawerform.edit(row);
this.$refs.drawerform.edit(row,this.menuOptions);
},
/** 重写查看方法 */
toView(row) {
this.$refs.drawerform.view(row);
this.$refs.drawerform.view(row, this.menuOptions);
},
afterRender(data) {
data.data = handleTree(data.data, "id", "parentId");
console.log("tree data:",data.data)
this.menuOptions = data.data;
this.$refs.layoutTable.showType = "treetable"
},
},
data() {
return {
config: {
// search: [
// {
// name: "orderNum",
// type: "text",
// label: "顺序",
// fuzzy: true
// },
// {
// name: "createUserId",
// type: "text",
// label: "创建用户",
// fuzzy: true
// },
// ],
showType:'treetable',
isshowTabPane:true,
/** 树表是否默认展开 */
expand: false,
columns: [
{type: "selection", width: 60},
{type: "index",label: "序号",width: 50},
......
......@@ -7,7 +7,8 @@
size="50%">
<el-form ref="form" :model="form" :rules="rules" label-width="120px" style="padding:20px">
<el-row>
<Field label="分组" prop="groupId" v-model="form.groupId" type="select" placeholder="请选择分组"/>
<Field v-if="title == '新增职位信息'" label="分组" prop="groupId" v-model="form.groupId" type="select" placeholder="请选择分组"/>
<Field label="分组名称" prop="groupName" v-model="form.groupName" placeholder="请输入分组名称"/>
<Field label="职位编码" prop="jobCode" v-model="form.jobCode" placeholder="请输入职位编码"/>
<Field label="职位名称" prop="jobName" v-model="form.jobName" placeholder="请输入职位名称"/>
......
......@@ -20,6 +20,7 @@
<el-row :gutter="20">
<el-col :span="6" :xs="12" class="mytree">
<div class="titles">选择部门</div>
<!-- default-expand-all -->
<el-scrollbar style="height: 100%">
<el-tree
size="mini"
......@@ -30,7 +31,6 @@
:props="treeProps"
:load="loadNode"
highlight-current
default-expand-all
:expand-on-click-node="false"
:render-content="renderContent"
@node-click="handleNodeClick"
......
......@@ -15,10 +15,12 @@
<div class="content ml20">
<div class="c1">
<span>{{info.workName}}</span>
<span class="tags">{{info.workStatus}}</span>
<!-- 格式 -->
<span class="tags">{{dict.status[allinfo.status]}}</span>
</div>
<div class="c2">
<span>{{allinfo.deptName}} - {{allinfo.positionName}}</span>
<!-- - {{allinfo.positionName}} -->
<span>{{allinfo.deptName}}</span>
<span style="margin:0 10px">|</span>
<span>{{info.workLimit}}</span>
</div>
......@@ -111,9 +113,10 @@
this.$get('/staff/info',{id}).then(res => {
if(res.code == 1){
this.info = res.data.holidayLists[0]
this.dict = res.dict
this.allinfo = res.data//总
this.info.workBeginDay = timestampToTime(Number(this.info.workBeginDay))
this.info.workFormalDay = timestampToTime(Number(this.info.workFormalDay))
this.info.workBeginDay = this.info.workBeginDay?timestampToTime(Number(this.info.workBeginDay)):'-'
this.info.workFormalDay = this.info.workFormalDay?timestampToTime(Number(this.info.workFormalDay)):'-'
}
})
.catch(err => {
......@@ -124,7 +127,8 @@
data() {
return {
info:{},
allinfo:{}
allinfo:{},
dict:[]
}
},
created(){
......
......@@ -23,7 +23,6 @@ export default {
},
methods: {
afterRender(data) {
console.log(data)
data.data = handleTree(data.data, "id", "parentId");
console.log("tree data:",data.data)
this.menuOptions = data.data;
......@@ -82,7 +81,7 @@ export default {
})
.catch((error) => {
this.$message.error(error.message);
});
})
},
/** 重写查看方法 */
toView(row) {
......
......@@ -3,15 +3,21 @@
<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="部门id号" prop="deptId" v-model="form.deptId" placeholder="请输入部门id号"/>
<Field label="部门名称" prop="deptName" v-model="form.deptName" placeholder="请输入部门名称"/>
<Field label="姓名" prop="name" v-model="form.name" placeholder="请输入姓名"/>
<Field label="工号" prop="number" v-model="form.number" placeholder="请输入工号"/>
<Field label="电话号码" prop="phone" v-model="form.phone" placeholder="请输入电话号码"/>
<Field label="照片" prop="photoPath" v-model="form.photoPath" type="textarea" placeholder="请输入照片"/>
<Field label="姓名" prop="name" v-model="form.name" placeholder="请输入姓名"/>
<Field label="电话号码" prop="phone" v-model="form.phone" placeholder="请输入电话号码"/>
<Field label="工号" prop="number" v-model="form.number" placeholder="请输入工号"/>
</el-row>
<el-form-item label="所属部门" prop="deptId">
<el-cascader v-model="deptList" style="width:50%" @change="cascaderChange" :options="dict.deptId" clearable
:props="{label:'label',value:'id'}">
</el-cascader>
</el-form-item>
<el-form-item label="照片" prop="photoPath">
<ImageUpload :value="form.photoPath"
@input="replaceImage"></ImageUpload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">确 定</el-button>
......@@ -23,6 +29,7 @@
<script>
import form from "@/assets/mixins/formdialog";
import dialogShow from "./dialogshow";
import {findParentIds} from "@/assets/utils/common.js"
export default {
mixins: [form],
components: {
......@@ -40,11 +47,33 @@
],
// 表单校验
rules: {
}
};
name: [
{required: true,message: "请输入姓名", trigger: "blur" },
{max: 20,message: "最多只能录入20个字符",trigger: "blur",},
],
phone: [
{required: true,message: "请输入电话号码", trigger: "blur" },
{max: 11,message: "最多只能录入个字符",trigger: "blur",},
]
},
deptList:[]
}
},
methods: {
// formSelect(){
// let treeId = getTreeIds(this.dict.deptId,this.form.deptId)
// },
cascaderChange(val){
if(this.deptList.length > 0){
this.form.deptId = this.deptList[this.deptList.length - 1]
}else{
this.form.deptId = ''
}
console.log(this.form.deptId,'当前选择')
},
replaceImage(val){
this.form.photoPath = val
},
/** 编辑 */
edit(row) {
this.reset()
......@@ -52,7 +81,7 @@
this.urls.currUrl ="workman/edit";
this.getData();
this.pageInfo.type="edit"
this.title = "修改工作人员";
this.title = "编辑";
},
/** 新增 */
add(row) {
......@@ -60,7 +89,8 @@
this.urls.currUrl = "workman/add";
this.getData();
this.pageInfo.type="add"
this.title = "新增工作人员";
this.title = "新增";
},
/** 查看*/
view(row) {
......@@ -74,14 +104,21 @@
/**取消按钮 */
cancel() {
this.open = false;
this.deptList = []
},
/**获取数据后弹框 */
afterRender(data) {
this.open = true;
this.deptList = findParentIds(this.dict.deptId,this.form.deptId).reverse()
this.deptList = this.deptList.concat(this.form.deptId)
console.log(this.deptList,'ddd')
},
afterSubmit(data) {
this.open = false;
this.reset()
this.deptList = []
this.$emit("ok");
},
......@@ -89,7 +126,6 @@
reset() {
this.form = {
deptId : 0,
deptName : "",
name : "",
number : "",
phone : "",
......@@ -101,7 +137,32 @@
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
},
},
};
}
}
}
</script>
<style scoped>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>
<template>
<div class="page">
<LayoutTable :data="tableData" :config="tableConfig">
</LayoutTable>
<LayoutTable :data="tableData" :config="tableConfig"></LayoutTable>
<dialog-show ref="dialogform" @ok="getData" />
</div>
</template>
......@@ -38,6 +35,7 @@
data() {
return {
config: {
isshowTabPane:true,
search: [
{
name: "name",
......@@ -58,7 +56,7 @@
{label: "电话号码", prop: "phone"},
{label: "照片", prop: "photoPath"},
{label: "照片", prop: "photoPath",formatter:this.formatterPic},
{label: "创建时间", prop: "createTime", formatter: this.formatterDate},
{
......@@ -66,7 +64,7 @@
width: 240,
formatter: row => {
return (
<table-buttons noAdd row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
<table-buttons noAdd noView row={row} onEdit={this.toEdit} onView={this.toView} onDel={this.toDel} />
);
}
}
......
......@@ -49,13 +49,7 @@ public interface DeptService extends ICRUDService<DeptEntity,Long>{
*/
List<DeptTreeSelect> getListByParentId(Long parentId,Context context);
/**
* 查询部门人数
* */
DeptEntity queryDept(String deptCode);
DeptEntity queryParent(String parentCode);
int queryParentId(Long deptId);
......
......@@ -191,15 +191,7 @@ public class DeptServiceImpl extends AbstractCRUDServiceImpl<DeptDao, DeptEntity
return collect;
}
@Override
public DeptEntity queryDept(String deptCode) {
return dao.queryDept(deptCode);
}
@Override
public DeptEntity queryParent(String parentCode) {
return dao.queryDeptParient(parentCode);
}
@Override
public int queryParentId(Long deptId) {
......
......@@ -4,7 +4,6 @@ import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.module.dept.model.DeptEntity;
import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.job.model.JobQuery;
import com.mortals.xhx.module.job.service.JobService;
......@@ -102,23 +101,4 @@ public class StaffController extends BaseCRUDJsonBodyMappingController<StaffServ
}
@Override
protected int saveAfter(StaffEntity entity, Map<String, Object> model, Context context) throws AppException {
//统计当前部门
DeptEntity deptEntity = deptService.get(entity.getDeptId());
int personNumcount = service.queryDeptNum(entity.getDeptId());
deptEntity.setPersonNum(personNumcount);
deptService.update(deptEntity);
//统计上级部门
int personNumId = deptService.queryParentId(entity.getDeptId());
if (personNumId!=0){
DeptEntity deptEntity1 = deptService.get(entity.getDeptId());
int personParentNumcount = service.queryDeptNum(deptEntity1.getParentId());
deptEntity1.setPersonNum(personParentNumcount);
deptService.update(deptEntity1);
}
return super.saveAfter(entity, model, context);
}
}
\ No newline at end of file
......@@ -13,18 +13,18 @@ client.global.set("SmsSet_id", JSON.parse(response.body).data.id);
client.global.set("authToken", JSON.parse(response.body).data.token);
%}
###职位信息列表
###部门信息列表
POST {{baseUrl}}/dept/list
Authorization: {{authToken}}
Content-Type: application/json
{
"page":1,
"size":10
"size":30
}
###职位信息更新与保存
###部门信息更新与保存
POST {{baseUrl}}/dept/save
Authorization: {{authToken}}
Content-Type: application/json
......@@ -41,18 +41,18 @@ Content-Type: application/json
client.global.set("Dept_id", JSON.parse(response.body).data.id);
%}
###职位信息查看
###部门信息查看
GET {{baseUrl}}/dept/info?id=1
Authorization: {{authToken}}
Accept: application/json
###职位信息编辑
###部门信息编辑
GET {{baseUrl}}/dept/edit?id={{Job_id}}
Authorization: {{authToken}}
Accept: application/json
###职位信息删除
###部门信息删除
GET {{baseUrl}}/dept/delete?id={{Job_id}}
Authorization: {{authToken}}
Accept: application/json
......
......@@ -19,9 +19,6 @@ Authorization: {{authToken}}
Content-Type: application/json
{
"groupName":"7knq8z",
"jobCode":"mmnj82",
"jobName":"z8f2k5",
"page":1,
"size":10
}
......
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