package com.panzhihua.service_community.service.impl;
|
|
import static java.util.Objects.isNull;
|
import static java.util.Objects.nonNull;
|
import static org.apache.commons.lang3.StringUtils.isBlank;
|
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Random;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.panzhihua.common.exceptions.ServiceException;
|
import com.panzhihua.common.model.dtos.community.convenient.DisableOrEnableConvenientMerchantDTO;
|
import com.panzhihua.common.model.dtos.community.microCommercialStreet.DisableOrEnableMcsMerchantDTO;
|
import com.panzhihua.common.model.dtos.community.microCommercialStreet.LoginWithPhoneDTO;
|
import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsMerchantDTO;
|
import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageMcsMerchantDTO;
|
import com.panzhihua.common.model.dtos.community.microCommercialStreet.PutUserInfoDTO;
|
import com.panzhihua.common.model.vos.LoginUserInfoVO;
|
import com.panzhihua.common.model.vos.R;
|
import com.panzhihua.common.model.vos.community.microCommercialStreet.IndexTopStatisticsVO;
|
import com.panzhihua.common.model.vos.community.microCommercialStreet.McsGameVO;
|
import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLoginUserInfoVO;
|
import com.panzhihua.common.model.vos.community.microCommercialStreet.McsMerchantVO;
|
import com.panzhihua.common.service.user.UserService;
|
import com.panzhihua.common.utlis.DateUtils;
|
import com.panzhihua.service_community.dao.McsConfigDAO;
|
import com.panzhihua.service_community.dao.McsGameDAO;
|
import com.panzhihua.service_community.dao.McsInformationDAO;
|
import com.panzhihua.service_community.dao.McsMerchantDAO;
|
import com.panzhihua.service_community.dao.McsOrderDao;
|
import com.panzhihua.service_community.entity.McsConfig;
|
import com.panzhihua.service_community.entity.McsMerchant;
|
import com.panzhihua.service_community.entity.McsOrder;
|
import com.panzhihua.service_community.service.McsMerchantService;
|
|
/**
|
* (McsMerchant)表服务实现类
|
*
|
* @author makejava
|
* @since 2021-12-28 14:37:11
|
*/
|
@Service("mcsMerchantService")
|
public class McsMerchantServiceImpl extends ServiceImpl<McsMerchantDAO, McsMerchant> implements McsMerchantService {
|
|
private static final String MERCHANT_PUBLISH_LIMIT_KEY = "MERCHANT_PUBLISH_LIMIT";
|
private static final String DEFAULT_IMAGE_URL = "https://www.psciio.com//idcard/91313573d071436ab1f934231b31c6e5.jpg";
|
private static final int DEFAULT_PUBLISH_LIMIT = 2;
|
private static final String CUSTOMER_SERVICE_CONTACT_NUM="CUSTOMER_SERVICE_CONTACT_NUM";
|
|
@Resource
|
private UserService userService;
|
@Resource
|
private McsConfigDAO mcsConfigDAO;
|
@Resource
|
private McsGameDAO mcsGameDAO;
|
@Resource
|
private McsInformationDAO mcsInformationDAO;
|
@Resource
|
private StringRedisTemplate stringRedisTemplate;
|
@Resource
|
private McsOrderDao mcsOrderDao;
|
|
/**
|
* 新增数字商业街商家
|
* @param mcsMerchantDTO
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public R addMcsMerchant(McsMerchantDTO mcsMerchantDTO) {
|
McsMerchant existMerchant = this.baseMapper.selectOne(new QueryWrapper<McsMerchant>().lambda().eq(McsMerchant::getPhone, mcsMerchantDTO.getPhone()));
|
if (nonNull(existMerchant)) {
|
if (existMerchant.getIsDel()) {
|
this.baseMapper.deleteById(existMerchant.getId());
|
} else {
|
return R.fail("手机号已存在");
|
}
|
}
|
McsMerchant mcsMerchant = new McsMerchant();
|
BeanUtils.copyProperties(mcsMerchantDTO, mcsMerchant);
|
Integer litDays = mcsMerchantDTO.getLitDays();
|
mcsMerchant.setExpireAt(DateUtils.addDay(new Date(), litDays));
|
mcsMerchant.setFirstLitAt(new Date());
|
McsConfig publishLimitConfig = mcsConfigDAO.selectOne(new QueryWrapper<McsConfig>().lambda().eq(McsConfig::getKey, MERCHANT_PUBLISH_LIMIT_KEY));
|
mcsMerchant.setPublishLimit(nonNull(publishLimitConfig) ? Integer.parseInt(publishLimitConfig.getValue()) : DEFAULT_PUBLISH_LIMIT);
|
mcsMerchant.setUserId(0L);
|
int insertResult = this.baseMapper.insert(mcsMerchant);
|
if (insertResult > 0) {
|
//添加user
|
R addUserResult = userService.addMcsMerchantUser(mcsMerchantDTO);
|
if (R.isOk(addUserResult)) {
|
LoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(addUserResult.getData()), LoginUserInfoVO.class);
|
mcsMerchant.setUserId(loginUserInfoVO.getUserId());
|
this.baseMapper.updateById(mcsMerchant);
|
} else {
|
throw new ServiceException("406", addUserResult.getMsg());
|
}
|
return R.ok();
|
}
|
return R.fail("添加失败");
|
}
|
|
/**
|
* 编辑数字商业街商家
|
* @param mcsMerchantDTO
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public R putMcsMerchant(McsMerchantDTO mcsMerchantDTO) {
|
McsMerchant mcsMerchant = this.baseMapper.selectById(mcsMerchantDTO.getId());
|
Long userId = mcsMerchant.getUserId();
|
if (isNull(mcsMerchant)) {
|
return R.fail("商家不存在");
|
}
|
if (mcsMerchantDTO.getLevel().equals(1)) {
|
Integer litDays = mcsMerchantDTO.getLitDays();
|
if (nonNull(litDays)) {
|
mcsMerchant.setExpireAt(DateUtils.addDay(new Date(), litDays));
|
}
|
}
|
BeanUtils.copyProperties(mcsMerchantDTO, mcsMerchant);
|
int result = this.baseMapper.updateById(mcsMerchant);
|
if (result > 0) {
|
//修改商家绑定账户号
|
mcsMerchantDTO.setUserId(userId);
|
R putResult = userService.putMcsMerchantUser(mcsMerchantDTO);
|
if (!R.isOk(putResult)) {
|
throw new ServiceException("406", putResult.getMsg());
|
}
|
return R.ok();
|
}
|
return R.fail("修改失败,请重新尝试");
|
}
|
|
/**
|
* 查询数字商业街商家详情
|
* @param merchantId
|
* @return
|
*/
|
@Override
|
public R getMcsMerchant(Long merchantId) {
|
McsMerchantVO merchantVO = this.baseMapper.getMcsMerchantById(merchantId);
|
if (nonNull(merchantVO)) {
|
retrieveMerchantSurplusLitDays(merchantVO);
|
}
|
return R.ok(merchantVO);
|
}
|
|
/**
|
* 删除数字商业街商家
|
* @param merchantId
|
* @param userId
|
* @return
|
*/
|
@Override
|
public R deleteMcsMerchant(Long merchantId, Long userId) {
|
McsMerchant mcsMerchant = this.baseMapper.selectById(merchantId);
|
if (isNull(mcsMerchant)) {
|
return R.fail("商家不存在");
|
}
|
mcsMerchant.setIsDel(true);
|
int num = this.baseMapper.updateById(mcsMerchant);
|
if (num > 0) {
|
this.baseMapper.enableUserStatus(mcsMerchant.getUserId());
|
}
|
return R.ok();
|
}
|
|
/**
|
* 分页查询数字商业街商家
|
* @param pageMcsMerchantDTO
|
* @return
|
*/
|
@Override
|
public R pageMcsMerchant(PageMcsMerchantDTO pageMcsMerchantDTO) {
|
Page page = new Page<>();
|
page.setSize(pageMcsMerchantDTO.getPageSize());
|
page.setCurrent(pageMcsMerchantDTO.getPageNum());
|
IPage<McsMerchantVO> mcsMerchants = this.baseMapper.pageMcsMerchant(page, pageMcsMerchantDTO);
|
List<McsMerchantVO> records = mcsMerchants.getRecords();
|
if (nonNull(records) && !records.isEmpty()) {
|
records.forEach(e -> retrieveMerchantSurplusLitDays(e));
|
}
|
return R.ok(mcsMerchants);
|
}
|
|
/**
|
* 禁用/启用数字商业街商家
|
* @param disableOrEnableMcsMerchantDTO
|
* @return
|
*/
|
@Override
|
public R disableOrEnableMcsMerchant(DisableOrEnableMcsMerchantDTO disableOrEnableMcsMerchantDTO) {
|
McsMerchant mcsMerchant = this.baseMapper.selectById(disableOrEnableMcsMerchantDTO.getMerchantId());
|
if (isNull(mcsMerchant)) {
|
return R.fail("商家不存在");
|
}
|
Integer type = disableOrEnableMcsMerchantDTO.getType();
|
if (type.equals(1) || type.equals(2)) {
|
//启用 or 禁用
|
DisableOrEnableConvenientMerchantDTO dto = new DisableOrEnableConvenientMerchantDTO();
|
dto.setType(type);
|
dto.setUserIds(Arrays.asList(mcsMerchant.getUserId()));
|
R r = userService.disableOrEnableMerchantUsers(dto);
|
return r;
|
} else {
|
return R.fail("未知错误");
|
}
|
}
|
|
/**
|
* 根据account查询微商业街商家信息
|
* @param account
|
* @return
|
*/
|
@Override
|
public R getMcsMerchantByAccount(String account) {
|
McsMerchantVO merchantVO = this.baseMapper.getMcsMerchantByAccount(account);
|
if (isNull(merchantVO)) {
|
return R.fail("账号不存在");
|
}
|
retrieveMerchantSurplusLitDays(merchantVO);
|
McsConfig mcsConfig=mcsConfigDAO.selectOne(new QueryWrapper<McsConfig>().lambda().eq(McsConfig::getKey,CUSTOMER_SERVICE_CONTACT_NUM));
|
if(mcsConfig!=null){
|
merchantVO.setCustomPhone(mcsConfig.getValue());
|
}
|
|
return R.ok(merchantVO);
|
}
|
|
/**
|
* 完成订单更新/新增商家信息
|
*
|
* @param orderNo
|
* @param configId
|
* @param userId
|
* @return
|
*/
|
@Override
|
public R updateOrAddMcsMerchantAfterOrder(String orderNo, Long configId, Long userId) {
|
McsOrder mcsOrder = mcsOrderDao.selectOne(new QueryWrapper<McsOrder>().lambda().eq(McsOrder::getOrderNo, orderNo));
|
if (isNull(mcsOrder)) {
|
return R.fail("订单不存在");
|
}
|
McsMerchant mcsMerchant = this.baseMapper.selectOne(new QueryWrapper<McsMerchant>().lambda().eq(McsMerchant::getUserId, userId));
|
McsConfig mcsConfig = mcsConfigDAO.selectById(configId);
|
if (isNull(mcsConfig) || isBlank(mcsConfig.getValue())) {
|
return R.fail("套餐配置不存在");
|
}
|
JSONObject packageObject = JSONObject.parseObject(mcsConfig.getValue());
|
if (!packageObject.containsKey("day")) {
|
return R.fail("配置有误");
|
}
|
Integer litDays = (Integer)packageObject.get("day");
|
String merchantName = mcsOrder.getMerchantName();
|
Date nowDate = new Date();
|
int num;
|
if (isNull(mcsMerchant)) {
|
//新增商家
|
R<LoginUserInfoVO> userInfoVOR = userService.getUserInfoByUserId(userId.toString());
|
if (R.isOk(userInfoVOR) && nonNull(userInfoVOR.getData())) {
|
LoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(userInfoVOR.getData()), LoginUserInfoVO.class);
|
mcsMerchant = new McsMerchant();
|
mcsMerchant.setName(isBlank(merchantName) ? loginUserInfoVO.getName() : merchantName);
|
mcsMerchant.setPhone(loginUserInfoVO.getPhone());
|
mcsMerchant.setAccount(loginUserInfoVO.getAccount());
|
mcsMerchant.setLevel(1);
|
mcsMerchant.setExpireAt(DateUtils.addDay(nowDate, litDays));
|
mcsMerchant.setFirstLitAt(nowDate);
|
McsConfig publishLimitConfig = mcsConfigDAO.selectOne(new QueryWrapper<McsConfig>().lambda().eq(McsConfig::getKey, MERCHANT_PUBLISH_LIMIT_KEY));
|
mcsMerchant.setPublishLimit(nonNull(publishLimitConfig) ? Integer.parseInt(publishLimitConfig.getValue()) : DEFAULT_PUBLISH_LIMIT);
|
mcsMerchant.setUserId(userId);
|
mcsMerchant.setCreatedBy(userId);
|
mcsMerchant.setUpdatedBy(userId);
|
mcsMerchant.setAddress(mcsOrder.getAddress());
|
mcsMerchant.setLat(mcsOrder.getLat());
|
mcsMerchant.setLon(mcsOrder.getLon());
|
num = this.baseMapper.insert(mcsMerchant);
|
McsMerchantDTO mcsMerchantDTO = new McsMerchantDTO();
|
mcsMerchantDTO.setName(mcsMerchant.getName());
|
userService.putMcsMerchantUser(mcsMerchantDTO);
|
} else {
|
return R.fail("获取用户信息失败");
|
}
|
} else {
|
//更新商家
|
Date previousExpireAt = mcsMerchant.getExpireAt();
|
Date nowExpireAt;
|
if (isNull(previousExpireAt) || previousExpireAt.before(nowDate)) {
|
nowExpireAt = DateUtils.addDay(nowDate, litDays);
|
} else {
|
nowExpireAt = DateUtils.addDay(previousExpireAt, litDays);
|
}
|
mcsMerchant.setExpireAt(nowExpireAt);
|
mcsMerchant.setUpdatedBy(userId);
|
num = this.baseMapper.updateById(mcsMerchant);
|
}
|
if (num > 0) {
|
return R.ok(mcsMerchant.getId());
|
} else {
|
return R.fail();
|
}
|
}
|
|
/**
|
* 验证码登录
|
* @param loginDTO
|
* @return
|
*/
|
@Override
|
public R loginWithPhone(LoginWithPhoneDTO loginDTO) {
|
String phone = loginDTO.getPhone();
|
String redisKey = String.join("::", phone, loginDTO.getCode());
|
Boolean hasKey = stringRedisTemplate.hasKey(redisKey);
|
if (hasKey) {
|
//通过验证
|
R r = userService.getSysUserByPhone(phone, 11);
|
if (R.isOk(r)) {
|
if (nonNull(r.getData())) {
|
//已有用户
|
McsLoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(r.getData()), McsLoginUserInfoVO.class);
|
stringRedisTemplate.delete(redisKey);
|
return R.ok(loginUserInfoVO);
|
} else {
|
//自动创建用户
|
McsMerchantDTO mcsMerchantDTO = new McsMerchantDTO();
|
mcsMerchantDTO.setAccount(phone);
|
mcsMerchantDTO.setPassword("88888888");
|
mcsMerchantDTO.setAccountStatus(1);
|
mcsMerchantDTO.setPhone(phone);
|
mcsMerchantDTO.setName("用户" + retrieveRandomCode(5));
|
mcsMerchantDTO.setImageUrl(DEFAULT_IMAGE_URL);
|
R addUserResult = userService.addMcsMerchantUser(mcsMerchantDTO);
|
if (R.isOk(addUserResult)) {
|
McsLoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(addUserResult.getData()), McsLoginUserInfoVO.class);
|
loginUserInfoVO.setPlaintextPassword("88888888");
|
stringRedisTemplate.delete(redisKey);
|
return R.ok(loginUserInfoVO);
|
}
|
return addUserResult;
|
}
|
}
|
return r;
|
} else {
|
return R.fail("验证码错误");
|
}
|
}
|
|
/**
|
* 首页顶部数据
|
* @return
|
*/
|
@Override
|
public R getMcsIndexTopData() {
|
IndexTopStatisticsVO statisticsVO = this.baseMapper.getMcsIndexTopData();
|
McsGameVO mcsGameVO = mcsGameDAO.selectPopularGame();
|
statisticsVO.setPopularGame(mcsGameVO);
|
return R.ok(statisticsVO);
|
}
|
|
/**
|
* H5分页查询数字商业街商家
|
* @param pageMcsMerchantDTO
|
* @return
|
*/
|
@Override
|
public R pageH5McsMerchant(PageMcsMerchantDTO pageMcsMerchantDTO) {
|
Page page = new Page<>();
|
page.setSize(pageMcsMerchantDTO.getPageSize());
|
page.setCurrent(pageMcsMerchantDTO.getPageNum());
|
IPage<McsMerchantVO> mcsMerchants = this.baseMapper.pageH5McsMerchant(page, pageMcsMerchantDTO);
|
return R.ok(mcsMerchants);
|
}
|
|
/**
|
* 修改用戶信息
|
* @param putUserInfoDTO
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public R putUserInfo(PutUserInfoDTO putUserInfoDTO) {
|
McsMerchant mcsMerchant = this.baseMapper.selectOne(new QueryWrapper<McsMerchant>().lambda().eq(McsMerchant::getUserId, putUserInfoDTO.getUserId()));
|
if (nonNull(mcsMerchant)) {
|
//修改商家名称
|
mcsMerchant.setLogo(putUserInfoDTO.getImageUrl());
|
mcsMerchant.setName(putUserInfoDTO.getName());
|
this.baseMapper.updateById(mcsMerchant);
|
}
|
LoginUserInfoVO loginUserInfoVO = new LoginUserInfoVO();
|
loginUserInfoVO.setImageUrl(putUserInfoDTO.getImageUrl());
|
loginUserInfoVO.setName(putUserInfoDTO.getName());
|
loginUserInfoVO.setUserId(putUserInfoDTO.getUserId());
|
userService.putUser(loginUserInfoVO);
|
return R.ok();
|
}
|
|
/**
|
* 根据userId获取商家信息
|
* @param userId
|
* @return
|
*/
|
@Override
|
public R retrieveMcsMerchantInfoByUserId(Long userId) {
|
McsMerchant mcsMerchant = this.baseMapper.selectOne(new QueryWrapper<McsMerchant>().lambda()
|
.eq(McsMerchant::getUserId, userId).eq(McsMerchant::getIsDel, false));
|
McsMerchantVO mcsMerchantVO = null;
|
if (nonNull(mcsMerchant)) {
|
mcsMerchantVO = new McsMerchantVO();
|
BeanUtils.copyProperties(mcsMerchant, mcsMerchantVO);
|
}
|
return R.ok(mcsMerchantVO);
|
}
|
|
/**
|
* 定时任务-每隔5分钟执行一次,将已到期的微商业街商家旗下所有的游戏/资讯全部下架
|
* @return
|
*/
|
@Override
|
public R offResourceForMcsMerchant() {
|
int num = 0;
|
List<Long> needDealIds = this.baseMapper.selectNeedDealExpiredMerchant();
|
if (nonNull(needDealIds) && !needDealIds.isEmpty()) {
|
mcsGameDAO.setOffByMerchantIds(needDealIds);
|
mcsInformationDAO.setOffByMerchantIds(needDealIds);
|
num = this.baseMapper.updateIsPauseStatus(needDealIds);
|
}
|
return R.ok("执行任务数:" + num);
|
}
|
|
private void retrieveMerchantSurplusLitDays(McsMerchantVO merchantVO) {
|
Integer publishLimit = merchantVO.getPublishLimit();
|
Integer publishCount = mcsGameDAO.selectPublishCount(merchantVO.getId());
|
Integer idleTotal = publishLimit - publishCount;
|
merchantVO.setIdleTotal(idleTotal > 0 ? idleTotal : 0);
|
if (nonNull(merchantVO.getExpireAt())) {
|
int surplusLitDays = DateUtils.retrieveRemainingDays(merchantVO.getExpireAt());
|
merchantVO.setSurplusLitDays(surplusLitDays > 0 ? surplusLitDays : 0);
|
}
|
}
|
|
private String retrieveRandomCode(int length) {
|
Random r = new Random();
|
StringBuilder rs = new StringBuilder();
|
for (int i = 0; i < length; i++) {
|
rs.append(r.nextInt(10));
|
}
|
return rs.toString();
|
}
|
}
|