|
@@ -8,11 +8,20 @@ import com.fs.common.core.domain.AjaxResult;
|
|
|
import com.fs.common.core.domain.R;
|
|
import com.fs.common.core.domain.R;
|
|
|
import com.fs.common.core.page.TableDataInfo;
|
|
import com.fs.common.core.page.TableDataInfo;
|
|
|
import com.fs.common.enums.BusinessType;
|
|
import com.fs.common.enums.BusinessType;
|
|
|
|
|
+import com.fs.common.exception.ServiceException;
|
|
|
import com.fs.common.utils.ServletUtils;
|
|
import com.fs.common.utils.ServletUtils;
|
|
|
import com.fs.common.utils.StringUtils;
|
|
import com.fs.common.utils.StringUtils;
|
|
|
import com.fs.company.cache.ICompanyUserCacheService;
|
|
import com.fs.company.cache.ICompanyUserCacheService;
|
|
|
|
|
+import com.fs.company.domain.CompanyUser;
|
|
|
|
|
+import com.fs.company.service.ICompanyUserService;
|
|
|
|
|
+import com.fs.course.domain.FsUserCompanyUser;
|
|
|
|
|
+import com.fs.course.mapper.FsUserCompanyUserMapper;
|
|
|
|
|
+import com.fs.course.domain.FsUserCoursePeriod;
|
|
|
import com.fs.course.dto.BatchSendCourseDTO;
|
|
import com.fs.course.dto.BatchSendCourseDTO;
|
|
|
import com.fs.course.param.FsCourseLinkCreateParam;
|
|
import com.fs.course.param.FsCourseLinkCreateParam;
|
|
|
|
|
+import com.fs.course.param.PeriodUserTransferParam;
|
|
|
|
|
+import com.fs.course.service.IFsUserCompanyUserService;
|
|
|
|
|
+import com.fs.course.service.IFsUserCoursePeriodService;
|
|
|
import com.fs.course.service.IFsUserCourseService;
|
|
import com.fs.course.service.IFsUserCourseService;
|
|
|
import com.fs.framework.security.LoginUser;
|
|
import com.fs.framework.security.LoginUser;
|
|
|
import com.fs.framework.service.TokenService;
|
|
import com.fs.framework.service.TokenService;
|
|
@@ -24,6 +33,7 @@ import com.fs.im.dto.OpenImResponseDTO;
|
|
|
import com.fs.im.service.OpenIMService;
|
|
import com.fs.im.service.OpenIMService;
|
|
|
import com.fs.qw.domain.CustomerTransferApproval;
|
|
import com.fs.qw.domain.CustomerTransferApproval;
|
|
|
import com.fs.qw.dto.FsUserTransferParamDTO;
|
|
import com.fs.qw.dto.FsUserTransferParamDTO;
|
|
|
|
|
+import com.fs.qw.dto.UserProjectDTO;
|
|
|
import com.fs.qw.service.ICustomerTransferApprovalService;
|
|
import com.fs.qw.service.ICustomerTransferApprovalService;
|
|
|
import com.fs.store.param.h5.FsUserPageListParam;
|
|
import com.fs.store.param.h5.FsUserPageListParam;
|
|
|
import io.swagger.annotations.Api;
|
|
import io.swagger.annotations.Api;
|
|
@@ -35,7 +45,11 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.security.access.prepost.PreAuthorize;
|
|
import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
|
|
|
+import java.util.HashMap;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
|
|
|
import static com.fs.his.utils.PhoneUtil.encryptPhone;
|
|
import static com.fs.his.utils.PhoneUtil.encryptPhone;
|
|
|
|
|
|
|
@@ -43,7 +57,6 @@ import static com.fs.his.utils.PhoneUtil.encryptPhone;
|
|
|
@RestController
|
|
@RestController
|
|
|
@Slf4j
|
|
@Slf4j
|
|
|
@RequestMapping("/user/fsUser")
|
|
@RequestMapping("/user/fsUser")
|
|
|
-@AllArgsConstructor
|
|
|
|
|
public class FsUserAdminController extends BaseController {
|
|
public class FsUserAdminController extends BaseController {
|
|
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
@@ -52,6 +65,9 @@ public class FsUserAdminController extends BaseController {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private ICompanyUserCacheService companyUserCacheService;
|
|
private ICompanyUserCacheService companyUserCacheService;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private ICompanyUserService companyUserService;
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private TokenService tokenService;
|
|
private TokenService tokenService;
|
|
|
|
|
|
|
@@ -64,6 +80,15 @@ public class FsUserAdminController extends BaseController {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private OpenIMService openIMService;
|
|
private OpenIMService openIMService;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private IFsUserCompanyUserService fsUserCompanyUserService;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private FsUserCompanyUserMapper fsUserCompanyUserMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private IFsUserCoursePeriodService fsUserCoursePeriodService;
|
|
|
|
|
+
|
|
|
@PreAuthorize("@ss.hasPermi('user:fsUser:list')")
|
|
@PreAuthorize("@ss.hasPermi('user:fsUser:list')")
|
|
|
@PostMapping("/list")
|
|
@PostMapping("/list")
|
|
|
@ApiOperation("会员列表(与移动端使用的相同查询)")
|
|
@ApiOperation("会员列表(与移动端使用的相同查询)")
|
|
@@ -171,4 +196,273 @@ public class FsUserAdminController extends BaseController {
|
|
|
return openIMService.batchSendCourse(batchSendCourseDTO);
|
|
return openIMService.batchSendCourse(batchSendCourseDTO);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取会员营期转移的下拉框数据
|
|
|
|
|
+ * 包括:当前公司下的营期列表和销售列表
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return 营期列表和销售列表
|
|
|
|
|
+ */
|
|
|
|
|
+ @GetMapping("/getPeriodTransferOptions")
|
|
|
|
|
+ @ApiOperation("获取会员营期转移下拉框数据")
|
|
|
|
|
+ public R getPeriodTransferOptions() {
|
|
|
|
|
+ LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
|
|
|
|
|
+ Long companyId = loginUser.getCompany().getCompanyId();
|
|
|
|
|
+
|
|
|
|
|
+ // 查询当前公司下的营期列表
|
|
|
|
|
+ FsUserCoursePeriod periodQuery = new FsUserCoursePeriod();
|
|
|
|
|
+ periodQuery.setCompanyId(companyId.toString());
|
|
|
|
|
+ List<FsUserCoursePeriod> periodList = fsUserCoursePeriodService.selectFsUserCoursePeriodList(periodQuery);
|
|
|
|
|
+
|
|
|
|
|
+ // 查询当前公司下的销售列表
|
|
|
|
|
+ CompanyUser userQuery = new CompanyUser();
|
|
|
|
|
+ userQuery.setCompanyId(companyId);
|
|
|
|
|
+ List<CompanyUser> companyUserList = companyUserService.selectCompanyUserList(userQuery);
|
|
|
|
|
+
|
|
|
|
|
+ return R.ok()
|
|
|
|
|
+ .put("periodList", periodList)
|
|
|
|
|
+ .put("companyUserList", companyUserList);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 加载指定源营期和源销售下的会员列表
|
|
|
|
|
+ * 用于会员营期转移功能中选择需要转移的会员
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param sourcePeriodId 源营期ID
|
|
|
|
|
+ * @param sourceCompanyUserId 源销售ID
|
|
|
|
|
+ * @return 会员列表
|
|
|
|
|
+ */
|
|
|
|
|
+ @GetMapping("/loadPeriodUserList")
|
|
|
|
|
+ @ApiOperation("加载指定源营期和源销售下的会员列表")
|
|
|
|
|
+ public R loadPeriodUserList(@RequestParam Long sourcePeriodId,
|
|
|
|
|
+ @RequestParam Long sourceCompanyUserId) {
|
|
|
|
|
+ LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
|
|
|
|
|
+ Long companyId = loginUser.getCompany().getCompanyId();
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 1. 验证营期是否存在且属于当前公司
|
|
|
|
|
+ FsUserCoursePeriod period = fsUserCoursePeriodService.selectFsUserCoursePeriodById(sourcePeriodId);
|
|
|
|
|
+ if (period == null) {
|
|
|
|
|
+ return R.error("营期不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!period.getCompanyId().contains(companyId.toString())) {
|
|
|
|
|
+ return R.error("营期不属于当前公司");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 验证销售是否存在且属于当前公司
|
|
|
|
|
+ CompanyUser companyUser = companyUserCacheService.selectCompanyUserById(sourceCompanyUserId);
|
|
|
|
|
+ if (companyUser == null) {
|
|
|
|
|
+ return R.error("销售不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!companyUser.getCompanyId().equals(companyId)) {
|
|
|
|
|
+ return R.error("销售不属于当前公司");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 查询该营期和销售下的会员ID列表
|
|
|
|
|
+ List<Long> userIds = fsUserCompanyUserMapper
|
|
|
|
|
+ .selectUserIdsByPeriodIdAndCompanyUserId(sourcePeriodId, sourceCompanyUserId);
|
|
|
|
|
+
|
|
|
|
|
+ log.info("查询营期ID:{}, 销售ID:{} 下的会员数量:{}",
|
|
|
|
|
+ sourcePeriodId, sourceCompanyUserId, userIds.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 查询会员详细信息
|
|
|
|
|
+ List<Map<String, Object>> userList = new ArrayList<>();
|
|
|
|
|
+ for (Long userId : userIds) {
|
|
|
|
|
+ FsUser fsUser = fsUserService.selectFsUserById(userId);
|
|
|
|
|
+ if (fsUser != null && fsUser.getIsDel() == 0) {
|
|
|
|
|
+ Map<String, Object> userInfo = new HashMap<>();
|
|
|
|
|
+ userInfo.put("userId", fsUser.getUserId());
|
|
|
|
|
+ userInfo.put("nickName", fsUser.getNickName());
|
|
|
|
|
+ userInfo.put("phone", fsUser.getPhone());
|
|
|
|
|
+ userInfo.put("avatar", fsUser.getAvatar());
|
|
|
|
|
+ userInfo.put("createTime", fsUser.getCreateTime());
|
|
|
|
|
+ userList.add(userInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return R.ok()
|
|
|
|
|
+ .put("total", userList.size())
|
|
|
|
|
+ .put("userList", userList);
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("加载会员列表失败", e);
|
|
|
|
|
+ return R.error("加载会员列表失败:" + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 会员营期转移
|
|
|
|
|
+ * 功能:将从源营期的某个销售下的会员,转移到目标营期的某个销售下
|
|
|
|
|
+ * 例如:香江0808某销售下的会员 需要转到 百脳1002期内的某个销售下
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param param 转移参数
|
|
|
|
|
+ * @return 结果
|
|
|
|
|
+ */
|
|
|
|
|
+ @PreAuthorize("@ss.hasPermi('user:fsUser:periodTransfer')")
|
|
|
|
|
+ @Log(title = "会员营期转移", businessType = BusinessType.UPDATE)
|
|
|
|
|
+ @PostMapping("/periodTransfer")
|
|
|
|
|
+ @ApiOperation("会员营期转移")
|
|
|
|
|
+ public R periodTransfer(@RequestBody PeriodUserTransferParam param) {
|
|
|
|
|
+ log.info("会员营期转移请求:{}", JSON.toJSONString(param));
|
|
|
|
|
+
|
|
|
|
|
+ LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
|
|
|
|
|
+ Long companyId = loginUser.getCompany().getCompanyId();
|
|
|
|
|
+ Long currentUserId = loginUser.getUser().getUserId();
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 1. 参数校验
|
|
|
|
|
+ if (param.getUserIds() == null || param.getUserIds().isEmpty()) {
|
|
|
|
|
+ return R.error("请选择需要转移的会员");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 验证源营期和目标营期是否存在
|
|
|
|
|
+ FsUserCoursePeriod sourcePeriod = fsUserCoursePeriodService.selectFsUserCoursePeriodById(param.getSourcePeriodId());
|
|
|
|
|
+ if (sourcePeriod == null) {
|
|
|
|
|
+ return R.error("源营期不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ FsUserCoursePeriod targetPeriod = fsUserCoursePeriodService.selectFsUserCoursePeriodById(param.getTargetPeriodId());
|
|
|
|
|
+ if (targetPeriod == null) {
|
|
|
|
|
+ return R.error("目标营期不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 验证营期归属公司
|
|
|
|
|
+ if (!sourcePeriod.getCompanyId().contains(companyId.toString())) {
|
|
|
|
|
+ return R.error("源营期不属于当前公司");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!targetPeriod.getCompanyId().contains(companyId.toString())) {
|
|
|
|
|
+ return R.error("目标营期不属于当前公司");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 验证销售是否存在
|
|
|
|
|
+ CompanyUser sourceCompanyUser = companyUserCacheService.selectCompanyUserById(param.getSourceCompanyUserId());
|
|
|
|
|
+ if (sourceCompanyUser == null) {
|
|
|
|
|
+ return R.error("源销售不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ CompanyUser targetCompanyUser = companyUserCacheService.selectCompanyUserById(param.getTargetCompanyUserId());
|
|
|
|
|
+ if (targetCompanyUser == null) {
|
|
|
|
|
+ return R.error("目标销售不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 批量转移会员营期关系
|
|
|
|
|
+ int successCount = 0;
|
|
|
|
|
+ int failCount = 0;
|
|
|
|
|
+ StringBuilder failReasons = new StringBuilder();
|
|
|
|
|
+
|
|
|
|
|
+ // 先查询源营期和源销售下的所有有效会员ID(通过观看记录表关联)
|
|
|
|
|
+ List<Long> validUserIds = fsUserCompanyUserMapper
|
|
|
|
|
+ .selectUserIdsByPeriodIdAndCompanyUserId(param.getSourcePeriodId(), param.getSourceCompanyUserId());
|
|
|
|
|
+
|
|
|
|
|
+ log.info("源营期ID:{}, 源销售ID:{} 下查询到有效会员数:{}",
|
|
|
|
|
+ param.getSourcePeriodId(), param.getSourceCompanyUserId(), validUserIds.size());
|
|
|
|
|
+
|
|
|
|
|
+ for (Long userId : param.getUserIds()) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 验证会员是否在源营期和源销售下
|
|
|
|
|
+ if (!validUserIds.contains(userId)) {
|
|
|
|
|
+ failReasons.append("会员ID:").append(userId).append("在源营期和源销售下不存在; ");
|
|
|
|
|
+ failCount++;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 先删除该会员的所有fs_user_company_user记录(不管哪个营期)
|
|
|
|
|
+ FsUserCompanyUser deleteParam = new FsUserCompanyUser();
|
|
|
|
|
+ deleteParam.setUserId(userId);
|
|
|
|
|
+ List<FsUserCompanyUser> existingRecords = fsUserCompanyUserService.selectFsUserCompanyUserList(deleteParam);
|
|
|
|
|
+ for (FsUserCompanyUser record : existingRecords) {
|
|
|
|
|
+ fsUserCompanyUserService.deleteFsUserCompanyUserById(record.getId());
|
|
|
|
|
+ log.info("删除旧的fs_user_company_user记录 - 会员ID:{}, 记录ID:{}, 营期ID:{}, 销售ID:{}",
|
|
|
|
|
+ userId, record.getId(), record.getProjectId(), record.getCompanyUserId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 创建新的目标营期记录
|
|
|
|
|
+ fsUserCompanyUserService.bindRelationship(userId, param.getTargetPeriodId(), companyId, param.getTargetCompanyUserId(), 1);
|
|
|
|
|
+ log.info("创建目标营期新记录 - 会员ID:{}, 营期ID:{}, 公司ID:{}, 销售ID:{}",
|
|
|
|
|
+ userId, param.getTargetPeriodId(), companyId, param.getTargetCompanyUserId());
|
|
|
|
|
+
|
|
|
|
|
+ // 更新fs_user表的companyId和companyUserId
|
|
|
|
|
+ FsUser fsUser = fsUserService.selectFsUserById(userId);
|
|
|
|
|
+ if (fsUser != null) {
|
|
|
|
|
+ fsUser.setCompanyId(companyId);
|
|
|
|
|
+ fsUser.setCompanyUserId(param.getTargetCompanyUserId());
|
|
|
|
|
+ fsUserService.updateFsUser(fsUser);
|
|
|
|
|
+ log.info("更新fs_user表 - 会员ID:{}, 公司ID:{}, 销售ID:{}",
|
|
|
|
|
+ userId, companyId, param.getTargetCompanyUserId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ successCount++;
|
|
|
|
|
+ log.info("会员ID:{} 从营期ID:{} 销售ID:{} 转移到 营期ID:{} 销售ID:{} 成功",
|
|
|
|
|
+ userId, param.getSourcePeriodId(), param.getSourceCompanyUserId(),
|
|
|
|
|
+ param.getTargetPeriodId(), param.getTargetCompanyUserId());
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("会员ID:{} 转移失败", userId, e);
|
|
|
|
|
+ failReasons.append("会员ID:").append(userId).append("转移失败:").append(e.getMessage()).append("; ");
|
|
|
|
|
+ failCount++;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 创建审批记录并记录到审批列表
|
|
|
|
|
+ List<UserProjectDTO> userProjectList = new ArrayList<>();
|
|
|
|
|
+ for (Long userId : param.getUserIds()) {
|
|
|
|
|
+ UserProjectDTO dto = new UserProjectDTO();
|
|
|
|
|
+ dto.setUserId(userId);
|
|
|
|
|
+ dto.setProjectId(param.getTargetPeriodId()); // 使用目标营期ID
|
|
|
|
|
+ userProjectList.add(dto);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ CustomerTransferApproval approval = new CustomerTransferApproval();
|
|
|
|
|
+ approval.setCorpId(String.valueOf(companyId));
|
|
|
|
|
+ approval.setTransferType(3); // 3=会员营期转移
|
|
|
|
|
+ approval.setCustomerIds(JSON.toJSONString(userProjectList));
|
|
|
|
|
+ approval.setCustomerList(null); // 避免自动反序列化错误
|
|
|
|
|
+ approval.setOriginalUserId(param.getSourceCompanyUserId());
|
|
|
|
|
+ approval.setTargetUserId(param.getTargetCompanyUserId());
|
|
|
|
|
+ approval.setInitiatorUserId(currentUserId);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 根据转移结果设置审批状态
|
|
|
|
|
+ if (successCount > 0 && failCount == 0) {
|
|
|
|
|
+ // 全部成功,自动审批通过
|
|
|
|
|
+ approval.setApprovalStatus(1);
|
|
|
|
|
+ approval.setApprovalRemark("会员营期转移成功");
|
|
|
|
|
+ } else if (successCount == 0 && failCount > 0) {
|
|
|
|
|
+ // 全部失败,审批驳回
|
|
|
|
|
+ approval.setApprovalStatus(2);
|
|
|
|
|
+ approval.setApprovalRemark("会员营期转移全部失败:" + failReasons.toString());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 部分成功,设为待审批状态供管理员查看
|
|
|
|
|
+ approval.setApprovalStatus(0);
|
|
|
|
|
+ approval.setApprovalRemark(String.format("部分成功,成功%d人,失败%d人。失败原因:%s",
|
|
|
|
|
+ successCount, failCount, failReasons.toString()));
|
|
|
|
|
+ }
|
|
|
|
|
+ approval.setContent(param.getReason()); // 转移原因
|
|
|
|
|
+ approval.setApproverUserId(currentUserId);
|
|
|
|
|
+ approval.setProcessedAt(new Date());
|
|
|
|
|
+ approval.setCreatedAt(new Date());
|
|
|
|
|
+ approval.setUpdatedAt(new Date());
|
|
|
|
|
+
|
|
|
|
|
+ // 保存审批记录
|
|
|
|
|
+ transferApprovalService.insertCustomerTransferApproval(approval);
|
|
|
|
|
+ log.info("会员营期转移审批记录已创建,审批ID:{}", approval.getId());
|
|
|
|
|
+
|
|
|
|
|
+ // 7. 返回结果
|
|
|
|
|
+ String resultMsg = String.format("转移完成!成功:%d人,失败:%d人", successCount, failCount);
|
|
|
|
|
+ if (failCount > 0) {
|
|
|
|
|
+ resultMsg += ". 失败原因:" + failReasons.toString();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("会员营期转移结果:{}", resultMsg);
|
|
|
|
|
+ return R.ok(resultMsg)
|
|
|
|
|
+ .put("successCount", successCount)
|
|
|
|
|
+ .put("failCount", failCount)
|
|
|
|
|
+ .put("approvalId", approval.getId());
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("会员营期转移异常", e);
|
|
|
|
|
+ return R.error("会员营期转移失败:" + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|