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

Commit e49925e3 authored by 胡佳晨's avatar 胡佳晨

Merge remote-tracking branch 'origin/dev_member_voucher_refund' into dev_member_voucher_refund

parents 4d8c0750 f961516f
......@@ -12,4 +12,6 @@ public class AdamMemberCodeListParam implements Serializable {
private static final long serialVersionUID = -8454342033562304457L;
@ApiModelProperty(required = false, value = "会员类型ID[64]")
private String memberId;
@ApiModelProperty(required = false, value = "状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]")
private Integer state;
}
......@@ -35,6 +35,8 @@ public class AdamMemberCodeVo implements Serializable, Cloneable {
@ApiModelProperty(position = 8, value = "失效时间")
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime expireAt;
@ApiModelProperty(position = 9, value = "操作人")
private String operator;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
private LocalDateTime createdAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern= DateUtil.DATE_FULL_STR)
......
package com.liquidnet.client.admin.web.controller.zhengzai.adam;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.utils.ShiroUtils;
import com.liquidnet.client.admin.common.utils.poi.ExcelUtil;
import com.liquidnet.client.admin.zhengzai.adam.dto.AdamMemberCodeExcelDto;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberAdminService;
......@@ -13,7 +15,10 @@ import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberPriceAdminSer
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberRightsAdminService;
import com.liquidnet.client.admin.zhengzai.candy.service.ICandyCouponAdminService;
import com.liquidnet.client.admin.zhengzai.candy.service.ICandyMgtCouponAdminService;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.admin.*;
import com.liquidnet.service.adam.dto.vo.AdamMemberCodeVo;
import com.liquidnet.service.adam.entity.AdamMember;
import com.liquidnet.service.adam.entity.AdamMemberCode;
import com.liquidnet.service.adam.entity.AdamMemberPrice;
......@@ -33,7 +38,11 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Api(tags = "登登登会员")
......@@ -54,11 +63,21 @@ public class AdamMemberAdminController extends BaseController {
@Autowired
ICandyCouponAdminService candyCouponAdminService;
@Autowired
private RedisUtil redisUtil;
@GetMapping()
public String view() {
return prefix + "/member";
}
@RequiresPermissions("adam:member:view:code")
@GetMapping("code/{memberId}")
public String viewCode(@PathVariable("memberId") String memberId, ModelMap mmap) {
mmap.put("memberId", memberId);
return prefix + "/code";
}
@RequiresPermissions("adam:member:view:list")
@PostMapping("list")
@ResponseBody
......@@ -218,7 +237,7 @@ public class AdamMemberAdminController extends BaseController {
}
@ApiOperation(value = "会员码:列表")
@RequiresPermissions("adam:member:view:list:code")
@RequiresPermissions("adam:member:list:code")
@PostMapping("list_code")
@ResponseBody
public TableDataInfo listCode(AdamMemberCodeListParam parameter) {
......@@ -227,13 +246,26 @@ public class AdamMemberAdminController extends BaseController {
private List<AdamMemberCode> codeListQuery(AdamMemberCodeListParam parameter) {
LambdaQueryWrapper<AdamMemberCode> queryWrapper = Wrappers.lambdaQuery(AdamMemberCode.class).orderByDesc(AdamMemberCode::getCreatedAt);
queryWrapper.eq(AdamMemberCode::getMemberId, parameter.getMemberId())
.ne(AdamMemberCode::getState, 2)
.select(
AdamMemberCode::getCode,
AdamMemberCode::getState,
AdamMemberCode::getMemberId
);
queryWrapper.eq(AdamMemberCode::getMemberId, parameter.getMemberId());
queryWrapper.eq(AdamMemberCode::getType, 2);
queryWrapper.ne(AdamMemberCode::getState, 2);
if (null != parameter.getState()) {
queryWrapper.eq(AdamMemberCode::getState, parameter.getState());
}
queryWrapper.select(
AdamMemberCode::getCode,
AdamMemberCode::getState,
AdamMemberCode::getOperator,
AdamMemberCode::getCreatedAt,
AdamMemberCode::getValidity,
AdamMemberCode::getEffectAt,
AdamMemberCode::getExpireAt,
AdamMemberCode::getUseOrderNo,
AdamMemberCode::getUseUid,
AdamMemberCode::getUseAt
);
queryWrapper.orderByDesc(AdamMemberCode::getMemberNo);
return adamMemberCodeAdminService.list(queryWrapper);
}
......@@ -270,6 +302,53 @@ public class AdamMemberAdminController extends BaseController {
return this.toAjax(adamMemberCodeAdminService.createGiftCode(parameter));
}
@RequiresPermissions("adam:member:invalid:code")
@PostMapping("invalid_code")
@ResponseBody
public AjaxResult invalid(AdamMemberCodeOptParam optParam) {
return toAjax(this.invalidRecoverCode(optParam, 4));
}
/**
* 失效|退回会员兑换码
*
* @param optParam AdamMemberCodeOptParam
* @param state 状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]
* @return boolean
*/
private boolean invalidRecoverCode(AdamMemberCodeOptParam optParam, int state) {
String loginName = ShiroUtils.getLoginName();
logger.info("by:{},optParam:{},state:{}", loginName, optParam, state);
LocalDateTime now = LocalDateTime.now();
optParam.getCodes().forEach(r -> {
String key = AdamRedisConst.INFO_MEMBER_CODE.concat(r);
AdamMemberCodeVo vo = (AdamMemberCodeVo) redisUtil.get(key);
if (null != vo) {
vo.setState(state);
vo.setOperator(loginName);
vo.setUpdatedAt(now);
redisUtil.set(key, vo);
}
});
LambdaUpdateWrapper<AdamMemberCode> memberCodeUpdateWrapper = Wrappers.lambdaUpdate(AdamMemberCode.class);
memberCodeUpdateWrapper.eq(AdamMemberCode::getMemberId, optParam.getMemberId());
memberCodeUpdateWrapper.eq(AdamMemberCode::getState, 0);
memberCodeUpdateWrapper.in(AdamMemberCode::getCode, optParam.getCodes());
memberCodeUpdateWrapper.set(AdamMemberCode::getState, state);
memberCodeUpdateWrapper.set(AdamMemberCode::getOperator, loginName);
memberCodeUpdateWrapper.set(AdamMemberCode::getUpdatedAt, now);
return adamMemberCodeAdminService.update(memberCodeUpdateWrapper);
}
@RequiresPermissions("adam:member:recover:code")
@PostMapping("recover_code")
@ResponseBody
public AjaxResult recover(AdamMemberCodeOptParam optParam) {
return toAjax(this.invalidRecoverCode(optParam, 5));
}
// @Log(title = "会员信息", businessType = BusinessType.LIST)
// @RequiresPermissions("adam:member:list")
......
......@@ -94,7 +94,7 @@ public class CandyCouponCodeAdminController extends BaseController {
String key = CandyRedisConst.BASIC_COUPON_CODE.concat(r);
CandyCouponCodeDto dto = (CandyCouponCodeDto) redisUtil.get(key);
if (null != dto) {
dto.setState(2);
dto.setState(4);
redisUtil.set(key, dto);
}
});
......@@ -103,7 +103,7 @@ public class CandyCouponCodeAdminController extends BaseController {
couponCodeUpdateWrapper.in(CandyCouponCode::getCcode, optParam.getCcodes()).eq(CandyCouponCode::getCouponId, optParam.getCouponId());
CandyCouponCode updateCouponCode = new CandyCouponCode();
updateCouponCode.setState(2);
updateCouponCode.setState(4);
updateCouponCode.setUpdatedAt(LocalDateTime.now());
return toAjax(candyCouponCodeAdminService.update(updateCouponCode, couponCodeUpdateWrapper));
}
......@@ -118,7 +118,7 @@ public class CandyCouponCodeAdminController extends BaseController {
String key = CandyRedisConst.BASIC_COUPON_CODE.concat(r);
CandyCouponCodeDto dto = (CandyCouponCodeDto) redisUtil.get(key);
if (null != dto) {
dto.setState(3);
dto.setState(5);
redisUtil.set(key, dto);
}
});
......@@ -127,7 +127,7 @@ public class CandyCouponCodeAdminController extends BaseController {
couponCodeUpdateWrapper.in(CandyCouponCode::getCcode, optParam.getCcodes()).eq(CandyCouponCode::getCouponId, optParam.getCouponId());
CandyCouponCode updateCouponCode = new CandyCouponCode();
updateCouponCode.setState(3);
updateCouponCode.setState(5);
updateCouponCode.setUpdatedAt(LocalDateTime.now());
return toAjax(candyCouponCodeAdminService.update(updateCouponCode, couponCodeUpdateWrapper));
}
......
......@@ -1057,6 +1057,24 @@ var table = {
$.operate.submit(url, "post", "json", data);
});
},
/**
* 批量处理
*
* @param url post.url
* @param optName 操作描述(失效、退回......)
* @param data post.data { "param1": param1,"param2": {param2} }
*/
batchProcessing: function(url, optName, data) {
table.set();
var rows = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId);
if (rows.length == 0) {
$.modal.alertWarning("请至少选择一条记录");
return;
}
$.modal.confirm("确认要" + optName + "选中的" + rows.length + "条数据吗?", function() {
$.operate.submit(url, "post", "json", data);
});
},
// 批量失效
batchProcessingForCouponCode: function(couponId, opt) {
table.set();
......
<!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('会员码列表')" />
<th:block th:include="include :: select2-css" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="col-sm-12 search-collapse">
<form id="data-form">
<div class="select-list">
<ul>
<input type="text" name="memberId" hidden="hidden" th:value="${memberId}" readonly/>
<li>
状态:<select name="state" th:with="type=${@dict.getType('zhengzai_coupon_code_state')}">
<option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</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="resetPre()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="candy:coupon:code:export">
<i class="fa fa-download"></i> 导出
</a>
<a class="btn btn-primary multiple disabled" onclick="invalidHandler()" shiro:hasPermission="candy:coupon:code:invalid">
<i class="fa fa-edit"></i> 批量失效
</a>
<a class="btn btn-danger multiple disabled" onclick="recoverHandler()" shiro:hasPermission="candy:coupon:code:recover">
<i class="fa fa-remove"></i> 批量退回
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" />
<script th:inline="javascript">
var invalidFlag = [[${@permission.hasPermi('candy:coupon:code:invalid')}]];
var recoverFlag = [[${@permission.hasPermi('candy:coupon:code:recover')}]];
var datas = [[${@dict.getType('zhengzai_coupon_code_state')}]];
var memberId = [[${memberId}]];
var prefix = ctx + "adam/member";
$(function() {
var options = {
url: prefix + "/list_code",
exportUrl: prefix + "/export_code",
detailUrl: ctx + "adam/order/orderList/detail/{id}",
sortName: "code",
sortOrder: "asc",
modalName: "数据",
columns: [{
checkbox: true
},
{
field: 'code',
title: '代金码'
},
{
field: 'expireAt',
title: '到期时间'
},
{
field: 'useAt',
title: '使用时间'
},
{
field: 'useOrderNo',
title: '兑换订单号',
formatter: function(value, row, index) {
var actions = [];
if ($.common.isEmpty(value)) {
actions.push('<a href="javascript:void(0)">-</a>');
} else {
actions.push('<a href="javascript:void(0)" onclick="$.operate.detailTab(\'' + value + '\')">' + value + '</a>');
}
return actions.join('');
}
},
{
field: 'state',
title: '状态',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
}
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
if (row.state === 0) {
actions.push('<a class="btn btn-primary btn-xs ' + (invalidFlag && row.state===0) + '" href="javascript:void(0)" onclick="invalidHandler(\'' + row.code + '\')"><i class="fa fa-edit"></i>失效</a> ');
actions.push('<a class="btn btn-danger btn-xs ' + (recoverFlag && row.state==0) + '" href="javascript:void(0)" onclick="recoverHandler(\'' + row.code + '\')"><i class="fa fa-remove"></i>退回</a>');
}
return actions.join('');
}
}]
};
$.table.init(options);
});
function resetPre() {
$.form.reset();
}
function invalidHandler(code) {
let invalidCodeUrl = prefix + '/invalid_code';
if (code !== null && code !== undefined) {
var data = {"memberId": memberId,"codes": code};
$.operate.submit(invalidCodeUrl, "post", "json", data);
} else {
var rows = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId);
var data = {"memberId": memberId, "codes": rows.join()};
$.operate.batchProcessing(invalidCodeUrl, '失效', data);
}
}
function recoverHandler(code) {
let recoverCodeUrl = prefix + '/recover_code';
if (code !== null && code !== undefined) {
var data = {"memberId": memberId,"codes": code};
$.operate.submit(recoverCodeUrl, "post", "json", data);
} else {
var rows = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId);
var data = {"memberId": memberId, "codes": rows.join()};
$.operate.batchProcessing(recoverCodeUrl, '失效', data);
}
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -67,12 +67,18 @@
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.editTab(\'' + row.memberId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="memberCodeList(\'' + row.memberId + '\')"><i class="fa fa-edit"></i>兑换码列表</a> ');
return actions.join('');
}
}]
};
$.table.init(options);
});
/* 查看码列表 */
function memberCodeList(memberId) {
$.modal.openTab("会员码列表", 'adam/member/code/' + memberId);
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -100,7 +100,7 @@
title: '订单号',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-xs" href="javascript:void(0)" onclick="$.operate.detailTab(\'' + row.orderNo + '\')">' + value + '</a>');
actions.push('<a href="javascript:void(0)" onclick="$.operate.detailTab(\'' + row.orderNo + '\')">' + value + '</a>');
return actions.join('');
}
},
......@@ -132,7 +132,7 @@
{
field: 'createdAt',
title: '创建时间'
},
},+
{
field: 'uid',
title: '用户ID'
......
package com.liquidnet.service.adam.dto.admin;
import lombok.Data;
import java.util.List;
@Data
public class AdamMemberCodeOptParam {
private String memberId;
/**
* 多个以,分隔
*/
private List<String> codes;
}
......@@ -53,6 +53,11 @@ public class AdamMemberCode {
*/
private LocalDateTime expireAt;
/**
* type=2时记录创建人
*/
private String operator;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
......
......@@ -359,6 +359,7 @@ create index idx_amember_code_id on adam_member_code (code);
alter table adam_member_code add validity tinyint null comment '有效期(单位天)' after state;
alter table adam_member_code add effect_at datetime(3) null comment '生效时间' after validity;
alter table adam_member_code add expire_at datetime(3) null comment '过期时间' after effect_at;
alter table adam_member_code add operator varchar(64) null comment 'type=2时记录创建人' after expire_at;
# 订单
alter table adam_member_order modify state tinyint null comment '订单状态:0-未支付,1-已支付,2-已关闭,3-超时付,4-退款中,5-已退款';
......
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