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

Commit da9e36ed authored by 张国柄's avatar 张国柄

+会员码管理;

parent 49aedc47
...@@ -4,12 +4,10 @@ import lombok.Data; ...@@ -4,12 +4,10 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
//@ApiModel(value = "AdamMemberCodeListParam", description = "会员码列表入参")
@Data @Data
public class AdamMemberCodeListParam implements Serializable { public class AdamMemberCodeListParam implements Serializable {
private static final long serialVersionUID = -8454342033562304457L; private static final long serialVersionUID = -8454342033562304457L;
// @ApiModelProperty(required = false, value = "会员码批次号[64]")
private String batchNo; private String batchNo;
// @ApiModelProperty(required = false, value = "状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]") private String code;
private Integer state; private Integer state;
} }
...@@ -18,6 +18,9 @@ import com.liquidnet.service.adam.dto.admin.AdamMemberCodeListParam; ...@@ -18,6 +18,9 @@ import com.liquidnet.service.adam.dto.admin.AdamMemberCodeListParam;
import com.liquidnet.service.adam.entity.AdamMemberCode; import com.liquidnet.service.adam.entity.AdamMemberCode;
import com.liquidnet.service.adam.entity.AdamMemberCodeBatch; import com.liquidnet.service.adam.entity.AdamMemberCodeBatch;
import com.liquidnet.service.adam.entity.AdamMemberPrice; import com.liquidnet.service.adam.entity.AdamMemberPrice;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
...@@ -28,7 +31,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -28,7 +31,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
//@Api(tags = "会员码管理") @Api(tags = "会员码管理")
@Controller @Controller
@RequestMapping("adam/mcode") @RequestMapping("adam/mcode")
public class AdamMemberCodeAdminController extends BaseController { public class AdamMemberCodeAdminController extends BaseController {
...@@ -43,6 +46,18 @@ public class AdamMemberCodeAdminController extends BaseController { ...@@ -43,6 +46,18 @@ public class AdamMemberCodeAdminController extends BaseController {
@GetMapping("mgt") @GetMapping("mgt")
public String viewCodeMgt(@RequestParam String memberId, ModelMap mmap) { public String viewCodeMgt(@RequestParam String memberId, ModelMap mmap) {
mmap.put("memberId", memberId); mmap.put("memberId", memberId);
AdamMemberPrice memberPrice = adamMemberPriceAdminService.getOne(Wrappers.lambdaQuery(AdamMemberPrice.class)
.eq(AdamMemberPrice::getState, 1)
.eq(AdamMemberPrice::getMemberId, memberId)
.select(
AdamMemberPrice::getMemberPriceId,
AdamMemberPrice::getPrice,
AdamMemberPrice::getPriceFixed,
AdamMemberPrice::getPriceSpecial,
AdamMemberPrice::getDays
)
);
mmap.put("memberPrice", memberPrice);
return prefix + "/code_mgt"; return prefix + "/code_mgt";
} }
...@@ -67,10 +82,13 @@ public class AdamMemberCodeAdminController extends BaseController { ...@@ -67,10 +82,13 @@ public class AdamMemberCodeAdminController extends BaseController {
); );
queryWrapper.orderByDesc(AdamMemberCodeBatch::getCreatedAt); queryWrapper.orderByDesc(AdamMemberCodeBatch::getCreatedAt);
logger.info("update member_code_batch.use_num:{}", adamMemberCodeBatchAdminService.updateBatchUseNum());
this.startPage();
return getDataTable(adamMemberCodeBatchAdminService.list(queryWrapper)); return getDataTable(adamMemberCodeBatchAdminService.list(queryWrapper));
} }
// @ApiOperation(value = "会员码:创建") @ApiOperation(value = "会员码:创建")
@RequiresPermissions("adam:member:code:creation") @RequiresPermissions("adam:member:code:creation")
@Log(title = "会员管理:会员码:创建", businessType = BusinessType.INSERT) @Log(title = "会员管理:会员码:创建", businessType = BusinessType.INSERT)
@PostMapping("mgt/creation") @PostMapping("mgt/creation")
...@@ -89,18 +107,19 @@ public class AdamMemberCodeAdminController extends BaseController { ...@@ -89,18 +107,19 @@ public class AdamMemberCodeAdminController extends BaseController {
return this.toAjax(adamMemberCodeAdminService.createGiftCode(parameter)); return this.toAjax(adamMemberCodeAdminService.createGiftCode(parameter));
} }
@GetMapping("view") @GetMapping("mgt/code")
public String viewCode(@RequestParam String batchNo, ModelMap mmap) { public String viewCode(@RequestParam String batchNo, ModelMap mmap) {
mmap.put("batchNo", batchNo); mmap.put("batchNo", batchNo);
return prefix + "/code"; return prefix + "/code";
} }
// @ApiOperation(value = "会员码:列表") @ApiOperation(value = "会员码:列表")
@RequiresPermissions("adam:member:code:list") @RequiresPermissions("adam:member:code:list")
@Log(title = "会员管理:会员码:列表", businessType = BusinessType.LIST) @Log(title = "会员管理:会员码:列表", businessType = BusinessType.LIST)
@PostMapping("list") @PostMapping("list")
@ResponseBody @ResponseBody
public TableDataInfo listCode(AdamMemberCodeListParam parameter) { public TableDataInfo listCode(AdamMemberCodeListParam parameter) {
this.startPage();
return getDataTable(codeListQuery(parameter)); return getDataTable(codeListQuery(parameter));
} }
...@@ -109,19 +128,16 @@ public class AdamMemberCodeAdminController extends BaseController { ...@@ -109,19 +128,16 @@ public class AdamMemberCodeAdminController extends BaseController {
queryWrapper.eq(AdamMemberCode::getBatchNo, parameter.getBatchNo()); queryWrapper.eq(AdamMemberCode::getBatchNo, parameter.getBatchNo());
queryWrapper.eq(AdamMemberCode::getType, 2); queryWrapper.eq(AdamMemberCode::getType, 2);
queryWrapper.ne(AdamMemberCode::getState, 2); queryWrapper.ne(AdamMemberCode::getState, 2);
if (StringUtils.isNotBlank(parameter.getCode())) {
queryWrapper.eq(AdamMemberCode::getCode, parameter.getCode());
}
if (null != parameter.getState()) { if (null != parameter.getState()) {
queryWrapper.eq(AdamMemberCode::getState, parameter.getState()); queryWrapper.eq(AdamMemberCode::getState, parameter.getState());
} }
queryWrapper.select( queryWrapper.select(
AdamMemberCode::getMemberNo,
AdamMemberCode::getCode, AdamMemberCode::getCode,
AdamMemberCode::getState, AdamMemberCode::getState,
AdamMemberCode::getOperator,
AdamMemberCode::getCreatedAt,
AdamMemberCode::getValidity,
AdamMemberCode::getEffectAt,
AdamMemberCode::getExpireAt,
AdamMemberCode::getUseOrderNo,
AdamMemberCode::getUseUid,
AdamMemberCode::getUseAt AdamMemberCode::getUseAt
); );
queryWrapper.orderByDesc(AdamMemberCode::getMemberNo); queryWrapper.orderByDesc(AdamMemberCode::getMemberNo);
...@@ -129,7 +145,7 @@ public class AdamMemberCodeAdminController extends BaseController { ...@@ -129,7 +145,7 @@ public class AdamMemberCodeAdminController extends BaseController {
return adamMemberCodeAdminService.list(queryWrapper); return adamMemberCodeAdminService.list(queryWrapper);
} }
// @ApiOperation(value = "会员码:导出") @ApiOperation(value = "会员码:导出")
@RequiresPermissions("adam:member:code:export") @RequiresPermissions("adam:member:code:export")
@Log(title = "会员管理:会员码:导出", businessType = BusinessType.EXPORT) @Log(title = "会员管理:会员码:导出", businessType = BusinessType.EXPORT)
@PostMapping("export") @PostMapping("export")
......
...@@ -11,9 +11,12 @@ ...@@ -11,9 +11,12 @@
<form id="data-form"> <form id="data-form">
<div class="select-list"> <div class="select-list">
<ul> <ul>
<input type="text" name="memberId" hidden="hidden" th:value="${memberId}" readonly/>
<li> <li>
状态:<select name="state" th:with="type=${@dict.getType('zhengzai_coupon_code_state')}"> <label>会员码:</label>
<input type="text" name="code"/>
</li>
<li>
状态:<select name="state" th:with="type=${@dict.getType('zhengzai_member_code_state')}">
<option value="">所有</option> <option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select> </select>
...@@ -28,15 +31,9 @@ ...@@ -28,15 +31,9 @@
</div> </div>
<div class="btn-group-sm" id="toolbar" role="group"> <div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="adam:member:export:code"> <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="adam:member:code:export">
<i class="fa fa-download"></i> 导出 <i class="fa fa-download"></i> 导出
</a> </a>
<!-- <a class="btn btn-primary multiple disabled" onclick="invalidHandler()" shiro:hasPermission="adam:member:invalid:code">-->
<!-- <i class="fa fa-edit"></i> 批量失效-->
<!-- </a>-->
<!-- <a class="btn btn-danger multiple disabled" onclick="recoverHandler()" shiro:hasPermission="adam:member:recover:code">-->
<!-- <i class="fa fa-remove"></i> 批量退回-->
<!-- </a>-->
</div> </div>
<div class="col-sm-12 select-table table-striped"> <div class="col-sm-12 select-table table-striped">
...@@ -47,70 +44,44 @@ ...@@ -47,70 +44,44 @@
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" /> <th:block th:include="include :: select2-js" />
<script th:inline="javascript"> <script th:inline="javascript">
// var invalidFlag = [[${@permission.hasPermi('adam:member:code:invalid')}]]; var datas = [[${@dict.getType('zhengzai_member_code_state')}]];// 样例:[{"dictLabel":"未支付","dictValue":"0"},{"dictLabel":"已支付","dictValue":"1"},{"dictLabel":"已关闭","dictValue":"2"}]
// var recoverFlag = [[${@permission.hasPermi('adam:member:code:recover')}]]; var batchNo = [[${batchNo}]];
var datas = [[${@dict.getType('zhengzai_coupon_code_state')}]];// 样例:[{"dictLabel":"未支付","dictValue":"0"},{"dictLabel":"已支付","dictValue":"1"},{"dictLabel":"已关闭","dictValue":"2"}]
var memberId = [[${memberId}]];
var prefix = ctx + "adam/mcode"; var prefix = ctx + "adam/mcode";
$(function() { $(function() {
var options = { var options = {
url: prefix + "/list", url: prefix + "/list?batchNo=" + batchNo,
exportUrl: prefix + "/export", exportUrl: prefix + "/export?batchNo=" + batchNo,
sortName: "code", sortName: "memberNo",
sortOrder: "asc", sortOrder: "desc",
modalName: "会员码", modalName: "会员码列表",
columns: [ columns: [
{ {
checkbox: true checkbox: true
}, },
{ {
field: 'code', field: 'memberNo',
title: '会员码' title: '卡号'
},
{
field: 'expireAt',
title: '到期时间'
},
{
field: 'useAt',
title: '使用时间'
}, },
{ {
field: 'useOrderNo', field: 'code',
title: '兑换订单号', 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', field: 'state',
title: '状态', title: '使用状态',
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value); return $.table.selectDictLabel(datas, value);
} }
}, },
// { {
// title: '操作', field: 'useAt',
// align: 'center', title: '使用时间',
// formatter: function(value, row, index) { formatter: function (value, row, index) {
// var actions = []; return $.common.sprintf("<span>%s</span>", null != value ? value.replace("T"," ").substring(0, 19) : value);
// 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> '); }
// } else if (row.state === 1) {
// // 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); $.table.init(options);
...@@ -119,30 +90,6 @@ ...@@ -119,30 +90,6 @@
function resetPre() { function resetPre() {
$.form.reset(); $.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> </script>
</body> </body>
</html> </html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('创建会员码')" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-code-add">
<input >
<div class="form-group">
<label class="col-sm-3 control-label is-required">生产数量:</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="genNum" id="genNum" required>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注:</label>
<div class="col-sm-8">
<textarea id="remark" name="detail" class="form-control"></textarea>
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer" />
<script type="text/javascript">
var prefix = ctx + "system/dict";
$("#form-code-add").validate({
onkeyup: false,
rules:{
dictType:{
minlength: 5,
remote: {
url: prefix + "/checkDictTypeUnique",
type: "post",
dataType: "json",
data: {
name : function() {
return $.common.trim($("#dictType").val());
}
},
dataFilter: function(data, type) {
return $.validate.unique(data);
}
}
},
},
messages: {
"dictType": {
remote: "该字典类型已经存在"
}
},
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/add", $('#form-code-add').serialize());
}
}
</script>
</body>
</html>
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<div class="container-div"> <div class="container-div">
<div class="row"> <div class="row">
<div class="btn-group-sm" id="toolbar" role="group"> <div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="adam:member:code:creation"> <a class="btn btn-success" href="#member-gencode-form" data-toggle="modal" shiro:hasPermission="adam:member:code:creation">
<i class="fa fa-plus"></i> 创建 <i class="fa fa-plus"></i> 创建
</a> </a>
</div> </div>
...@@ -16,59 +16,97 @@ ...@@ -16,59 +16,97 @@
<div class="col-sm-12 select-table table-striped"> <div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table> <table id="bootstrap-table"></table>
</div> </div>
<div id="member-gencode-form" class="modal fade" aria-hidden="true">
<div class="modal-dialog" style="width:33%;">
<div class="modal-content modal-body row">
<h3 class="m-t-none m-b text-center">创建会员码</h3>
<form role="form" id="form-member-code-generate">
<input name="memberId" type="hidden" th:value="${memberId}" readonly>
<input name="memberPriceId" type="hidden" th:value="${memberPrice.memberPriceId}" readonly>
<div class="form-group">
<label class="pull-left">生产数量:</label>
<input type="number" name="genNum" class="form-control" style="width: 30%;height: 20px;" placeholder="生产数量">
</div>
<div class="form-group">
<!-- <label>备注:</label>-->
<textarea rows="3" name="detail" placeholder="备注描述" class="form-control"></textarea>
</div>
<div class="text-center" style="margin-bottom: -15px;margin-top: 10px;">
<button class="btn btn-sm btn-primary m-t-n-xs" type="button" onclick="memberCodeGenerate()">
<strong>确认创建</strong>
</button>
</div>
</form>
</div>
</div>
</div>
</div> </div>
</div> </div>
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" /> <th:block th:include="include :: select2-js" />
<script th:inline="javascript"> <script th:inline="javascript">
var viewMemberCodeListFlg = [[${@permission.hasPermi('adam:member:code:list')}]];
var memberId = [[${memberId}]]; var memberId = [[${memberId}]];
var prefix = ctx + "adam/mcode"; var prefix = ctx + "adam/mcode";
$(function() { $(function() {
var options = { var options = {
url: prefix + "/mgt/list?memberId=" + memberId, url: prefix + "/mgt/list?memberId=" + memberId,
createUrl: prefix + "/mgt/creation/{id}",
exportUrl: prefix + "/export_code", exportUrl: prefix + "/export_code",
detailUrl: ctx + "adam/order/orderList/detail/{id}", detailUrl: ctx + "adam/order/orderList/detail/{id}",
sortName: "code", sortName: "createdAt",
sortOrder: "asc", sortOrder: "desc",
modalName: "会员码创建记录", modalName: "会员码创建记录",
columns: [{ columns: [{
checkbox: true checkbox: true
}, },
{ {
field: 'memberName', field: 'memberName',
title: '会员名称' title: '会员名称',
width: 220
}, },
{ {
field: 'memberCombo', field: 'memberCombo',
title: '会员套餐名称' title: '会员套餐名称',
width: 180
}, },
{ {
field: 'genNum', field: 'genNum',
title: '生产数量' title: '生产数量',
width: 80
}, },
{ {
field: 'useNum', field: 'useNum',
title: '使用数量' title: '使用数量',
width: 80
}, },
{ {
field: 'detail', field: 'detail',
title: '备注' title: '备注',
width: 280
}, },
{ {
field: 'operator', field: 'operator',
title: '创建人' title: '创建人',
width: 100
}, },
{ {
field: 'createdAt', field: 'createdAt',
title: '创建时间' title: '创建时间',
width: 150,
formatter: function (value, row, index) {
return $.common.sprintf("<span>%s</span>", null != value ? value.replace("T"," ").substring(0, 19) : value);
}
}, },
{ {
title: '操作', title: '操作',
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
var actions = []; var actions = [];
actions.push('<a class="btn btn-primary btn-xs ' + (invalidFlag && row.state===0) + '" href="javascript:void(0)" onclick="memberCodeList(\'' + row.batchNo + '\')"><i class="fa fa-edit"></i>查看码列表</a> '); actions.push('<a class="btn btn-primary btn-xs ' + viewMemberCodeListFlg + '" href="javascript:void(0)" onclick="memberCodeList(\'' + row.batchNo + '\')"><i class="fa fa-list-ul"></i>查看码列表</a> ');
return actions.join(''); return actions.join('');
} }
}] }]
...@@ -78,7 +116,57 @@ ...@@ -78,7 +116,57 @@
/* 会员码列表 */ /* 会员码列表 */
function memberCodeList(batchNo) { function memberCodeList(batchNo) {
$.modal.openTab("会员码列表", 'adam/mcode/view?batchNo=' + batchNo); $.modal.openTab("会员码列表", prefix + '/mgt/code?batchNo=' + batchNo);
}
$("#form-member-code-generate").validate({
onkeyup: false,
rules:{
genNum: {
required: true,
number: true,
min: 1,
max: 100
},
detail: {
required: true,
minlength: 2,
maxlength: 100
}
},
messages: {
genNum: {
required: "请输入生产数量",
number: "生产数量必须为数字",
min: "生产数量不能小于1",
max: "生产数量不能大于100"
},
detail: {
required: "请输入备注描述",
minlength: "备注描述不得少于2个字符",
maxlength: "备注描述不得大于100个字符"
}
},
focusCleanup: true
});
function memberCodeGenerate() {
if ($.validate.form("form-member-code-generate")) {
$.operate.saveModal(prefix + "/mgt/creation", $('#form-member-code-generate').serialize(), memberCodeGenerateCallback);
}
}
function memberCodeGenerateCallback(result) {
if (typeof callback == "function") {
callback(result);
}
if (result.code == web_status.SUCCESS) {
$.modal.alertSuccess(result.msg);
setTimeout("refreshTab()", 1500);
} else if (result.code == web_status.WARNING) {
$.modal.alertWarning(result.msg);
} else {
$.modal.alertError(result.msg);
}
} }
</script> </script>
</body> </body>
......
...@@ -39,9 +39,10 @@ ...@@ -39,9 +39,10 @@
field: 'icon', field: 'icon',
title: 'ICON', title: 'ICON',
formatter: function (value, row, index) { formatter: function (value, row, index) {
var actions = []; // var actions = [];
actions.push($.common.sprintf("<img class='img-circle img-xs' src='%s' />", value)); // actions.push($.common.sprintf("<img class='img-circle img-xs' src='%s' />", value));
return actions; // return actions;
return $.table.imageView(value);
} }
}, },
{ {
...@@ -77,7 +78,7 @@ ...@@ -77,7 +78,7 @@
formatter: function(value, row, index) { formatter: function(value, row, index) {
var actions = []; var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.editTab(\'' + row.memberId + '\'); setVipTabs()"><i class="fa fa-edit"></i>编辑</a> '); actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.editTab(\'' + row.memberId + '\'); setVipTabs()"><i class="fa fa-edit"></i>编辑</a> ');
// actions.push('<a class="btn btn-success btn-xs ' + viewMemberCodeMgtFlag + '" href="javascript:void(0)" onclick="memberCodeMgt(\'' + row.memberId + '\')"><i class="fa fa-edit"></i>会员码管理</a> '); actions.push('<a class="btn btn-warning btn-xs ' + viewMemberCodeMgtFlag + '" href="javascript:void(0)" onclick="memberCodeMgt(\'' + row.memberId + '\')"><i class="fa fa-barcode"></i>会员码管理</a> ');
return actions.join(''); return actions.join('');
} }
}] }]
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head> <head>
<th:block th:include="include :: header('会员订单详情')" /> <th:block th:include="include :: header('会员订单详情')" />
<style type="text/css">.user-info-head{position:relative;display:inline-block;}.user-info-head:hover:after{content:'\f030';position:absolute;left:0;right:0;top:0;bottom:0;color:#eee;background:rgba(0,0,0,0.5);font-family:FontAwesome;font-size:24px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;cursor:pointer;line-height:110px;border-radius:50%;}</style> <!-- <style type="text/css">.user-info-head{position:relative;display:inline-block;}.user-info-head:hover:after{content:'\f030';position:absolute;left:0;right:0;top:0;bottom:0;color:#eee;background:rgba(0,0,0,0.5);font-family:FontAwesome;font-size:24px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;cursor:pointer;line-height:110px;border-radius:50%;}</style>-->
</head> </head>
<body class="gray-bg" style="font: 14px Helvetica Neue, Helvetica, PingFang SC, 微软雅黑, Tahoma, Arial, sans-serif !important;"> <body class="gray-bg" style="font: 14px Helvetica Neue, Helvetica, PingFang SC, 微软雅黑, Tahoma, Arial, sans-serif !important;">
...@@ -185,7 +185,7 @@ ...@@ -185,7 +185,7 @@
var pricePaid = [[${orderDetailsVo.adamMemberOrderVo.pricePaid}]]; var pricePaid = [[${orderDetailsVo.adamMemberOrderVo.pricePaid}]];
$("#form-member-order-refund").validate({ $("#form-member-order-refund").validate({
onkeyup: true, onkeyup: false,
rules:{ rules:{
refundAmt: { refundAmt: {
required: true, required: true,
......
...@@ -10,18 +10,14 @@ import java.io.Serializable; ...@@ -10,18 +10,14 @@ import java.io.Serializable;
@Data @Data
public class AdamMemberCodeExcelDto implements Serializable, Cloneable { public class AdamMemberCodeExcelDto implements Serializable, Cloneable {
private static final long serialVersionUID = -6775626480969657499L; private static final long serialVersionUID = -6775626480969657499L;
@Excel(name = "会员码") @Excel(name = "卡号")
private String memberNo;
@Excel(name = "会员码", width = 30)
private String code; private String code;
@Excel(name = "状态") @Excel(name = "使用状态")
private Integer state; private String state;
@Excel(name = "用户UID") @Excel(name = "使用时间", width = 30)
private String useUid; private String useAt;
@Excel(name = "生效时间", width = 30)
private String effectAt;
@Excel(name = "过期时间", width = 30)
private String expireAt;
@Excel(name = "批次号")
private String memberId;
private static final AdamMemberCodeExcelDto obj = new AdamMemberCodeExcelDto(); private static final AdamMemberCodeExcelDto obj = new AdamMemberCodeExcelDto();
...@@ -35,12 +31,10 @@ public class AdamMemberCodeExcelDto implements Serializable, Cloneable { ...@@ -35,12 +31,10 @@ public class AdamMemberCodeExcelDto implements Serializable, Cloneable {
public AdamMemberCodeExcelDto copy(AdamMemberCode source) { public AdamMemberCodeExcelDto copy(AdamMemberCode source) {
if (null == source) return this; if (null == source) return this;
this.setMemberNo(source.getMemberNo());
this.setCode(source.getCode()); this.setCode(source.getCode());
this.setState(source.getState()); this.setState(source.getState() == 0 ? "可用" : "已用");
this.setUseUid(source.getUseUid()); this.setUseAt(DateUtil.Formatter.yyyyMMddHHmmss.format(source.getUseAt()));
this.setEffectAt(DateUtil.Formatter.yyyyMMddHHmmss.format(source.getEffectAt()));
this.setExpireAt(DateUtil.Formatter.yyyyMMddHHmmss.format(source.getExpireAt()));
this.setMemberId(source.getMemberId());
return this; return this;
} }
} }
...@@ -4,4 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -4,4 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.adam.entity.AdamMemberCodeBatch; import com.liquidnet.service.adam.entity.AdamMemberCodeBatch;
public interface IAdamMemberCodeBatchAdminService extends IService<AdamMemberCodeBatch> { public interface IAdamMemberCodeBatchAdminService extends IService<AdamMemberCodeBatch> {
int updateBatchUseNum();
} }
...@@ -2,16 +2,24 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl; ...@@ -2,16 +2,24 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl;
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.liquidnet.client.admin.common.utils.ShiroUtils;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeAdminService; import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeAdminService;
import com.liquidnet.common.cache.redis.util.AbstractRedisUtil; import com.liquidnet.common.cache.redis.util.AbstractRedisUtil;
import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil; import com.liquidnet.common.cache.redis.util.RedisDataSourceUtil;
import com.liquidnet.common.exception.LiquidnetServiceException; import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.CollectionUtil; import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.adam.constant.AdamRedisConst; import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.admin.AdamMemberCodeGenParam; import com.liquidnet.service.adam.dto.admin.AdamMemberCodeGenParam;
import com.liquidnet.service.adam.dto.vo.AdamMemberCodeVo; 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.AdamMemberCode;
import com.liquidnet.service.adam.entity.AdamMemberCodeBatch;
import com.liquidnet.service.adam.entity.AdamMemberPrice;
import com.liquidnet.service.adam.mapper.AdamMemberCodeBatchMapper;
import com.liquidnet.service.adam.mapper.AdamMemberCodeMapper; import com.liquidnet.service.adam.mapper.AdamMemberCodeMapper;
import com.liquidnet.service.adam.mapper.AdamMemberMapper;
import com.liquidnet.service.adam.mapper.AdamMemberPriceMapper;
import com.liquidnet.service.adam.util.MemberUtil; import com.liquidnet.service.adam.util.MemberUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -26,16 +34,24 @@ import java.util.regex.Pattern; ...@@ -26,16 +34,24 @@ import java.util.regex.Pattern;
@Service @Service
public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMapper, AdamMemberCode> implements IAdamMemberCodeAdminService { public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMapper, AdamMemberCode> implements IAdamMemberCodeAdminService {
@Autowired @Autowired
AdamMemberCodeMapper memberCodeMapper; AdamMemberCodeMapper adamMemberCodeMapper;
@Autowired @Autowired
RedisDataSourceUtil redisDataSourceUtil; RedisDataSourceUtil redisDataSourceUtil;
@Autowired
AdamMemberMapper adamMemberMapper;
@Autowired
AdamMemberPriceMapper adamMemberPriceMapper;
@Autowired
AdamMemberCodeBatchMapper adamMemberCodeBatchMapper;
@Override @Override
public boolean createGiftCode(AdamMemberCodeGenParam param) { public boolean createGiftCode(AdamMemberCodeGenParam param) {
String loginName = ShiroUtils.getLoginName();
List<AdamMemberCode> memberCodeList = new ArrayList<>(); List<AdamMemberCode> memberCodeList = new ArrayList<>();
ArrayList<String> codeList = CollectionUtil.arrayListString(); ArrayList<String> codeList = CollectionUtil.arrayListString();
Integer genNum = param.getGenNum(); Integer genNum = param.getGenNum();
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
String batchNo = IDGenerator.nextMilliId2();
AbstractRedisUtil redisAdamUtil = redisDataSourceUtil.getRedisAdamUtil(); AbstractRedisUtil redisAdamUtil = redisDataSourceUtil.getRedisAdamUtil();
for (int i = 0; i < genNum; i++) { for (int i = 0; i < genNum; i++) {
String mCode; String mCode;
...@@ -48,15 +64,17 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa ...@@ -48,15 +64,17 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
AdamMemberCode initMemberCode = new AdamMemberCode(); AdamMemberCode initMemberCode = new AdamMemberCode();
initMemberCode.setCode(mCode); initMemberCode.setCode(mCode);
initMemberCode.setType(1); initMemberCode.setType(2);
initMemberCode.setBatchNo(batchNo);
initMemberCode.setMemberId(param.getMemberId()); initMemberCode.setMemberId(param.getMemberId());
initMemberCode.setMemberPriceId(param.getMemberPriceId()); initMemberCode.setMemberPriceId(param.getMemberPriceId());
// 需要主动生成会员编号 // 需要主动生成会员编号,这里暂不生产,待数据记录成功同步RDS时生产
//initMemberCode.setMemberNo(getNextMemberNo(param.getMemberId())); // initMemberCode.setMemberNo(getNextMemberNo(param.getMemberId()));
initMemberCode.setState(0);// 状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回] initMemberCode.setState(0);// 0-可用|1-已用
// initMemberCode.setValidity(param.getValidity()); // initMemberCode.setValidity(param.getValidity());
// initMemberCode.setEffectAt(now); // initMemberCode.setEffectAt(now);
// initMemberCode.setExpireAt(now.plusDays(param.getValidity()).withHour(23).withMinute(59).withSecond(59)); // initMemberCode.setExpireAt(now.plusDays(param.getValidity()).withHour(23).withMinute(59).withSecond(59));
initMemberCode.setOperator(loginName);
initMemberCode.setCreatedAt(now); initMemberCode.setCreatedAt(now);
memberCodeList.add(initMemberCode); memberCodeList.add(initMemberCode);
...@@ -65,16 +83,43 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa ...@@ -65,16 +83,43 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
//redisDataSourceUtil.getRedisAdamUtil().set(AdamRedisConst.INFO_MEMBER_CODE.concat(mCode), AdamMemberCodeVo.getNew().copy(initMemberCode)); //redisDataSourceUtil.getRedisAdamUtil().set(AdamRedisConst.INFO_MEMBER_CODE.concat(mCode), AdamMemberCodeVo.getNew().copy(initMemberCode));
} }
if (this.saveBatch(memberCodeList, memberCodeList.size())) { AdamMember member = adamMemberMapper.selectOne(
Wrappers.lambdaQuery(AdamMember.class).eq(AdamMember::getMemberId, param.getMemberId())
.select(AdamMember::getName)
);
AdamMemberPrice memberPrice = adamMemberPriceMapper.selectOne(
Wrappers.lambdaQuery(AdamMemberPrice.class)
.eq(AdamMemberPrice::getMemberPriceId, param.getMemberPriceId())
.eq(AdamMemberPrice::getMemberId, param.getMemberId())
.eq(AdamMemberPrice::getState, 1)
.select(AdamMemberPrice::getName)
);
AdamMemberCodeBatch memberCodeBatch = new AdamMemberCodeBatch();
memberCodeBatch.setBatchNo(batchNo);
memberCodeBatch.setMemberId(param.getMemberId());
memberCodeBatch.setMemberPriceId(param.getMemberPriceId());
memberCodeBatch.setMemberName(member.getName());
memberCodeBatch.setMemberCombo(memberPrice.getName());
memberCodeBatch.setGenNum(genNum);
memberCodeBatch.setUseNum(0);
memberCodeBatch.setDetail(param.getDetail());
memberCodeBatch.setState(1);
memberCodeBatch.setOperator(loginName);
memberCodeBatch.setCreatedAt(now);
if (adamMemberCodeBatchMapper.insert(memberCodeBatch) > 0 && this.saveBatch(memberCodeList, memberCodeList.size())) {
List<AdamMemberCode> list = this.list( List<AdamMemberCode> list = this.list(
Wrappers.lambdaQuery(AdamMemberCode.class).in(AdamMemberCode::getCode, codeList) Wrappers.lambdaQuery(AdamMemberCode.class)
.eq(AdamMemberCode::getState, 0).eq(AdamMemberCode::getCreatedAt, now) .in(AdamMemberCode::getCode, codeList)
.eq(AdamMemberCode::getState, 0)
.eq(AdamMemberCode::getBatchNo, batchNo)
// .select(AdamMemberCode::getMid, AdamMemberCode::getCode)
); );
list.forEach(r -> { for (AdamMemberCode memberCode : list) {
r.setMemberNo(getNextMemberNo(param.getMemberId())); memberCode.setMemberNo(getNextMemberNo(param.getMemberId()));
redisAdamUtil.set(AdamRedisConst.INFO_MEMBER_CODE.concat(r.getCode()), AdamMemberCodeVo.getNew().copy(r)); redisAdamUtil.set(AdamRedisConst.INFO_MEMBER_CODE.concat(memberCode.getCode()), AdamMemberCodeVo.getNew().copy(memberCode));
}); }
this.updateBatchById(list, list.size()); this.updateBatchById(list, list.size());
return true; return true;
} }
......
...@@ -5,9 +5,17 @@ import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeBatchAdmi ...@@ -5,9 +5,17 @@ import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeBatchAdmi
import com.liquidnet.service.adam.entity.AdamMemberCodeBatch; import com.liquidnet.service.adam.entity.AdamMemberCodeBatch;
import com.liquidnet.service.adam.mapper.AdamMemberCodeBatchMapper; import com.liquidnet.service.adam.mapper.AdamMemberCodeBatchMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Slf4j @Slf4j
@Service @Service
public class AdamMemberCodeBatchAdminServiceImpl extends ServiceImpl<AdamMemberCodeBatchMapper, AdamMemberCodeBatch> implements IAdamMemberCodeBatchAdminService { public class AdamMemberCodeBatchAdminServiceImpl extends ServiceImpl<AdamMemberCodeBatchMapper, AdamMemberCodeBatch> implements IAdamMemberCodeBatchAdminService {
@Autowired
AdamMemberCodeBatchMapper adamMemberCodeBatchMapper;
@Override
public int updateBatchUseNum() {
return adamMemberCodeBatchMapper.updateUseNum();
}
} }
...@@ -16,11 +16,6 @@ public class AdamMemberCode { ...@@ -16,11 +16,6 @@ public class AdamMemberCode {
@TableId(value = "mid", type = IdType.AUTO) @TableId(value = "mid", type = IdType.AUTO)
private Long mid; private Long mid;
/**
* 会员码批次号
*/
private String batchNo;
/** /**
* 会员码 * 会员码
*/ */
...@@ -29,6 +24,10 @@ public class AdamMemberCode { ...@@ -29,6 +24,10 @@ public class AdamMemberCode {
* 类型:1-购买,2-赠送(后台生成) * 类型:1-购买,2-赠送(后台生成)
*/ */
private Integer type; private Integer type;
/**
* 会员码批次号
*/
private String batchNo;
/** /**
* 会员类型id * 会员类型id
*/ */
......
...@@ -2,6 +2,7 @@ package com.liquidnet.service.adam.mapper; ...@@ -2,6 +2,7 @@ package com.liquidnet.service.adam.mapper;
import com.liquidnet.service.adam.entity.AdamMemberCodeBatch; import com.liquidnet.service.adam.entity.AdamMemberCodeBatch;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Update;
/** /**
* <p> * <p>
...@@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; ...@@ -13,4 +14,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface AdamMemberCodeBatchMapper extends BaseMapper<AdamMemberCodeBatch> { public interface AdamMemberCodeBatchMapper extends BaseMapper<AdamMemberCodeBatch> {
@Update("update adam_member_code_batch amcb\n" +
" inner join (\n" +
" select batch_no, count(1) ct from adam_member_code where batch_no is not null and state = 1 group by batch_no\n" +
" ) t on amcb.batch_no = t.batch_no\n" +
"set amcb.use_num=t.ct, amcb.updated_at=sysdate()\n" +
"where amcb.state = 1 and amcb.gen_num <> amcb.use_num")
int updateUseNum();
} }
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