| | |
| | | import com.doumee.dao.business.model.PricingRule; |
| | | import com.doumee.dao.business.model.ShopInfo; |
| | | import com.doumee.dao.dto.*; |
| | | import com.doumee.dao.system.model.SystemDictData; |
| | | import com.doumee.dao.system.SystemUserMapper; |
| | | import com.doumee.dao.system.model.SystemUser; |
| | | import com.doumee.dao.vo.ShopDetailVO; |
| | |
| | | Integer shopId; |
| | | if (existing != null) { |
| | | // 校验状态:只有待审批(0)和被驳回(2)可修改 |
| | | if (!Constants.equalsInteger(existing.getAuditStatus(), Constants.ZERO) |
| | | && !Constants.equalsInteger(existing.getAuditStatus(), Constants.TWO)) { |
| | | if (!Constants.equalsInteger(existing.getAuditStatus(), Constants.TWO)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前门店状态不允许修改"); |
| | | } |
| | | // 校验openid匹配:当前登录会员的openid必须与门店的openid一致 |
| | |
| | | shopInfo.setSalt(salt); |
| | | shopInfo.setAliAccount(request.getAliAccount()); |
| | | shopInfo.setAliName(request.getAliName()); |
| | | shopInfo.setAuditStatus(Constants.ZERO); |
| | | shopInfo.setStatus(Constants.ZERO); |
| | | shopInfo.setDeleted(Constants.ZERO); |
| | | shopInfo.setCreateTime(now); |
| | |
| | | shopInfo.setRegionMemberId(member.getId()); |
| | | // 读取押金金额 |
| | | setDepositAmountFromPricingRule(shopInfo); |
| | | // 设置默认配送范围 |
| | | setDefaultDeliveryRange(shopInfo); |
| | | shopInfoMapper.insert(shopInfo); |
| | | shopId = shopInfo.getId(); |
| | | } |
| | |
| | | if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) { |
| | | // 审核通过 → 通知缴纳押金 |
| | | String depositMoney = shopInfo.getDepositAmount() != null |
| | | ? String.valueOf(shopInfo.getDepositAmount() / 100.0) : "0"; |
| | | ? new java.math.BigDecimal(shopInfo.getDepositAmount()) |
| | | .divide(new java.math.BigDecimal(100), 2, java.math.RoundingMode.HALF_UP).toPlainString() : "0"; |
| | | sendSmsNotify(shopInfo.getTelephone(), |
| | | Constants.SmsNotify.SHOP_AUTH_APPROVED_DEPOSIT, |
| | | "storeName", shopInfo.getName(), |
| | |
| | | } |
| | | } |
| | | |
| | | // 门店头像:优先使用 coverImg,为空则取门头照第一张 |
| | | if (StringUtils.isNotBlank(shopInfo.getCoverImg())) { |
| | | vo.setShopAvatar(imgPrefix + shopInfo.getCoverImg()); |
| | | } else if (!CollectionUtils.isEmpty(vo.getStoreFrontImgUrls())) { |
| | | vo.setShopAvatar(vo.getStoreFrontImgUrls().get(0)); |
| | | } |
| | | |
| | | return vo; |
| | | } |
| | | |
| | |
| | | |
| | | // 门店名称模糊查询 |
| | | if (StringUtils.isNotBlank(dto.getName())) { |
| | | qw.lambda().like(ShopInfo::getName, dto.getName()); |
| | | qw.lambda().and(q -> q.like(ShopInfo::getName, dto.getName()).or() |
| | | .like(ShopInfo::getAddress, dto.getName())); |
| | | } |
| | | |
| | | // 城市筛选(areaId是区县,需匹配其parentId等于城市ID) |
| | |
| | | } |
| | | |
| | | @Override |
| | | public ShopInfoMaintainDTO getShopMaintainInfo(Integer memberId) { |
| | | ShopInfo shop = shopInfoMapper.selectById(memberId); |
| | | public ShopInfoMaintainDTO getShopMaintainInfo(Integer shopId) { |
| | | ShopInfo shop = shopInfoMapper.selectById(shopId); |
| | | if (Objects.isNull(shop) || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) { |
| | | return null; |
| | | } |
| | |
| | | dto.setDeliveryArea(shop.getDeliveryArea()); |
| | | dto.setShopHours(shop.getShopHours()); |
| | | dto.setBusinessType(shop.getBusinessType()); |
| | | // 头像全路径 |
| | | if (StringUtils.isNotBlank(shop.getCoverImg())) { |
| | | dto.setCoverImgUrl(getShopPrefix() + shop.getCoverImg()); |
| | | } |
| | | return dto; |
| | | } |
| | | |
| | |
| | | public ShopLoginVO shopPasswordLogin(ShopLoginDTO dto){ |
| | | if(StringUtils.isBlank(dto.getTelephone()) |
| | | || StringUtils.isBlank(dto.getPassword()) |
| | | || StringUtils.isBlank(dto.getOpenid()) |
| | | ){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户名或密码不能为空"); |
| | | } |
| | |
| | | ); |
| | | if(shop==null){ |
| | | throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT); |
| | | } |
| | | if(!Constants.equalsInteger(shop.getAuditStatus(),Constants.THREE)){ |
| | | if(Constants.equalsInteger(shop.getAuditStatus(),Constants.ONE)){ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请完成审批流程 - 支付押金"); |
| | | } |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"门店审批流程未完成,请完成审批流程"); |
| | | } |
| | | //加密密码 |
| | | String pwd = Utils.Secure.encryptPassword( dto.getPassword(), shop.getSalt()); |
| | |
| | | |
| | | // 创建token(generateTokenForRedis 已自动清除该用户旧token,保证唯一有效) |
| | | String token = JwtTokenUtil.generateTokenForRedis(shop.getId(), Constants.TWO, JSONObject.toJSONString(shop), redisTemplate); |
| | | |
| | | // 构建响应 |
| | | ShopLoginVO vo = new ShopLoginVO(); |
| | | vo.setToken(token); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 从运营配置读取默认配送范围并赋值到门店记录 |
| | | */ |
| | | private void setDefaultDeliveryRange(ShopInfo shopInfo) { |
| | | SystemDictData data = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, Constants.OP_DEFAULT_DELIVERY_RANGE); |
| | | if (data != null && StringUtils.isNotBlank(data.getCode())) { |
| | | shopInfo.setDeliveryArea(new java.math.BigDecimal(data.getCode())); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 发送短信通知(失败不影响主业务) |
| | | */ |
| | | private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) { |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void changePassword(Integer shopId, String oldPassword, String newPassword, String token) { |
| | | if (StringUtils.isBlank(oldPassword)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "旧密码不能为空"); |
| | | } |
| | | if (StringUtils.isBlank(newPassword)) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "新密码不能为空"); |
| | | } |
| | | // 校验新密码必须同时包含字母和数字 |
| | | boolean hasLetter = newPassword.chars().anyMatch(Character::isLetter); |
| | | boolean hasDigit = newPassword.chars().anyMatch(Character::isDigit); |
| | | if (!hasLetter || !hasDigit) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "密码必须同时包含字母和数字"); |
| | | } |
| | | // 查询门店 |
| | | ShopInfo shopInfo = shopInfoMapper.selectById(shopId); |
| | | if (shopInfo == null || Constants.equalsInteger(shopInfo.getDeleted(), Constants.ONE)) { |
| | | throw new BusinessException(ResponseStatus.DATA_EMPTY); |
| | | } |
| | | // 校验旧密码 |
| | | String oldEncryptPwd = Utils.Secure.encryptPassword(oldPassword, shopInfo.getSalt()); |
| | | if (!oldEncryptPwd.equals(shopInfo.getPassword())) { |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "旧密码错误"); |
| | | } |
| | | // 重新生成salt,加密新密码并更新 |
| | | String salt = RandomStringUtils.randomAlphabetic(6); |
| | | shopInfo.setPassword(Utils.Secure.encryptPassword(newPassword, salt)); |
| | | shopInfo.setSalt(salt); |
| | | shopInfoMapper.updateById(shopInfo); |
| | | // 清除token,强制重新登录 |
| | | if (StringUtils.isNotBlank(token)) { |
| | | redisTemplate.delete(token); |
| | | } |
| | | } |
| | | |
| | | } |