| | |
| | | |
| | | 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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.panzhihua.service_community.dao.McsConfigDAO; |
| | | import com.panzhihua.service_community.dao.McsGameDAO; |
| | | import com.panzhihua.service_community.entity.McsConfig; |
| | | 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; |
| | | |
| | | /** |
| | |
| | | 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; |
| | |
| | | private McsConfigDAO mcsConfigDAO; |
| | | @Resource |
| | | private McsGameDAO mcsGameDAO; |
| | | @Resource |
| | | private McsInformationDAO mcsInformationDAO; |
| | | @Resource |
| | | private StringRedisTemplate stringRedisTemplate; |
| | | @Resource |
| | | private McsOrderDao mcsOrderDao; |
| | | |
| | | /** |
| | | * 新增数字商业街商家 |
| | |
| | | @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); |
| | | if (mcsMerchantDTO.getLevel().equals(1)) { |
| | | Integer litDays = mcsMerchantDTO.getLitDays(); |
| | | if (isNull(litDays)) { |
| | | return R.fail("临时商家未设置点亮天数"); |
| | | } |
| | | mcsMerchant.setExpireAt(DateUtils.addDay(new Date(), litDays)); |
| | | mcsMerchant.setFirstLitAt(new Date()); |
| | | } |
| | | 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); |
| | |
| | | //添加user |
| | | R addUserResult = userService.addMcsMerchantUser(mcsMerchantDTO); |
| | | if (R.isOk(addUserResult)) { |
| | | Long merchantUserId = ((Integer) addUserResult.getData()).longValue(); |
| | | mcsMerchant.setUserId(merchantUserId); |
| | | 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()); |
| | |
| | | public R getMcsMerchant(Long merchantId) { |
| | | McsMerchantVO merchantVO = this.baseMapper.getMcsMerchantById(merchantId); |
| | | if (nonNull(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.differentDays(new Date(), merchantVO.getExpireAt()); |
| | | merchantVO.setSurplusLitDays(surplusLitDays > 0 ? surplusLitDays : 0); |
| | | } |
| | | retrieveMerchantSurplusLitDays(merchantVO); |
| | | } |
| | | return R.ok(merchantVO); |
| | | } |
| | |
| | | return R.fail("商家不存在"); |
| | | } |
| | | mcsMerchant.setIsDel(true); |
| | | this.baseMapper.updateById(mcsMerchant); |
| | | int num = this.baseMapper.updateById(mcsMerchant); |
| | | if (num > 0) { |
| | | this.baseMapper.enableUserStatus(mcsMerchant.getUserId()); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | IPage<McsMerchantVO> mcsMerchants = this.baseMapper.pageMcsMerchant(page, pageMcsMerchantDTO); |
| | | List<McsMerchantVO> records = mcsMerchants.getRecords(); |
| | | if (nonNull(records) && !records.isEmpty()) { |
| | | Date nowDate = new Date(); |
| | | records.forEach(e -> { |
| | | if (nonNull(e.getExpireAt())) { |
| | | int surplusLitDays = DateUtils.differentDays(nowDate, e.getExpireAt()); |
| | | e.setSurplusLitDays(surplusLitDays > 0 ? surplusLitDays : 0); |
| | | } |
| | | }); |
| | | records.forEach(e -> retrieveMerchantSurplusLitDays(e)); |
| | | } |
| | | return R.ok(mcsMerchants); |
| | | } |
| | |
| | | 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(); |
| | | } |
| | | } |