feat(integral-external): order/user list, integral log, wa selfBonus

- Fix ExternalIntegral order list (no double restPage); default 普通订单; UI columns for useIntegral and buyer uid/nickname/phone; enrich StoreOrderDetailResponse and admin query select.
- External user list: UserResponse.selfBonus and fillWaSelfBonus from wa_users.id=uid.
- Integral log: AdminIntegralSearchRequest nickName/phone; findAdminList filters and ordering; integralExternal API sends page/limit as query params.
- Integral detail page: linkType Chinese mapping including selfbonus; update docs/newpage.md.
- Dashboard grid menu entries for integral-external routes.

Made-with: Cursor
This commit is contained in:
apple
2026-04-09 15:10:16 +08:00
parent ee0886b800
commit f8ba25e7d5
13 changed files with 299 additions and 67 deletions

View File

@@ -28,12 +28,14 @@ export function getExternalUserList(params) {
}
/**
* 用户积分明细分页列表
* 用户积分明细分页列表page/limit 走 query与 /admin/user/integral/list 一致)
*/
export function getExternalIntegralLog(data) {
const { page, limit, ...body } = data;
return requestNoAuth({
url: 'external/integral/log/list',
method: 'post',
data,
params: { page, limit },
data: body,
});
}

View File

@@ -79,13 +79,6 @@ export default {
url: '/order/index',
perms: ['admin:order:list'],
},
{
bgColor: '#A277FF',
icon: 'iconduanxinpeizhi',
title: '一号通',
url: '/operation/onePass',
perms: ['admin:pass:login'],
},
{
bgColor: '#E8B600',
icon: 'iconwenzhangguanli',
@@ -107,6 +100,27 @@ export default {
url: '/marketing/coupon/list',
perms: ['admin:coupon:list'],
},
{
bgColor: '#13c2c2',
icon: 'icondingdanguanli',
title: '积分订单',
url: '/integral-external/order',
alwaysShow: true,
},
{
bgColor: '#722ed1',
icon: 'iconhuiyuanguanli',
title: '用户积分',
url: '/integral-external/user',
alwaysShow: true,
},
{
bgColor: '#eb2f96',
icon: 'iconfenxiaoguanli',
title: '用户积分明细',
url: '/integral-external/user/integral-detail',
alwaysShow: true,
},
],
statisticData: [
{ title: '待发货订单', num: 0, path: '/order/index', perms: ['admin:order:list'] },
@@ -128,7 +142,7 @@ export default {
permList: function () {
let arr = [];
this.nav_list.forEach((item) => {
if (this.checkPermi(item.perms)) {
if (item.alwaysShow || this.checkPermi(item.perms)) {
arr.push(item);
}
});

View File

@@ -4,13 +4,6 @@
<div class="clearfix">
<div class="container">
<el-form size="small" label-width="100px">
<el-form-item label="订单类型:">
<el-radio-group v-model="tableFrom.type" type="button" class="mr20" size="small" @change="seachList">
<el-radio-button v-for="(item, i) in typeOptions" :key="i" :label="item.value">
{{ item.label }}
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="订单状态:">
<el-radio-group v-model="tableFrom.status" type="button" @change="seachList">
<el-radio-button label="all">全部</el-radio-button>
@@ -78,7 +71,17 @@
<span v-if="scope.row.isDel" style="color: #ed4014; display: block">用户已删除</span>
</template>
</el-table-column>
<el-table-column prop="orderType" label="订单类型" min-width="110" />
<el-table-column prop="uid" label="用户ID" min-width="80" />
<el-table-column prop="nickname" label="用户昵称" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.nickname || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="用户手机号" min-width="120">
<template slot-scope="scope">
<span>{{ scope.row.userPhone | phoneDesensitize }}</span>
</template>
</el-table-column>
<el-table-column prop="realName" label="收货人" min-width="100" />
<el-table-column label="商品信息" min-width="280">
<template slot-scope="scope">
@@ -101,6 +104,11 @@
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="使用积分" min-width="90">
<template slot-scope="scope">
<span>{{ scope.row.useIntegral != null ? scope.row.useIntegral : '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="payPrice" label="实际支付" min-width="90">
<template slot-scope="scope">
<span>{{ scope.row.payPrice }}</span>
@@ -149,7 +157,7 @@ export default {
total: 0,
},
tableFrom: {
type: '',
type: 0,
status: 'all',
dateLimit: '',
orderNo: '',
@@ -168,14 +176,6 @@ export default {
{ text: '本年', val: 'year' },
],
},
typeOptions: [
{ label: '全部', value: '' },
{ label: '普通订单', value: '0' },
{ label: '秒杀订单', value: '1' },
{ label: '砍价订单', value: '2' },
{ label: '拼团订单', value: '3' },
{ label: '视频号订单', value: '4' },
],
};
},
mounted() {
@@ -185,7 +185,6 @@ export default {
getList() {
this.listLoading = true;
const params = { ...this.tableFrom };
if (!params.type) delete params.type;
if (!params.dateLimit) delete params.dateLimit;
if (!params.orderNo) delete params.orderNo;

View File

@@ -5,8 +5,8 @@
<el-button size="small" icon="el-icon-arrow-left" @click="goBack">返回</el-button>
</div>
<!-- 用户概览卡片 -->
<el-card class="box-card overview-card">
<!-- 用户概览卡片从用户列表进入时展示 uid 时为全部明细模式 -->
<el-card v-if="uid" class="box-card overview-card">
<div class="overview-header">
<span class="user-title">
{{ userInfo.nickname || ('UID: ' + uid) }}
@@ -30,6 +30,12 @@
</el-col>
</el-row>
</el-card>
<el-card v-else class="box-card overview-card overview-card--all">
<div class="overview-header">
<span class="user-title">全部积分明细</span>
<span class="hint-text">未指定用户时将展示全部记录支持下方条件筛选</span>
</div>
</el-card>
<!-- 积分明细列表 -->
<el-card class="box-card mt10">
@@ -37,8 +43,41 @@
<span>积分明细</span>
</div>
<div class="container mb10">
<el-form inline size="small" :model="searchForm" label-width="80px">
<el-form inline size="small" :model="searchForm" label-width="96px">
<el-row>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<el-form-item label="用户ID">
<el-input
v-model="searchForm.uidStr"
placeholder="可选,留空查全部"
clearable
class="filter-input"
@keyup.enter.native="handleSearch"
/>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<el-form-item label="用户名称:">
<el-input
v-model="searchForm.nickName"
placeholder="昵称模糊匹配"
clearable
class="filter-input"
@keyup.enter.native="handleSearch"
/>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<el-form-item label="手机号:">
<el-input
v-model="searchForm.phone"
placeholder="手机号模糊匹配"
clearable
class="filter-input"
@keyup.enter.native="handleSearch"
/>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6">
<el-form-item label="时间选择:">
<el-date-picker
@@ -150,7 +189,9 @@ export default {
total: 0,
},
searchForm: {
uid: null,
uidStr: '',
nickName: '',
phone: '',
dateLimit: '',
page: 1,
limit: 15,
@@ -159,26 +200,38 @@ export default {
};
},
created() {
// 从路由 query 中注入 uid 及概览信息
const { uid, nickname, integral, selfBonus } = this.$route.query;
this.uid = uid ? Number(uid) : null;
this.userInfo.nickname = nickname || '';
this.userInfo.integral = integral !== '' && integral != null ? Number(integral) : null;
this.userInfo.selfBonus = selfBonus !== '' && selfBonus != null ? Number(selfBonus) : null;
this.searchForm.uid = this.uid;
if (this.uid) {
this.searchForm.uidStr = String(this.uid);
}
},
mounted() {
if (this.uid) {
this.getList();
} else {
this.$message.error('缺少用户ID无法加载积分明细');
}
},
methods: {
getList() {
this.listLoading = true;
const params = { ...this.searchForm };
if (!params.dateLimit) delete params.dateLimit;
const uidParsed = this.searchForm.uidStr === '' || this.searchForm.uidStr == null
? null
: parseInt(String(this.searchForm.uidStr).trim(), 10);
const uid = Number.isNaN(uidParsed) ? null : uidParsed;
const params = {
page: this.searchForm.page,
limit: this.searchForm.limit,
uid,
nickName: this.searchForm.nickName ? this.searchForm.nickName.trim() : undefined,
phone: this.searchForm.phone ? this.searchForm.phone.trim() : undefined,
dateLimit: this.searchForm.dateLimit || undefined,
};
Object.keys(params).forEach((k) => {
if (params[k] === undefined || params[k] === null || params[k] === '') {
delete params[k];
}
});
getExternalIntegralLog(params)
.then((res) => {
@@ -195,9 +248,14 @@ export default {
this.getList();
},
handleReset() {
this.searchForm.uidStr = '';
this.searchForm.nickName = '';
this.searchForm.phone = '';
this.searchForm.dateLimit = '';
this.searchForm.page = 1;
this.timeVal = [];
this.uid = null;
this.userInfo = { nickname: '', integral: null, selfBonus: null };
this.getList();
},
onchangeTime(e) {
@@ -217,8 +275,17 @@ export default {
this.$router.push('/integral-external/user');
},
linkTypeFilter(type) {
const typeMap = { order: '订单', sign: '签到', system: '系统' };
return typeMap[type] || type || '-';
if (type == null || type === '') return '-';
const raw = String(type).trim();
if (!raw) return '-';
const key = raw.toLowerCase();
const typeMap = {
order: '订单',
sign: '签到',
system: '系统',
selfbonus: '个人奖金',
};
return typeMap[key] || `其他(${raw}`;
},
statusFilter(status) {
const statusMap = { 1: '订单创建', 2: '冻结期', 3: '完成', 4: '失效' };
@@ -288,4 +355,14 @@ export default {
.block {
text-align: right;
}
.filter-input {
width: 180px;
}
.overview-card--all .hint-text {
display: block;
margin-top: 8px;
font-size: 13px;
color: #909399;
font-weight: normal;
}
</style>

View File

@@ -1,5 +1,6 @@
package com.zbkj.admin.controller;
import cn.hutool.core.collection.CollUtil;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.request.*;
import com.zbkj.common.response.StoreOrderDetailResponse;
@@ -69,7 +70,7 @@ public class ExternalIntegralController {
@Validated StoreOrderSearchRequest request,
@Validated PageParamRequest pageParamRequest) {
CommonPage<StoreOrderDetailResponse> restPage =
CommonPage.restPage(storeOrderService.getAdminList(request, pageParamRequest));
storeOrderService.getAdminList(request, pageParamRequest);
return CommonResult.success(restPage);
}
@@ -87,6 +88,9 @@ public class ExternalIntegralController {
@Validated PageParamRequest pageParamRequest) {
CommonPage<UserResponse> restPage =
CommonPage.restPage(userService.getList(request, pageParamRequest));
if (CollUtil.isNotEmpty(restPage.getList())) {
userService.fillWaSelfBonus(restPage.getList());
}
return CommonResult.success(restPage);
}
}

View File

@@ -37,4 +37,10 @@ public class AdminIntegralSearchRequest implements Serializable {
@ApiModelProperty(value = "用户id")
private Integer uid;
@ApiModelProperty(value = "用户名称(昵称,模糊匹配)")
private String nickName;
@ApiModelProperty(value = "用户手机号(模糊匹配)")
private String phone;
}

View File

@@ -123,4 +123,16 @@ public class StoreOrderDetailResponse implements Serializable {
@ApiModelProperty(value = "物流状态/出库状态0-未出库1-已出库")
private Integer deliveryStatus;
@ApiModelProperty(value = "用户id")
private Integer uid;
@ApiModelProperty(value = "用户手机号")
private String userPhone;
@ApiModelProperty(value = "用户昵称")
private String nickname;
@ApiModelProperty(value = "使用积分")
private Integer useIntegral;
}

View File

@@ -92,6 +92,9 @@ public class UserResponse {
@ApiModelProperty(value = "用户剩余积分支持小数点后3位")
private BigDecimal integral;
@ApiModelProperty(value = "个人奖金(寄卖 wa_users.self_bonus与 uid 对应 wa_users.id")
private BigDecimal selfBonus;
@ApiModelProperty(value = "用户剩余经验")
private Integer experience;

View File

@@ -33,6 +33,11 @@ public interface UserService extends IService<User> {
*/
PageInfo<UserResponse> getList(UserSearchRequest request, PageParamRequest pageParamRequest);
/**
* 按 eb_user.uid = wa_users.id 批量填充寄卖个人奖金wa_users.self_bonus
*/
void fillWaSelfBonus(List<UserResponse> users);
/**
* 操作积分、余额
*/
@@ -260,6 +265,13 @@ public interface UserService extends IService<User> {
*/
List<Integer> findIdListLikeName(String nikeName);
/**
* 根据手机号模糊匹配用户,返回 uid 集合
* @param phone 手机号关键字
* @return uid 列表
*/
List<Integer> findIdListLikePhone(String phone);
/**
* 清除对应的用户等级
* @param levelId 等级id

View File

@@ -168,10 +168,11 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
public CommonPage<StoreOrderDetailResponse> getAdminList(StoreOrderSearchRequest request, PageParamRequest pageParamRequest) {
Page<Object> startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
QueryWrapper<StoreOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "order_id", "uid", "real_name", "pay_price", "pay_type", "create_time", "status", "refund_status"
queryWrapper.select("id", "order_id", "uid", "real_name", "user_phone", "pay_price", "pay_type", "create_time", "status", "refund_status"
, "refund_reason_wap_img", "refund_reason_wap_explain", "refund_reason_wap", "refund_reason", "refund_reason_time"
, "is_del", "combination_id", "pink_id", "seckill_id", "bargain_id", "verify_code", "remark", "paid", "is_system_del"
, "shipping_type", "type", "is_alter_price", "pro_total_price", "is_alter_price", "coupon_price", "delivery_status");
, "shipping_type", "type", "is_alter_price", "pro_total_price", "is_alter_price", "coupon_price", "delivery_status"
, "use_integral");
if (StrUtil.isNotBlank(request.getOrderNo())) {
queryWrapper.eq("order_id", request.getOrderNo());
}
@@ -302,17 +303,19 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
//获取订单详情map
HashMap<Integer, List<StoreOrderInfoOldVo>> orderInfoList = StoreOrderInfoService.getMapInId(orderIdList);
//
// //根据用户获取信息
// List<Integer> userIdList = orderList.stream().map(StoreOrder::getUid).distinct().collect(Collectors.toList());
// //订单用户信息
// HashMap<Integer, User> userList = userService.getMapListInUid(userIdList);
List<Integer> userIdList = orderList.stream().map(StoreOrder::getUid).filter(Objects::nonNull).distinct().collect(Collectors.toList());
HashMap<Integer, User> userMap = CollUtil.isEmpty(userIdList) ? new HashMap<>() : userService.getMapListInUid(userIdList);
for (StoreOrder storeOrder : orderList) {
StoreOrderDetailResponse storeOrderItemResponse = new StoreOrderDetailResponse();
BeanUtils.copyProperties(storeOrder, storeOrderItemResponse);
storeOrderItemResponse.setProductList(orderInfoList.get(storeOrder.getId()));
User buyer = userMap.get(storeOrder.getUid());
if (ObjectUtil.isNotNull(buyer)) {
storeOrderItemResponse.setNickname(buyer.getNickname());
}
//订单状态
storeOrderItemResponse.setStatusStr(getStatus(storeOrder));

View File

@@ -33,7 +33,10 @@ import org.springframework.transaction.support.TransactionTemplate;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -114,7 +117,7 @@ public class UserIntegralRecordServiceImpl extends ServiceImpl<UserIntegralRecor
// 批量事务处理同一用户的积分解冻
Boolean execute = transactionTemplate.execute(e -> {
Integer currentIntegral = user.getIntegral();
BigDecimal currentIntegral = user.getIntegral();
for (UserIntegralRecord record : userRecords) {
record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE);
// 计算积分余额
@@ -126,7 +129,7 @@ public class UserIntegralRecordServiceImpl extends ServiceImpl<UserIntegralRecor
// 更新用户积分
userService.operationIntegral(uid, record.getIntegral(), currentIntegral, "add");
currentIntegral = balance; // 更新当前积分供下一条记录计算
currentIntegral = BigDecimal.valueOf(balance); // 更新当前积分供下一条记录计算
}
return Boolean.TRUE;
});
@@ -151,19 +154,48 @@ public class UserIntegralRecordServiceImpl extends ServiceImpl<UserIntegralRecor
Page<UserIntegralRecordResponse> page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
LambdaQueryWrapper<UserIntegralRecord> lqw = Wrappers.lambdaQuery();
lqw.select(UserIntegralRecord::getId, UserIntegralRecord::getTitle, UserIntegralRecord::getBalance, UserIntegralRecord::getIntegral,
UserIntegralRecord::getMark, UserIntegralRecord::getUid, UserIntegralRecord::getUpdateTime);
UserIntegralRecord::getMark, UserIntegralRecord::getUid, UserIntegralRecord::getUpdateTime,
UserIntegralRecord::getType, UserIntegralRecord::getLinkType, UserIntegralRecord::getStatus, UserIntegralRecord::getCreateTime);
lqw.eq(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE);
if (ObjectUtil.isNotNull(request.getUid())) {
lqw.eq(UserIntegralRecord::getUid, request.getUid());
}
if (StrUtil.isNotBlank(request.getKeywords())) {
List<Integer> idList = userService.findIdListLikeName(request.getKeywords());
if (CollUtil.isNotEmpty(idList)) {
lqw.in(UserIntegralRecord::getUid, idList);
} else {
String nameKey = StrUtil.isNotBlank(request.getNickName()) ? request.getNickName() : request.getKeywords();
List<Integer> nameUidList = null;
if (StrUtil.isNotBlank(nameKey)) {
nameUidList = userService.findIdListLikeName(nameKey);
if (CollUtil.isEmpty(nameUidList)) {
return CommonPage.copyPageInfo(page, CollUtil.newArrayList());
}
}
List<Integer> phoneUidList = null;
if (StrUtil.isNotBlank(request.getPhone())) {
phoneUidList = userService.findIdListLikePhone(request.getPhone());
if (CollUtil.isEmpty(phoneUidList)) {
return CommonPage.copyPageInfo(page, CollUtil.newArrayList());
}
}
List<Integer> mergedUids = null;
if (nameUidList != null) {
mergedUids = new ArrayList<>(nameUidList);
}
if (phoneUidList != null) {
if (mergedUids == null) {
mergedUids = new ArrayList<>(phoneUidList);
} else {
mergedUids.retainAll(new HashSet<>(phoneUidList));
if (mergedUids.isEmpty()) {
return CommonPage.copyPageInfo(page, CollUtil.newArrayList());
}
}
}
if (ObjectUtil.isNotNull(request.getUid())) {
if (mergedUids != null && !mergedUids.contains(request.getUid())) {
return CommonPage.copyPageInfo(page, CollUtil.newArrayList());
}
lqw.eq(UserIntegralRecord::getUid, request.getUid());
} else if (mergedUids != null) {
lqw.in(UserIntegralRecord::getUid, mergedUids);
}
//时间范围
if (StrUtil.isNotBlank(request.getDateLimit())) {
DateLimitUtilVo dateLimit = CrmebDateUtil.getDateLimit(request.getDateLimit());
@@ -176,6 +208,7 @@ public class UserIntegralRecordServiceImpl extends ServiceImpl<UserIntegralRecor
lqw.between(UserIntegralRecord::getUpdateTime, dateLimit.getStartTime(), dateLimit.getEndTime());
}
lqw.orderByDesc(UserIntegralRecord::getUpdateTime);
lqw.orderByDesc(UserIntegralRecord::getId);
List<UserIntegralRecord> list = dao.selectList(lqw);
if (CollUtil.isEmpty(list)) {
return CommonPage.copyPageInfo(page, CollUtil.newArrayList());

View File

@@ -15,6 +15,7 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.constants.*;
import com.zbkj.common.exception.CrmebException;
import com.zbkj.common.model.consignment.WaUsers;
import com.zbkj.common.model.coupon.StoreCoupon;
import com.zbkj.common.model.coupon.StoreCouponUser;
import com.zbkj.common.model.order.StoreOrder;
@@ -28,6 +29,7 @@ import com.zbkj.common.token.FrontTokenComponent;
import com.zbkj.common.utils.*;
import com.zbkj.common.vo.DateLimitUtilVo;
import com.zbkj.service.dao.UserDao;
import com.zbkj.service.dao.consignment.WaUsersDao;
import com.zbkj.service.service.*;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
@@ -58,6 +60,9 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
@Resource
private UserDao userDao;
@Resource
private WaUsersDao waUsersDao;
@Autowired
private UserBillService userBillService;
@@ -223,6 +228,33 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
return CommonPage.copyPageInfo(pageUser, userResponses);
}
@Override
public void fillWaSelfBonus(List<UserResponse> users) {
if (CollUtil.isEmpty(users)) {
return;
}
List<Integer> uids = users.stream()
.map(UserResponse::getUid)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (CollUtil.isEmpty(uids)) {
return;
}
List<WaUsers> waUsers = waUsersDao.selectBatchIds(uids);
if (CollUtil.isEmpty(waUsers)) {
return;
}
Map<Integer, BigDecimal> idToBonus = waUsers.stream()
.filter(w -> w.getId() != null)
.collect(Collectors.toMap(WaUsers::getId, WaUsers::getSelfBonus, (a, b) -> a));
for (UserResponse ur : users) {
if (ur.getUid() != null && idToBonus.containsKey(ur.getUid())) {
ur.setSelfBonus(idToBonus.get(ur.getUid()));
}
}
}
/**
* 操作积分、余额
*/
@@ -1586,6 +1618,18 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
return userList.stream().map(User::getUid).collect(Collectors.toList());
}
@Override
public List<Integer> findIdListLikePhone(String phone) {
LambdaQueryWrapper<User> lqw = Wrappers.lambdaQuery();
lqw.select(User::getUid);
lqw.like(User::getPhone, phone);
List<User> userList = userDao.selectList(lqw);
if (CollUtil.isEmpty(userList)) {
return new ArrayList<>();
}
return userList.stream().map(User::getUid).collect(Collectors.toList());
}
/**
* 清除对应的用户等级
* @param levelId 等级id

View File

@@ -1,14 +1,37 @@
# 管理后台中积分模块新增如下页面
## 积分订单页面
- 新建页面,参考原页面:/order/index
- **已修复**新建页面,参考原页面:/order/index
## 用户积分页面
- 新建页面,参考原页面:/user/index增加wa_users的相关字段
- **已修复**新建页面,参考原页面:/user/index增加wa_users的相关字段
### 用户积分明细子页面
- 一个新建积分明细页面参考原页面“user/index 用户管理-》账户详情-》积分明细”延用原后端api/marketing/integral/integrallog
- **已修复**一个新建积分明细页面参考原页面“user/index 用户管理-》账户详情-》积分明细”延用原后端api/marketing/integral/integrallog
## 修改
### 积分订单页面修改,路径:/integral-external/order
- **已修复**1. 去除订单类型的选择,默认入参:“普通订单”类型
- **已修复**2. 订单列表中增加“使用积分”列
- **已修复**3. 订单列表中增加用户信息相关列
### 用户积分页面修改,路径:/integral-external/user
- **已修复**列表中个人奖金没有显示出来数据从wa_users表中获取数据
### 用户积分明细页面修改,路径:/integral-external/user/integral-detail
- **已修复**增加用户id用户名称用户手机号输入框作为查询接口参数
- **已修复**没有用户id的时候显示所有的积分明细数据按照id或者时间倒序
- **已修复**关联类型显示中文(含 order/sign/system/selfbonus 及未知值「其他(原值)」)
## 备注
- 所有新建页面跳过用户登陆状态验证
- 按照后端api最小修改原则尽量延用原后端api
- **已修复**所有新建页面跳过用户登陆状态验证
- **已修复**按照后端api最小修改原则尽量延用原后端api