修改职工/租户员工菜单相关内容
dev
zxf 2 months ago
parent 09ce747ead
commit 11b4993b1e

@ -0,0 +1,63 @@
import request from '@/utils/request'
/**
* 新增ebuser
* @param pram
*/
export function ebuserCreateApi(data) {
return request({
url: `autogencode/ebuser/save`,
method: 'POST',
data
})
}
/**
* ebuser更新
* @param pram
*/
export function ebuserUpdateApi(data) {
return request({
url: `autogencode/ebuser/update`,
method: 'POST',
data
})
}
/**
* ebuser详情
* @param pram
*/
export function ebuserDetailApi(id) {
return request({
url: `autogencode/ebuser/info/${id}`,
method: 'GET'
})
}
/**
* ebuser批量删除
* @param ids
*/
export function ebuserDeleteApi(ids) {
return request({
url: `autogencode/ebuser/delete`,
method: 'POST',
data: ids
})
}
/**
* ebuser列表
* @param pram
*/
export function ebuserListApi(params) {
return request({
url: `autogencode/ebuser/list`,
method: 'GET',
params
})
}

@ -10,6 +10,24 @@ export function deptTreeSelect(params) {
})
}
// 查询部门树
export function getDeptTreeByPm(params) {
return request({
url: '/autogencode/sysdept/getDeptTreeByPm',
method: 'get',
params
})
}
// 查询当前用户的部门树(包含子部门)
export function getCurrentUserDeptTree(params) {
return request({
url: '/autogencode/sysdept/getCurrentUserDeptTree',
method: 'get',
params
})
}
/**
* 新增sysdept
* @param pram

@ -54,7 +54,7 @@ export default {
let findIndex = -1;
try {
findIndex = this.options.findIndex(val => {
return val && val.value !== undefined && val.value === item;
return val && val.value !== undefined && val.value == item;
});
} catch (e) {
console.error('Error in DictTag findIndex:', e);

@ -0,0 +1,443 @@
<template>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="!dataForm.uid ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible">
<!-- 新增和修改表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="手机号码" prop="phone">
<el-input v-model="dataForm.phone" placeholder="手机号码"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="真实姓名" prop="realName">
<el-input v-model="dataForm.realName" placeholder="真实姓名"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生日" prop="birthday">
<el-date-picker
v-model="dataForm.birthday"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
placeholder="选择生日"
style="width: 100%;"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="身份证号码" prop="cardId">
<el-input v-model="dataForm.cardId" placeholder="身份证号码"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="用户昵称" prop="nickname">
<el-input v-model="dataForm.nickname" placeholder="用户昵称"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户头像" prop="avatar">
<el-input v-model="dataForm.avatar" placeholder="用户头像"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="用户状态" prop="status">
<el-select v-model="dataForm.status" placeholder="请选择用户状态" style="width: 100%;">
<el-option
key="true"
label="正常"
:value="true"
/>
<el-option
key="false"
label="禁止"
:value="false"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别" prop="sex">
<el-select v-model="dataForm.sex" placeholder="请选择性别" style="width: 100%;">
<el-option
v-for="dict in dict.type.user_sex"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="用户类型" prop="userType">
<el-input v-model="dataForm.userType" placeholder="用户类型"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="员工类型" prop="staffType">
<el-select v-model="dataForm.staffType" placeholder="请选择员工类型" style="width: 100%;" @change="handleStaffTypeChange">
<el-option
v-for="dict in dict.type.staff_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="业主/租户" prop="ownerTenantId">
<el-select
v-model="dataForm.ownerTenantId"
:placeholder="dataForm.staffType ? (dataForm.staffType === '1' ? '请选择业主' : '请选择租户') : '请先选择员工类型'"
:disabled="!dataForm.staffType"
style="width: 100%;"
@change="handleOwnerTenantChange"
>
<!-- 显示业主列表 -->
<el-option
v-for="owner in ownerList"
:key="owner.id"
:label="owner.ownerName"
:value="owner.id"
v-if="dataForm.staffType === '1'"
/>
<!-- 显示租户列表 -->
<el-option
v-for="tenant in tenantList"
:key="tenant.id"
:label="tenant.tenantName"
:value="tenant.id"
v-if="dataForm.staffType === '2'"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属部门" prop="deptId">
<treeselect
v-model="dataForm.deptId"
:options="deptTreeOptions"
:normalizer="normalizer"
:placeholder="dataForm.ownerTenantId ? '选择部门' : '请先选择业主/租户'"
:disabled="!dataForm.ownerTenantId"
:key="dataForm.ownerTenantId + '-' + deptTreeOptions.length"
style="width: 100%"
></treeselect>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="用户备注" prop="mark">
<el-input v-model="dataForm.mark" placeholder="用户备注" type="textarea"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()"></el-button>
</span>
</el-dialog>
</template>
<script>
import * as api from '@/api/ebuser.js'
import { pmownerListApi } from '@/api/pmowner.js'
import { pmtenantListApi } from '@/api/pmtenant.js'
import { deptTreeSelect,getDeptTreeByPm } from '@/api/sysdept.js'
import Treeselect from "@riophae/vue-treeselect"
import "@riophae/vue-treeselect/dist/vue-treeselect.css"
export default {
dicts: ['user_status','user_sex','staff_type'],
components: {
Treeselect
},
data() {
return {
visible: false,
ownerList: [], //
tenantList: [], //
deptTreeOptions: [], //
deptMap: {}, //
dataForm: {
uid: 0,
account: '',
pwd: '',
realName: '',
birthday: '',
cardId: '',
mark: '',
partnerId: '',
groupId: '',
tagId: '',
nickname: '',
avatar: '',
phone: '',
addIp: '',
lastIp: '',
nowMoney: '',
brokeragePrice: '',
integral: '',
experience: '',
signNum: '',
status: true,
level: '',
spreadUid: '',
spreadTime: '',
userType: '',
isPromoter: '',
payCount: '',
spreadCount: '',
addres: '',
adminid: '',
loginType: '',
lastLoginTime: '',
cleanTime: '',
path: '',
subscribe: '',
subscribeTime: '',
sex: 0,
country: '',
promoterTime: '',
staffType: '',
ownerTenantId: '',
deptId: 0 // ID
},
dataRule: {
phone: [
{required: true, message: '手机号码 为必填项', trigger: 'blur'}
],
realName: [
{required: true, message: '真实姓名 为必填项', trigger: 'blur'}
],
status: [
{required: true, message: '用户状态为必填项', trigger: 'blur'}
],
staffType: [
{required: true, message: '员工类型为必填项', trigger: 'blur'}
],
ownerTenantId: [
{
required: true,
message: '请选择业主/租户',
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (value && !this.dataForm.staffType) {
callback(new Error('请先选择员工类型'));
} else {
callback();
}
},
trigger: 'blur'
}
],
deptId: [
{required: true, message: '请选择所属部门', trigger: 'blur'}
]
}
}
},
methods: {
init(id) { //
this.dataForm.uid = id || 0
this.visible = true
this.$nextTick(function () {
this.$refs['dataForm'].resetFields()
if (this.dataForm.uid) {
api.ebuserDetailApi(id).then(function (res) {
this.dataForm = res;
// /
if (this.dataForm.staffType) {
this.handleStaffTypeChange(this.dataForm.staffType);
}
}.bind(this))
}
}.bind(this))
},
//
handleStaffTypeChange(type) {
// /ID/ID
if (!this.dataForm.uid) {
this.dataForm.ownerTenantId = '';
this.dataForm.deptId = 0;
}
// API
if (type === '1') { //
pmownerListApi({ page: 1, limit: 1000 }).then(res => {
this.ownerList = res.list || [];
this.tenantList = [];
// ID
if (this.dataForm.uid && this.dataForm.ownerTenantId) {
this.handleOwnerTenantChange(this.dataForm.ownerTenantId);
}
}).catch(error => {
console.error('获取业主列表失败:', error);
});
} else if (type === '2') { //
pmtenantListApi({ page: 1, limit: 1000 }).then(res => {
this.tenantList = res.list || [];
this.ownerList = [];
// ID
if (this.dataForm.uid && this.dataForm.ownerTenantId) {
this.handleOwnerTenantChange(this.dataForm.ownerTenantId);
}
}).catch(error => {
console.error('获取租户列表失败:', error);
});
} else {
//
this.ownerList = [];
this.tenantList = [];
this.deptTreeOptions = [];
}
},
//
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.deptId || 0,
label: node.deptName ? node.deptName : '顶级部门',
children: node.children
};
},
// /
handleOwnerTenantChange(ownerTenantId) {
// deptId
const currentDeptId = this.dataForm.deptId;
// Id
this.dataForm.deptId = 0;
this.deptTreeOptions = [];
// /
if (ownerTenantId) {
getDeptTreeByPm({ ownerTenantId: ownerTenantId, staffType: this.dataForm.staffType }).then(res => {
const deptTree = res || [];
// deptId
const deptIds = new Set();
const hasDuplicates = this.checkDuplicateDeptIds(deptTree, deptIds);
if (hasDuplicates) {
console.warn('部门树中存在重复的deptId已去除重复部门');
}
this.deptTreeOptions = deptTree;
this.buildDeptMap(deptTree);
// currentDeptIddeptTree
if (this.isDeptIdInTree(currentDeptId, deptTree)) {
this.dataForm.deptId = currentDeptId;
}
}).catch(error => {
console.error('获取部门树失败:', error);
this.deptTreeOptions = [];
this.deptMap = {};
});
} else {
this.deptTreeOptions = [];
this.deptMap = {};
}
},
// deptId
checkDuplicateDeptIds(deptTree, deptIds = new Set()) {
let hasDuplicates = false;
const processNode = (node) => {
if (node.deptId) {
if (deptIds.has(node.deptId)) {
hasDuplicates = true;
} else {
deptIds.add(node.deptId);
}
if (node.children && node.children.length > 0) {
node.children.forEach(child => processNode(child));
}
}
};
deptTree.forEach(node => processNode(node));
return hasDuplicates;
},
//
buildDeptMap(depts) {
//
this.deptMap = {};
const mapDept = (deptList) => {
deptList.forEach(dept => {
if (dept && dept.deptId) {
this.deptMap[dept.deptId] = dept.deptName;
if (dept.children && dept.children.length > 0) {
mapDept(dept.children);
}
}
});
};
mapDept(depts);
},
// ID
isDeptIdInTree(deptId, deptTree) {
if (!deptId || !deptTree || !Array.isArray(deptTree)) {
return false;
}
for (const dept of deptTree) {
if (dept.deptId === deptId) {
return true;
}
if (dept.children && dept.children.length > 0) {
if (this.isDeptIdInTree(deptId, dept.children)) {
return true;
}
}
}
return false;
},
//
dataSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
if (this.dataForm.uid) {
api.ebuserUpdateApi(this.dataForm).then(function (res) {
this.$message.success('保存成功')
this.visible = false
this.$emit('refreshDataList')
}.bind(this));
} else {
api.ebuserCreateApi(this.dataForm).then(function (res) {
this.$message.success('新增成功')
this.visible = false
this.$emit('refreshDataList')
}.bind(this));
}
}
})
}
}
}
</script>

@ -0,0 +1,453 @@
<template>
<div class="divBox">
<el-row :gutter="20">
<!--部门数据-->
<el-col :span="4" :xs="24">
<div class="head-container">
<el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search"
style="margin-bottom: 20px"/>
</div>
<div class="head-container">
<el-tree :data="deptTreeOptions" :props="defaultProps" :expand-on-click-node="false"
:filter-node-method="filterNode" ref="tree" node-key="deptId" default-expand-all highlight-current
@node-click="handleNodeClick"/>
</div>
</el-col>
<!--用户数据-->
<el-col :span="20" :xs="24">
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<el-form-item label="真实姓名">
<el-input v-model="dataForm.realName" placeholder="请输入真实姓名" clearable></el-input>
</el-form-item>
<el-form-item label="用户昵称">
<el-input v-model="dataForm.nickname" placeholder="请输入用户昵称" clearable></el-input>
</el-form-item>
<el-form-item label="手机号码">
<el-input v-model="dataForm.phone" placeholder="请输入手机号码" clearable></el-input>
</el-form-item>
<el-form-item label="用户状态">
<el-select v-model="dataForm.status" placeholder="请选择用户状态" clearable>
<el-option label="正常" :value="true"></el-option>
<el-option label="禁止" :value="false"></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户类型">
<el-input v-model="dataForm.userType" placeholder="请输入用户类型" clearable></el-input>
</el-form-item>
<el-form-item label="员工类型">
<el-select v-model="dataForm.staffType" placeholder="请选择员工类型" clearable>
<el-option v-for="dict in dict.type.staff_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="业主/租户Id">-->
<!-- <el-input v-model="dataForm.ownerTenantId" placeholder="请输入业主/租户Id" clearable></el-input>-->
<!-- </el-form-item>-->
<el-form-item>
<el-button @click="getDataList()"></el-button>
<el-button @click="resetForm()"></el-button>
<el-button v-hasPermi="['autogencode:ebuser:save']" type="primary" @click="addOrUpdateHandle()"></el-button>
<el-button v-hasPermi="['autogencode:ebuser:delete']" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0"></el-button>
</el-form-item>
</el-form>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
@selection-change="selectionChangeHandle"
style="width: 100%;">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="account"
header-align="center"
align="center"
label="用户账号">
</el-table-column>
<el-table-column
prop="realName"
header-align="center"
align="center"
label="真实姓名">
</el-table-column>
<el-table-column
prop="birthday"
header-align="center"
align="center"
label="生日">
</el-table-column>
<el-table-column
prop="cardId"
header-align="center"
align="center"
label="身份证号码">
</el-table-column>
<el-table-column
prop="nickname"
header-align="center"
align="center"
label="用户昵称">
</el-table-column>
<el-table-column
prop="phone"
header-align="center"
align="center"
label="手机号码">
</el-table-column>
<el-table-column
prop="status"
header-align="center"
align="center"
label="用户状态">
<template slot-scope="scope">
{{ scope.row.status ? '正常' : '禁止' }}
</template>
</el-table-column>
<el-table-column
prop="userType"
header-align="center"
align="center"
label="用户类型">
</el-table-column>
<el-table-column
prop="staffType"
header-align="center"
align="center"
label="员工类型">
<template slot-scope="scope">
<dict-tag :options="dict.type.staff_type" :value="scope.row.staffType"/>
</template>
</el-table-column>
<el-table-column
prop="deptName"
header-align="center"
align="center"
label="部门名称">
</el-table-column>
<el-table-column
prop="ownerTenantName"
header-align="center"
align="center"
label="业主/租户">
</el-table-column>
<el-table-column
prop="addres"
header-align="center"
align="center"
label="详细地址">
</el-table-column>
<el-table-column
prop="sex"
header-align="center"
align="center"
label="性别">
<template slot-scope="scope">
<dict-tag :options="dict.type.user_sex" :value="scope.row.sex"/>
</template>
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.uid)">{{ '' }}</el-button>
<el-button v-hasPermi="['autogencode:ebuser:delete']" type="text" size="small" @click="deleteHandle(scope.row.uid)" style="color: #f56c6c;"></el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 表单弹窗, 新增数据和修改数据 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</el-col>
</el-row>
</div>
</template>
<script>
import AddOrUpdate from './ebuser-add-and-update'
import * as api from '@/api/ebuser.js'
import * as deptApi from '@/api/sysdept.js'
export default {
dicts: ['user_status','user_sex','staff_type'],
data () {
return {
deptTreeOptions: [],
deptMap: {},
deptName: undefined,
defaultProps: {
children: 'children',
label: 'deptName'
},
dataForm: {
uid: '',
account: '',
pwd: '',
realName: '',
birthday: '',
cardId: '',
mark: '',
partnerId: '',
groupId: '',
tagId: '',
nickname: '',
avatar: '',
phone: '',
addIp: '',
lastIp: '',
nowMoney: '',
brokeragePrice: '',
integral: '',
experience: '',
signNum: '',
status: '',
level: '',
spreadUid: '',
spreadTime: '',
userType: '',
isPromoter: '',
payCount: '',
spreadCount: '',
addres: '',
adminid: '',
loginType: '',
lastLoginTime: '',
cleanTime: '',
path: '',
subscribe: '',
subscribeTime: '',
sex: '',
country: '',
promoterTime: '',
staffType: '',
ownerTenantId: '',
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false
}
},
components: {
AddOrUpdate
},
watch: {
deptName(val) {
this.$refs.tree.filter(val);
}
},
activated () {
this.getDataList()
},
mounted() {
//
this.getDataList()
this.handleGetDeptList()
},
methods: {
//
handleGetDeptList() {
deptApi.getCurrentUserDeptTree().then(res => {
this.deptTreeOptions = res
this.buildDeptMap(res)
})
},
filterNode(value, data) {
if (!value) return true;
return data.deptName.indexOf(value) !== -1;
},
handleNodeClick(data) {
this.dataForm.deptId = data.deptId;
this.getDataList();
},
buildDeptMap(depts) {
if (depts) {
depts.forEach(dept => {
this.deptMap[dept.deptId] = dept.deptName
if (dept.children && dept.children.length > 0) {
this.buildDeptMap(dept.children)
}
})
}
},
resetForm() {
this.dataForm = {
uid: '',
account: '',
pwd: '',
realName: '',
birthday: '',
cardId: '',
mark: '',
partnerId: '',
groupId: '',
tagId: '',
nickname: '',
avatar: '',
phone: '',
addIp: '',
lastIp: '',
nowMoney: '',
brokeragePrice: '',
integral: '',
experience: '',
signNum: '',
status: '',
level: '',
spreadUid: '',
spreadTime: '',
userType: '',
isPromoter: '',
payCount: '',
spreadCount: '',
addres: '',
adminid: '',
loginType: '',
lastLoginTime: '',
cleanTime: '',
path: '',
subscribe: '',
subscribeTime: '',
sex: '',
country: '',
promoterTime: '',
staffType: '',
ownerTenantId: '',
deptId: '',
}
this.getDataList()
},
//
getDataList () {
this.dataListLoading = true
// EbUserControllerPageParamRequest
const params = {
page: this.pageIndex,
limit: this.pageSize
}
//
if (this.dataForm.uid) params.uid = this.dataForm.uid;
if (this.dataForm.account) params.account = this.dataForm.account;
if (this.dataForm.pwd) params.pwd = this.dataForm.pwd;
if (this.dataForm.realName) params.realName = this.dataForm.realName;
if (this.dataForm.birthday) params.birthday = this.dataForm.birthday;
if (this.dataForm.cardId) params.cardId = this.dataForm.cardId;
if (this.dataForm.mark) params.mark = this.dataForm.mark;
if (this.dataForm.partnerId) params.partnerId = this.dataForm.partnerId;
if (this.dataForm.groupId) params.groupId = this.dataForm.groupId;
if (this.dataForm.tagId) params.tagId = this.dataForm.tagId;
if (this.dataForm.nickname) params.nickname = this.dataForm.nickname;
if (this.dataForm.avatar) params.avatar = this.dataForm.avatar;
if (this.dataForm.phone) params.phone = this.dataForm.phone;
if (this.dataForm.addIp) params.addIp = this.dataForm.addIp;
if (this.dataForm.lastIp) params.lastIp = this.dataForm.lastIp;
if (this.dataForm.nowMoney) params.nowMoney = this.dataForm.nowMoney;
if (this.dataForm.brokeragePrice) params.brokeragePrice = this.dataForm.brokeragePrice;
if (this.dataForm.integral) params.integral = this.dataForm.integral;
if (this.dataForm.experience) params.experience = this.dataForm.experience;
if (this.dataForm.signNum) params.signNum = this.dataForm.signNum;
if (this.dataForm.status) params.status = this.dataForm.status;
if (this.dataForm.level) params.level = this.dataForm.level;
if (this.dataForm.spreadUid) params.spreadUid = this.dataForm.spreadUid;
if (this.dataForm.spreadTime) params.spreadTime = this.dataForm.spreadTime;
if (this.dataForm.userType) params.userType = this.dataForm.userType;
if (this.dataForm.isPromoter) params.isPromoter = this.dataForm.isPromoter;
if (this.dataForm.payCount) params.payCount = this.dataForm.payCount;
if (this.dataForm.spreadCount) params.spreadCount = this.dataForm.spreadCount;
if (this.dataForm.addres) params.addres = this.dataForm.addres;
if (this.dataForm.adminid) params.adminid = this.dataForm.adminid;
if (this.dataForm.loginType) params.loginType = this.dataForm.loginType;
if (this.dataForm.lastLoginTime) params.lastLoginTime = this.dataForm.lastLoginTime;
if (this.dataForm.cleanTime) params.cleanTime = this.dataForm.cleanTime;
if (this.dataForm.path) params.path = this.dataForm.path;
if (this.dataForm.subscribe) params.subscribe = this.dataForm.subscribe;
if (this.dataForm.subscribeTime) params.subscribeTime = this.dataForm.subscribeTime;
if (this.dataForm.sex) params.sex = this.dataForm.sex;
if (this.dataForm.country) params.country = this.dataForm.country;
if (this.dataForm.promoterTime) params.promoterTime = this.dataForm.promoterTime;
if (this.dataForm.staffType) params.staffType = this.dataForm.staffType;
if (this.dataForm.ownerTenantId) params.ownerTenantId = this.dataForm.ownerTenantId;
if (this.dataForm.deptId) params.deptId = this.dataForm.deptId;
// /Id
params.hasOwnerTenantId = true;
api.ebuserListApi(params).then(res => {
this.dataListLoading = false
this.dataList = res.list || [];
this.totalPage = res.total;
}).catch(e => {
this.dataListLoading = false
})
},
//
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle (val) {
this.pageIndex = val
this.getDataList()
},
//
selectionChangeHandle (val) {
this.dataListSelections = val
},
// /
addOrUpdateHandle (id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
//
deleteHandle (id) {
let ids = []
let idText = ''
// id
if (id) {
ids = [id]
idText = id
} else {
//
ids = this.dataListSelections.map(item => {
return item.uid
})
idText = ids.join(',')
}
this.$confirm(`确定进行删除操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// API
api.ebuserDeleteApi(ids).then(res => {
this.$message.success('删除成功')
this.getDataList()
})
})
},
}
}
</script>

@ -20,18 +20,34 @@
<el-input v-model="dataForm.ownerName" placeholder="请输入业主姓名" clearable></el-input>
</el-form-item>
<el-form-item label="业主类型">
<el-input v-model="dataForm.ownerType" placeholder="请输入业主类型" clearable></el-input>
<el-select v-model="dataForm.ownerType" placeholder="请选择业主类型" clearable style="width: 200px;">
<el-option
v-for="dict in dict.type.owner_Type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="业主状态">
<el-input v-model="dataForm.status" placeholder="请输入业主状态" clearable></el-input>
<el-select v-model="dataForm.status" placeholder="请选择业主状态" clearable style="width: 200px;">
<el-option
v-for="dict in dict.type.owner_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="getDataList()"></el-button>
<el-button @click="resetForm()"></el-button>
<el-button v-hasPermi="['autogencode:pmowner:save']" type="primary"
@click="addOrUpdateHandle()">新增数据</el-button>
@click="addOrUpdateHandle()">新增数据
</el-button>
<el-button v-hasPermi="['autogencode:pmowner:delete']" type="danger" @click="deleteHandle()"
:disabled="dataListSelections.length <= 0">批量删除</el-button>
:disabled="dataListSelections.length <= 0">批量删除
</el-button>
</el-form-item>
</el-form>
<el-table :data="dataList" border v-loading="dataListLoading" @selection-change="selectionChangeHandle"
@ -40,12 +56,15 @@
</el-table-column>
<el-table-column type="expand" header-align="center" align="center">
<template slot-scope="scope">
<TenatList :owner-id="scope.row.id" :show-search="false" />
<TenatList :key="tenantListKey" :owner-id="scope.row.id" :show-search="false"/>
</template>
</el-table-column>
<el-table-column prop="ownerName" header-align="center" align="center" label="业主姓名">
</el-table-column>
<el-table-column prop="ownerType" header-align="center" align="center" label="业主类型">
<template slot-scope="scope">
<dict-tag :options="dict.type.owner_Type" :value="scope.row.ownerType"/>
</template>
</el-table-column>
<el-table-column prop="ownerIdcard" header-align="center" align="center" label="业主身份证">
</el-table-column>
@ -68,14 +87,18 @@
</template>
</el-table-column>
<el-table-column prop="status" header-align="center" align="center" label="业主状态">
<template slot-scope="scope">
<dict-tag :options="dict.type.owner_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column prop="remark" header-align="center" align="center" label="备注">
</el-table-column>
<el-table-column header-align="center" align="center" width="150" label="操作">
<el-table-column header-align="center" align="center" width="150" label="操作" fixed="right">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{ '' }}</el-button>
<el-button v-hasPermi="['autogencode:pmowner:delete']" type="text" size="small"
@click="deleteHandle(scope.row.id)" style="color: #f56c6c;">删除</el-button>
@click="deleteHandle(scope.row.id)" style="color: #f56c6c;">删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -84,7 +107,7 @@
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 表单弹窗, 新增数据和修改数据 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="handleRefresh"></add-or-update>
</el-col>
</el-row>
</div>
@ -96,12 +119,15 @@ import * as api from '@/api/pmowner.js'
import * as deptApi from '@/api/sysdept.js'
import * as houseApi from '@/api/pmhouse.js'
import TenatList from '@/views/pm/tenant/index';
import DictTag from '@/components/DictTag'
export default {
components: {
TenatList,
AddOrUpdate
AddOrUpdate,
DictTag
},
dicts: ['owner_Type','owner_status'],
data() {
return {
deptTreeOptions: [],
@ -129,7 +155,9 @@ export default {
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false
addOrUpdateVisible: false,
// TenatListkey
tenantListKey: Date.now()
}
},
watch: {
@ -277,6 +305,13 @@ export default {
})
})
},
//
handleRefresh() {
// tenantListKeyTenatList
this.tenantListKey = Date.now()
//
this.getDataList()
},
}
}
</script>

@ -3,30 +3,61 @@
<el-dialog
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible">
:visible.sync="visible"
:append-to-body="true"
>
<!-- 新增和修改表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="业主姓名" prop="ownerName">
<el-input v-model="dataForm.ownerName" placeholder="业主姓名"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="业主类型" prop="ownerType">
<el-input v-model="dataForm.ownerType" placeholder="业主类型"></el-input>
<el-select v-model="dataForm.ownerType" placeholder="请选择业主类型" style="width: 100%;">
<el-option
v-for="dict in dict.type.owner_Type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="业主身份证" prop="ownerIdcard">
<el-input v-model="dataForm.ownerIdcard" placeholder="业主身份证"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="phone">
<el-input v-model="dataForm.phone" placeholder="联系电话"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="电子邮箱" prop="email">
<el-input v-model="dataForm.email" placeholder="电子邮箱"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="紧急联系人" prop="emergencyContact">
<el-input v-model="dataForm.emergencyContact" placeholder="紧急联系人"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="紧急联系电话" prop="emergencyPhone">
<el-input v-model="dataForm.emergencyPhone" placeholder="紧急联系电话"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属部门" prop="deptId">
<treeselect
v-model="dataForm.deptId"
@ -36,6 +67,10 @@
style="width: 100%"
></treeselect>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="所属房屋" prop="houseId">
<el-select v-model="dataForm.houseId" placeholder="选择房屋" clearable style="width: 100%">
<el-option
@ -46,16 +81,35 @@
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="业主状态" prop="status">
<el-input v-model="dataForm.status" placeholder="业主状态"></el-input>
<el-select v-model="dataForm.status" placeholder="请选择业主状态" style="width: 100%;">
<el-option
v-for="dict in dict.type.owner_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" placeholder="备注" type="textarea"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 显示添加租户按钮 -->
<el-row :gutter="20">
<el-col :span="24">
<el-form-item>
<el-button type="success" @click="addTenant"></el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 租户列表 -->
@ -65,7 +119,16 @@
<el-table-column prop="phome" label="联系电话" width="120"></el-table-column>
<el-table-column prop="idCard" label="身份证号" width="180"></el-table-column>
<el-table-column prop="company" label="工作单位" width="150"></el-table-column>
<el-table-column prop="status" label="状态" width="100"></el-table-column>
<el-table-column label="租户类型" width="120">
<template slot-scope="scope">
<dict-tag :options="dict.type.tenant_type" :value="scope.row.tenantType"/>
</template>
</el-table-column>
<el-table-column label="状态" width="100">
<template slot-scope="scope">
<dict-tag :options="dict.type.tenant_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="150"></el-table-column>
<el-table-column label="操作" width="180" fixed="right">
<template slot-scope="scope">
@ -94,9 +157,11 @@
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import TenantAddAndUpdate from './tenant-add-and-update.vue'
import DictTag from '@/components/DictTag'
export default {
components: { Treeselect, TenantAddAndUpdate },
components: { Treeselect, TenantAddAndUpdate, DictTag },
dicts: ['tenant_type','owner_Type','owner_status','tenant_status'],
data () {
return {
visible: false,

@ -4,14 +4,15 @@
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible"
:z-index="2000">
:append-to-body="true"
>
<!-- 新增和修改表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="120px">
<el-form-item label="绑定时间" prop="rentBeginTime">
<el-date-picker v-model="dataForm.rentBeginTime" type="datetime" placeholder="选择绑定时间" value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%"></el-date-picker>
<el-date-picker v-model="dataForm.rentBeginTime" type="datetime" placeholder="选择绑定时间" value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%" :z-index="7000"></el-date-picker>
</el-form-item>
<el-form-item label="解绑时间" prop="rentEndTime">
<el-date-picker v-model="dataForm.rentEndTime" type="datetime" placeholder="选择解绑时间" value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%"></el-date-picker>
<el-date-picker v-model="dataForm.rentEndTime" type="datetime" placeholder="选择解绑时间" value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%" :z-index="7000"></el-date-picker>
</el-form-item>
<el-form-item label="押金金额" prop="depositAmount">
<el-input-number v-model="dataForm.depositAmount" :min="0" :precision="2" placeholder="押金金额" style="width: 100%"></el-input-number>
@ -23,7 +24,14 @@
<el-input v-model="dataForm.authScope" placeholder="授权范围"></el-input>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-input v-model="dataForm.status" placeholder="状态"></el-input>
<el-select v-model="dataForm.status" placeholder="请选择状态" style="width: 100%;">
<el-option
v-for="dict in dict.type.record_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" placeholder="备注" type="textarea"></el-input>
@ -45,6 +53,7 @@
default: 0
}
},
dicts: ['record_status'],
data () {
return {
visible: false,

@ -4,14 +4,24 @@
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible"
:z-index="2000">
:append-to-body="true"
>
<!-- 新增和修改表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="120px">
<el-form-item label="租户姓名" prop="tenantName">
<el-input v-model="dataForm.tenantName" placeholder="租户姓名"></el-input>
</el-form-item>
<el-form-item label="租户类型" prop="tenantType">
<el-input v-model="dataForm.tenantType" placeholder="租户类型(个人、企业)"></el-input>
<el-select v-model="dataForm.tenantType" placeholder="请选择租户类型" style="width: 100%;">
<el-option
v-for="dict in dict.type.tenant_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="身份证号" prop="idCard">
<el-input v-model="dataForm.idCard" placeholder="身份证号"></el-input>
@ -22,8 +32,15 @@
<el-form-item label="工作单位" prop="company">
<el-input v-model="dataForm.company" placeholder="工作单位"></el-input>
</el-form-item>
<el-form-item label="租户ID" prop="tenantId">
<el-input v-model="dataForm.tenantId" placeholder="租户ID"></el-input>
<el-form-item label="状态" prop="status">
<el-select v-model="dataForm.status" placeholder="请选择状态" style="width: 100%;">
<el-option
v-for="dict in dict.type.tenant_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" placeholder="备注" type="textarea"></el-input>
@ -51,12 +68,19 @@
</template>
</el-table-column>
<el-table-column prop="authScope" label="授权范围" width="150"></el-table-column>
<el-table-column prop="status" label="状态" width="100"></el-table-column>
<el-table-column label="状态" width="100">
<template slot-scope="scope">
<dict-tag :options="dict.type.record_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="150"></el-table-column>
<el-table-column label="操作" width="180" fixed="right">
<template slot-scope="scope">
<el-button type="text" size="small" @click="editRentRecord(scope.row.id)">{{ '' }}</el-button>
<el-button type="text" size="small" @click="deleteRentRecord(scope.row.id, scope.$index)">{{ '删除' }}</el-button>
<el-button type="text" size="small" @click="deleteRentRecord(scope.row.id, scope.$index)">{{
'删除'
}}
</el-button>
</template>
</el-table-column>
</el-table>
@ -68,7 +92,8 @@
</span>
<!-- 租赁记录弹窗 -->
<rent-record-add-and-update ref="rentRecordAddOrUpdate" :tenantId="dataForm.id" @refreshDataList="getRentRecords" @saveRentRecord="saveRentRecord"></rent-record-add-and-update>
<rent-record-add-and-update ref="rentRecordAddOrUpdate" :tenantId="dataForm.id" @refreshDataList="getRentRecords"
@saveRentRecord="saveRentRecord"></rent-record-add-and-update>
</el-dialog>
</template>
@ -77,21 +102,24 @@
import * as relApi from '@/api/pmtentanthouserel.js'
import * as rentRecordApi from '@/api/pmtenanthouse.js'
import RentRecordAddAndUpdate from './rent-record-add-and-update.vue'
import DictTag from '@/components/DictTag'
export default {
components: { RentRecordAddAndUpdate },
components: {RentRecordAddAndUpdate, DictTag},
props: {
ownerId: {
type: Number,
default: 0
type: String,
default: ''
}
},
dicts: ['tenant_type','record_status','tenant_status'],
data() {
return {
visible: false,
rentRecords: [],
dataForm: {
id: 0,
ownerId: 0,
ownerId: '',
tenantName: '',
tenantType: '',
idCard: '',
@ -117,7 +145,7 @@
methods: {
init(id, ownerId) { //
this.dataForm.id = id || 0
this.dataForm.ownerId = ownerId || 0
this.dataForm.ownerId = ownerId || ''
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
@ -126,9 +154,40 @@
this.dataForm = res;
this.getRentRecords()
})
} else {
// tenantList
let foundTenant = null
// tenantList
let parent = this.$parent
while (parent) {
if (parent.tenantList && Array.isArray(parent.tenantList)) {
//
foundTenant = parent.tenantList.find(tenant =>
tenant.id === this.dataForm.id ||
(tenant.id === 0 && tenant.tenantName && tenant.phome)
)
if (foundTenant) {
break
}
}
parent = parent.$parent
}
// 使
if (foundTenant) {
//
this.dataForm.tenantName = foundTenant.tenantName
this.dataForm.tenantType = foundTenant.tenantType
this.dataForm.idCard = foundTenant.idCard
this.dataForm.phome = foundTenant.phome
this.dataForm.company = foundTenant.company
this.dataForm.status = foundTenant.status
this.dataForm.remark = foundTenant.remark
//
this.rentRecords = foundTenant.pmTenantHouses || []
} else {
this.rentRecords = []
}
}
})
},
//
@ -194,23 +253,48 @@
dataSubmit() {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
const tenantData = {
id: this.dataForm.id,
tenantName: this.dataForm.tenantName,
tenantType: this.dataForm.tenantType,
idCard: this.dataForm.idCard,
phome: this.dataForm.phome,
company: this.dataForm.company,
status: this.dataForm.status,
remark: this.dataForm.remark,
if (this.dataForm.id) {
api.pmtenantUpdateApi(this.dataForm).then(() => {
this.$message.success('保存成功')
this.visible = false
this.$emit('refreshDataList')
//
this.$emit('saveTenant', {...this.dataForm, pmTenantHouses: this.rentRecords})
})
} else {
if (!this.ownerId) {
const tenantData = {...this.dataForm, pmTenantHouses: this.rentRecords}
this.$message.success('新增成功')
this.visible = false
this.$emit('saveTenant', tenantData)
} else {
api.pmtenantCreateApi(this.dataForm).then(res => {
const tenantId = res.id
const tenantData = {...this.dataForm, id: tenantId}
if (tenantId && this.ownerId) {
const relData = {
tenantHouseId: tenantId,
ownerId: this.ownerId,
tenantId: this.dataForm.tenantId,
pmTenantHouses: this.rentRecords
delFlag: '0'
}
relApi.pmtentanthouserelCreateApi(relData).then(() => {
this.$message.success('新增成功')
this.visible = false
this.$emit('refreshDataList')
this.$emit('saveTenant', tenantData)
this.$message.success('保存成功')
}).catch(() => {
this.$message.error('关联关系创建失败')
})
} else {
this.$message.success('新增成功')
this.visible = false
this.$emit('refreshDataList')
this.$emit('saveTenant', tenantData)
}
})
}
}
}
})
}

@ -263,7 +263,7 @@
addOrUpdateHandle (id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
this.$refs.addOrUpdate.init(id, this.dataForm.ownerId)
})
},
//

@ -3,7 +3,9 @@
<el-dialog
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible">
:visible.sync="visible"
:append-to-body="true"
>
<!-- 新增和修改表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="80px">
<el-form-item label="租户姓名" prop="tenantName">
@ -38,6 +40,8 @@
<script>
import * as api from '@/api/pmtenant.js'
export default {
// tenant_status
data () {
return {
visible: false,
@ -50,6 +54,7 @@
company: '' ,
status: '' ,
remark: '' ,
ownerId: '',
},
dataRule: {
tenantName: [
@ -77,8 +82,9 @@
}
},
methods: {
init (id) { //
init (id, ownerId) { //
this.dataForm.id = id || 0
this.dataForm.ownerId = ownerId || ''
this.visible = true
this.$nextTick(function() {
this.$refs['dataForm'].resetFields()
@ -86,6 +92,8 @@
api.pmtenantDetailApi(id).then(function(res) {
this.dataForm = res;
}.bind(this))
} else if (ownerId) {
this.dataForm.ownerId = ownerId;
}
}.bind(this))
},

@ -143,10 +143,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/api/public/**").anonymous()
// 放行公共文件访问
.antMatchers("/file/public/**").anonymous()
// 放行访客预约保存
.antMatchers("/api/autogencode/dcvisitbook/save").anonymous()
// 放行访客预约列表
.antMatchers("/api/autogencode/dcvisitbook/list").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()

@ -0,0 +1,33 @@
package com.zbkj.modules.autogencode.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* Web MVC
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* StringHttpMessageConverter
*/
@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
return new StringHttpMessageConverter(StandardCharsets.UTF_8);
}
/**
*
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(stringHttpMessageConverter());
}
}

@ -1,15 +1,29 @@
package com.zbkj.modules.autogencode.controller;
import java.util.Arrays;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zbkj.common.model.system.SysDept;
import com.zbkj.common.model.user.User;
import com.zbkj.common.model.system.SystemAdmin;
import com.zbkj.common.model.system.SysDeptUser;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.response.CommonResult;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.utils.CrmebUtil;
import com.zbkj.common.utils.SecurityUtil;
import com.zbkj.common.vo.LoginUserVo;
import com.zbkj.service.service.UserService;
import com.zbkj.service.service.SystemAdminService;
import com.zbkj.service.service.SysDeptUserService;
import com.zbkj.service.service.SysDeptService;
import com.zbkj.modules.autogencode.service.PmOwnerService;
import com.zbkj.modules.autogencode.service.PmTenantService;
import com.zbkj.modules.autogencode.entity.PmOwner;
import com.zbkj.modules.autogencode.entity.PmTenant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -33,6 +47,21 @@ public class EbUserController {
@Autowired
private UserService ebUserService;
@Autowired
private SystemAdminService systemAdminService;
@Autowired
private SysDeptUserService sysDeptUserService;
@Autowired
private SysDeptService sysDeptService;
@Autowired
private PmOwnerService pmOwnerService;
@Autowired
private PmTenantService pmTenantService;
/**
@ -242,6 +271,15 @@ public class EbUserController {
queryWrapper.eq(User::getPromoterTime, request.getPromoterTime());
}
// 业主/租户Id
if (request.getOwnerTenantId() != null) {
queryWrapper.eq(User::getOwnerTenantId, request.getOwnerTenantId());
}
// 是否只查询有业主/租户Id的用户
if (request.getHasOwnerTenantId() != null && request.getHasOwnerTenantId()) {
queryWrapper.isNotNull(User::getOwnerTenantId);
}
}
@ -249,17 +287,133 @@ public class EbUserController {
*
* @param request
* @param pageParamRequest
* @param hasOwnerTenantId /Id
*/
@ApiOperation(value = "分页列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<User>> getList(@Validated User request, @Validated PageParamRequest pageParamRequest) {
public CommonResult<CommonPage<Map<String, Object>>> getList(@Validated User request, @Validated PageParamRequest pageParamRequest,
@RequestParam(required = false) Boolean hasOwnerTenantId) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
// 应用搜索条件
condition(queryWrapper, request);
// 通过当前用户的部门及其子部门过滤用户
LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo();
if (loginUserVo != null && loginUserVo.getUser() != null) {
SystemAdmin currentAdmin = loginUserVo.getUser();
// 查询当前用户所属的部门
List<SysDeptUser> deptUsers = sysDeptUserService.list(Wrappers.<SysDeptUser>lambdaQuery()
.eq(SysDeptUser::getUserId, Long.valueOf(currentAdmin.getId())));
if (deptUsers != null && !deptUsers.isEmpty()) {
// 获取当前用户的所有部门ID
List<Long> deptIds = deptUsers.stream().map(SysDeptUser::getDeptId).collect(Collectors.toList());
// 查询这些部门及其所有子部门的ID
List<Long> allDeptIds = new ArrayList<>();
for (Long deptId : deptIds) {
// 获取当前部门
allDeptIds.add(deptId);
// 查询当前部门的所有子部门使用ancestors字段进行过滤
List<SysDept> childDepts = sysDeptService.list(Wrappers.<SysDept>lambdaQuery()
.apply("CONCAT(',', ancestors, ',') LIKE {0}", "%" + deptId + "%")
.eq(SysDept::getDelFlag, "0"));
if (childDepts != null && !childDepts.isEmpty()) {
allDeptIds.addAll(childDepts.stream().map(SysDept::getDeptId).collect(Collectors.toList()));
}
}
// 查询这些部门下的所有用户
List<SysDeptUser> allDeptUsers = sysDeptUserService.list(Wrappers.<SysDeptUser>lambdaQuery()
.in(SysDeptUser::getDeptId, allDeptIds));
if (allDeptUsers != null && !allDeptUsers.isEmpty()) {
// 获取这些用户的admin ID
List<Long> adminIds = allDeptUsers.stream().map(SysDeptUser::getUserId).collect(Collectors.toList());
// 查询这些admin ID对应的用户
List<SystemAdmin> admins = systemAdminService.list(Wrappers.<SystemAdmin>lambdaQuery()
.in(SystemAdmin::getId, adminIds));
if (admins != null && !admins.isEmpty()) {
// 获取用户ID列表
List<Integer> userIds = admins.stream().map(SystemAdmin::getId).collect(Collectors.toList());
// 添加用户ID过滤条件
queryWrapper.in(User::getAdminid, userIds);
} else {
// 如果没有找到用户,返回空结果
queryWrapper.in(User::getUid, -1);
}
} else {
// 如果没有找到部门用户,返回空结果
queryWrapper.in(User::getUid, -1);
}
} else {
// 如果当前用户没有所属部门,返回空结果
queryWrapper.in(User::getUid, -1);
}
}
CommonPage<User> page = CommonPage.restPage(ebUserService.pageList(queryWrapper, pageParamRequest));
return CommonResult.success(page);
// 转换为包含ownerTenantName和deptName虚拟字段的Map列表
List<Map<String, Object>> userListWithVirtualField = page.getList().stream().map(user -> {
Map<String, Object> userMap = cn.hutool.core.bean.BeanUtil.beanToMap(user);
String ownerTenantName = "";
String deptName = "";
if (user.getOwnerTenantId() != null) {
// 根据staffType判断是业主还是租户
if ("1".equals(user.getStaffType())) {
// 查询业主名称
PmOwner pmOwner = pmOwnerService.getById(user.getOwnerTenantId());
if (pmOwner != null) {
ownerTenantName = pmOwner.getOwnerName();
}
} else if ("2".equals(user.getStaffType())) {
// 查询租户名称
PmTenant pmTenant = pmTenantService.getById(user.getOwnerTenantId());
if (pmTenant != null) {
ownerTenantName = pmTenant.getTenantName();
}
}
}
// 查询部门名称
if (user.getAdminid() != null) {
// 根据adminid查询对应的部门用户关系
List<SysDeptUser> deptUsers = sysDeptUserService.list(Wrappers.<SysDeptUser>lambdaQuery()
.eq(SysDeptUser::getUserId, Long.valueOf(user.getAdminid())));
if (deptUsers != null && !deptUsers.isEmpty()) {
// 获取第一个部门的ID
Long deptId = deptUsers.get(0).getDeptId();
// 查询部门信息
SysDept dept = sysDeptService.getById(deptId);
if (dept != null) {
deptName = dept.getDeptName();
}
}
}
userMap.put("ownerTenantName", ownerTenantName);
userMap.put("deptName", deptName);
return userMap;
}).collect(java.util.stream.Collectors.toList());
// 创建新的CommonPage对象
CommonPage<Map<String, Object>> resultPage = new CommonPage<>();
resultPage.setList(userListWithVirtualField);
resultPage.setTotal(page.getTotal());
resultPage.setPage(page.getPage());
resultPage.setLimit(page.getLimit());
resultPage.setTotalPage(page.getTotalPage());
return CommonResult.success(resultPage);
}
@ -278,7 +432,40 @@ public class EbUserController {
*/
@RequestMapping(value = "/save", method = RequestMethod.POST)
public CommonResult<String> save(@RequestBody User ebUser){
// 将手机号码作为账号和密码
ebUser.setAccount(ebUser.getPhone());
ebUser.setPwd(CrmebUtil.encryptPassword(ebUser.getPhone(), ebUser.getPhone()));
// 保存用户数据
if (ebUserService.save(ebUser)) {
// 将用户数据保存到admin表
SystemAdmin admin = new SystemAdmin();
admin.setAccount(ebUser.getPhone()); // 手机号作为账号
admin.setPwd(CrmebUtil.encryptPassword(ebUser.getPhone(), ebUser.getPhone())); // 手机号作为密码,并加密存储
admin.setRealName(ebUser.getRealName());
admin.setPhone(ebUser.getPhone());
admin.setStatus(true); // 默认为有效状态
admin.setIsDel(false); // 默认为不删除
admin.setCreateTime(new Date());
admin.setUpdateTime(new Date());
admin.setRoles("6"); // 角色权限默认设置为6
// 保存admin数据
if (systemAdminService.save(admin)) {
// 将admin的ID保存到ebUser的adminid字段中
ebUser.setAdminid(admin.getId());
ebUserService.updateById(ebUser);
// 处理部门关联
if (ebUser.getDeptId() != null) {
SysDeptUser sysDeptUser = new SysDeptUser();
sysDeptUser.setUserId(Long.valueOf(admin.getId()));
sysDeptUser.setDeptId(Long.valueOf(ebUser.getDeptId()));
sysDeptUserService.save(sysDeptUser);
}
}
return CommonResult.success();
}
return CommonResult.failed();
@ -289,7 +476,35 @@ public class EbUserController {
*/
@RequestMapping(value = "/update", method = RequestMethod.POST)
public CommonResult<String> update(@RequestBody User ebUser){
// 更新用户数据
if (ebUserService.updateById(ebUser)) {
// 根据用户手机号查询对应的admin记录
LambdaQueryWrapper<SystemAdmin> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SystemAdmin::getPhone, ebUser.getPhone());
SystemAdmin admin = systemAdminService.getOne(queryWrapper);
if (admin != null) {
// 更新admin表中的信息
admin.setRealName(ebUser.getRealName());
admin.setPhone(ebUser.getPhone());
admin.setUpdateTime(new Date());
// 保存admin更新
if (systemAdminService.updateById(admin)) {
// 处理部门关联:先删除原有关联
sysDeptUserService.remove(new LambdaQueryWrapper<SysDeptUser>()
.eq(SysDeptUser::getUserId, Long.valueOf(admin.getId())));
// 添加新的部门关联
if (ebUser.getDeptId() != null) {
SysDeptUser sysDeptUser = new SysDeptUser();
sysDeptUser.setUserId(Long.valueOf(admin.getId()));
sysDeptUser.setDeptId(Long.valueOf(ebUser.getDeptId()));
sysDeptUserService.save(sysDeptUser);
}
}
}
return CommonResult.success();
}
return CommonResult.failed();
@ -300,6 +515,24 @@ public class EbUserController {
*/
@RequestMapping(value = "/delete", method = RequestMethod.POST)
public CommonResult<String> delete(@RequestBody Integer[] uids){
// 遍历所有要删除的用户ID
for (Integer uid : uids) {
// 获取用户信息
User user = ebUserService.getById(uid);
if (user != null && user.getAdminid() != null) {
// 获取对应的adminid
Integer adminId = user.getAdminid();
// 删除关联的SysDeptUser记录
sysDeptUserService.remove(Wrappers.<SysDeptUser>lambdaQuery()
.eq(SysDeptUser::getUserId, Long.valueOf(adminId)));
// 删除对应的SystemAdmin记录
systemAdminService.removeById(adminId);
}
}
// 删除用户记录
if (ebUserService.removeByIds(Arrays.asList(uids))) {
return CommonResult.success();
}

@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.response.CommonResult;
import com.zbkj.common.page.CommonPage;
import com.zbkj.modules.autogencode.entity.PmTenantHouse;
import com.zbkj.modules.autogencode.service.PmTenantHouseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -40,13 +42,16 @@ public class PmTenantController {
@Autowired
private PmTenantHouseRelService pmTenantHouseRelService;
@Autowired
private PmTenantHouseService pmTenantHouseService;
/**
*
*
*/
private void condition(LambdaQueryWrapper<PmTenant> queryWrapper, PmTenant request) {
private void condition(LambdaQueryWrapper<PmTenant> queryWrapper, PmTenant request, Long ownerId) {
if (request == null) {
return;
}
@ -128,6 +133,21 @@ public class PmTenantController {
queryWrapper.eq(PmTenant::getTenantId, request.getTenantId());
}
// 根据业主ID查询租户
if (ownerId != null) {
LambdaQueryWrapper<PmTenantHouseRel> relQueryWrapper = new LambdaQueryWrapper<>();
relQueryWrapper.eq(PmTenantHouseRel::getOwnerId, ownerId);
relQueryWrapper.eq(PmTenantHouseRel::getDelFlag, "0");
List<PmTenantHouseRel> rels = pmTenantHouseRelService.list(relQueryWrapper);
List<Long> tenantIds = rels.stream().map(PmTenantHouseRel::getTenantHouseId).collect(Collectors.toList());
if (!tenantIds.isEmpty()) {
queryWrapper.in(PmTenant::getId, tenantIds);
} else {
queryWrapper.eq(PmTenant::getId, -1L); // 没有匹配的租户,返回空结果
}
}
}
@ -138,11 +158,13 @@ public class PmTenantController {
*/
@ApiOperation(value = "分页列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<PmTenant>> getList(@Validated PmTenant request, @Validated PageParamRequest pageParamRequest) {
public CommonResult<CommonPage<PmTenant>> getList(@Validated PmTenant request,
@RequestParam(required = false) Long ownerId,
@Validated PageParamRequest pageParamRequest) {
LambdaQueryWrapper<PmTenant> queryWrapper = new LambdaQueryWrapper();
// 应用搜索条件
condition(queryWrapper, request);
condition(queryWrapper, request, ownerId);
CommonPage<PmTenant> page = CommonPage.restPage(pmTenantService.pageList(queryWrapper, pageParamRequest));
return CommonResult.success(page);
@ -186,6 +208,14 @@ public class PmTenantController {
*/
@RequestMapping(value = "/delete", method = RequestMethod.POST)
public CommonResult<String> delete(@RequestBody Long[] ids){
// 删除前需要判断有没有相关的PmTenantHouse没有删除
LambdaQueryWrapper<PmTenantHouse> tenantHouseQuery = new LambdaQueryWrapper<>();
tenantHouseQuery.in(PmTenantHouse::getRentId, Arrays.asList(ids));
long tenantHouseCount = pmTenantHouseService.count(tenantHouseQuery);
if (tenantHouseCount > 0) {
return CommonResult.failed("删除失败,该租户下存在关联的租赁记录,请先删除关联的租赁记录");
}
if (pmTenantService.removeByIds(Arrays.asList(ids))) {
return CommonResult.success();
}

@ -12,11 +12,25 @@ import com.zbkj.common.response.CommonResult;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.vo.SysDeptTreeVo;
import com.zbkj.service.service.SysDeptService;
import com.zbkj.modules.autogencode.entity.PmOwner;
import com.zbkj.modules.autogencode.entity.PmTenantHouse;
import com.zbkj.modules.autogencode.entity.PmTenantHouseRel;
import com.zbkj.modules.autogencode.service.PmOwnerService;
import com.zbkj.modules.autogencode.service.PmTenantHouseService;
import com.zbkj.modules.autogencode.service.PmTenantHouseRelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.zbkj.common.utils.SecurityUtil;
import com.zbkj.common.vo.LoginUserVo;
import com.zbkj.common.model.system.SysDeptUser;
@ -35,6 +49,18 @@ public class SysDeptController {
@Autowired
private SysDeptService sysDeptService;
@Autowired
private PmOwnerService pmOwnerService;
@Autowired
private PmTenantHouseService pmTenantHouseService;
@Autowired
private PmTenantHouseRelService pmTenantHouseRelService;
@Autowired
private com.zbkj.service.service.SysDeptUserService sysDeptUserService;
/**
@ -206,14 +232,112 @@ public class SysDeptController {
*
* @param deptName
* @param status
* @param ownerTenantId /ID
* @param staffType
* @return List<SysDeptTreeVo>
*/
@ApiOperation(value = "获取部门树形结构")
@RequestMapping(value = "/tree", method = RequestMethod.GET)
public CommonResult<List<SysDeptTreeVo>> getDeptTree(
@RequestParam(required = false) String deptName,
@RequestParam(required = false) String status) {
@RequestParam(required = false) String status,
@RequestParam(required = false) Long ownerTenantId,
@RequestParam(required = false) String staffType) {
return CommonResult.success(sysDeptService.getDeptTree(deptName, status));
}
/**
*
* @param deptName
* @param status
* @param ownerTenantId /ID
* @param staffType
* @return List<SysDeptTreeVo>
*/
@ApiOperation(value = "获取部门树形结构")
@RequestMapping(value = "/getDeptTreeByPm", method = RequestMethod.GET)
public CommonResult<List<SysDeptTreeVo>> getDeptTreeByPm(
@RequestParam(required = false) String deptName,
@RequestParam(required = false) String status,
@RequestParam(required = false) Long ownerTenantId,
@RequestParam(required = false) String staffType) {
// 根据staffType和ownerTenantId获取实际用于过滤的deptId
Long actualDeptId = null;
if (staffType != null && !staffType.isEmpty() && ownerTenantId != null) {
// 如果 staffType为1时是业主为2时是租户
if ("1".equals(staffType)) {
// 为业主时查询PmOwner表获取其deptId
PmOwner pmOwner = pmOwnerService.getById(ownerTenantId);
if (pmOwner != null) {
actualDeptId = pmOwner.getDeptId();
}
} else if ("2".equals(staffType)) {
// 为租户时查询pm_tenant_house表并且是当前时间还在的
Date now = new Date();
LambdaQueryWrapper<PmTenantHouse> tenantHouseWrapper = new LambdaQueryWrapper<>();
tenantHouseWrapper.eq(PmTenantHouse::getRentId, ownerTenantId)
.eq(PmTenantHouse::getDelFlag, "0")
.le(PmTenantHouse::getRentBeginTime, now)
.ge(PmTenantHouse::getRentEndTime, now);
PmTenantHouse tenantHouse = pmTenantHouseService.getOne(tenantHouseWrapper);
if (tenantHouse != null) {
// 通过pm_tenant_house_rel查询出对应的业主ID
LambdaQueryWrapper<PmTenantHouseRel> tenantHouseRelWrapper = new LambdaQueryWrapper<>();
tenantHouseRelWrapper.eq(PmTenantHouseRel::getTenantHouseId, tenantHouse.getId())
.eq(PmTenantHouseRel::getDelFlag, "0");
PmTenantHouseRel tenantHouseRel = pmTenantHouseRelService.getOne(tenantHouseRelWrapper);
if (tenantHouseRel != null) {
// 查询业主信息获取其deptId
PmOwner pmOwner = pmOwnerService.getById(tenantHouseRel.getOwnerId());
if (pmOwner != null) {
actualDeptId = pmOwner.getDeptId();
}
}
}
}
}
List<SysDeptTreeVo> deptTree = sysDeptService.getDeptTree(deptName, status, actualDeptId, staffType);
return CommonResult.success(deptTree);
}
/**
*
* @param deptName
* @param status
* @return List<SysDeptTreeVo>
*/
@ApiOperation(value = "获取当前用户的部门及其子部门的部门树")
@RequestMapping(value = "/getCurrentUserDeptTree", method = RequestMethod.GET)
public CommonResult<List<SysDeptTreeVo>> getCurrentUserDeptTree(
@RequestParam(required = false) String deptName,
@RequestParam(required = false) String status) {
// 获取当前登录用户信息
LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo();
if (loginUserVo == null || loginUserVo.getUser() == null) {
return CommonResult.success(new ArrayList<SysDeptTreeVo>());
}
// 查询当前用户所属的部门
List<SysDeptUser> deptUsers = sysDeptUserService.list(Wrappers.<SysDeptUser>lambdaQuery()
.eq(SysDeptUser::getUserId, Long.valueOf(loginUserVo.getUser().getId())));
if (deptUsers == null || deptUsers.isEmpty()) {
return CommonResult.success(new ArrayList<SysDeptTreeVo>());
}
// 获取当前用户的所有部门ID
List<Long> deptIds = deptUsers.stream().map(SysDeptUser::getDeptId).collect(Collectors.toList());
// 这里我们只处理用户的第一个部门(如果有多个部门的话)
Long actualDeptId = deptIds.get(0);
// 使用现有的getDeptTree方法传入当前用户的部门ID作为过滤条件
List<SysDeptTreeVo> deptTree = sysDeptService.getDeptTree(deptName, status, actualDeptId, null);
return CommonResult.success(deptTree);
}
}

@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
@ -77,4 +78,7 @@ public class PmTenantHouseRel implements Serializable {
@ApiModelProperty(value = "租户ID")
private String tenantId;
}

@ -1,6 +1,7 @@
package com.zbkj.common.model.user;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
@ -163,5 +164,13 @@ public class User implements Serializable {
@ApiModelProperty(value = "业主/租户Id")
private Long ownerTenantId;
@ApiModelProperty(value = "部门id")
private Long deptId;
@TableField(exist = false)
@ApiModelProperty(value = "是否只查询有业主/租户Id的用户虚拟字段不存储数据库")
private Boolean hasOwnerTenantId;
}

@ -19,10 +19,19 @@ public class SysDeptTree {
//建立树形结构
public List<SysDeptTreeVo> buildTree(){
List<SysDeptTreeVo> treeDepts = new ArrayList<>();
for(SysDeptTreeVo deptNode : getRootNode()) {
List<SysDeptTreeVo> rootNodes = getRootNode();
// 如果有根节点,正常构建树形结构
if (CollUtil.isNotEmpty(rootNodes)) {
for(SysDeptTreeVo deptNode : rootNodes) {
deptNode = buildChildTree(deptNode);
treeDepts.add(deptNode);
}
} else if (CollUtil.isNotEmpty(deptList)) {
// 如果没有根节点但有部门数据,直接返回所有部门(处理只有一个非根节点的情况)
treeDepts.addAll(deptList);
}
return sortList(treeDepts);
}

@ -1,12 +1,24 @@
package com.zbkj.front.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zbkj.common.model.user.User;
import com.zbkj.common.model.user.UserToken;
import com.zbkj.common.request.LoginMobileRequest;
import com.zbkj.common.request.LoginRequest;
import com.zbkj.common.request.RegisterThirdUserRequest;
import com.zbkj.common.response.CommonResult;
import com.zbkj.common.response.LoginResponse;
import com.zbkj.common.token.FrontTokenComponent;
import com.zbkj.common.token.WeChatOauthToken;
import com.zbkj.common.vo.WeChatMiniAuthorizeVo;
import com.zbkj.front.service.LoginService;
import com.zbkj.service.service.SmsService;
import com.zbkj.service.service.UserService;
import com.zbkj.service.service.UserTokenService;
import com.zbkj.service.service.WechatNewService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@ -17,6 +29,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
/**
*
@ -42,6 +55,18 @@ public class LoginController {
@Autowired
private LoginService loginService;
@Autowired
private WechatNewService wechatNewService;
@Autowired
private UserService userService;
@Autowired
private UserTokenService userTokenService;
@Autowired
private FrontTokenComponent tokenComponent;
/**
*
*/
@ -71,6 +96,145 @@ public class LoginController {
return CommonResult.success();
}
/**
* openId
* @param loginBody
* @return
*/
@ApiOperation(value = "获取openId")
@PostMapping("/getGzhOpenId")
public CommonResult<JSONObject> getGzhOpenId(@RequestBody LoginRequest loginBody) {
JSONObject result = new JSONObject();
// 生成令牌
if (loginBody.getPassword() == null) {
return CommonResult.failed("请传入微信Code");
}
if (loginBody.getPhone() == null) {
return CommonResult.failed("请传ghzCode");
}
// 这里使用密码字段暂存wxCode手机字段暂存gzhCode
WeChatMiniAuthorizeVo xcxToken = wechatNewService.miniAuthCode(loginBody.getPassword());
if (xcxToken == null || xcxToken.getOpenId() == null) {
return CommonResult.failed("wxCode错误");
}
WeChatOauthToken gzhToken = wechatNewService.getOauth2AccessToken(loginBody.getPhone());
if (gzhToken == null || gzhToken.getOpenId() == null) {
return CommonResult.failed("gzhCode错误");
}
result.put("openId", xcxToken.getOpenId());
result.put("gzhOpenId", gzhToken.getOpenId());
// result.put("unionId", xcxToken.getUnionId() != null ? xcxToken.getUnionId() : gzhToken.getUnionId());
return CommonResult.success(result);
}
/**
*
* @param loginBody
* @return
*/
@ApiOperation(value = "绑定微信")
@PostMapping("/bindingWx")
public CommonResult<JSONObject> bindingWx(@RequestBody LoginRequest loginBody) {
JSONObject result = new JSONObject();
// 使用密码字段暂存wxCode
if (loginBody.getPassword() == null) {
return CommonResult.failed("请传入微信Code");
}
WeChatMiniAuthorizeVo xcxToken = wechatNewService.miniAuthCode(loginBody.getPassword());
if (xcxToken == null || xcxToken.getOpenId() == null) {
return CommonResult.failed("微信code错误");
}
// 判断微信是否被其他用户绑定
LambdaQueryWrapper<UserToken> userTokenWrapper = new LambdaQueryWrapper<>();
userTokenWrapper.eq(UserToken::getType, 2); // 2表示小程序
UserToken tempUserToken = userTokenService.getOne(userTokenWrapper);
if (tempUserToken != null) {
return CommonResult.failed("此微信已被绑定");
}
// 这里需要获取当前登录用户CRMEB应该有自己的获取当前用户的方式
// 假设当前用户ID可以从登录信息中获取这里暂时使用phone字段
LambdaQueryWrapper<User> currentUserWrapper = new LambdaQueryWrapper<>();
currentUserWrapper.eq(User::getPhone, loginBody.getPhone());
User currentUser = userService.getOne(currentUserWrapper);
if (currentUser == null) {
return CommonResult.failed("当前用户不存在");
}
// 更新用户微信信息
// User类没有openId和unionId字段微信信息存储在UserToken表中
UserToken userToken = new UserToken();
userToken.setUid(currentUser.getUid());
userToken.setType(2); // 2表示小程序
userTokenService.save(userToken);
result.put("message", "绑定成功");
result.put("user", currentUser);
return CommonResult.success(result);
}
/**
*
* @param loginBody
* @return
*/
@ApiOperation(value = "微信登录")
@PostMapping("/wxlogin")
public CommonResult<JSONObject> wxlogin(@RequestBody LoginRequest loginBody) {
JSONObject result = new JSONObject();
// 使用密码字段暂存wxCode
String wxCode = loginBody.getPassword();
WeChatMiniAuthorizeVo xcxToken = null;
if (wxCode != null) {
xcxToken = wechatNewService.miniAuthCode(wxCode);
}
if (xcxToken == null || xcxToken.getOpenId() == null) {
return CommonResult.failed("微信登录失败code错误");
}
// 根据openId查询用户
// 注意在CRMEB中微信登录信息存储在UserToken表中而不是User表
LambdaQueryWrapper<UserToken> userTokenWrapper = new LambdaQueryWrapper<>();
userTokenWrapper.eq(UserToken::getType, 2); // 2表示小程序
UserToken userToken = userTokenService.getOne(userTokenWrapper);
User sysUser = null;
if (userToken != null) {
sysUser = userService.getById(userToken.getUid());
}
if (sysUser == null) {
// 未找到用户,需要手动绑定
result.put("code", "501");
result.put("openId", xcxToken.getOpenId());
result.put("gzhOpenId", "");
result.put("unionId", xcxToken.getUnionId());
return CommonResult.success(result);
}
// 生成登录响应
String token = tokenComponent.createToken(sysUser);
result.put("token", token);
result.put("user", sysUser);
return CommonResult.success(result);
}
/**
*
* @param phone
@ -88,6 +252,9 @@ public class LoginController {
return CommonResult.failed("发送失败");
}
}
}

@ -36,4 +36,14 @@ public interface SysDeptService extends IService<SysDept> {
* @return List<SysDeptTreeVo>
*/
List<SysDeptTreeVo> getDeptTree(String deptName, String status);
/**
* /
* @param deptName
* @param status
* @param actualDeptId ID
* @param staffType
* @return List<SysDeptTreeVo>
*/
List<SysDeptTreeVo> getDeptTree(String deptName, String status, Long actualDeptId, String staffType);
}

@ -1101,7 +1101,8 @@ public class OrderServiceImpl implements OrderService {
storeOrder.setCreateTime(DateUtil.nowDateTime());
storeOrder.setShippingType(request.getShippingType());
storeOrder.setIsChannel(isChannel);
storeOrder.setPaid(false);
//storeOrder.setPaid(false);
storeOrder.setPaid(true);
storeOrder.setCost(BigDecimal.ZERO);
storeOrder.setType(0);
if (orderInfoVo.getIsVideo()) {
@ -1186,7 +1187,7 @@ public class OrderServiceImpl implements OrderService {
}
// 加入自动未支付自动取消队列
redisUtil.lPush(Constants.ORDER_AUTO_CANCEL_KEY, storeOrder.getOrderId());
//redisUtil.lPush(Constants.ORDER_AUTO_CANCEL_KEY, storeOrder.getOrderId());
// 发送后台管理员下单提醒通知短信
sendAdminOrderNotice(storeOrder.getOrderId());

@ -20,6 +20,7 @@ import javax.annotation.Resource;
import java.util.Map;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
@ -59,11 +60,25 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptDao, SysDept> impleme
*/
@Override
public List<SysDeptTreeVo> getDeptTree(String deptName, String status) {
return getDeptTree(deptName, status, null, null);
}
/**
* /
* @param deptName
* @param status
* @param actualDeptId ID
* @param staffType
* @return List<SysDeptTreeVo>
*/
@Override
public List<SysDeptTreeVo> getDeptTree(String deptName, String status, Long actualDeptId, String staffType) {
LambdaQueryWrapper<SysDept> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysDept::getDelFlag, "0");
// 添加部门名称搜索条件
// 添加部门名称搜索条件(处理中文编码问题)
if (deptName != null && !deptName.isEmpty()) {
// 确保中文参数正确编码
queryWrapper.like(SysDept::getDeptName, deptName);
}
@ -72,6 +87,23 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptDao, SysDept> impleme
queryWrapper.eq(SysDept::getStatus, status);
}
// 查询该部门及其所有子部门只有当actualDeptId不为null时才添加过滤条件
if (actualDeptId != null) {
// 先获取该部门的信息
SysDept targetDept = dao.selectById(actualDeptId);
if (targetDept != null) {
// 使用ancestors字段进行过滤子部门的ancestors包含父部门的ID
queryWrapper.and(wrapper -> {
// 1. 匹配当前部门本身
wrapper.eq(SysDept::getDeptId, actualDeptId)
// 2. 匹配所有子部门祖先节点包含当前部门ID
// 统一处理先给ancestors前后加逗号再匹配 ",actualDeptId,", 避免部分匹配错误
.or()
.apply("CONCAT(',', ancestors, ',') LIKE {0}", "%" + actualDeptId + "%");
});
}
}
queryWrapper.orderByAsc(SysDept::getOrderNum);
List<SysDept> deptList = dao.selectList(queryWrapper);

@ -0,0 +1,80 @@
package com.zbkj.service.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
*
* <br>
* WeiXinUtil <br>
*
*
* @author Tjw
* @date 201987 3:21:16
*/
@Slf4j
@Component
public class SignUtil {
public static Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";
//注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"&timestamp=" + timestamp +
"&url=" + url;
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
return ret;
}
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
private static String create_nonce_str() {
return UUID.randomUUID().toString();
}
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}
Loading…
Cancel
Save