记得上下班打卡 | git大法好,push需谨慎

Commit abfb181d authored by wangyifan's avatar wangyifan

草莓护照-护照管理

parent 55569119
package com.liquidnet.service.adam.dto.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("草莓护照-护照管理搜索参数")
public class AdamCaomeiPassportSearchParam {
@ApiModelProperty(value = "护照编号")
private String passportNo;
@ApiModelProperty(value = "关联用户名(昵称/真实姓名模糊)")
private String userName;
@ApiModelProperty(value = "手机号")
private String mobile;
@ApiModelProperty(value = "证件号")
private String idCard;
@ApiModelProperty(value = "绑定状态:0-未绑定 1-已绑定 2-已作废,空为全部")
private Integer bindStatus;
}
package com.liquidnet.service.adam.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("草莓护照-用户已领徽章项")
public class AdamCaomeiPassportBadgeItemVo {
@ApiModelProperty(value = "徽章ID")
private String badgeId;
@ApiModelProperty(value = "徽章名称")
private String badgeName;
@ApiModelProperty(value = "图标")
private String icon;
@ApiModelProperty(value = "领取时间")
private Date claimedAt;
@ApiModelProperty(value = "获取途径 source")
private Integer source;
}
package com.liquidnet.service.adam.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
@ApiModel("草莓护照-护照详情")
public class AdamCaomeiPassportDetailVo {
@ApiModelProperty(value = "护照主键")
private Long mid;
@ApiModelProperty(value = "护照编号")
private String passportNo;
@ApiModelProperty(value = "绑定状态")
private Integer status;
@ApiModelProperty(value = "绑定用户uid")
private String userId;
@ApiModelProperty(value = "首次绑定时间")
private Date boundAt;
@ApiModelProperty(value = "批次号")
private String batchNo;
@ApiModelProperty(value = "用户昵称")
private String nickname;
@ApiModelProperty(value = "手机号(脱敏)")
private String mobile;
@ApiModelProperty(value = "真实姓名")
private String realName;
@ApiModelProperty(value = "证件号(脱敏)")
private String idCard;
@ApiModelProperty(value = "已领取徽章")
private List<AdamCaomeiPassportBadgeItemVo> badges;
}
package com.liquidnet.service.adam.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("草莓护照-护照管理列表")
public class AdamCaomeiPassportListVo {
@ApiModelProperty(value = "主键")
private Long mid;
@ApiModelProperty(value = "护照ID/编号")
private String passportNo;
@ApiModelProperty(value = "关联用户昵称")
private String nickname;
@ApiModelProperty(value = "真实姓名")
private String realName;
@ApiModelProperty(value = "手机号(脱敏)")
private String mobile;
@ApiModelProperty(value = "证件号(脱敏)")
private String idCard;
@ApiModelProperty(value = "绑定状态 0未绑定 1已绑定 2已作废")
private Integer bindStatus;
@ApiModelProperty(value = "已领取徽章数")
private Integer claimedBadgeCount;
}
...@@ -126,6 +126,18 @@ public class BaseController ...@@ -126,6 +126,18 @@ public class BaseController
return rspData; return rspData;
} }
/**
* 响应分页数据(用于查询结果已转为 VO 列表,但需保留 PageHelper 总条数的场景)
*/
protected TableDataInfo getDataTable(PageInfo<?> pageInfo)
{
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(0);
rspData.setRows(pageInfo.getList());
rspData.setTotal(pageInfo.getTotal());
return rspData;
}
/** /**
* 响应返回结果 * 响应返回结果
* *
......
...@@ -10,8 +10,7 @@ import com.liquidnet.commons.lang.util.IDGenerator; ...@@ -10,8 +10,7 @@ import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeParam; import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeParam;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeClaimUserSearchParam; import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeClaimUserSearchParam;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeSearchParam; import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeSearchParam;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeClaimUserVo; import com.github.pagehelper.PageInfo;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeVo;
import com.liquidnet.service.adam.entity.AdamCaomeiBadge; import com.liquidnet.service.adam.entity.AdamCaomeiBadge;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -23,8 +22,6 @@ import org.springframework.ui.ModelMap; ...@@ -23,8 +22,6 @@ import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Date; import java.util.Date;
import java.util.List;
@Api(tags = "草莓护照-徽章管理") @Api(tags = "草莓护照-徽章管理")
@Controller @Controller
@RequestMapping("adam/caomei/badge") @RequestMapping("adam/caomei/badge")
...@@ -46,8 +43,8 @@ public class AdamCaomeiBadgeController extends BaseController { ...@@ -46,8 +43,8 @@ public class AdamCaomeiBadgeController extends BaseController {
@ResponseBody @ResponseBody
public TableDataInfo list(AdamCaomeiBadgeSearchParam param) { public TableDataInfo list(AdamCaomeiBadgeSearchParam param) {
startPage(); startPage();
List<AdamCaomeiBadgeVo> voList = adamCaomeiBadgeAdminService.listWithClaimedCount(param); PageInfo<?> pageInfo = adamCaomeiBadgeAdminService.listWithClaimedCount(param);
return getDataTable(voList); return getDataTable(pageInfo);
} }
@GetMapping("add") @GetMapping("add")
...@@ -102,8 +99,8 @@ public class AdamCaomeiBadgeController extends BaseController { ...@@ -102,8 +99,8 @@ public class AdamCaomeiBadgeController extends BaseController {
@ResponseBody @ResponseBody
public TableDataInfo claimUsersList(AdamCaomeiBadgeClaimUserSearchParam param) { public TableDataInfo claimUsersList(AdamCaomeiBadgeClaimUserSearchParam param) {
startPage(); startPage();
List<AdamCaomeiBadgeClaimUserVo> list = adamCaomeiBadgeAdminService.listClaimUsers(param); PageInfo<?> pageInfo = adamCaomeiBadgeAdminService.listClaimUsers(param);
return getDataTable(list); return getDataTable(pageInfo);
} }
@GetMapping("edit/{mid}") @GetMapping("edit/{mid}")
......
package com.liquidnet.client.admin.web.controller.zhengzai.adam;
import com.liquidnet.client.admin.common.annotation.Log;
import com.liquidnet.client.admin.common.core.controller.BaseController;
import com.liquidnet.client.admin.common.core.domain.AjaxResult;
import com.liquidnet.client.admin.common.core.page.TableDataInfo;
import com.liquidnet.client.admin.common.enums.BusinessType;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamCaomeiPassportAdminService;
import com.liquidnet.service.adam.dto.param.AdamCaomeiPassportSearchParam;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiPassportDetailVo;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
@Api(tags = "草莓护照-护照管理")
@Controller
@RequestMapping("adam/caomei/passport")
public class AdamCaomeiPassportController extends BaseController {
private final String prefix = "zhengzai/adam/caomei/passport";
@Autowired
private IAdamCaomeiPassportAdminService adamCaomeiPassportAdminService;
@RequiresPermissions("adam:caomei:passport:view")
@GetMapping()
public String view() {
return prefix + "/passport_list";
}
@RequiresPermissions("adam:caomei:passport:list")
@PostMapping("list")
@ResponseBody
public TableDataInfo list(AdamCaomeiPassportSearchParam param) {
startPage();
PageInfo<?> pageInfo = adamCaomeiPassportAdminService.listPassports(param);
return getDataTable(pageInfo);
}
@RequiresPermissions("adam:caomei:passport:detail")
@GetMapping("detail/{passportNo}")
public String detail(@PathVariable("passportNo") String passportNo, ModelMap mmap) {
AdamCaomeiPassportDetailVo detail = adamCaomeiPassportAdminService.getPassportDetail(passportNo);
mmap.put("detail", detail);
return prefix + "/passport_detail";
}
@RequiresPermissions("adam:caomei:passport:unbind")
@Log(title = "草莓护照-护照解绑", businessType = BusinessType.UPDATE)
@PostMapping("unbind")
@ResponseBody
public AjaxResult unbind(@RequestParam("passportNo") String passportNo) {
boolean ok = adamCaomeiPassportAdminService.unbindPassport(passportNo);
if (!ok) {
return error("解绑失败:护照不存在或当前未绑定用户");
}
return success();
}
}
...@@ -19,11 +19,15 @@ ...@@ -19,11 +19,15 @@
var options = { var options = {
url: prefix + "/claimUsers/list", url: prefix + "/claimUsers/list",
queryParams: function(params) { queryParams: function(params) {
return { var curParams = {
pageSize: params.limit, pageSize: params.limit,
pageNum: params.offset / params.limit + 1, pageNum: params.offset / params.limit + 1,
searchValue: params.search,
orderByColumn: params.sort,
isAsc: params.order,
badgeId: $("#badgeId").val() badgeId: $("#badgeId").val()
}; };
return curParams;
}, },
modalName: "领取用户", modalName: "领取用户",
columns: [ columns: [
......
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:include="include :: header('护照详情')" />
</head>
<body class="gray-bg">
<div class="container-div" th:if="${detail != null}">
<div class="row">
<div class="col-sm-12">
<div class="ibox">
<div class="ibox-title"><h5>护照信息</h5></div>
<div class="ibox-content">
<table class="table table-bordered table-striped">
<tbody>
<tr><td class="col-sm-2">护照编号</td><td th:text="${detail.passportNo}">-</td></tr>
<tr><td>绑定状态</td>
<td>
<span th:if="${detail.status == 1}" class="label label-info">已绑定</span>
<span th:if="${detail.status == 0}" class="label label-default">未绑定</span>
<span th:if="${detail.status == 2}" class="label label-warning">已作废</span>
</td>
</tr>
<tr><td>批次号</td><td th:text="${detail.batchNo != null ? detail.batchNo : '-'}">-</td></tr>
<tr><td>首次绑定时间</td><td th:text="${detail.boundAt != null ? #dates.format(detail.boundAt, 'yyyy-MM-dd HH:mm:ss') : '-'}">-</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-sm-12" th:if="${detail.userId != null and detail.userId != ''}">
<div class="ibox">
<div class="ibox-title"><h5>关联用户信息</h5></div>
<div class="ibox-content">
<table class="table table-bordered table-striped">
<tbody>
<tr><td class="col-sm-2">用户ID</td><td th:text="${detail.userId}">-</td></tr>
<tr><td>昵称</td><td th:text="${detail.nickname}">-</td></tr>
<tr><td>手机号</td><td th:text="${detail.mobile}">-</td></tr>
<tr><td>真实姓名</td><td th:text="${detail.realName}">-</td></tr>
<tr><td>证件号</td><td th:text="${detail.idCard}">-</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-sm-12" th:if="${detail.userId == null or detail.userId == ''}">
<div class="alert alert-info">当前护照未绑定用户</div>
</div>
<div class="col-sm-12" th:if="${detail.badges != null and !#lists.isEmpty(detail.badges)}">
<div class="ibox">
<div class="ibox-title"><h5>已领取徽章</h5></div>
<div class="ibox-content">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>徽章名称</th>
<th>图标</th>
<th>领取时间</th>
<th>获取途径</th>
</tr>
</thead>
<tbody>
<tr th:each="b : ${detail.badges}">
<td th:text="${b.badgeName}">-</td>
<td>
<span th:if="${b.icon != null and (b.icon.startsWith('http') or b.icon.startsWith('/'))}">
<img th:src="${b.icon}" style="max-height:28px;"/>
</span>
<span th:if="${b.icon != null and !(b.icon.startsWith('http') or b.icon.startsWith('/'))}" th:text="${b.icon}" style="font-size:22px;"></span>
</td>
<td th:text="${b.claimedAt != null ? #dates.format(b.claimedAt, 'yyyy-MM-dd HH:mm:ss') : '-'}">-</td>
<td>
<span th:if="${b.source == 1}">绑定护照自动发放</span>
<span th:if="${b.source == 2}">购票自动发放</span>
<span th:if="${b.source == 3}">补签审核通过</span>
<span th:if="${b.source == 4}">现场管理员手动发放</span>
<span th:if="${b.source == null or b.source &lt; 1 or b.source &gt; 4}">未知</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="container-div" th:if="${detail == null}">
<div class="alert alert-warning">未找到护照信息</div>
</div>
<th:block th:include="include :: footer" />
</body>
</html>
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('护照管理')" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="col-sm-12 search-collapse">
<form id="formId">
<div class="select-list">
<ul>
<li>
<label>护照编号:</label>
<input type="text" name="passportNo" placeholder="模糊匹配"/>
</li>
<li>
<label>绑定状态:</label>
<select name="bindStatus">
<option value="">全部</option>
<option value="1">已绑定</option>
<option value="0">未绑定</option>
<option value="2">已作废</option>
</select>
</li>
<li>
<label>用户昵称/姓名:</label>
<input type="text" name="userName" placeholder="昵称或真实姓名"/>
</li>
<li>
<label>手机号:</label>
<input type="text" name="mobile" placeholder="完整或片段"/>
</li>
<li>
<label>证件号:</label>
<input type="text" name="idCard" placeholder="完整或片段"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var unbindFlag = [[${@permission.hasPermi('adam:caomei:passport:unbind')}]];
var detailFlag = [[${@permission.hasPermi('adam:caomei:passport:detail')}]];
var prefix = ctx + "adam/caomei/passport";
$(function() {
var options = {
url: prefix + "/list",
formId: "formId",
modalName: "护照",
columns: [
{ field: 'mid', title: '主键', visible: false },
{ field: 'passportNo', title: '护照ID' },
{
field: 'nickname',
title: '关联用户',
formatter: function(value, row, index) {
if (!value && row.bindStatus !== 1) {
return '<span class="text-muted">未绑定用户</span>';
}
return value || '-';
}
},
{ field: 'realName', title: '姓名', formatter: function(v) { return v || '-'; } },
{ field: 'mobile', title: '手机号', formatter: function(v) { return v || '-'; } },
{ field: 'idCard', title: '证件号', formatter: function(v) { return v || '-'; } },
{
field: 'bindStatus',
title: '绑定状态',
align: 'center',
formatter: function(value) {
if (value === 1) {
return '<span class="label label-info">已绑定</span>';
}
if (value === 0) {
return '<span class="label label-default">未绑定</span>';
}
if (value === 2) {
return '<span class="label label-warning">已作废</span>';
}
return value;
}
},
{ field: 'claimedBadgeCount', title: '已领取徽章数', align: 'center' },
{
title: '操作',
align: 'center',
formatter: function(value, row) {
var actions = [];
actions.push('<a class="btn btn-info btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick=\'openDetail(' + JSON.stringify(row.passportNo) + ')\'><i class="fa fa-eye"></i>查看详情</a> ');
if (row.bindStatus === 1) {
actions.push('<a class="btn btn-warning btn-xs ' + unbindFlag + '" href="javascript:void(0)" onclick=\'unbind(' + JSON.stringify(row.passportNo) + ')\'><i class="fa fa-unlink"></i>解绑用户</a>');
}
return actions.join('');
}
}
]
};
$.table.init(options);
});
function openDetail(passportNo) {
$.modal.openTab("护照详情", prefix + "/detail/" + encodeURIComponent(passportNo));
}
function unbind(passportNo) {
$.modal.confirm("解绑后该护照将变为未绑定状态,用户需重新绑定。确认解绑?", function() {
$.operate.post(prefix + "/unbind", { passportNo: passportNo });
});
}
</script>
</body>
</html>
package com.liquidnet.client.admin.zhengzai.adam.service; package com.liquidnet.client.admin.zhengzai.adam.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeClaimUserSearchParam; import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeClaimUserSearchParam;
import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeSearchParam; import com.liquidnet.service.adam.dto.param.AdamCaomeiBadgeSearchParam;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeClaimUserVo; import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeClaimUserVo;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeVo; import com.liquidnet.service.adam.dto.vo.AdamCaomeiBadgeVo;
import com.liquidnet.service.adam.entity.AdamCaomeiBadge; import com.liquidnet.service.adam.entity.AdamCaomeiBadge;
import java.util.List;
/** /**
* 草莓护照-徽章管理 * 草莓护照-徽章管理
*/ */
...@@ -19,12 +18,12 @@ public interface IAdamCaomeiBadgeAdminService extends IService<AdamCaomeiBadge> ...@@ -19,12 +18,12 @@ public interface IAdamCaomeiBadgeAdminService extends IService<AdamCaomeiBadge>
* @param param * @param param
* @return * @return
*/ */
List<AdamCaomeiBadgeVo> listWithClaimedCount(AdamCaomeiBadgeSearchParam param); PageInfo<AdamCaomeiBadgeVo> listWithClaimedCount(AdamCaomeiBadgeSearchParam param);
/** /**
* 徽章领取用户列表 * 徽章领取用户列表
* @param param * @param param
* @return * @return
*/ */
List<AdamCaomeiBadgeClaimUserVo> listClaimUsers(AdamCaomeiBadgeClaimUserSearchParam param); PageInfo<AdamCaomeiBadgeClaimUserVo> listClaimUsers(AdamCaomeiBadgeClaimUserSearchParam param);
} }
package com.liquidnet.client.admin.zhengzai.adam.service;
import com.github.pagehelper.PageInfo;
import com.liquidnet.service.adam.dto.param.AdamCaomeiPassportSearchParam;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiPassportDetailVo;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiPassportListVo;
/**
* 草莓护照-护照管理
*/
public interface IAdamCaomeiPassportAdminService {
PageInfo<AdamCaomeiPassportListVo> listPassports(AdamCaomeiPassportSearchParam param);
AdamCaomeiPassportDetailVo getPassportDetail(String passportNo);
boolean unbindPassport(String passportNo);
}
...@@ -3,6 +3,7 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl; ...@@ -3,6 +3,7 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageInfo;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamCaomeiBadgeAdminService; import com.liquidnet.client.admin.zhengzai.adam.service.IAdamCaomeiBadgeAdminService;
import com.liquidnet.service.adam.dto.AdamCaomeiBadgeClaimCountDto; import com.liquidnet.service.adam.dto.AdamCaomeiBadgeClaimCountDto;
import com.liquidnet.service.adam.dto.AdamCaomeiBadgeClaimUserDto; import com.liquidnet.service.adam.dto.AdamCaomeiBadgeClaimUserDto;
...@@ -26,7 +27,7 @@ import java.util.stream.Collectors; ...@@ -26,7 +27,7 @@ import java.util.stream.Collectors;
@Service @Service
public class AdamCaomeiBadgeAdminServiceImpl extends ServiceImpl<AdamCaomeiBadgeMapper, AdamCaomeiBadge> implements IAdamCaomeiBadgeAdminService { public class AdamCaomeiBadgeAdminServiceImpl extends ServiceImpl<AdamCaomeiBadgeMapper, AdamCaomeiBadge> implements IAdamCaomeiBadgeAdminService {
@Override @Override
public List<AdamCaomeiBadgeVo> listWithClaimedCount(AdamCaomeiBadgeSearchParam param) { public PageInfo<AdamCaomeiBadgeVo> listWithClaimedCount(AdamCaomeiBadgeSearchParam param) {
LambdaQueryWrapper<AdamCaomeiBadge> queryWrapper = Wrappers.lambdaQuery(AdamCaomeiBadge.class); LambdaQueryWrapper<AdamCaomeiBadge> queryWrapper = Wrappers.lambdaQuery(AdamCaomeiBadge.class);
if (StringUtils.isNotBlank(param.getName())) { if (StringUtils.isNotBlank(param.getName())) {
queryWrapper.like(AdamCaomeiBadge::getName, param.getName()); queryWrapper.like(AdamCaomeiBadge::getName, param.getName());
...@@ -40,11 +41,9 @@ public class AdamCaomeiBadgeAdminServiceImpl extends ServiceImpl<AdamCaomeiBadge ...@@ -40,11 +41,9 @@ public class AdamCaomeiBadgeAdminServiceImpl extends ServiceImpl<AdamCaomeiBadge
queryWrapper.orderByDesc(AdamCaomeiBadge::getSort, AdamCaomeiBadge::getUpdatedAt); queryWrapper.orderByDesc(AdamCaomeiBadge::getSort, AdamCaomeiBadge::getUpdatedAt);
List<AdamCaomeiBadge> badges = this.list(queryWrapper); List<AdamCaomeiBadge> badges = this.list(queryWrapper);
if (badges.isEmpty()) { PageInfo<AdamCaomeiBadge> entityPage = new PageInfo<>(badges);
return Collections.emptyList();
}
List<String> badgeIds = badges.stream() List<String> badgeIds = entityPage.getList().stream()
.map(AdamCaomeiBadge::getBadgeId) .map(AdamCaomeiBadge::getBadgeId)
.filter(StringUtils::isNotBlank) .filter(StringUtils::isNotBlank)
.collect(Collectors.toList()); .collect(Collectors.toList());
...@@ -54,24 +53,31 @@ public class AdamCaomeiBadgeAdminServiceImpl extends ServiceImpl<AdamCaomeiBadge ...@@ -54,24 +53,31 @@ public class AdamCaomeiBadgeAdminServiceImpl extends ServiceImpl<AdamCaomeiBadge
baseMapper.selectClaimedCountByBadgeIds(badgeIds).stream() baseMapper.selectClaimedCountByBadgeIds(badgeIds).stream()
.collect(Collectors.toMap(AdamCaomeiBadgeClaimCountDto::getBadgeId, AdamCaomeiBadgeClaimCountDto::getClaimedCount, (a, b) -> a)); .collect(Collectors.toMap(AdamCaomeiBadgeClaimCountDto::getBadgeId, AdamCaomeiBadgeClaimCountDto::getClaimedCount, (a, b) -> a));
return badges.stream().map(item -> { List<AdamCaomeiBadgeVo> voList = entityPage.getList().stream().map(item -> {
AdamCaomeiBadgeVo vo = new AdamCaomeiBadgeVo(); AdamCaomeiBadgeVo vo = new AdamCaomeiBadgeVo();
BeanUtils.copyProperties(item, vo); BeanUtils.copyProperties(item, vo);
vo.setClaimedCount(countMap.getOrDefault(item.getBadgeId(), 0)); vo.setClaimedCount(countMap.getOrDefault(item.getBadgeId(), 0));
return vo; return vo;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
PageInfo<AdamCaomeiBadgeVo> voPage = new PageInfo<>(voList);
voPage.setTotal(entityPage.getTotal());
return voPage;
} }
@Override @Override
public List<AdamCaomeiBadgeClaimUserVo> listClaimUsers(AdamCaomeiBadgeClaimUserSearchParam param) { public PageInfo<AdamCaomeiBadgeClaimUserVo> listClaimUsers(AdamCaomeiBadgeClaimUserSearchParam param) {
if (param == null || StringUtils.isBlank(param.getBadgeId())) { if (param == null || StringUtils.isBlank(param.getBadgeId())) {
return Collections.emptyList(); return new PageInfo<>(Collections.emptyList());
} }
List<AdamCaomeiBadgeClaimUserDto> list = baseMapper.selectClaimUsersByBadgeId(param.getBadgeId()); List<AdamCaomeiBadgeClaimUserDto> list = baseMapper.selectClaimUsersByBadgeId(param.getBadgeId());
return list.stream().map(item -> { PageInfo<AdamCaomeiBadgeClaimUserDto> dtoPage = new PageInfo<>(list);
List<AdamCaomeiBadgeClaimUserVo> voList = dtoPage.getList().stream().map(item -> {
AdamCaomeiBadgeClaimUserVo vo = new AdamCaomeiBadgeClaimUserVo(); AdamCaomeiBadgeClaimUserVo vo = new AdamCaomeiBadgeClaimUserVo();
BeanUtils.copyProperties(item, vo); BeanUtils.copyProperties(item, vo);
return vo; return vo;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
PageInfo<AdamCaomeiBadgeClaimUserVo> voPage = new PageInfo<>(voList);
voPage.setTotal(dtoPage.getTotal());
return voPage;
} }
} }
package com.liquidnet.client.admin.zhengzai.adam.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageInfo;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamCaomeiPassportAdminService;
import com.liquidnet.service.adam.dto.AdamCaomeiPassportListDto;
import com.liquidnet.service.adam.dto.AdamCaomeiPassportUserBadgeDto;
import com.liquidnet.service.adam.dto.param.AdamCaomeiPassportSearchParam;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiPassportBadgeItemVo;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiPassportDetailVo;
import com.liquidnet.service.adam.dto.vo.AdamCaomeiPassportListVo;
import com.liquidnet.service.adam.entity.AdamCaomeiPassport;
import com.liquidnet.service.adam.entity.AdamRealName;
import com.liquidnet.service.adam.entity.AdamUser;
import com.liquidnet.service.adam.entity.AdamUserInfo;
import com.liquidnet.service.adam.mapper.AdamCaomeiPassportMapper;
import com.liquidnet.service.adam.mapper.AdamRealNameMapper;
import com.liquidnet.service.adam.mapper.AdamUserInfoMapper;
import com.liquidnet.service.adam.mapper.AdamUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class AdamCaomeiPassportAdminServiceImpl implements IAdamCaomeiPassportAdminService {
@Autowired
private AdamCaomeiPassportMapper adamCaomeiPassportMapper;
@Autowired
private AdamUserMapper adamUserMapper;
@Autowired
private AdamUserInfoMapper adamUserInfoMapper;
@Autowired
private AdamRealNameMapper adamRealNameMapper;
@Override
public PageInfo<AdamCaomeiPassportListVo> listPassports(AdamCaomeiPassportSearchParam param) {
if (param == null) {
param = new AdamCaomeiPassportSearchParam();
}
List<AdamCaomeiPassportListDto> rows = adamCaomeiPassportMapper.selectPassportAdminList(
param.getPassportNo(),
param.getUserName(),
param.getMobile(),
param.getIdCard(),
param.getBindStatus()
);
PageInfo<AdamCaomeiPassportListDto> dtoPage = new PageInfo<>(rows);
List<AdamCaomeiPassportListVo> voList = dtoPage.getList().stream().map(d -> {
AdamCaomeiPassportListVo vo = new AdamCaomeiPassportListVo();
BeanUtils.copyProperties(d, vo);
return vo;
}).collect(Collectors.toList());
PageInfo<AdamCaomeiPassportListVo> voPage = new PageInfo<>(voList);
voPage.setTotal(dtoPage.getTotal());
return voPage;
}
@Override
public AdamCaomeiPassportDetailVo getPassportDetail(String passportNo) {
if (StringUtils.isBlank(passportNo)) {
return null;
}
AdamCaomeiPassport passport = adamCaomeiPassportMapper.selectOne(
Wrappers.lambdaQuery(AdamCaomeiPassport.class)
.eq(AdamCaomeiPassport::getPassportNo, passportNo.trim())
);
if (passport == null) {
return null;
}
AdamCaomeiPassportDetailVo vo = new AdamCaomeiPassportDetailVo();
vo.setMid(passport.getMid());
vo.setPassportNo(passport.getPassportNo());
vo.setStatus(passport.getStatus());
vo.setUserId(passport.getUserId());
vo.setBoundAt(passport.getBoundAt());
vo.setBatchNo(passport.getBatchNo());
String uid = passport.getUserId();
if (StringUtils.isBlank(uid)) {
vo.setBadges(Collections.emptyList());
return vo;
}
AdamUser user = adamUserMapper.selectOne(Wrappers.lambdaQuery(AdamUser.class).eq(AdamUser::getUid, uid));
AdamUserInfo userInfo = adamUserInfoMapper.selectOne(Wrappers.lambdaQuery(AdamUserInfo.class).eq(AdamUserInfo::getUid, uid));
vo.setNickname(userInfo != null ? StringUtils.defaultString(userInfo.getNickname()) : "");
vo.setMobile(user != null ? maskMobile(user.getMobile()) : "");
AdamRealName realName = adamRealNameMapper.selectOne(
Wrappers.lambdaQuery(AdamRealName.class)
.eq(AdamRealName::getUid, uid)
.eq(AdamRealName::getState, 1)
.orderByDesc(AdamRealName::getMid)
.last("limit 1")
);
if (realName != null) {
vo.setRealName(StringUtils.defaultString(realName.getName()));
vo.setIdCard(maskIdCard(realName.getIdCard()));
} else {
vo.setRealName("");
vo.setIdCard("");
}
List<AdamCaomeiPassportUserBadgeDto> badgeRows = adamCaomeiPassportMapper.selectUserBadgesByUid(uid);
vo.setBadges(badgeRows.stream().map(b -> {
AdamCaomeiPassportBadgeItemVo item = new AdamCaomeiPassportBadgeItemVo();
item.setBadgeId(b.getBadgeId());
item.setBadgeName(b.getBadgeName());
item.setIcon(b.getIcon());
item.setClaimedAt(b.getClaimedAt());
item.setSource(b.getSource());
return item;
}).collect(Collectors.toList()));
return vo;
}
@Override
public boolean unbindPassport(String passportNo) {
if (StringUtils.isBlank(passportNo)) {
return false;
}
AdamCaomeiPassport passport = adamCaomeiPassportMapper.selectOne(
Wrappers.lambdaQuery(AdamCaomeiPassport.class)
.eq(AdamCaomeiPassport::getPassportNo, passportNo.trim())
);
if (passport == null) {
return false;
}
if (passport.getStatus() == null || passport.getStatus() != 1) {
return false;
}
Date now = new Date();
passport.setStatus(0);
passport.setUserId("");
passport.setUnboundAt(now);
passport.setUpdatedAt(now);
return adamCaomeiPassportMapper.updateById(passport) > 0;
}
private static String maskMobile(String mobile) {
if (StringUtils.isBlank(mobile)) {
return "";
}
if (mobile.length() >= 11) {
return mobile.substring(0, 3) + "****" + mobile.substring(7);
}
return mobile;
}
private static String maskIdCard(String idCard) {
if (StringUtils.isBlank(idCard)) {
return "";
}
if (idCard.length() > 8) {
return idCard.substring(0, 4) + "****" + idCard.substring(idCard.length() - 4);
}
return "****";
}
}
package com.liquidnet.service.adam.dto;
import lombok.Data;
/**
* 护照管理列表行
*/
@Data
public class AdamCaomeiPassportListDto {
private Long mid;
private String passportNo;
private String nickname;
private String realName;
private String mobile;
private String idCard;
/** 0-未绑定 1-已绑定 2-已作废 */
private Integer bindStatus;
private Integer claimedBadgeCount;
}
package com.liquidnet.service.adam.dto;
import lombok.Data;
import java.util.Date;
@Data
public class AdamCaomeiPassportUserBadgeDto {
private String badgeId;
private String badgeName;
private String icon;
private Date claimedAt;
private Integer source;
}
package com.liquidnet.service.adam.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 草莓护照-实体编号表
*/
@Data
@TableName("adam_caomei_passport")
public class AdamCaomeiPassport implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
private String passportNo;
/**
* 绑定状态: 0-未绑定, 1-已绑定, 2-已作废
*/
private Integer status;
private String userId;
private Date boundAt;
private Date unboundAt;
private String batchNo;
private String remark;
private Date createdAt;
private Date updatedAt;
}
package com.liquidnet.service.adam.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.adam.dto.AdamCaomeiPassportListDto;
import com.liquidnet.service.adam.dto.AdamCaomeiPassportUserBadgeDto;
import com.liquidnet.service.adam.entity.AdamCaomeiPassport;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface AdamCaomeiPassportMapper extends BaseMapper<AdamCaomeiPassport> {
List<AdamCaomeiPassportListDto> selectPassportAdminList(@Param("passportNo") String passportNo,
@Param("userName") String userName,
@Param("mobile") String mobile,
@Param("idCard") String idCard,
@Param("bindStatus") Integer bindStatus);
List<AdamCaomeiPassportUserBadgeDto> selectUserBadgesByUid(@Param("uid") String uid);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.service.adam.mapper.AdamCaomeiPassportMapper">
<select id="selectPassportAdminList" resultType="com.liquidnet.service.adam.dto.AdamCaomeiPassportListDto">
SELECT
p.mid AS mid,
p.passport_no AS passportNo,
IFNULL(ui.nickname, '') AS nickname,
IFNULL(arn.name, '') AS realName,
CASE
WHEN u.mobile IS NULL OR u.mobile = '' THEN ''
WHEN CHAR_LENGTH(u.mobile) &gt;= 11 THEN CONCAT(SUBSTRING(u.mobile, 1, 3), '****', SUBSTRING(u.mobile, 8, 4))
ELSE u.mobile
END AS mobile,
CASE
WHEN arn.id_card IS NULL OR arn.id_card = '' THEN ''
WHEN CHAR_LENGTH(arn.id_card) &gt; 8 THEN CONCAT(SUBSTRING(arn.id_card, 1, 4), '****', SUBSTRING(arn.id_card, CHAR_LENGTH(arn.id_card) - 3, 4))
ELSE '****'
END AS idCard,
p.status AS bindStatus,
IFNULL(bc.cnt, 0) AS claimedBadgeCount
FROM adam_caomei_passport p
LEFT JOIN adam_user u ON p.user_id = u.uid AND p.user_id &lt;&gt; ''
LEFT JOIN adam_user_info ui ON p.user_id = ui.uid
LEFT JOIN (
SELECT r.uid, r.name, r.id_card
FROM adam_real_name r
INNER JOIN (
SELECT uid, MAX(mid) AS max_mid
FROM adam_real_name
WHERE state = 1
GROUP BY uid
) rm ON r.uid = rm.uid AND r.mid = rm.max_mid AND r.state = 1
) arn ON p.user_id = arn.uid
LEFT JOIN (
SELECT user_id, COUNT(1) AS cnt
FROM adam_caomei_user_badge
GROUP BY user_id
) bc ON p.user_id = bc.user_id
<where>
<if test="passportNo != null and passportNo != ''">
AND p.passport_no LIKE CONCAT('%', #{passportNo}, '%')
</if>
<if test="userName != null and userName != ''">
AND (ui.nickname LIKE CONCAT('%', #{userName}, '%') OR arn.name LIKE CONCAT('%', #{userName}, '%'))
</if>
<if test="mobile != null and mobile != ''">
AND u.mobile LIKE CONCAT('%', #{mobile}, '%')
</if>
<if test="idCard != null and idCard != ''">
AND arn.id_card LIKE CONCAT('%', #{idCard}, '%')
</if>
<if test="bindStatus != null">
AND p.status = #{bindStatus}
</if>
</where>
<!-- 已绑定优先展示,避免仅按更新时间导致已绑定记录长期沉底 -->
ORDER BY (p.status = 1) DESC, p.updated_at DESC, p.mid DESC
</select>
<select id="selectUserBadgesByUid" resultType="com.liquidnet.service.adam.dto.AdamCaomeiPassportUserBadgeDto">
SELECT
ub.badge_id AS badgeId,
IFNULL(b.name, '') AS badgeName,
IFNULL(b.icon, '') AS icon,
ub.created_at AS claimedAt,
ub.source AS source
FROM adam_caomei_user_badge ub
LEFT JOIN adam_caomei_badge b ON ub.badge_id = b.badge_id
WHERE ub.user_id = #{uid}
ORDER BY ub.created_at DESC
</select>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment