feat:经纪人管理

master
username 5 months ago
parent 706cd977d3
commit cdeb743fe6

@ -11,7 +11,9 @@ import com.bs.common.core.domain.entity.SysUser;
import com.bs.common.utils.SecurityUtils;
import com.bs.common.utils.ServletUtils;
import com.bs.df.domain.DfOrder;
import com.bs.df.domain.DfUserBroker;
import com.bs.df.mapper.DfBizClueMapper;
import com.bs.df.service.IDfUserBrokerService;
import com.bs.system.mapper.SysUserMapper;
import com.bs.system.service.ISysUserService;
import io.swagger.annotations.Api;
@ -56,7 +58,8 @@ public class DfBizClueController extends BaseController {
private ISysUserService userService;
@Resource
private SysUserMapper sysUserMapper;
@Resource
private IDfUserBrokerService dfUserBrokerService;
/**
* 线
*/
@ -277,13 +280,22 @@ public class DfBizClueController extends BaseController {
@ApiOperation("经纪人ID")
@PostMapping("/changeUserId")
public AjaxResult changeUserId(@RequestBody DfBizClue dfBizClue) {
List<DfBizClue> list = dfBizClueService.list(new LambdaQueryWrapper<DfBizClue>().eq(DfBizClue::getShareUser, dfBizClue.getOldUserId()));
List<DfBizClue> list = dfBizClueService.list(new LambdaQueryWrapper<DfBizClue>()
.eq(DfBizClue::getShareUser, dfBizClue.getOldUserId()));
if (list.size() > 0) {
for (DfBizClue dfBizClueNew : list) {
dfBizClueNew.setShareUser(dfBizClue.getNewUserId());
}
dfBizClueService.updateBatchById(list);
}
List<DfUserBroker> userBrokerList = dfUserBrokerService.list(new LambdaQueryWrapper<DfUserBroker>()
.eq(DfUserBroker::getBrokerId, dfBizClue.getOldUserId()));
if (userBrokerList.size() > 0) {
for (DfUserBroker dfUserBroker : userBrokerList) {
dfUserBroker.setBrokerId(Long.valueOf(dfBizClue.getNewUserId()));
}
dfUserBrokerService.updateBatchById(userBrokerList);
}
return toAjax(true);
}

@ -178,7 +178,7 @@ public class DfProductPosterController extends BaseController {
@PostMapping
public AjaxResult add(@RequestBody DfProductPoster dfProductPoster) {
if ("1".equals(dfProductPoster.getPosterType())) {
dfProductPoster.setProductId(null);
dfProductPoster.setProductId(-1L);
}
return toAjax(dfProductPosterService.save(dfProductPoster));
}
@ -191,7 +191,7 @@ public class DfProductPosterController extends BaseController {
@PutMapping
public AjaxResult edit(@RequestBody DfProductPoster dfProductPoster) {
if ("1".equals(dfProductPoster.getPosterType())) {
dfProductPoster.setProductId(null);
dfProductPoster.setProductId(-1L);
}
return toAjax(dfProductPosterService.updateById(dfProductPoster));
}

@ -36,6 +36,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
@ -74,6 +75,8 @@ public class SysUserController extends BaseController {
private ICmAttachService cmAttachService;
/**
*
*/
@ -111,6 +114,12 @@ public class SysUserController extends BaseController {
return success(true);
}
@PostMapping("/removeBrokers")
public AjaxResult removeBrokers(@RequestBody SysUser user) {
dfUserBrokerService.remove(new LambdaQueryWrapper<DfUserBroker>().in(DfUserBroker::getUserId, user.getUserIds()));
return success(true);
}
@PostMapping("/updateDepts")
public AjaxResult updateDepts(@RequestBody SysUser user) {
for (Long userId : user.getUserIds()) {
@ -122,14 +131,27 @@ public class SysUserController extends BaseController {
return success(true);
}
@PostMapping("/updateBroker")
public AjaxResult updateBroker(@RequestBody SysUser user) {
for (Long userId : user.getUserIds()) {
DfUserBroker dfUserBroker = new DfUserBroker();
dfUserBroker.setUserId(userId);
dfUserBroker.setBrokerId(Long.valueOf(user.getBrokerId()));
dfUserBrokerService.save(dfUserBroker);
}
return success(true);
}
@GetMapping("/listByType")
public TableDataInfo listByType(SysUser user) {
List<DfUserBroker> dfUserBrokers = dfUserBrokerService.list(new LambdaQueryWrapper<DfUserBroker>()
.eq(DfUserBroker::getBrokerId, user.getBrokerId()));
if (!"1".equals(user.getSelectAll())) {
startPage();
}
LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
if (user.getDeptIds()!=null) {
if (user.getDeptIds() != null) {
wrapper.in(SysUser::getDeptId, user.getDeptIds());
} else {
if (!SecurityUtils.isAdmin(SecurityUtils.getUserId())) {
@ -137,6 +159,74 @@ public class SysUserController extends BaseController {
wrapper.in(SysUser::getDeptId, longs);
}
}
if (null != user.getBrokerId()) {
List<Long> userIds = dfUserBrokers.stream()
.map(DfUserBroker::getUserId)
.distinct()
.collect(Collectors.toList());
if (userIds.isEmpty()) {
userIds.add(0L);
}
wrapper.in(SysUser::getUserId, userIds);
}
condition(wrapper,user);
List<SysUser> list = userService.list(wrapper);
List<SysUser> listByAll = userService.list();
List<DfUserBroker> userBrokerListByAll = dfUserBrokerService.list();
List<DfBroker> dfBrokers = dfBrokerService.list();
List<DfArea> dfAreas = dfAreaService.list();
List<CmAttach> attachVo = cmAttachService.list();
Map<String, List<CmAttach>> attachMap = attachVo.stream()
.filter(cmAttach -> cmAttach.getFileId() != null)
.collect(Collectors.groupingBy(CmAttach::getFileId));
Map<Long, Long> mapByUserBroker = userBrokerListByAll.stream().collect(Collectors.toMap(DfUserBroker::getUserId, DfUserBroker::getBrokerId));
Map<Long, String> mapByUser = listByAll.stream().collect(Collectors.toMap(SysUser::getUserId, SysUser::getUserName));
Map<Long, String> map = dfBrokers.stream().collect(Collectors.toMap(DfBroker::getId, DfBroker::getBrokerName));
Map<String, String> mapByArea = dfAreas.stream().collect(Collectors.toMap(DfArea::getAreaId, DfArea::getName));
for (SysUser sysUser : list) {
sysUser.setUserDesc(HtmlUtils.stripHtmlTags(sysUser.getUserDesc()));
String deptName = map.get(sysUser.getDeptId());
sysUser.setBrokerId(String.valueOf(mapByUserBroker.get(sysUser.getUserId())));
String brokerId = sysUser.getBrokerId();
if (!Validator.isEmpty(brokerId) && !"null".equals(brokerId)) {
sysUser.setBrokerName(mapByUser.get(Long.valueOf(brokerId)));
}
String cityName = mapByArea.get(sysUser.getCity());
if (Validator.isNotEmpty(deptName)) {
sysUser.setDeptName(deptName);
}
if (Validator.isNotEmpty(cityName)) {
sysUser.setCity(cityName);
}
Long id = sysUser.getUserId();
List<CmAttach> matchingAttachments = attachMap.get(String.valueOf(id));
if (matchingAttachments != null) {
sysUser.setFiles(matchingAttachments);
}
}
return getDataTable(list);
}
@GetMapping("/listByNotBroker")
public TableDataInfo listByNotBroker(SysUser user) {
List<DfUserBroker> userBrokerList = dfUserBrokerService.list();
List<Long> userIdList = userBrokerList.stream()
.map(DfUserBroker::getUserId)
.filter(Objects::nonNull) // 过滤掉 null 值
.collect(Collectors.toList());
startPage();
LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
wrapper.notIn(SysUser::getUserId, userIdList);
wrapper.eq(SysUser::getUserType,"jj");
condition(wrapper,user);
List<SysUser> list = userService.list(wrapper);
return getDataTable(list);
}
@GetMapping("/listByBroker")
public TableDataInfo listByBroker(SysUser user) {
startPage();
LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
condition(wrapper,user);
List<SysUser> list = userService.list(wrapper);
List<DfBroker> dfBrokers = dfBrokerService.list();
@ -253,22 +343,36 @@ public class SysUserController extends BaseController {
@GetMapping(value = {"/getUsers"})
public TableDataInfo getInfosById(SysUser user) {
SysUser sysUser = userService.selectUserById(user.getUserId());
Long deptId = sysUser.getDeptId();
LambdaQueryWrapper<DfBroker> dfBrokerLambdaQueryWrapper = new LambdaQueryWrapper<>();
if (!sysUser.getDeptId().equals(-1L)) {
dfBrokerLambdaQueryWrapper.eq(DfBroker::getParentId, deptId);
}
List<DfBroker> list = dfBrokerService.list(dfBrokerLambdaQueryWrapper);
List<Long> idList = list.stream()
.map(DfBroker::getId)
// Long deptId = sysUser.getDeptId();
// LambdaQueryWrapper<DfBroker> dfBrokerLambdaQueryWrapper = new LambdaQueryWrapper<>();
// if (!sysUser.getDeptId().equals(-1L)) {
// dfBrokerLambdaQueryWrapper.eq(DfBroker::getParentId, deptId);
// }
// List<DfBroker> list = dfBrokerService.list(dfBrokerLambdaQueryWrapper);
// List<Long> idList = list.stream()
// .map(DfBroker::getId)
// .collect(Collectors.toList());
// if (idList.isEmpty()) {
// idList.add(0L);
// }
List<DfUserBroker> userBrokerList = dfUserBrokerService.list(new LambdaQueryWrapper<DfUserBroker>()
.eq(DfUserBroker::getBrokerId, sysUser.getUserId()));
List<Long> userIdList = userBrokerList.stream()
.map(DfUserBroker::getUserId)
.collect(Collectors.toList());
if (idList.isEmpty()) {
idList.add(0L);
if (userIdList.isEmpty()) {
userIdList.add(0L);
}
startPage();
List<SysUser> sysUsers = userService.list(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getUserType, user.getUserType())
.in(SysUser::getDeptId, idList));
LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SysUser::getUserId, userIdList)
.eq(SysUser::getUserType, user.getUserType());
if (sysUser.getDeptId().equals(-1L)) {
queryWrapper.or()
.isNotNull(SysUser::getUserId);
}
List<SysUser> sysUsers = userService.list(queryWrapper);
return getDataTable(sysUsers);
}

@ -17,6 +17,7 @@ import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@ -178,7 +179,14 @@ public class SysUser extends BaseEntity
/** 角色ID */
@TableField(exist = false)
private Long roleId;
@Excel(name = "备注")
@ApiModelProperty(value = "备注")
private String remark;
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
private LocalDateTime createTime;
public SysUser()
{
@ -216,6 +224,13 @@ public class SysUser extends BaseEntity
@TableField(exist = false)
private String hasBroker;
@TableField(exist = false)
private String brokerId;
/** 所属经纪人 */
@TableField(exist = false)
private String brokerName;
/**
* openId

@ -18,6 +18,12 @@ import com.bs.framework.manager.factory.AsyncFactory;
import com.bs.system.service.ISysConfigService;
import com.bs.system.service.ISysUserService;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.Random;
/**
*
*
@ -87,7 +93,16 @@ public class SysRegisterService
sysUser.setTenantId(0L);
sysUser.setNickName(username);
sysUser.setPassword(SecurityUtils.encryptPassword(password));
Date date = new Date();
LocalDateTime localDateTime = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
sysUser.setCreateTime(localDateTime);
sysUser.setBrokerId(registerBody.getShareUser());
Long newId = System.currentTimeMillis() + new Random().nextInt(1000);
sysUser.setUserId(newId);
boolean regFlag = userService.registerUser(sysUser);
userService.registerUserByBroker(sysUser);
if (!regFlag)
{
msg = "注册失败,请联系系统管理人员";

@ -71,4 +71,7 @@ public interface SysUserMapper extends BaseMapperX<SysUser> {
Boolean insertNew(@Param("user")SysUser user);
Boolean insertByBroker(@Param("user")SysUser user);
}

@ -122,6 +122,15 @@ public interface ISysUserService extends MPJBaseService<SysUser>
*/
public boolean registerUser(SysUser user);
/**
*
*
* @param user
* @return
*/
public boolean registerUserByBroker(SysUser user);
/**
*
*

@ -340,6 +340,18 @@ public class SysUserServiceImpl extends MPJBaseServiceImpl<SysUserMapper, SysUse
return userMapper.insertNew(user);
}
/**
*
*
* @param user
* @return
*/
@Override
public boolean registerUserByBroker(SysUser user)
{
return userMapper.insertByBroker(user);
}
/**
*
*

@ -180,13 +180,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</insert>
<insert id="insertNew" parameterType="com.bs.common.core.domain.entity.SysUser">
INSERT INTO sys_user (user_id, dept_id, user_name, nick_name, email, phonenumber, sex, avatar, password, status, review_status,
tenant_id,user_type )
tenant_id,user_type, create_time)
VALUES (#{user.userId}, #{user.deptId}, #{user.userName}, #{user.nickName}, #{user.email},
#{user.phonenumber}, #{user.sex}, #{user.avatar}, #{user.password}, #{user.status}, #{user.reviewStatus},
#{user.tenantId}, #{user.userType})
#{user.tenantId}, #{user.userType}, #{user.createTime})
</insert>
<insert id="insertByBroker" parameterType="com.bs.common.core.domain.entity.SysUser">
INSERT INTO df_user_broker (user_id, broker_id, create_time, tenant_id)
VALUES (#{user.userId}, #{user.brokerId}, #{user.createTime},0)
</insert>
<update id="updateUser" parameterType="SysUser">
update sys_user

@ -10,6 +10,15 @@ export function listUser(query) {
})
}
// 查询用户列表
export function listByNotBroker(query) {
return request({
url: '/system/user/listByNotBroker',
method: 'get',
params: query
})
}
// 查询用户列表
export function listUserAll(query) {
return request({
@ -190,6 +199,15 @@ export function removeDepts(data) {
})
}
// 批量移除用户经纪人
export function removeBrokers(data) {
return request({
url: '/system/user/removeBrokers',
method: 'post',
data: data
})
}
// 批量修改用户部门/代理商
export function updateDepts(data) {
return request({
@ -197,4 +215,13 @@ export function updateDepts(data) {
method: 'post',
data: data
})
}
}
// 批量修改用户经纪人
export function updateBroker(data) {
return request({
url: '/system/user/updateBroker',
method: 'post',
data: data
})
}

@ -0,0 +1,185 @@
<template>
<el-dialog
:close-on-click-modal="false"
:close-on-press-escape="false"
:visible.sync="dialogVisible"
:title="title"
append-to-body
>
<el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" label-width="100px">
<el-form-item label="登录账号" prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入登录账号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input
v-model="queryParams.phonenumber"
placeholder="请输入手机号码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table ref="table" :data="list" style="width: 100%" highlight-current-row @selection-change="handleSelectionChange"
@select="handleSelect" @select-all="handleSelectAll" @row-click="rowClick" v-loading="loading">
<el-table-column type="" width="50" align="center">
<template slot-scope="scope">
<i v-if="scope.row.userId === selectionUserId" style="color: #1890ff;" class="el-icon-circle-check"></i>
</template>
</el-table-column>
<el-table-column label="登录账号" key="userName" prop="userName"
:show-overflow-tooltip="true" />
<el-table-column label="所属代理商" prop="deptName" :show-overflow-tooltip="true" width="120"/>
<el-table-column label="用户昵称" key="nickName" prop="nickName"
:show-overflow-tooltip="true"/>
<el-table-column label="城市" prop="city" />
<el-table-column label="手机号码" key="phonenumber" prop="phonenumber"
width="110"/>
</el-table>
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" :disabled="!selectionUserId" @click="changeUser" >确认转入该经纪人</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { clueChangeUserId } from "@/api/biz/clue";
import {
listUserByType
} from "@/api/system/user";
export default {
name: 'BrokerChange',
props: {
oldBroker: [String, Number]
},
data() {
return {
loading: false,
dialogVisible: false,
title: '转入经纪人选择',
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
userName: '',
userType: "jj",
phonenumber: '',
},
list: [],
selectionUserId: ''
}
},
methods: {
show() {
this.list = [];
this.dialogVisible = true;
this.getList();
},
cancel() {
this.dialogVisible = false
},
getList() {
this.loading = true;
listUserByType(this.queryParams).then(response => {
this.list = response.rows || [];
this.total = response.total;
this.loading = false;
}).catch(e => {
this.loading = false;
});
},
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 10,
userName: '',
userType: "jj",
phonenumber: ''
};
this.getList();
},
rowClick(row) {
this.selectionUserId = row.userId;
},
// handleSelectionChange(sel) {
// // this.selection = sel || [];
// },
// handleSelect(row) {
// this.selection.forEach(val => {
// this.$refs.table.toggleRowSelection(val, false);
// });
// this.selection = [row];
// this.$nextTick(() => {
// // this.$refs.table.toggleRowSelection(row, true);
// // this.selection.forEach(val => {
// // if (row.userId !== val.userId) {
// // this.$nextTick(() => {
// // this.$refs.table.toggleRowSelection(val, false);
// // });
// // }
// // });
// // this.$nextTick(() => {
// // this.selection = [row];
// // })
// });
// },
// handleSelectAll() {
// //
// this.$refs.table.clearSelection();
// },
changeUser() {
if (this.selectionUserId && this.oldBroker) {
clueChangeUserId({
oldUserId: this.oldBroker,
newUserId: this.selectionUserId,
}).then(response => {
this.$emit('changeUser', this.selectionUserId);
this.cancel();
});
}
},
// getAllIds(data) {
// let ids = [];
// // id
// ids.push(data.id);
// // children children
// if (data.children && Array.isArray(data.children)) {
// // children
// data.children.forEach(child => {
// // getAllIds id ids
// ids = ids.concat(this.getAllIds(child));
// });
// }
// return ids;
// },
}
}
</script>
<style>
</style>

@ -0,0 +1,798 @@
<template>
<div ref="list">
<el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="登录账号" prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入登录账号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="真实姓名" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入真实姓名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input
v-model="queryParams.phonenumber"
placeholder="请输入手机号码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="用户状态"
clearable
>
<el-option
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="dateRange"
style="width: 200px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
:disabled="!brokerId"
v-hasPermi="['system:user:add']"
>选择
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:user:remove']"
>移除
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="userList" @sort-change="handleSortChange" :height="tableHeight - 150"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center"/>
<el-table-column label="登录账号" key="userName" prop="userName" v-if="columns[1].visible"
:show-overflow-tooltip="true" fixed="left"/>
<el-table-column label="所属经纪人" prop="brokerName" :show-overflow-tooltip="true" width="120"/>
<el-table-column label="所属代理商" prop="deptName" :show-overflow-tooltip="true" width="120"/>
<el-table-column label="用户编号" key="userId" prop="userId" v-if="columns[0].visible"/>
<el-table-column label="用户昵称" key="nickName" prop="nickName" v-if="columns[2].visible"
:show-overflow-tooltip="true"/>
<el-table-column label="真实姓名" key="realName" prop="realName" :show-overflow-tooltip="true"/>
<!-- <el-table-column label="身份证号" prop="identityCard" /> -->
<el-table-column label="城市" prop="city" />
<el-table-column label="注册时间" prop="registrationTime" width="100" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.registrationTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="简介" align="center" prop="userDesc" show-overflow-tooltip/> -->
<el-table-column label="手机号码" key="phonenumber" prop="phonenumber" v-if="columns[4].visible"
width="110"/>
<el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
<template slot-scope="scope">
<el-switch
v-model="scope.row.status"
active-value="0"
inactive-value="1"
@change="handleStatusChange(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
width="80"
class-name="small-padding fixed-width"
fixed="right"
>
<template slot-scope="scope" v-if="scope.row.userId !== 1&&scope.row.isTenantAdmin !=='Y'">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleRead(scope.row)"
>查看
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改代理商经纪对话框 -->
<el-dialog :title="title" :visible.sync="open" width="70%" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="登录账号" prop="userName">
<el-input v-model="form.userName" disabled placeholder="请输入登录账号" maxlength="20" minlength="2" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="归属代理商" prop="deptId" >
<treeselect v-model="form.deptId" :options="brokerList" props="lable" :show-count="true"
:defaultExpandLevel="Infinity" :disabled="readonly"
placeholder="请选择归属代理商" :normalizer="tenantIdnormalizer"/>
</el-form-item>
</el-col>
</el-row>
<template v-if="readonly">
<el-row>
<el-col :span="12">
<el-form-item label="真实姓名" prop="realName">
<el-input v-model="form.realName" placeholder="请输入真实姓名" maxlength="30" :disabled="readonly"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" :disabled="readonly"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item v-if="title == '添加用户'" label="用户密码" prop="password">
<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password :disabled="readonly"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="title == '添加用户'" label="登录账号" prop="userName">
<el-input v-model="form.userName" placeholder="请输入登录账号" maxlength="30" :disabled="readonly"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" :disabled="readonly"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="form.sex" placeholder="请选择性别" style="width: 100%" :disabled="readonly">
<el-option
v-for="dict in dict.type.sys_user_sex"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="状态">
<el-radio-group v-model="form.status" :disabled="readonly">
<el-radio
v-for="dict in dict.type.sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="form.postIds" multiple placeholder="请选择岗位" style="width: 100%" :disabled="readonly">
<el-option
v-for="item in postOptions"
:key="item.postId"
:label="item.postName"
:value="item.postId"
:disabled="item.status == 1"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="角色" prop="roleIds">
<el-select v-model="form.roleIds" multiple placeholder="请选择角色" style="width: 100%" :disabled="readonly">
<el-option
v-for="item in roleOptions"
:key="item.roleId"
:label="item.roleName"
:value="item.roleId"
:disabled="item.status == 1"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核状态">
<el-radio-group v-model="form.reviewStatus" :disabled="readonly">
<el-radio
v-for="dict in dict.type.review_status"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="名片标签" prop="label">
<el-input v-model="form.label" placeholder="请输入名片标签" :disabled="readonly"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="名片简介" prop="userDesc">
<el-input v-model="form.userDesc" type="textarea" placeholder="请输入内容" :disabled="readonly"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="公司" prop="company">
<el-input v-model="form.company" placeholder="请输入公司" :disabled="readonly" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="地址" prop="address">
<el-input v-model="form.address" placeholder="请输入地址" :disabled="readonly"/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" :disabled="readonly"></el-input>
</el-form-item>
</el-col>
</el-row>
</template>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm" v-if="!readonly" > </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<ClientList ref="clientList"></ClientList>
<NoBrokerUser ref="noBrokerUser" @success="handleQuery"></NoBrokerUser>
</div>
</template>
<script>
import AutoTableHeight from '@/views/broker/AutoTableHeight';
import {listBrokerByTree} from "@/api/broker/broker";
import {listArea} from "@/api/system/area";
import ClientList from "./ClientList";
import {
listUserByType,
listUser,
getUser,
delUser,
addUser,
updateUser,
resetUserPwd,
changeUserStatus,
deptTreeSelect, removeDepts,removeBrokers,
} from "@/api/system/user";
import {getToken} from "@/utils/auth";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import NoBrokerUser from "./NoBrokerUser.vue";
export default {
name: "BrokerUser",
mixins: [AutoTableHeight],
dicts: ['sys_normal_disable', 'sys_user_sex', 'review_status'],
components: {Treeselect, ClientList, NoBrokerUser},
props: {
rowData: {
type: Object,
default: () => ({})
}
},
data() {
return {
readonly:false,
cityOptions: [],
brokerList: [],
deptId: "",
rowDataNew: {},
//
loading: true,
brokerId : null,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
userList: null,
//
title: "",
//
deptOptions: undefined,
//
open: false,
//
deptName: undefined,
//
initPassword: undefined,
//
dateRange: [],
//
postOptions: [],
//
roleOptions: [],
//
form: {},
defaultProps: {
children: "children",
label: "label"
},
//
upload: {
//
open: false,
//
title: "",
//
isUploading: false,
//
updateSupport: 0,
//
headers: {Authorization: "Bearer " + getToken()},
//
url: process.env.VUE_APP_BASE_API + "/system/user/importData"
},
//
queryParams: {
pageNum: 1,
pageSize: 10,
userName: undefined,
phonenumber: undefined,
status: undefined,
deptId: undefined,
userType: "jj",
deptIds: [],
},
//
columns: [
{key: 0, label: `用户编号`, visible: true},
{key: 1, label: `登录账号`, visible: true},
{key: 2, label: `用户昵称`, visible: true},
{key: 3, label: `部门`, visible: true},
{key: 4, label: `手机号码`, visible: true},
{key: 5, label: `状态`, visible: true},
{key: 6, label: `创建时间`, visible: true}
],
//
rules: {
userName: [
{required: true, message: "登录账号不能为空", trigger: "blur"},
{min: 2, max: 20, message: '登录账号长度必须介于 2 和 20 之间', trigger: 'blur'}
],
nickName: [
{required: true, message: "用户昵称不能为空", trigger: "blur"}
],
password: [
{required: true, message: "用户密码不能为空", trigger: "blur"},
{min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur'}
],
email: [
{
type: "email",
message: "请输入正确的邮箱地址",
trigger: ["blur", "change"]
}
],
phonenumber: [
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
]
}
};
},
mounted() {
// rowData row
this.rowDataNew = this.rowData;
},
watch: {
// rowData
rowData: function (newVal, oldVal) {
// rowData row
console.log(newVal);
this.rowDataNew = newVal;
this.deptId = this.rowDataNew.id;
const allIds = this.getAllIds(this.rowDataNew);
this.queryParams.deptIds = allIds;
this.queryParams.brokerId = newVal.userId;
this.brokerId = newVal.userId;
this.getList();
},
//
deptName(val) {
this.$refs.tree.filter(val);
},
},
created() {
this.getList();
this.getCity();
// this.getDeptTree();
this.getbrokerList();
this.getConfigKey("sys.user.initPassword").then(response => {
this.initPassword = response.msg;
});
},
methods: {
handleAdd() {
this.$refs.noBrokerUser.show(this.brokerId);
},
citynormalizer(node, instanceId) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.areaId,
label: node.name,
children: node.children
}
},
getCity() {
listArea().then(response => {
this.cityOptions = this.buildTree(response.data);
});
},
buildTree(data) {
let tree = [];
let map = {};
data.forEach(node => {
map[node.areaId] = node;
node.children = [];
});
//
if (map[0]) {
tree.push(map[0]);
delete map[0];
}
data.forEach(node => {
if (node.parentId != 0) {
const parent = map[node.parentId];
if (parent) {
parent.children.push(node);
}
} else if (node.areaId != 0) {
tree.push(node);
}
});
return tree;
},
tenantIdnormalizer(node, instanceId) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.id,
label: node.brokerName,
children: node.children
}
},
getbrokerList() {
listBrokerByTree().then(response => {
this.brokerList = response.data;
});
},
getAllIds(data) {
let ids = [];
// id
ids.push(data.id);
// children children
if (data.children && Array.isArray(data.children)) {
// children
data.children.forEach(child => {
// getAllIds id ids
ids = ids.concat(this.getAllIds(child));
});
}
return ids;
},
handleSortChange(col) {
this.$sortBy(col, this.queryParams);
this.getList();
},
/** 查询用户列表 */
getList() {
this.loading = true;
listUserByType(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
this.userList = response.rows;
this.total = response.total;
this.loading = false;
}
);
},
/** 查询部门下拉树结构 */
getDeptTree() {
deptTreeSelect().then(response => {
this.deptOptions = response.data;
});
},
//
filterNode(value, data) {
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
//
handleNodeClick(data) {
this.queryParams.deptId = data.id;
this.handleQuery();
},
//
handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用";
this.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
return changeUserStatus(row.userId, row.status);
}).then(() => {
this.$modal.msgSuccess(text + "成功");
}).catch(function () {
row.status = row.status === "0" ? "1" : "0";
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
userId: undefined,
deptId: undefined,
userName: undefined,
nickName: undefined,
password: undefined,
phonenumber: undefined,
email: undefined,
sex: undefined,
status: "0",
remark: undefined,
postIds: [],
roleIds: [],
identityCard: null,
city: null,
brokerName: null,
registrationTime: null,
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.userId);
this.single = selection.length != 1;
this.multiple = !selection.length;
},
//
handleCommand(command, row) {
switch (command) {
case "handleResetPwd":
this.handleResetPwd(row);
break;
case "handleAuthRole":
this.handleAuthRole(row);
break;
default:
break;
}
},
/** 新增按钮操作 */
// handleAdd() {
// this.getbrokerList();
// this.reset();
// getUser().then(response => {
// this.postOptions = response.posts;
// this.roleOptions = response.roles;
// this.open = true;
// this.title = "";
// this.readonly = false;
// this.form.deptId = this.deptId;
// this.form.userType = "jj"
// this.form.password = this.initPassword;
// this.form.registrationTime = new Date();
// });
// },
handleRead(row) {
this.getbrokerList();
this.reset();
const userId = row.userId || this.ids;
getUser(userId).then(response => {
this.form = response.data || {};
if (this.form.deptId == 0) {
this.form.deptId = null;
}
this.postOptions = response.posts;
this.roleOptions = response.roles;
this.$set(this.form, "postIds", response.postIds);
this.$set(this.form, "roleIds", response.roleIds);
this.open = true;
this.readonly = true;
this.title = "查看用户";
this.form.password = "";
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.getbrokerList();
this.reset();
const userId = row.userId || this.ids;
getUser(userId).then(response => {
this.form = response.data;
this.postOptions = response.posts;
this.roleOptions = response.roles;
this.$set(this.form, "postIds", response.postIds);
this.$set(this.form, "roleIds", response.roleIds);
this.open = true;
this.readonly = false;
this.title = "修改用户";
this.form.password = "";
});
},
/** 重置密码按钮操作 */
handleResetPwd(row) {
this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
closeOnClickModal: false,
inputPattern: /^.{5,20}$/,
inputErrorMessage: "用户密码长度必须介于 5 和 20 之间"
}).then(({value}) => {
resetUserPwd(row.userId, value).then(response => {
this.$modal.msgSuccess("修改成功,新密码是:" + value);
});
}).catch(() => {
});
},
/** 分配角色操作 */
handleAuthRole: function (row) {
const userId = row.userId;
this.$router.push("/system/user-auth/role/" + userId);
},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.userId != undefined) {
updateUser(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addUser(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const userIds = row.userId ? [row.userId] : this.ids;
this.$modal.confirm('是否确认从经纪人移出这些用户?').then(function () {
return removeBrokers({
userIds,
});
}).then(() => {
this.getList();
this.$modal.msgSuccess("移出成功");
}).catch(() => {
});
},
/** 导出按钮操作 */
handleExport() {
this.download('system/user/exportByType', {
...this.queryParams
}, `代理商经纪用户数据_${new Date().getTime()}.xlsx`)
},
/** 导入按钮操作 */
handleImport() {
this.upload.title = "用户导入";
this.upload.open = true;
},
/** 下载模板操作 */
importTemplate() {
this.download('system/user/importTemplate', {}, `user_template_${new Date().getTime()}.xlsx`)
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
//
handleFileSuccess(response, file, fileList) {
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true});
this.getList();
},
//
submitFileForm() {
this.$refs.upload.submit();
}
}
};
</script>

@ -0,0 +1,101 @@
<template>
<el-dialog
:close-on-click-modal="false"
:close-on-press-escape="false"
:visible.sync="dialogVisible"
:title="title"
>
<el-table
v-loading="loading" :data="list" style="width: 100%">
<el-table-column prop="avatarLink" label="头像" width="80">
<template slot-scope="scope">
<img :src="getAvatar(scope.row)" class="avatar" style="width: 40px; height: 40px; border-radius: 50%"/>
</template>
</el-table-column>
<el-table-column prop="nickName" label="姓名" width="180"></el-table-column>
<el-table-column prop="phone" label="电话" min-width="180"></el-table-column>
<!-- <el-table-column prop="address" label="地址"></el-table-column> -->
</el-table>
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="goChangeUser" >经纪人转移</el-button>
<el-button @click="cancel"> </el-button>
</div>
<BrokerChange ref="brokerChange" :oldBroker="queryParams.brokerId" @changeUser="changeUser"></BrokerChange>
</el-dialog>
</template>
<script>
import { pageListClueVisitsNum } from "@/api/biz/clue";
import BrokerChange from "./BrokerChange";
export default {
name: 'ClientList',
components: { BrokerChange },
data() {
return {
loading: false,
dialogVisible: false,
title: '经纪人客户',
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
hasOrder: '1',
dataType: '0',
brokerId: '',
},
list: [],
currentRow: {},
}
},
methods: {
show(row) {
this.currentRow = row || {};
this.list = [];
this.queryParams.brokerId = this.currentRow.userId;
this.dialogVisible = true;
this.getList();
},
cancel() {
this.dialogVisible = false
},
getAvatar(row) {
if (!row.avatarLink) {
return require("@/assets/images/profile.jpg");
}
if (row.avatarLink.indexOf('http') === 0) {
return row.avatarLink;
}
return process.env.VUE_APP_BASE_API + row.avatarLink;
},
getList() {
this.loading = true;
pageListClueVisitsNum(this.queryParams).then(response => {
this.list = response.rows || [];
this.total = response.total;
this.loading = false;
}).catch(e => {
this.loading = false;
});
},
goChangeUser() {
this.$refs.brokerChange.show();
},
changeUser() {
this.getList();
}
}
}
</script>
<style>
</style>

@ -0,0 +1,179 @@
<template>
<div ref="list">
<el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" v-show="showSearch" label-width="95px" >
<el-form-item label="经纪人" prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入经纪人"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="userList" @sort-change="handleSortChange" :height="340" ref="table"
@selection-change="handleSelectionChange" row-key="id" :highlight-current-row="true" @row-click="handleRowClick" >
<el-table-column label="经纪人" prop="userName" sortable='custom' min-width="200px"/>
<el-table-column label="真实姓名" prop="realName" sortable='custom' min-width="200px"/>
</el-table>
<pagination
size="small"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
layout=" prev, pager,next"
@pagination="getList"
/>
</div>
</template>
<script>
import {
listUser
} from "@/api/system/user";
import AutoTableHeight from '@/views/broker/AutoTableHeight';
import {changeUserStatus} from "@/api/system/user";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
name: "DfBroker",
mixins: [AutoTableHeight],
dicts: ["df_broker_staus","sys_yes_no"],
components: {Treeselect},
data() {
return {
readonly:false,
//
loading: true,
//
ids: [],
//
names: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
userList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
userName: undefined,
phonenumber: undefined,
status: undefined,
deptId: undefined,
userType: "jj",
},
//
form: {},
//
rules: {
brokerName: [
{required: true, message: "代理商名称不能为空", trigger: "blur"}
],
isInstitution: [
{required: true, message: "是否机构不能为空", trigger: "blur"}
],
staus: [
{required: true, message: "状态不能为空", trigger: "blur"}
],
}
};
},
created() {
this.getList();
},
methods: {
clearSelection() {
this.resetQuery();
},
tenantIdnormalizer(node, instanceId) {
if (node.children && !node.children.length) {
delete node.children
}
return {
id: node.id,
label: node.brokerName,
children: node.children
}
},
//
handleRowClick(row) {
this.$emit('row-click', row);
},
/** 查询代理商经纪列表 */
getList() {
this.loading = true;
this.queryParams.isBroker = "Y";
listUser(this.queryParams).then(response => {
this.userList = response.rows;
this.total = response.total;
this.loading = false;
}).catch(e => {
this.loading = false;
});
// listBrokerByTree().then(response => {
// this.brokerOptions = response.data;
// });
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
parentId: null,
brokerName: null,
brokerAddress: null,
brokerDesc: null,
orderNum: null,
chargePerson: null,
contactPhone: null,
email: null,
isInstitution: null,
staus: null,
remark: null,
};
this.resetForm("form");
},
//
handleSortChange(col) {
this.$sortBy(col, this.queryParams);
this.getList();
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.names = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
}
};
</script>

@ -0,0 +1,133 @@
<template>
<el-dialog title="选择用户进行添加" :visible.sync="open" width="70%" append-to-body :close-on-click-modal="false">
<div>
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
<el-form-item label="登录账号" prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入登录账号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="真实姓名" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入真实姓名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input
v-model="queryParams.phonenumber"
placeholder="请输入手机号码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<!-- <el-table-column type="index" width="50" align="center" :index="customIndex" /> -->
<el-table-column label="登录账号" align="center" key="userName" prop="userName" min-width="100" :show-overflow-tooltip="true" />
<el-table-column label="真实姓名" align="center" key="realName" prop="realName" min-width="100" :show-overflow-tooltip="true" />
<el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" min-width="100" :show-overflow-tooltip="true" />
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" min-width="120" />
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
<div slot="footer" class="dialog-footer">
<el-button v-loading="saving" type="primary" @click="submitForm" > </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { listUser, updateBroker,listByNotBroker } from "@/api/system/user";
export default {
name: 'NoBrokerUser',
data() {
return {
open: false,
loading: false,
saving: false,
userList: [],
list: [],
total: 0,
queryParams: { pageNum: 1, pageSize: 10, hasBroker: '0' },
currentBrokerId: null,
}
},
methods: {
show(brokerId) {
this.currentBrokerId = brokerId;
this.list = [];
this.open = true;
this.resetQuery();
},
cancel() {
this.open = false;
},
getList() {
this.loading = true;
listByNotBroker(this.queryParams).then(response => {
this.userList = response.rows;
this.total = response.total;
this.loading = false;
}).catch(e => {
this.loading = false;
});
},
handleSelectionChange(val) {
this.list = val;
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = { pageNum: 1, pageSize: 10, hasBroker: '0' };
this.resetForm("queryForm");
this.handleQuery();
},
submitForm() {
if (!this.currentBrokerId || this.list.length === 0) {
return;
}
this.saving = true;
updateBroker({
brokerId: this.currentBrokerId,
userIds: this.list.map(item => item.userId)
}).then(response => {
this.saving = false;
this.$modal.msgSuccess("添加成功");
this.open = false;
this.$emit('success');
}).catch(e => {
this.saving = false;
});
}
}
}
</script>
<style>
</style>

@ -1,280 +1,31 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="客户id" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入客户id"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="经纪id" prop="brokerId">
<el-input
v-model="queryParams.brokerId"
placeholder="请输入经纪id"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['user:broker:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['user:broker:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['user:broker:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['user:broker:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="brokerList" @sort-change="handleSortChange" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="id" align="center" prop="id" sortable='custom' />
<el-table-column label="客户id" align="center" prop="userId" sortable='custom' />
<el-table-column label="经纪id" align="center" prop="brokerId" sortable='custom' />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['user:broker:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['user:broker:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
hide-on-single-page
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改客户经纪对话框 -->
<el-dialog :title="title" :visible.sync="open" width="70%" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-col :span="12">
<el-form-item label="客户id" prop="userId">
<el-input v-model="form.userId" placeholder="请输入客户id" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经纪id" prop="brokerId">
<el-input v-model="form.brokerId" placeholder="请输入经纪id" />
</el-form-item>
</el-col>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
<my-page :left-style="{width: '20vw'}">
<template slot="left">
<DfBroker ref="dfBroker" style="height: 100%;width:100%;" @row-click="handleRowClick"></DfBroker>
</template>
<BrokerUserVo ref="brokerUser" :extraHeight="100" style="height: 97%;margin-left: 8px;" :rowData="rowData"></BrokerUserVo>
</my-page>
</template>
<script>
import { pageListBroker, getBroker, delBroker, addBroker, updateBroker } from "@/api/user/broker";
import BrokerUserVo from './components/BrokerUser.vue';
import DfBroker from './components/DfBroker.vue';
export default {
name: "Broker",
data() {
return {
//
loading: true,
//
ids: [],
//
names: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
brokerList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
userId: null,
brokerId: null,
},
//
form: {},
//
rules: {
userId: [
{ required: true, message: "客户id不能为空", trigger: "blur" }
],
brokerId: [
{ required: true, message: "经纪id不能为空", trigger: "blur" }
],
}
};
},
created() {
this.getList();
},
methods: {
/** 查询客户经纪列表 */
getList() {
this.loading = true;
pageListBroker(this.queryParams).then(response => {
this.brokerList = response.rows;
this.total = response.total;
this.loading = false;
}).catch(e => {
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
userId: null,
brokerId: null,
};
this.resetForm("form");
},
//
handleSortChange(col) {
this.$sortBy(col, this.queryParams);
this.getList();
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.names = selection.map(item => item.id);
this.single = selection.length!==1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加客户经纪";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids;
getBroker(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改客户经纪";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateBroker(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addBroker(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
const names = row.id || this.names;
this.$modal.confirm('是否确认删除客户经纪为"' + names + '"的数据项?').then(function() {
return delBroker(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('user/broker/export', {
...this.queryParams
}, `broker_${new Date().getTime()}.xlsx`)
}
export default {
name: "UserBroker",
components: {
BrokerUserVo,
DfBroker,
},
data() {
return {
rowData: null
};
},
methods: {
handleRowClick(row) {
this.rowData = row;// row
}
}
};
};
</script>

Loading…
Cancel
Save