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 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().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().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 mcsMerchants = this.baseMapper.pageMcsMerchant(page, pageMcsMerchantDTO); List 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().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().lambda().eq(McsOrder::getOrderNo, orderNo)); if (isNull(mcsOrder)) { return R.fail("订单不存在"); } McsMerchant mcsMerchant = this.baseMapper.selectOne(new QueryWrapper().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 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().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 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().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().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 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(); } }