批量按部门修改代理商的寄卖状态,用户状态

This commit is contained in:
2026-09-08 01:15:22 +08:00
parent 5b5c3bdb41
commit 1b8294ae65
9 changed files with 905 additions and 2 deletions

View File

@@ -64,6 +64,7 @@ public class MybatisPlusConfig {
ignoreTables.add("lb_buy_account"); // 抢单账号跨租户管理;分页/批量抢单按记录 tenant_id 业务处理
ignoreTables.add("lb_buy_account_history"); // 抢单历史跨租户查询;按记录 tenant_id 业务过滤
ignoreTables.add("lb_goods"); // 货品跨租户管理;分页/抢单按页面或业务传入的 tenant_id 显式过滤
ignoreTables.add("member_info"); // 第三方库镜像会员表(business_shop.member_info),表无 tenant_id 字段
return new TenantLineHandler() {

View File

@@ -53,6 +53,58 @@ public class LbPurchaseApplyController {
private Integer maxOrder;
}
@Data
@Schema(description = "按用户ID批量修改「是否可以寄卖 / 用户状态」请求体")
public static class UpdateHxrAdminUserResellStatusRequest {
@Schema(description = "租户ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "租户id不能为空")
private String tenantId;
@Schema(description = "hxrd 后台用户 ID 列表", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "用户id列表不能为空")
private List<Long> userIds;
@Schema(description = "isResell 是否生效:true 修改「是否可以寄卖」,false 不修改该字段",
requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "isResellEnabled不能为空")
private Boolean isResellEnabled;
@Schema(description = "是否可以寄卖 is_resell 的值:1 可以寄卖,0 不可以寄卖;isResellEnabled 为 true 时必填")
private Integer isResell;
@Schema(description = "status 是否生效:true 修改「用户状态」,false 不修改该字段",
requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "statusEnabled不能为空")
private Boolean statusEnabled;
@Schema(description = "用户状态 status 的值:1 正常,0 停用;statusEnabled 为 true 时必填")
private Integer status;
}
@Data
@Schema(description = "按 member_info 全部用户批量修改「是否可以寄卖 / 用户状态」请求体")
public static class UpdateHxrAdminUserResellStatusForAllMembersRequest {
@Schema(description = "租户ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "租户id不能为空")
private String tenantId;
@Schema(description = "isResell 是否生效:true 修改「是否可以寄卖」,false 不修改该字段",
requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "isResellEnabled不能为空")
private Boolean isResellEnabled;
@Schema(description = "是否可以寄卖 is_resell 的值:1 可以寄卖,0 不可以寄卖;isResellEnabled 为 true 时必填")
private Integer isResell;
@Schema(description = "status 是否生效:true 修改「用户状态」,false 不修改该字段",
requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "statusEnabled不能为空")
private Boolean statusEnabled;
@Schema(description = "用户状态 status 的值:1 正常,0 停用;statusEnabled 为 true 时必填")
private Integer status;
}
@Data
@Schema(description = "大模型解析订货信息请求体")
public static class ParseOrderInfoRequest {
@@ -176,6 +228,47 @@ public class LbPurchaseApplyController {
return ResponseEntity.badRequest().body(result);
}
@PostMapping("/updateHxrAdminUserResellStatusByUserIds")
@Operation(summary = "按用户ID列表批量修改是否可寄卖与用户状态",
description = "根据入参 userIds 逐条调用 POST /app/admin/user/update,"
+ "仅修改生效标记为 true 的字段(isResellEnabled→is_resell,statusEnabled→status),"
+ "未生效的字段不向第三方提交、保持原值;"
+ "cookie、URL、Referer 等从 lb_third_integration_config 按 tenantId 读取")
public ResponseEntity<Map<String, Object>> updateHxrAdminUserResellStatusByUserIds(
@Parameter(description = "租户、用户列表及寄卖/状态参数", required = true)
@Valid @RequestBody UpdateHxrAdminUserResellStatusRequest body) {
Map<String, Object> result = lbPurchaseApplyService.updateHxrAdminUserResellStatusByUserIds(
body.getTenantId(), body.getUserIds(),
body.getIsResellEnabled(), body.getIsResell(),
body.getStatusEnabled(), body.getStatus());
Boolean success = (Boolean) result.get("success");
if (success != null && success) {
return ResponseEntity.ok(result);
}
return ResponseEntity.badRequest().body(result);
}
@PostMapping("/updateHxrAdminUserResellStatusForAllMembers")
@Operation(summary = "按 member_info 全部用户批量修改是否可寄卖与用户状态",
description = "用户 id 列表从 member_info 表读取全部用户(不接收 id 列表),"
+ "逐条调用 POST /app/admin/user/update(v1 后台接口),"
+ "仅修改生效标记为 true 的字段(isResellEnabled→is_resell,statusEnabled→status),"
+ "未生效的字段不向第三方提交、保持原值;"
+ "cookie、URL、Referer 等从 lb_third_integration_config 按 tenantId 读取")
public ResponseEntity<Map<String, Object>> updateHxrAdminUserResellStatusForAllMembers(
@Parameter(description = "租户及寄卖/状态参数", required = true)
@Valid @RequestBody UpdateHxrAdminUserResellStatusForAllMembersRequest body) {
Map<String, Object> result = lbPurchaseApplyService.updateHxrAdminUserResellStatusForAllMembers(
body.getTenantId(),
body.getIsResellEnabled(), body.getIsResell(),
body.getStatusEnabled(), body.getStatus());
Boolean success = (Boolean) result.get("success");
if (success != null && success) {
return ResponseEntity.ok(result);
}
return ResponseEntity.badRequest().body(result);
}
@GetMapping("/syncHxrAdminColleagueVip")
@Operation(summary = "按申请日期与租户同步同事 hxrd 用户 VIP",
description = "根据 lb_purchase_apply 的申请日期区间与 tenant_id 逐条处理,"

View File

@@ -0,0 +1,99 @@
package com.rj.controller;
import com.rj.entity.MemberInfo;
import com.rj.service.IMemberInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/api/memberInfo")
@Tag(name = "会员信息", description = "member_info 增删改查与分页")
public class MemberInfoController {
@Autowired
private IMemberInfoService memberInfoService;
@PostMapping("/add")
@Operation(summary = "新增")
public ResponseEntity<Map<String, Object>> add(
@Parameter(description = "会员实体", required = true) @RequestBody MemberInfo entity) {
Map<String, Object> result = memberInfoService.add(entity);
Boolean success = (Boolean) result.get("success");
if (success != null && success) {
return ResponseEntity.ok(result);
}
return ResponseEntity.badRequest().body(result);
}
@PutMapping("/update")
@Operation(summary = "编辑")
public ResponseEntity<Map<String, Object>> update(
@Parameter(description = "会员实体(须含 id)", required = true) @RequestBody MemberInfo entity) {
Map<String, Object> result = memberInfoService.update(entity);
Boolean success = (Boolean) result.get("success");
if (success != null && success) {
return ResponseEntity.ok(result);
}
return ResponseEntity.badRequest().body(result);
}
@DeleteMapping("/delete/{id}")
@Operation(summary = "删除")
public ResponseEntity<Map<String, Object>> delete(
@Parameter(description = "主键ID", required = true) @PathVariable String id) {
Map<String, Object> result = memberInfoService.deleteById(id);
Boolean success = (Boolean) result.get("success");
if (success != null && success) {
return ResponseEntity.ok(result);
}
return ResponseEntity.badRequest().body(result);
}
@GetMapping("/list")
@Operation(summary = "分页查询")
public ResponseEntity<Map<String, Object>> list(
@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size,
@Parameter(description = "手机号") @RequestParam(required = false) String phone,
@Parameter(description = "昵称") @RequestParam(required = false) String nickname,
@Parameter(description = "邀请码") @RequestParam(required = false) String inviteCode,
@Parameter(description = "上级ID") @RequestParam(required = false) String parentId,
@Parameter(description = "用户等级") @RequestParam(required = false) String userLevel,
@Parameter(description = "状态") @RequestParam(required = false) Integer status,
@Parameter(description = "审核状态") @RequestParam(required = false) Integer auditStatus,
@Parameter(description = "是否可以寄卖(0-禁用,1-启用)") @RequestParam(required = false) Integer canConsign) {
Map<String, Object> result = memberInfoService.pageQuery(
current, size, phone, nickname, inviteCode, parentId, userLevel, status, auditStatus, canConsign);
Boolean success = (Boolean) result.get("success");
if (success != null && success) {
return ResponseEntity.ok(result);
}
return ResponseEntity.internalServerError().body(result);
}
@GetMapping("/listAll")
@Operation(summary = "查询全部数据")
public ResponseEntity<Map<String, Object>> listAll(
@Parameter(description = "手机号") @RequestParam(required = false) String phone,
@Parameter(description = "昵称") @RequestParam(required = false) String nickname,
@Parameter(description = "邀请码") @RequestParam(required = false) String inviteCode,
@Parameter(description = "上级ID") @RequestParam(required = false) String parentId,
@Parameter(description = "用户等级") @RequestParam(required = false) String userLevel,
@Parameter(description = "状态") @RequestParam(required = false) Integer status,
@Parameter(description = "审核状态") @RequestParam(required = false) Integer auditStatus,
@Parameter(description = "是否可以寄卖(0-禁用,1-启用)") @RequestParam(required = false) Integer canConsign) {
Map<String, Object> result = memberInfoService.listAll(
phone, nickname, inviteCode, parentId, userLevel, status, auditStatus, canConsign);
Boolean success = (Boolean) result.get("success");
if (success != null && success) {
return ResponseEntity.ok(result);
}
return ResponseEntity.internalServerError().body(result);
}
}

View File

@@ -0,0 +1,182 @@
package com.rj.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("member_info")
@Schema(description = "会员表")
public class MemberInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.ASSIGN_UUID)
@Schema(description = "主键ID")
private String id;
@TableField("phone")
@Schema(description = "手机号/账号")
private String phone;
@TableField("nickname")
@Schema(description = "昵称")
private String nickname;
@TableField("avatar")
@Schema(description = "头像")
private String avatar;
@TableField("password")
@Schema(description = "密码")
private String password;
@TableField("invite_code")
@Schema(description = "邀请码")
private String inviteCode;
@TableField("parent_id")
@Schema(description = "上级ID")
private String parentId;
@TableField("user_level")
@Schema(description = "用户等级(normal-普通用户,referral-推荐人,shopkeeper-店长,second_shopkeeper-二代店长)")
private String userLevel;
@TableField("available_order_count")
@Schema(description = "当天可抢订单数量")
private Integer availableOrderCount;
@TableField("vip_end_time")
@Schema(description = "新人体验VIP截止时间")
private LocalDateTime vipEndTime;
@TableField("is_priority_buy")
@Schema(description = "是否优先抢购(0-禁用,1-启用)")
private Integer isPriorityBuy;
@TableField("can_consign")
@Schema(description = "是否可以寄卖(0-禁用,1-启用)")
private Integer canConsign;
@TableField("status")
@Schema(description = "状态(0-禁用,1-正常)")
private Integer status;
@TableField("balance")
@Schema(description = "余额")
private BigDecimal balance;
@TableField("coupon_balance")
@Schema(description = "优惠券")
private BigDecimal couponBalance;
@TableField("personal_bonus")
@Schema(description = "个人奖金")
private BigDecimal personalBonus;
@TableField("promotion_bonus")
@Schema(description = "推广奖金")
private BigDecimal promotionBonus;
@TableField("contract_status")
@Schema(description = "合同状态")
private String contractStatus;
@TableField("today_buy_amount")
@Schema(description = "今日购买总金额")
private BigDecimal todayBuyAmount;
@TableField("today_sell_amount")
@Schema(description = "今日卖出总金额")
private BigDecimal todaySellAmount;
@TableField("yesterday_new_count")
@Schema(description = "昨日卖出数量")
private Integer yesterdayNewCount;
@TableField("today_buy_count")
@Schema(description = "今日购买数量")
private Integer todayBuyCount;
@TableField("available_goods_count")
@Schema(description = "商品可抢单数")
private Integer availableGoodsCount;
@TableField("bank_card_number")
@Schema(description = "银行卡号")
private String bankCardNumber;
@TableField("bank_name")
@Schema(description = "开户行")
private String bankName;
@TableField("bank_card_name")
@Schema(description = "银行卡姓名")
private String bankCardName;
@TableField("bank_phone")
@Schema(description = "银行卡手机号")
private String bankPhone;
@TableField("alipay_account")
@Schema(description = "支付宝账号")
private String alipayAccount;
@TableField("alipay_name")
@Schema(description = "支付宝姓名")
private String alipayName;
@TableField("alipay_qr_code")
@Schema(description = "支付宝二维码")
private String alipayQrCode;
@TableField("alipay_phone")
@Schema(description = "支付宝手机号")
private String alipayPhone;
@TableField("create_by")
@Schema(description = "创建人")
private String createBy;
@TableField("update_by")
@Schema(description = "更新人")
private String updateBy;
@TableField("create_time")
@Schema(description = "创建时间")
private LocalDateTime createTime;
@TableField("update_time")
@Schema(description = "更新时间")
private LocalDateTime updateTime;
@TableField("audit_status")
@Schema(description = "审核状态(0-未审核,1-已审核)")
private Integer auditStatus;
@TableField("last_time")
@Schema(description = "最后登录时间")
private LocalDateTime lastTime;
@TableField("last_ip")
@Schema(description = "最后登录IP")
private String lastIp;
@TableField("join_time")
@Schema(description = "注册时间")
private LocalDateTime joinTime;
@TableField("join_ip")
@Schema(description = "注册IP")
private String joinIp;
}

View File

@@ -0,0 +1,9 @@
package com.rj.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.rj.entity.MemberInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MemberInfoMapper extends BaseMapper<MemberInfo> {
}

View File

@@ -1056,6 +1056,42 @@ public class HxrAdminUserService {
public boolean updateUserVipFields(
long userId, Integer maxOrder, String viptimeFormatted, int isVip, HxrAdminUserApiContext ctx)
throws Exception {
String form = buildUpdateFormBody(userId, maxOrder, viptimeFormatted, isVip);
return postUserUpdateForm(form, ctx, String.valueOf(userId));
}
/**
* 更新用户「是否可以寄卖 is_resell / 用户状态 status」字段({@code application/x-www-form-urlencoded})。
* 仅当对应参数非 {@code null} 时才向第三方提交该字段,为 {@code null} 时不传、第三方保持原值。
*
* @param isResell 是否可以寄卖:1 可以,0 不可以;null 不修改该字段
* @param status 用户状态:1 正常,0 停用;null 不修改该字段
* @return 接口 {@code code==0} 时为 true
*/
public boolean updateUserResellStatusFields(long userId, Integer isResell, Integer status, HxrAdminUserApiContext ctx)
throws Exception {
return updateUserResellStatusFields(String.valueOf(userId), isResell, status, ctx);
}
/**
* 更新用户「是否可以寄卖 is_resell / 用户状态 status」字段(重载:用户 id 为字符串,如 member_info.id,原样透传给第三方)。
* 仅当对应参数非 {@code null} 时才向第三方提交该字段,为 {@code null} 时不传、第三方保持原值。
*
* @param isResell 是否可以寄卖:1 可以,0 不可以;null 不修改该字段
* @param status 用户状态:1 正常,0 停用;null 不修改该字段
* @return 接口 {@code code==0} 时为 true
*/
public boolean updateUserResellStatusFields(String userId, Integer isResell, Integer status, HxrAdminUserApiContext ctx)
throws Exception {
String form = buildResellStatusFormBody(userId, isResell, status);
return postUserUpdateForm(form, ctx, userId);
}
/**
* 校验上下文并以 {@code application/x-www-form-urlencoded} 表单 POST 到 user/update,
* 接口 {@code code==0} 时返回 true。
*/
private boolean postUserUpdateForm(String form, HxrAdminUserApiContext ctx, String userId) throws Exception {
if (ctx == null) {
log.warn("用户 API 配置为空,跳过 user/update");
return false;
@@ -1076,8 +1112,6 @@ public class HxrAdminUserService {
return false;
}
String form = buildUpdateFormBody(userId, maxOrder, viptimeFormatted, isVip);
HttpClient client = HttpClient.newBuilder()
.connectTimeout(java.time.Duration.ofSeconds(35))
.followRedirects(HttpClient.Redirect.NORMAL)
@@ -1135,6 +1169,19 @@ public class HxrAdminUserService {
return form.toString();
}
/** 仅提交「是否可以寄卖 is_resell / 用户状态 status」中非 null 的字段(id 必传;id 为字符串原样透传)。 */
private static String buildResellStatusFormBody(String userId, Integer isResell, Integer status) {
StringBuilder form = new StringBuilder();
form.append("id=").append(userId);
if (isResell != null) {
form.append("&is_resell=").append(isResell == 1 ? 1 : 0);
}
if (status != null) {
form.append("&status=").append(status == 1 ? 1 : 0);
}
return form.toString();
}
/**
* v2 模拟登录:POST JSON {phone,password} → /trade-app/api/app/login。
* 成功返回格式:{ success:true, token:"Bearer eyJ..." };去掉 "Bearer " 前缀后返回。

View File

@@ -41,6 +41,25 @@ public interface ILbPurchaseApplyService extends IService<LbPurchaseApply> {
Map<String, Object> updateHxrAdminUserVipByUserIds(
String tenantId, List<Long> userIds, Integer isVip, String vipTime, Integer maxOrder);
/**
* 按用户 ID 列表批量调用 hxrd 用户更新接口,修改「是否可以寄卖 is_resell」与「用户状态 status」;
* 仅修改生效标记为 {@code true} 的字段,未生效的字段不向第三方提交、保持原值。
*/
Map<String, Object> updateHxrAdminUserResellStatusByUserIds(
String tenantId, List<Long> userIds,
Boolean isResellEnabled, Integer isResell,
Boolean statusEnabled, Integer status);
/**
* 从 {@code member_info} 表读取全部用户 id(不接收 id 列表),批量调用 hxrd 用户更新接口(v1 后台接口)
* 修改「是否可以寄卖 is_resell」与「用户状态 status」;
* 仅修改生效标记为 {@code true} 的字段,未生效的字段不向第三方提交、保持原值。
*/
Map<String, Object> updateHxrAdminUserResellStatusForAllMembers(
String tenantId,
Boolean isResellEnabled, Integer isResell,
Boolean statusEnabled, Integer status);
/**
* 按申请日期区间与租户筛选进货申请,对每条记录的 {@code colleague_phone} 调用 hxrd 用户查询与更新,
* 仅当 {@code colleague_name} 能在 {@code lb_daily_user_trade}(同租户、按 nickname)中查到时才开通;

View File

@@ -17,11 +17,13 @@ import com.rj.entity.LbDailyUserTradeReport;
import com.rj.entity.LbOrderRow;
import com.rj.entity.LbPurchaseApply;
import com.rj.entity.LbUser;
import com.rj.entity.MemberInfo;
import com.rj.util.IsoWorkdayUtils;
import com.rj.mapper.LbDailyUserTradeReportMapper;
import com.rj.mapper.LbOrderRowMapper;
import com.rj.mapper.LbPurchaseApplyMapper;
import com.rj.mapper.LbUserMapper;
import com.rj.mapper.MemberInfoMapper;
import com.rj.service.HxrAdminUserService;
import com.rj.service.ILbPurchaseApplyService;
import com.rj.service.ILbThirdIntegrationConfigService;
@@ -74,6 +76,9 @@ public class LbPurchaseApplyServiceImpl
@Autowired
private LbUserMapper lbUserMapper;
@Autowired
private MemberInfoMapper memberInfoMapper;
@Autowired
private LbOrderRowMapper lbOrderRowMapper;
@@ -978,6 +983,208 @@ public class LbPurchaseApplyServiceImpl
}
}
@Override
public Map<String, Object> updateHxrAdminUserResellStatusByUserIds(
String tenantId, List<Long> userIds,
Boolean isResellEnabled, Integer isResell,
Boolean statusEnabled, Integer status) {
Map<String, Object> result = new HashMap<>();
try {
if (tenantId == null || tenantId.trim().isEmpty()) {
result.put("success", false);
result.put("message", "租户id不能为空");
return result;
}
if (userIds == null || userIds.isEmpty()) {
result.put("success", false);
result.put("message", "用户id列表不能为空");
return result;
}
String validationError = validateResellStatusParams(isResellEnabled, isResell, statusEnabled, status);
if (validationError != null) {
result.put("success", false);
result.put("message", validationError);
return result;
}
String tid = tenantId.trim();
Optional<HxrAdminUserApiContext> apiContextOpt =
lbThirdIntegrationConfigService.resolveAdminUserApiContext(tid);
if (apiContextOpt.isEmpty()) {
return buildApiContextMissingResult(tid, userIds.size());
}
List<String> ids = new ArrayList<>(userIds.size());
for (Long userId : userIds) {
ids.add(userId == null ? null : String.valueOf(userId));
}
return doUpdateHxrAdminUserResellStatus(tid, ids, apiContextOpt.get(),
Boolean.TRUE.equals(isResellEnabled), isResell,
Boolean.TRUE.equals(statusEnabled), status);
} catch (Exception e) {
result.put("success", false);
result.put("message", "处理异常:" + e.getMessage());
return result;
}
}
@Override
public Map<String, Object> updateHxrAdminUserResellStatusForAllMembers(
String tenantId,
Boolean isResellEnabled, Integer isResell,
Boolean statusEnabled, Integer status) {
Map<String, Object> result = new HashMap<>();
try {
if (tenantId == null || tenantId.trim().isEmpty()) {
result.put("success", false);
result.put("message", "租户id不能为空");
return result;
}
String validationError = validateResellStatusParams(isResellEnabled, isResell, statusEnabled, status);
if (validationError != null) {
result.put("success", false);
result.put("message", validationError);
return result;
}
// 读取 member_info 全部用户(该表为第三方库镜像,无 tenant_id,已在租户拦截器忽略名单中)
// 过滤掉昵称中包含 "**" 的记录(脱敏/无效数据)
LambdaQueryWrapper<MemberInfo> memberQuery = new LambdaQueryWrapper<>();
memberQuery.and(w -> w.isNull(MemberInfo::getNickname)
.or().notLike(MemberInfo::getNickname, "**"));
List<MemberInfo> members = memberInfoMapper.selectList(memberQuery);
if (members == null || members.isEmpty()) {
result.put("success", false);
result.put("message", "member_info 表无用户数据");
return result;
}
List<String> userIds = new ArrayList<>(members.size());
for (MemberInfo member : members) {
userIds.add(member == null ? null : member.getId());
}
String tid = tenantId.trim();
Optional<HxrAdminUserApiContext> apiContextOpt =
lbThirdIntegrationConfigService.resolveAdminUserApiContext(tid);
if (apiContextOpt.isEmpty()) {
return buildApiContextMissingResult(tid, userIds.size());
}
return doUpdateHxrAdminUserResellStatus(tid, userIds, apiContextOpt.get(),
Boolean.TRUE.equals(isResellEnabled), isResell,
Boolean.TRUE.equals(statusEnabled), status);
} catch (Exception e) {
result.put("success", false);
result.put("message", "处理异常:" + e.getMessage());
return result;
}
}
/** 校验寄卖/状态参数:至少一项生效,生效字段的值必须为 0 或 1;返回 null 表示校验通过。 */
private static String validateResellStatusParams(
Boolean isResellEnabled, Integer isResell,
Boolean statusEnabled, Integer status) {
boolean resellEffect = Boolean.TRUE.equals(isResellEnabled);
boolean statusEffect = Boolean.TRUE.equals(statusEnabled);
if (!resellEffect && !statusEffect) {
return "isResellEnabled 与 statusEnabled 至少一项需为 true";
}
if (resellEffect && (isResell == null || (isResell != 0 && isResell != 1))) {
return "isResell 生效时其值必须为 0 或 1";
}
if (statusEffect && (status == null || (status != 0 && status != 1))) {
return "status 生效时其值必须为 0 或 1";
}
return null;
}
/** 组装「未找到租户第三方集成配置」的失败结果。 */
private static Map<String, Object> buildApiContextMissingResult(String tid, int total) {
Map<String, Object> result = new HashMap<>();
result.put("success", false);
result.put("message",
"未找到该租户的第三方集成配置,或配置未启用、URL/凭证不完整(请检查 lb_third_integration_config)");
result.put("totalRecords", total);
result.put("successCount", 0);
result.put("failCount", total);
result.put("details", List.of());
result.put("tenantId", tid);
return result;
}
/**
* 逐个用户调用 hxrd user/update(v1 后台接口)修改 is_resell/status;
* 未生效字段传 null,第三方提交时不携带、保持原值。
*/
private Map<String, Object> doUpdateHxrAdminUserResellStatus(
String tid,
List<String> userIds,
HxrAdminUserApiContext apiContext,
boolean resellEffect, Integer isResell,
boolean statusEffect, Integer status) {
Map<String, Object> result = new HashMap<>();
Integer isResellForApi = resellEffect ? isResell : null;
Integer statusForApi = statusEffect ? status : null;
List<Map<String, Object>> details = new ArrayList<>();
int ok = 0;
int fail = 0;
for (String userId : userIds) {
Map<String, Object> one = new HashMap<>();
one.put("userId", userId);
if (resellEffect) {
one.put("isResell", isResellForApi);
}
if (statusEffect) {
one.put("status", statusForApi);
}
if (userId == null || userId.trim().isEmpty()) {
one.put("success", false);
one.put("message", "用户id为空,跳过");
fail++;
details.add(one);
continue;
}
try {
boolean updated =
hxrAdminUserService.updateUserResellStatusFields(
userId, isResellForApi, statusForApi, apiContext);
if (updated) {
one.put("success", true);
one.put("message", "user/update 成功");
ok++;
} else {
one.put("success", false);
one.put("message", "user/update 失败");
fail++;
}
} catch (Exception ex) {
one.put("success", false);
one.put("message", "调用异常:" + ex.getMessage());
fail++;
}
details.add(one);
}
result.put("success", fail == 0);
result.put("message", fail == 0 ? "全部处理成功" : "部分或全部失败,见 details");
result.put("totalRecords", userIds.size());
result.put("successCount", ok);
result.put("failCount", fail);
result.put("isResellEnabled", resellEffect);
if (resellEffect) {
result.put("isResell", isResellForApi);
}
result.put("statusEnabled", statusEffect);
if (statusEffect) {
result.put("status", statusForApi);
}
result.put("details", details);
result.put("tenantId", tid);
return result;
}
@Override
public Map<String, Object> syncHxrAdminColleagueVipByApplyDateRange(
LocalDate applyDateStart, LocalDate applyDateEnd, String tenantId) {

View File

@@ -0,0 +1,246 @@
package com.rj.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.rj.entity.MemberInfo;
import com.rj.mapper.MemberInfoMapper;
import com.rj.service.IMemberInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class MemberInfoServiceImpl extends ServiceImpl<MemberInfoMapper, MemberInfo> implements IMemberInfoService {
@Override
public Map<String, Object> add(MemberInfo entity) {
Map<String, Object> result = new HashMap<>();
try {
if (entity.getPhone() == null || entity.getPhone().trim().isEmpty()) {
result.put("success", false);
result.put("message", "phone(手机号)不能为空");
return result;
}
entity.setPhone(entity.getPhone().trim());
// 同一手机号唯一
MemberInfo existing = this.getOne(
new LambdaQueryWrapper<MemberInfo>().eq(MemberInfo::getPhone, entity.getPhone()),
false);
if (existing != null) {
result.put("success", false);
result.put("message", "该手机号已存在");
return result;
}
// 设置默认值
if (entity.getStatus() == null) {
entity.setStatus(1);
}
if (entity.getUserLevel() == null || entity.getUserLevel().trim().isEmpty()) {
entity.setUserLevel("normal");
}
if (entity.getAvailableOrderCount() == null) {
entity.setAvailableOrderCount(0);
}
if (entity.getIsPriorityBuy() == null) {
entity.setIsPriorityBuy(0);
}
if (entity.getCanConsign() == null) {
entity.setCanConsign(1);
}
if (entity.getAuditStatus() == null) {
entity.setAuditStatus(0);
}
LocalDateTime now = LocalDateTime.now();
if (entity.getCreateTime() == null) {
entity.setCreateTime(now);
}
entity.setUpdateTime(now);
if (entity.getJoinTime() == null) {
entity.setJoinTime(now);
}
boolean ok = this.save(entity);
result.put("success", ok);
result.put("message", ok ? "新增成功" : "新增失败");
if (ok) {
result.put("data", this.getById(entity.getId()));
}
return result;
} catch (Exception e) {
result.put("success", false);
result.put("message", "新增异常:" + e.getMessage());
return result;
}
}
@Override
public Map<String, Object> update(MemberInfo entity) {
Map<String, Object> result = new HashMap<>();
try {
if (entity.getId() == null || entity.getId().trim().isEmpty()) {
result.put("success", false);
result.put("message", "id不能为空");
return result;
}
if (this.getById(entity.getId()) == null) {
result.put("success", false);
result.put("message", "记录不存在");
return result;
}
if (entity.getPhone() != null) {
entity.setPhone(entity.getPhone().trim());
}
entity.setUpdateTime(LocalDateTime.now());
boolean ok = this.updateById(entity);
result.put("success", ok);
result.put("message", ok ? "编辑成功" : "编辑失败");
if (ok) {
result.put("data", this.getById(entity.getId()));
}
return result;
} catch (Exception e) {
result.put("success", false);
result.put("message", "编辑异常:" + e.getMessage());
return result;
}
}
@Override
public Map<String, Object> deleteById(String id) {
Map<String, Object> result = new HashMap<>();
try {
if (id == null || id.trim().isEmpty()) {
result.put("success", false);
result.put("message", "id不能为空");
return result;
}
if (this.getById(id) == null) {
result.put("success", false);
result.put("message", "记录不存在");
return result;
}
boolean ok = this.removeById(id);
result.put("success", ok);
result.put("message", ok ? "删除成功" : "删除失败");
return result;
} catch (Exception e) {
result.put("success", false);
result.put("message", "删除异常:" + e.getMessage());
return result;
}
}
@Override
public Map<String, Object> pageQuery(
Integer current,
Integer size,
String phone,
String nickname,
String inviteCode,
String parentId,
String userLevel,
Integer status,
Integer auditStatus,
Integer canConsign) {
Map<String, Object> result = new HashMap<>();
try {
if (current == null || current < 1) {
current = 1;
}
if (size == null || size < 1) {
size = 10;
}
LambdaQueryWrapper<MemberInfo> w = buildWrapper(
phone, nickname, inviteCode, parentId, userLevel, status, auditStatus, canConsign);
w.orderByDesc(MemberInfo::getCreateTime);
Page<MemberInfo> page = this.page(new Page<>(current, size), w);
result.put("success", true);
result.put("message", "查询成功");
result.put("data", page.getRecords());
result.put("total", page.getTotal());
result.put("current", page.getCurrent());
result.put("size", page.getSize());
result.put("pages", page.getPages());
return result;
} catch (Exception e) {
result.put("success", false);
result.put("message", "查询异常:" + e.getMessage());
return result;
}
}
@Override
public Map<String, Object> listAll(
String phone,
String nickname,
String inviteCode,
String parentId,
String userLevel,
Integer status,
Integer auditStatus,
Integer canConsign) {
Map<String, Object> result = new HashMap<>();
try {
LambdaQueryWrapper<MemberInfo> w = buildWrapper(
phone, nickname, inviteCode, parentId, userLevel, status, auditStatus, canConsign);
w.orderByDesc(MemberInfo::getCreateTime);
List<MemberInfo> list = this.list(w);
result.put("success", true);
result.put("message", "查询成功");
result.put("data", list);
result.put("total", list.size());
return result;
} catch (Exception e) {
result.put("success", false);
result.put("message", "查询异常:" + e.getMessage());
return result;
}
}
private LambdaQueryWrapper<MemberInfo> buildWrapper(
String phone,
String nickname,
String inviteCode,
String parentId,
String userLevel,
Integer status,
Integer auditStatus,
Integer canConsign) {
LambdaQueryWrapper<MemberInfo> w = new LambdaQueryWrapper<>();
if (phone != null && !phone.trim().isEmpty()) {
w.like(MemberInfo::getPhone, phone.trim());
}
if (nickname != null && !nickname.trim().isEmpty()) {
w.like(MemberInfo::getNickname, nickname.trim());
}
if (inviteCode != null && !inviteCode.trim().isEmpty()) {
w.eq(MemberInfo::getInviteCode, inviteCode.trim());
}
if (parentId != null && !parentId.trim().isEmpty()) {
w.eq(MemberInfo::getParentId, parentId.trim());
}
if (userLevel != null && !userLevel.trim().isEmpty()) {
w.eq(MemberInfo::getUserLevel, userLevel.trim());
}
if (status != null) {
w.eq(MemberInfo::getStatus, status);
}
if (auditStatus != null) {
w.eq(MemberInfo::getAuditStatus, auditStatus);
}
if (canConsign != null) {
w.eq(MemberInfo::getCanConsign, canConsign);
}
return w;
}
}