|
|
|
|
@ -1,36 +1,44 @@
|
|
|
|
|
/*
|
|
|
|
|
* Copyright 2019-2020 Zheng Jie
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
* Copyright 2019-2020 Zheng Jie
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
package cn.ysk.cashier.service.impl.shopimpl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.core.thread.ThreadUtil;
|
|
|
|
|
import cn.ysk.cashier.config.security.security.TokenProvider;
|
|
|
|
|
import cn.ysk.cashier.cons.RedisConstant;
|
|
|
|
|
import cn.ysk.cashier.cons.rabbit.RabbitConstants;
|
|
|
|
|
import cn.ysk.cashier.dto.shoptable.*;
|
|
|
|
|
import cn.ysk.cashier.enums.ShopWxMsgTypeEnum;
|
|
|
|
|
import cn.ysk.cashier.exception.BadRequestException;
|
|
|
|
|
import cn.ysk.cashier.mybatis.mapper.TbCashierCartMapper;
|
|
|
|
|
import cn.ysk.cashier.mybatis.mapper.TbProductMapper;
|
|
|
|
|
import cn.ysk.cashier.mybatis.entity.TbShopOpenId;
|
|
|
|
|
import cn.ysk.cashier.mybatis.mapper.*;
|
|
|
|
|
import cn.ysk.cashier.pojo.order.TbCashierCart;
|
|
|
|
|
import cn.ysk.cashier.pojo.order.TbOrderDetail;
|
|
|
|
|
import cn.ysk.cashier.pojo.order.TbOrderInfo;
|
|
|
|
|
import cn.ysk.cashier.pojo.product.TbProduct;
|
|
|
|
|
import cn.ysk.cashier.pojo.product.TbProductSku;
|
|
|
|
|
import cn.ysk.cashier.pojo.shop.TbMerchantAccount;
|
|
|
|
|
import cn.ysk.cashier.pojo.shop.TbShopInfo;
|
|
|
|
|
import cn.ysk.cashier.pojo.shop.TbShopTable;
|
|
|
|
|
import cn.ysk.cashier.repository.order.TbCashierCartRepository;
|
|
|
|
|
import cn.ysk.cashier.repository.product.TbProductRepository;
|
|
|
|
|
import cn.ysk.cashier.repository.product.TbProductSkuRepository;
|
|
|
|
|
import cn.ysk.cashier.utils.RedisUtils;
|
|
|
|
|
import cn.ysk.cashier.utils.ValidationUtil;
|
|
|
|
|
import cn.ysk.cashier.utils.FileUtil;
|
|
|
|
|
import cn.ysk.cashier.repository.shop.TbShopInfoRepository;
|
|
|
|
|
import cn.ysk.cashier.utils.*;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
import com.dianguang.cloud.ossservice.model.DateUtils;
|
|
|
|
|
@ -42,25 +50,28 @@ import cn.ysk.cashier.dto.shop.TbShopTableQueryCriteria;
|
|
|
|
|
import cn.ysk.cashier.mapper.shop.TbShopTableMapper;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.springframework.data.domain.PageRequest;
|
|
|
|
|
import org.springframework.amqp.rabbit.connection.CorrelationData;
|
|
|
|
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
|
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.springframework.data.domain.Page;
|
|
|
|
|
import org.springframework.data.domain.Pageable;
|
|
|
|
|
import cn.ysk.cashier.utils.QueryHelp;
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.time.Instant;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @website https://eladmin.vip
|
|
|
|
|
* @description 服务实现
|
|
|
|
|
* @author lyf
|
|
|
|
|
* @date 2024-01-18
|
|
|
|
|
**/
|
|
|
|
|
* @author lyf
|
|
|
|
|
* @website https://eladmin.vip
|
|
|
|
|
* @description 服务实现
|
|
|
|
|
* @date 2024-01-18
|
|
|
|
|
**/
|
|
|
|
|
@Slf4j
|
|
|
|
|
@Service
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@ -74,31 +85,41 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
private final TbProductMapper productMapper;
|
|
|
|
|
private final TbCashierCartMapper cashierCartMapper;
|
|
|
|
|
private final RedisUtils redisUtils;
|
|
|
|
|
private final TokenProvider tokenProvider;
|
|
|
|
|
private final TbMerchantAccountMapper merchantAccountMapper;
|
|
|
|
|
private final TbOrderInfoMapper orderInfoMapper;
|
|
|
|
|
private final TbOrderDetailMapper orderDetailMapper;
|
|
|
|
|
private final TbProducSkutMapper producSkutMapper;
|
|
|
|
|
private final RabbitTemplate rabbitTemplate;
|
|
|
|
|
private final TbShopInfoRepository shopInfoRepository;
|
|
|
|
|
private final TbShopOpenIdMapper shopOpenIdMapper;
|
|
|
|
|
private final WxAccountUtil wxAccountUtil;
|
|
|
|
|
private final WxMsgUtils wxMsgUtils;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*桌码前缀
|
|
|
|
|
* 桌码前缀
|
|
|
|
|
*/
|
|
|
|
|
private final String QRCODE = "https://kysh.sxczgkj.cn/codeplate?code=";
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Map<String,Object> queryAll(TbShopTableQueryCriteria criteria, Pageable pageable){
|
|
|
|
|
if (criteria.getAreaId() == 0){
|
|
|
|
|
public Map<String, Object> queryAll(TbShopTableQueryCriteria criteria, Pageable pageable) {
|
|
|
|
|
if (criteria.getAreaId() == 0) {
|
|
|
|
|
criteria.setAreaId(null);
|
|
|
|
|
}
|
|
|
|
|
Page<TbShopTable> page = tbShopTableRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
|
|
|
|
|
Page<TbShopTable> page = tbShopTableRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable);
|
|
|
|
|
for (TbShopTable date : page.getContent()) {
|
|
|
|
|
if (!"".equals(date.getQrcode())){
|
|
|
|
|
date.setQrcode(QRCODE+date.getQrcode().trim());
|
|
|
|
|
if (!"".equals(date.getQrcode())) {
|
|
|
|
|
date.setQrcode(QRCODE + date.getQrcode().trim());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
HashMap<String, Object> map = new HashMap<>();
|
|
|
|
|
map.put("content",page.getContent());
|
|
|
|
|
map.put("totalElements",page.getTotalElements());
|
|
|
|
|
map.put("content", page.getContent());
|
|
|
|
|
map.put("totalElements", page.getTotalElements());
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Map<String,Object> queryAllNoPage(TbShopTableQueryCriteria criteria){
|
|
|
|
|
public Map<String, Object> queryAllNoPage(TbShopTableQueryCriteria criteria) {
|
|
|
|
|
if (null == criteria.getAreaId() || criteria.getAreaId() == 0) {
|
|
|
|
|
criteria.setAreaId(null);
|
|
|
|
|
}
|
|
|
|
|
@ -106,22 +127,22 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
ArrayList<Map<String, Object>> infoList = new ArrayList<>();
|
|
|
|
|
for (TbShopTable date : tbShopTableList) {
|
|
|
|
|
Map<String, Object> itemMap = BeanUtil.beanToMap(date, false, false);
|
|
|
|
|
if (!"".equals(date.getQrcode())){
|
|
|
|
|
itemMap.put("qrcode",QRCODE+date.getQrcode().trim());
|
|
|
|
|
itemMap.put("tableId",date.getQrcode());
|
|
|
|
|
if (!"".equals(date.getQrcode())) {
|
|
|
|
|
itemMap.put("qrcode", QRCODE + date.getQrcode().trim());
|
|
|
|
|
itemMap.put("tableId", date.getQrcode());
|
|
|
|
|
}
|
|
|
|
|
infoList.add(itemMap);
|
|
|
|
|
}
|
|
|
|
|
int i = tbShopTableRepository.countAllByShopId(criteria.getShopId());
|
|
|
|
|
HashMap<String, Object> map = new HashMap<>();
|
|
|
|
|
map.put("content",infoList);
|
|
|
|
|
map.put("total",i);
|
|
|
|
|
map.put("content", infoList);
|
|
|
|
|
map.put("total", i);
|
|
|
|
|
return map;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<TbShopTableDto> queryAll(TbShopTableQueryCriteria criteria){
|
|
|
|
|
return tbShopTableMapper.toDto(tbShopTableRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
|
|
|
|
|
public List<TbShopTableDto> queryAll(TbShopTableQueryCriteria criteria) {
|
|
|
|
|
return tbShopTableMapper.toDto(tbShopTableRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@ -133,7 +154,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
@Transactional
|
|
|
|
|
public TbShopTableDto findById(Integer id) {
|
|
|
|
|
TbShopTable tbShopTable = tbShopTableRepository.findById(id).orElseGet(TbShopTable::new);
|
|
|
|
|
ValidationUtil.isNull(tbShopTable.getId(),"TbShopTable","id",id);
|
|
|
|
|
ValidationUtil.isNull(tbShopTable.getId(), "TbShopTable", "id", id);
|
|
|
|
|
return tbShopTableMapper.toDto(tbShopTable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -141,14 +162,14 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
public void binding(TbShopTable resources) {
|
|
|
|
|
//判是否绑定过
|
|
|
|
|
TbShopTable byQrcode = tbShopTableRepository.findByQrcode(resources.getQrcode());
|
|
|
|
|
if (byQrcode != null){
|
|
|
|
|
if (byQrcode != null) {
|
|
|
|
|
throw new BadRequestException("已绑定");
|
|
|
|
|
}
|
|
|
|
|
TbShopTable tbShopTable = tbShopTableRepository.findById(resources.getId()).orElseGet(TbShopTable::new);
|
|
|
|
|
if (tbShopTable.getId() == null){
|
|
|
|
|
if (tbShopTable.getId() == null) {
|
|
|
|
|
throw new BadRequestException("找不到台桌");
|
|
|
|
|
}
|
|
|
|
|
ValidationUtil.isNull( tbShopTable.getId(),"TbShopTable","id",resources.getId());
|
|
|
|
|
ValidationUtil.isNull(tbShopTable.getId(), "TbShopTable", "id", resources.getId());
|
|
|
|
|
tbShopTable.copy(resources);
|
|
|
|
|
tbShopTableRepository.save(tbShopTable);
|
|
|
|
|
}
|
|
|
|
|
@ -167,7 +188,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public void update(TbShopTable resources) {
|
|
|
|
|
TbShopTable tbShopTable = tbShopTableRepository.findById(resources.getId()).orElseGet(TbShopTable::new);
|
|
|
|
|
ValidationUtil.isNull( tbShopTable.getId(),"TbShopTable","id",resources.getId());
|
|
|
|
|
ValidationUtil.isNull(tbShopTable.getId(), "TbShopTable", "id", resources.getId());
|
|
|
|
|
tbShopTable.copy(resources);
|
|
|
|
|
tbShopTableRepository.save(tbShopTable);
|
|
|
|
|
}
|
|
|
|
|
@ -183,9 +204,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
public void download(List<TbShopTableDto> all, HttpServletResponse response) throws IOException {
|
|
|
|
|
List<Map<String, Object>> list = new ArrayList<>();
|
|
|
|
|
for (TbShopTableDto tbShopTable : all) {
|
|
|
|
|
Map<String,Object> map = new LinkedHashMap<>();
|
|
|
|
|
map.put(" name", tbShopTable.getName());
|
|
|
|
|
map.put(" shopId", tbShopTable.getShopId());
|
|
|
|
|
Map<String, Object> map = new LinkedHashMap<>();
|
|
|
|
|
map.put(" name", tbShopTable.getName());
|
|
|
|
|
map.put(" shopId", tbShopTable.getShopId());
|
|
|
|
|
map.put("客座数,允许的客座数量", tbShopTable.getMaxCapacity());
|
|
|
|
|
map.put("台桌排序", tbShopTable.getSort());
|
|
|
|
|
map.put("区域Id", tbShopTable.getAreaId());
|
|
|
|
|
@ -196,8 +217,8 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
map.put("当type=0时,amount生效,为台桌的低消金额", tbShopTable.getAmount());
|
|
|
|
|
map.put("当type=2时perhour生效,为计时类型,每小时收款金额", tbShopTable.getPerhour());
|
|
|
|
|
map.put("台桌展示图---预留", tbShopTable.getView());
|
|
|
|
|
map.put(" createdAt", tbShopTable.getCreatedAt());
|
|
|
|
|
map.put(" updatedAt", tbShopTable.getUpdatedAt());
|
|
|
|
|
map.put(" createdAt", tbShopTable.getCreatedAt());
|
|
|
|
|
map.put(" updatedAt", tbShopTable.getUpdatedAt());
|
|
|
|
|
list.add(map);
|
|
|
|
|
}
|
|
|
|
|
FileUtil.downloadExcel(list, response);
|
|
|
|
|
@ -231,9 +252,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
tbCashierCart.setStatus("create");
|
|
|
|
|
tbCashierCart.setSalePrice(productSku.getSalePrice());
|
|
|
|
|
tbCashierCart.setTotalAmount(new BigDecimal(updateCartDTO.getNum()).multiply(productSku.getSalePrice()));
|
|
|
|
|
if (tbCashierCart.getIsPack().equals("false")){
|
|
|
|
|
if (tbCashierCart.getIsPack().equals("false")) {
|
|
|
|
|
tbCashierCart.setPackFee(BigDecimal.ZERO);
|
|
|
|
|
}else {
|
|
|
|
|
} else {
|
|
|
|
|
tbCashierCart.setPackFee(new BigDecimal(updateCartDTO.getNum()).multiply(product.getPackFee()));
|
|
|
|
|
tbCashierCart.setTotalAmount(tbCashierCart.getTotalAmount().add(tbCashierCart.getPackFee()));
|
|
|
|
|
}
|
|
|
|
|
@ -258,7 +279,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
throw new BadRequestException("商品不存在或已下架, id: " + addCartDTO.getSkuId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((product.getIsDistribute().equals(1) && product.getStockNumber() < 1 )
|
|
|
|
|
if ((product.getIsDistribute().equals(1) && product.getStockNumber() < 1)
|
|
|
|
|
|| (!product.getIsDistribute().equals(1) && productSku.getStockNumber() < 1)
|
|
|
|
|
) {
|
|
|
|
|
throw new BadRequestException("商品库存不足");
|
|
|
|
|
@ -269,10 +290,19 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
throw new BadRequestException("桌码不存在,桌码" + addCartDTO.getTableId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TbCashierCart tbCashierCart = cashierCartRepository.selectActivateBySkuId(String.valueOf(addCartDTO.getSkuId()), String.valueOf(addCartDTO.getShopId()), Long.valueOf(addCartDTO.getTableId()));
|
|
|
|
|
LambdaQueryWrapper<TbCashierCart> query = new LambdaQueryWrapper<TbCashierCart>().eq(TbCashierCart::getShopId, addCartDTO.getShopId())
|
|
|
|
|
.eq(TbCashierCart::getTableId, addCartDTO.getTableId());
|
|
|
|
|
if (addCartDTO.getVipUserId() != null) {
|
|
|
|
|
query.eq(TbCashierCart::getUserId, addCartDTO.getVipUserId());
|
|
|
|
|
} else {
|
|
|
|
|
query.isNull(TbCashierCart::getUserId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TbCashierCart tbCashierCart = cashierCartMapper.selectOne(query);
|
|
|
|
|
// 首次加入
|
|
|
|
|
if (tbCashierCart == null) {
|
|
|
|
|
tbCashierCart = new TbCashierCart();
|
|
|
|
|
tbCashierCart.setUserId(addCartDTO.getVipUserId());
|
|
|
|
|
tbCashierCart.setCoverImg(product.getCoverImg());
|
|
|
|
|
tbCashierCart.setCreatedAt(System.currentTimeMillis());
|
|
|
|
|
tbCashierCart.setIsSku(product.getTypeEnum());
|
|
|
|
|
@ -281,6 +311,7 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
tbCashierCart.setProductId(String.valueOf(product.getId()));
|
|
|
|
|
tbCashierCart.setSalePrice(productSku.getSalePrice());
|
|
|
|
|
tbCashierCart.setSkuId(productSku.getId().toString());
|
|
|
|
|
tbCashierCart.setMasterId(addCartDTO.getMasterId());
|
|
|
|
|
tbCashierCart.setShopId(String.valueOf(addCartDTO.getShopId()));
|
|
|
|
|
tbCashierCart.setTradeDay(DateUtils.getDay());
|
|
|
|
|
tbCashierCart.setStatus("create");
|
|
|
|
|
@ -288,9 +319,9 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
tbCashierCart.setIsGift(String.valueOf(addCartDTO.isGift()));
|
|
|
|
|
tbCashierCart.setSalePrice(productSku.getSalePrice());
|
|
|
|
|
tbCashierCart.setTotalAmount(new BigDecimal(addCartDTO.getNum()).multiply(productSku.getSalePrice()));
|
|
|
|
|
if (!addCartDTO.isPack()){
|
|
|
|
|
if (!addCartDTO.isPack()) {
|
|
|
|
|
tbCashierCart.setPackFee(BigDecimal.ZERO);
|
|
|
|
|
}else {
|
|
|
|
|
} else {
|
|
|
|
|
tbCashierCart.setPackFee(new BigDecimal(addCartDTO.getNum()).multiply(product.getPackFee()));
|
|
|
|
|
tbCashierCart.setTotalAmount(tbCashierCart.getTotalAmount().add(tbCashierCart.getPackFee()));
|
|
|
|
|
|
|
|
|
|
@ -302,12 +333,12 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
tbCashierCart.setNumber(addCartDTO.getNum());
|
|
|
|
|
tbCashierCart.setCategoryId(product.getCategoryId());
|
|
|
|
|
cashierCartRepository.save(tbCashierCart);
|
|
|
|
|
}else {
|
|
|
|
|
} else {
|
|
|
|
|
tbCashierCart.setTotalAmount(new BigDecimal(addCartDTO.getNum()).multiply(productSku.getSalePrice()));
|
|
|
|
|
|
|
|
|
|
if (!addCartDTO.isPack()){
|
|
|
|
|
if (!addCartDTO.isPack()) {
|
|
|
|
|
tbCashierCart.setPackFee(BigDecimal.ZERO);
|
|
|
|
|
}else {
|
|
|
|
|
} else {
|
|
|
|
|
tbCashierCart.setPackFee(new BigDecimal(addCartDTO.getNum()).multiply(product.getPackFee()));
|
|
|
|
|
tbCashierCart.setTotalAmount(tbCashierCart.getTotalAmount().add(tbCashierCart.getPackFee()));
|
|
|
|
|
|
|
|
|
|
@ -335,20 +366,41 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void removeCart(RemoveCartDTO removeCartDTO) {
|
|
|
|
|
cashierCartRepository.deleteByIdAndShopId(String.valueOf(removeCartDTO.getShopId()), removeCartDTO.getCartId(), removeCartDTO.getTableId());
|
|
|
|
|
// 会员点单
|
|
|
|
|
cashierCartMapper.delete(new LambdaQueryWrapper<TbCashierCart>().eq(TbCashierCart::getShopId, removeCartDTO.getShopId())
|
|
|
|
|
.eq(TbCashierCart::getId, removeCartDTO.getCartId()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void clearCart(ClearCartDTO clearCartDTO) {
|
|
|
|
|
if (clearCartDTO.getVipUserId() != null) {
|
|
|
|
|
cashierCartMapper.delete(new LambdaQueryWrapper<TbCashierCart>().eq(TbCashierCart::getShopId, clearCartDTO.getShopId())
|
|
|
|
|
.eq(TbCashierCart::getTableId, clearCartDTO.getTableId())
|
|
|
|
|
.eq(TbCashierCart::getUserId, clearCartDTO.getVipUserId()));
|
|
|
|
|
} else {
|
|
|
|
|
cashierCartMapper.delete(new LambdaQueryWrapper<TbCashierCart>().eq(TbCashierCart::getShopId, clearCartDTO.getShopId())
|
|
|
|
|
.eq(TbCashierCart::getTableId, clearCartDTO.getTableId())
|
|
|
|
|
.eq(TbCashierCart::getMasterId, clearCartDTO.getMasterId())
|
|
|
|
|
.isNull(TbCashierCart::getUserId));
|
|
|
|
|
}
|
|
|
|
|
tbShopTableRepository.deleteByTableIdAndShopId(clearCartDTO.getTableId(), clearCartDTO.getShopId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public com.baomidou.mybatisplus.extension.plugins.pagination.Page<TbCashierCart> getCart(Long tableId, Integer page, Integer size, Integer shopId) {
|
|
|
|
|
com.baomidou.mybatisplus.extension.plugins.pagination.Page<TbCashierCart> cartPage = cashierCartMapper.selectPage(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page, size), new LambdaQueryWrapper<TbCashierCart>()
|
|
|
|
|
public com.baomidou.mybatisplus.extension.plugins.pagination.Page<TbCashierCart> getCart(Long tableId, Integer page, Integer size, Integer shopId, Integer vipUserId) {
|
|
|
|
|
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
|
|
|
|
.eq(TbCashierCart::getTableId, tableId)
|
|
|
|
|
.eq(TbCashierCart::getStatus, "create")
|
|
|
|
|
.eq(TbCashierCart::getShopId, shopId));
|
|
|
|
|
.eq(TbCashierCart::getShopId, shopId);
|
|
|
|
|
|
|
|
|
|
if (vipUserId != null) {
|
|
|
|
|
queryWrapper.eq(TbCashierCart::getUserId, vipUserId);
|
|
|
|
|
}else {
|
|
|
|
|
queryWrapper.isNull(TbCashierCart::getUserId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
com.baomidou.mybatisplus.extension.plugins.pagination.Page<TbCashierCart> cartPage = cashierCartMapper
|
|
|
|
|
.selectPage(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page, size), queryWrapper);
|
|
|
|
|
List<TbCashierCart> records = cartPage.getRecords();
|
|
|
|
|
|
|
|
|
|
ArrayList<Integer> skuIds = new ArrayList<>();
|
|
|
|
|
@ -378,14 +430,23 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void pack(PackCartDTO packCartDTO) {
|
|
|
|
|
List<TbCashierCart> tbCashierCarts = cashierCartMapper.selectList(new LambdaQueryWrapper<TbCashierCart>().eq(TbCashierCart::getTableId, packCartDTO.getTableId())
|
|
|
|
|
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
|
|
|
|
.eq(TbCashierCart::getTableId, packCartDTO.getTableId())
|
|
|
|
|
.eq(TbCashierCart::getShopId, packCartDTO.getShopId())
|
|
|
|
|
.eq(TbCashierCart::getStatus, "create"));
|
|
|
|
|
.eq(TbCashierCart::getStatus, "create");
|
|
|
|
|
|
|
|
|
|
if (packCartDTO.getVipUserId() != null) {
|
|
|
|
|
queryWrapper.eq(TbCashierCart::getUserId, packCartDTO.getVipUserId());
|
|
|
|
|
} else {
|
|
|
|
|
queryWrapper.isNull(TbCashierCart::getUserId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<TbCashierCart> tbCashierCarts = cashierCartMapper.selectList(queryWrapper);
|
|
|
|
|
tbCashierCarts.forEach(item -> {
|
|
|
|
|
if (packCartDTO.getState().equals(0) && item.getIsPack().equals("true")) {
|
|
|
|
|
item.setIsPack("false");
|
|
|
|
|
item.setTotalAmount(item.getTotalAmount().subtract(item.getPackFee()));
|
|
|
|
|
}else {
|
|
|
|
|
} else {
|
|
|
|
|
item.setIsPack("true");
|
|
|
|
|
item.setTotalAmount(item.getTotalAmount().add(item.getPackFee()));
|
|
|
|
|
}
|
|
|
|
|
@ -396,56 +457,349 @@ public class TbShopTableServiceImpl implements TbShopTableService {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Object createOrder(CreateOrderDTO createOrderDTO) {
|
|
|
|
|
// 生成取餐码
|
|
|
|
|
String day = DateUtils.getDay();
|
|
|
|
|
LambdaQueryWrapper<TbCashierCart> queryWrapper = new LambdaQueryWrapper<TbCashierCart>()
|
|
|
|
|
.eq(TbCashierCart::getShopId, createOrderDTO.getShopId())
|
|
|
|
|
.eq(TbCashierCart::getTableId, createOrderDTO.getTableId())
|
|
|
|
|
.eq(TbCashierCart::getStatus, "create");
|
|
|
|
|
if (createOrderDTO.getVipUserId() != null) {
|
|
|
|
|
queryWrapper.eq(TbCashierCart::getUserId, createOrderDTO.getVipUserId());
|
|
|
|
|
}else {
|
|
|
|
|
queryWrapper.eq(TbCashierCart::getMasterId, createOrderDTO.getMasterId())
|
|
|
|
|
.isNull(TbCashierCart::getUserId);
|
|
|
|
|
}
|
|
|
|
|
List<TbCashierCart> cashierCarts = cashierCartMapper
|
|
|
|
|
.selectList(queryWrapper);
|
|
|
|
|
if (cashierCarts.isEmpty()) {
|
|
|
|
|
throw new BadRequestException("购物车为空,请先添加商品");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
BigDecimal totalAmount = BigDecimal.ZERO;
|
|
|
|
|
BigDecimal packAMount = BigDecimal.ZERO;
|
|
|
|
|
BigDecimal feeAmount = BigDecimal.ZERO;
|
|
|
|
|
BigDecimal saleAmount = BigDecimal.ZERO;
|
|
|
|
|
List<TbOrderDetail> orderDetails = new ArrayList<>();
|
|
|
|
|
Integer orderId = null;
|
|
|
|
|
for (TbCashierCart cashierCart : cashierCarts) {
|
|
|
|
|
totalAmount = totalAmount.add(cashierCart.getTotalAmount());
|
|
|
|
|
packAMount = packAMount.add(cashierCart.getPackFee());
|
|
|
|
|
feeAmount = cashierCart.getPackFee();
|
|
|
|
|
TbProductSku productSku = productSkuRepository.findById(Integer.valueOf(cashierCart.getSkuId())).orElse(null);
|
|
|
|
|
TbOrderDetail orderDetail = new TbOrderDetail();
|
|
|
|
|
|
|
|
|
|
if (Objects.nonNull(productSku)) {
|
|
|
|
|
saleAmount = saleAmount.add(productSku.getSalePrice());
|
|
|
|
|
orderDetail.setProductSkuName(productSku.getSpecSnap());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
orderDetail.setCreateTime(DateUtil.date().toTimestamp());
|
|
|
|
|
orderDetail.setNum(cashierCart.getNumber());
|
|
|
|
|
orderDetail.setPrice(cashierCart.getSalePrice());
|
|
|
|
|
orderDetail.setPriceAmount(cashierCart.getTotalAmount());
|
|
|
|
|
orderDetail.setProductId(Integer.valueOf(cashierCart.getProductId()));
|
|
|
|
|
orderDetail.setProductSkuId(Integer.valueOf(cashierCart.getSkuId()));
|
|
|
|
|
orderDetail.setProductName(cashierCart.getName());
|
|
|
|
|
orderDetail.setShopId(Integer.valueOf(cashierCart.getShopId()));
|
|
|
|
|
orderDetail.setPackAmount(cashierCart.getPackFee());
|
|
|
|
|
orderDetail.setStatus("unpaid");
|
|
|
|
|
orderDetail.setProductImg(cashierCart.getCoverImg());
|
|
|
|
|
orderDetails.add(orderDetail);
|
|
|
|
|
if (cashierCart.getOrderId() != null) {
|
|
|
|
|
orderId = cashierCart.getOrderId();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TbOrderInfo orderInfo = null;
|
|
|
|
|
if (orderId != null) {
|
|
|
|
|
orderInfo = orderInfoMapper.selectById(orderId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 修改订单信息
|
|
|
|
|
if (orderInfo != null) {
|
|
|
|
|
// 删除历史订单
|
|
|
|
|
orderDetailMapper.delete(new LambdaQueryWrapper<TbOrderDetail>().eq(TbOrderDetail::getOrderId, orderId));
|
|
|
|
|
orderInfo.setUpdatedAt(System.currentTimeMillis());
|
|
|
|
|
orderInfo.setSettlementAmount(totalAmount);
|
|
|
|
|
orderInfo.setAmount(totalAmount);
|
|
|
|
|
orderInfo.setOriginAmount(totalAmount);
|
|
|
|
|
orderInfo.setStatus("unpaid");
|
|
|
|
|
orderInfo.setOrderAmount(totalAmount);
|
|
|
|
|
orderInfo.setRemark(createOrderDTO.getNote());
|
|
|
|
|
orderInfo.setFreightAmount(feeAmount);
|
|
|
|
|
orderInfo.setProductAmount(saleAmount);
|
|
|
|
|
orderInfo.setTradeDay(DateUtils.getDay());
|
|
|
|
|
orderInfoMapper.updateById(orderInfo);
|
|
|
|
|
}else {
|
|
|
|
|
String orderNo = generateOrderNumber();
|
|
|
|
|
orderInfo = new TbOrderInfo();
|
|
|
|
|
orderInfo.setOrderNo(orderNo);
|
|
|
|
|
orderInfo.setAmount(totalAmount);
|
|
|
|
|
orderInfo.setPackFee(packAMount);
|
|
|
|
|
orderInfo.setSettlementAmount(totalAmount);
|
|
|
|
|
orderInfo.setOriginAmount(totalAmount);
|
|
|
|
|
orderInfo.setProductAmount(saleAmount);
|
|
|
|
|
orderInfo.setOrderAmount(totalAmount);
|
|
|
|
|
orderInfo.setFreightAmount(feeAmount);
|
|
|
|
|
orderInfo.setTableId(createOrderDTO.getTableId());
|
|
|
|
|
orderInfo.setSendType("table");
|
|
|
|
|
orderInfo.setOrderType("cash");
|
|
|
|
|
orderInfo.setShopId(createOrderDTO.getShopId().toString());
|
|
|
|
|
orderInfo.setRefundAble(1);
|
|
|
|
|
orderInfo.setTradeDay(day);
|
|
|
|
|
orderInfo.setMasterId(createOrderDTO.getMasterId());
|
|
|
|
|
orderInfo.setRemark(createOrderDTO.getNote());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新取餐号
|
|
|
|
|
orderInfo.setOutNumber(updateOutNumber(String.valueOf(createOrderDTO.getShopId())).toString());
|
|
|
|
|
orderInfoMapper.insert(orderInfo);
|
|
|
|
|
|
|
|
|
|
// 添加订单详细数据
|
|
|
|
|
orderId = orderInfo.getId();
|
|
|
|
|
for (TbOrderDetail orderDetail : orderDetails) {
|
|
|
|
|
orderDetail.setOrderId(orderId);
|
|
|
|
|
orderDetailMapper.insert(orderDetail);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新购物车记录的orderId
|
|
|
|
|
// 是否是第一次添加的商品
|
|
|
|
|
boolean isFirst = true;
|
|
|
|
|
for (TbCashierCart cashierCart : cashierCarts) {
|
|
|
|
|
TbProduct product = productMapper.selectById(cashierCart.getProductId());
|
|
|
|
|
TbProductSku productSku = productSkuRepository.findById(Integer.valueOf(cashierCart.getSkuId())).orElse(null);
|
|
|
|
|
|
|
|
|
|
log.info("下单,开始校验库存预警,购物车id:{}", cashierCart.getId());
|
|
|
|
|
CompletableFuture.runAsync(() -> checkWarnLineAndSendMsg(productSku, product, Integer.valueOf(cashierCart.getShopId()), cashierCart.getNumber()));
|
|
|
|
|
|
|
|
|
|
// 已经添加的商品,修改数量
|
|
|
|
|
isFirst = updateStock(cashierCart);
|
|
|
|
|
cashierCart.setOrderId(orderId);
|
|
|
|
|
cashierCart.setUpdatedAt(System.currentTimeMillis());
|
|
|
|
|
cashierCartMapper.updateById(cashierCart);
|
|
|
|
|
}
|
|
|
|
|
if (isFirst) {
|
|
|
|
|
redisTemplate.delete("SHOP:CODE:USER:pc:" + createOrderDTO.getShopId() + ":"
|
|
|
|
|
+ day + ":" + createOrderDTO.getTableId() + ":" + (createOrderDTO.getVipUserId() == null ? "" : createOrderDTO.getVipUserId()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 推送耗材信息
|
|
|
|
|
pushConsMsg(orderInfo, cashierCarts);
|
|
|
|
|
return orderInfo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 增加库存
|
|
|
|
|
* @param productId 商品id
|
|
|
|
|
* @param skuId sku
|
|
|
|
|
* @param addNum 增加的库存数量
|
|
|
|
|
*/
|
|
|
|
|
public void incrStock(Integer productId, Integer skuId, Integer addNum) {
|
|
|
|
|
TbProduct product = productMapper.selectById(productId);
|
|
|
|
|
if (product.getIsDistribute() == 1) {
|
|
|
|
|
productMapper.incrStock(product.getId(), addNum);
|
|
|
|
|
}else {
|
|
|
|
|
producSkutMapper.incrStock(skuId, addNum);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 减少库存
|
|
|
|
|
* @param productId 商品数据
|
|
|
|
|
* @param skuId sku
|
|
|
|
|
* @param decrNum 减少的数量
|
|
|
|
|
*/
|
|
|
|
|
public void decrStock(Integer productId, String skuId, int decrNum) {
|
|
|
|
|
TbProduct product = productMapper.selectById(productId);
|
|
|
|
|
if (product.getIsDistribute() == 1) {
|
|
|
|
|
if (product.getIsStock() == 1) {
|
|
|
|
|
if (productMapper.decrStock(productId, decrNum) < 1) {
|
|
|
|
|
throw new BadRequestException("库存不足,下单失败");
|
|
|
|
|
}
|
|
|
|
|
}else {
|
|
|
|
|
productMapper.decrStockUnCheck(productId, decrNum);
|
|
|
|
|
}
|
|
|
|
|
}else {
|
|
|
|
|
if (product.getIsStock() == 1) {
|
|
|
|
|
if (producSkutMapper.decrStock(String.valueOf(skuId), decrNum) < 1) {
|
|
|
|
|
throw new BadRequestException("库存不足,下单失败");
|
|
|
|
|
}
|
|
|
|
|
}else {
|
|
|
|
|
producSkutMapper.decrStockUnCheck(String.valueOf(skuId), decrNum);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 推送耗材消耗信息
|
|
|
|
|
*/
|
|
|
|
|
private void pushConsMsg(TbOrderInfo orderInfo, List<TbCashierCart> cashierCarts) {
|
|
|
|
|
log.info("创建订单,发送更新耗材消息,订单id:{}", orderInfo.getId());
|
|
|
|
|
//修改耗材数据
|
|
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
|
|
jsonObject.put("orderId", orderInfo.getId());
|
|
|
|
|
jsonObject.put("type", "create");
|
|
|
|
|
rabbitTemplate.convertAndSend(RabbitConstants.CONS_COLLECT_PUT, RabbitConstants.CONS_COLLECT_ROUTINGKEY_PUT,
|
|
|
|
|
jsonObject.toJSONString(), new CorrelationData(UUID.randomUUID().toString()));
|
|
|
|
|
|
|
|
|
|
ThreadUtil.execAsync(() -> {
|
|
|
|
|
ThreadUtil.sleep(5, TimeUnit.SECONDS);
|
|
|
|
|
for (TbCashierCart cashierCart : cashierCarts) {
|
|
|
|
|
JSONObject objectMsg = new JSONObject();
|
|
|
|
|
objectMsg.put("skuId", Integer.valueOf(cashierCart.getSkuId()));
|
|
|
|
|
objectMsg.put("shopId", Integer.valueOf(cashierCart.getShopId()));
|
|
|
|
|
rabbitTemplate.convertAndSend(RabbitConstants.CONS_MSG_COLLECT_PUT, RabbitConstants.CONS_MSG_COLLECT_ROUTINGKEY_PUT,
|
|
|
|
|
objectMsg.toJSONString(), new CorrelationData(UUID.randomUUID().toString()));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新库存
|
|
|
|
|
* @param cashierCart 购物车
|
|
|
|
|
* @return 是否是第一次添加的商品
|
|
|
|
|
*/
|
|
|
|
|
private boolean updateStock(TbCashierCart cashierCart) {
|
|
|
|
|
if (cashierCart.getOrderId() != null) {
|
|
|
|
|
String message = redisTemplate.opsForValue().get(RedisConstant.ORDER_PRODUCT_NUM + cashierCart.getId());
|
|
|
|
|
if (message != null) {
|
|
|
|
|
int lastNum = Integer.parseInt(message);
|
|
|
|
|
// 数量减少, 返还库存
|
|
|
|
|
if (lastNum > cashierCart.getNumber()) {
|
|
|
|
|
incrStock(Integer.parseInt(cashierCart.getProductId()), Integer.parseInt(cashierCart.getSkuId()), lastNum - cashierCart.getNumber());
|
|
|
|
|
} else {
|
|
|
|
|
decrStock(Integer.parseInt(cashierCart.getProductId()), cashierCart.getSkuId(), cashierCart.getNumber() - lastNum);
|
|
|
|
|
}
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.ORDER_PRODUCT_NUM + cashierCart.getId(), cashierCart.getNumber().toString(), 24 * 60 * 60, TimeUnit.SECONDS);
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// 首次添加的商品
|
|
|
|
|
} else {
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.ORDER_PRODUCT_NUM + cashierCart.getId(), cashierCart.getNumber().toString(), 24 * 60 * 60, TimeUnit.SECONDS);
|
|
|
|
|
// 修改库存
|
|
|
|
|
decrStock(Integer.parseInt(cashierCart.getProductId()), cashierCart.getSkuId(), cashierCart.getNumber());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新取餐号
|
|
|
|
|
* @param shopId 店铺id
|
|
|
|
|
* @return 当前取餐号
|
|
|
|
|
*/
|
|
|
|
|
public Integer updateOutNumber(String shopId) {
|
|
|
|
|
JSONObject object = new JSONObject();
|
|
|
|
|
String outNumber = redisTemplate.opsForValue().get(RedisConstant.OUT_NUMBER.concat(shopId));
|
|
|
|
|
Integer number = 1;
|
|
|
|
|
if (Objects.isNull(outNumber)) {
|
|
|
|
|
object.put("outNumber", number);
|
|
|
|
|
object.put("times", DateUtils.getDay());
|
|
|
|
|
} else {
|
|
|
|
|
object = JSONObject.parseObject(outNumber);
|
|
|
|
|
if (object.getString("times").equals(DateUtils.getDay())) {
|
|
|
|
|
number = object.getInteger("outNumber") + 1;
|
|
|
|
|
object.put("outNumber", number);
|
|
|
|
|
} else {
|
|
|
|
|
object.put("outNumber", number);
|
|
|
|
|
object.put("times", DateUtils.getDay());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.OUT_NUMBER.concat(shopId), object.toString());
|
|
|
|
|
|
|
|
|
|
return number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 校验商品库存警戒线并通知商户
|
|
|
|
|
*
|
|
|
|
|
* @param productSku sku
|
|
|
|
|
*/
|
|
|
|
|
private void checkWarnLineAndSendMsg(TbProductSku productSku, TbProduct product, Integer shopId, Integer num) {
|
|
|
|
|
TbShopInfo shopInfo = shopInfoRepository.getById(shopId);
|
|
|
|
|
if (productSku.getWarnLine() == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (product.getIsStock() == null || product.getIsStock() != 1) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (productSku.getStockNumber() == null) {
|
|
|
|
|
productSku.setStockNumber((double) 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (product.getStockNumber() == null) {
|
|
|
|
|
product.setStockNumber(0);
|
|
|
|
|
}
|
|
|
|
|
if (
|
|
|
|
|
(product.getIsDistribute() == 1 && product.getStockNumber() - num <= productSku.getWarnLine())
|
|
|
|
|
|| (product.getIsDistribute() != 1) && productSku.getStockNumber() - num <= productSku.getWarnLine()
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
|
|
List<TbShopOpenId> openIdList = shopOpenIdMapper.selectList(new LambdaQueryWrapper<TbShopOpenId>()
|
|
|
|
|
.eq(TbShopOpenId::getShopId, shopId)
|
|
|
|
|
.eq(TbShopOpenId::getStatus, 1)
|
|
|
|
|
.and((queryWrapper) -> queryWrapper.eq(TbShopOpenId::getType, ShopWxMsgTypeEnum.ALL_MSG.getType())
|
|
|
|
|
.or().eq(TbShopOpenId::getType, ShopWxMsgTypeEnum.STOCK_MSG.getType()))
|
|
|
|
|
.groupBy(TbShopOpenId::getOpenId)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
wxMsgUtils.aboardStockMsg(shopInfo.getShopName(), shopId, product.getName(),
|
|
|
|
|
product.getIsDistribute() == 1 ? product.getStockNumber()-num : (int) (productSku.getStockNumber() - num));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String generateOrderNumber() {
|
|
|
|
|
String date = DateUtils.getSdfTimes();
|
|
|
|
|
Random random = new Random();
|
|
|
|
|
int randomNum = random.nextInt(900) + 100;
|
|
|
|
|
return "DD" + date + randomNum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public synchronized String generateOrderCode(String day, String clientType, String shopId) {
|
|
|
|
|
String code = redisUtils.get("SHOP:CODE:" + clientType + ":" + shopId + ":" + day)+"";
|
|
|
|
|
String code = redisUtils.get("SHOP:CODE:" + clientType + ":" + shopId + ":" + day) + "";
|
|
|
|
|
// 使用顺序递增的计数器生成取餐码
|
|
|
|
|
String orderCode = "";
|
|
|
|
|
if (StringUtils.isEmpty(code) || "null".equals(code)) {
|
|
|
|
|
orderCode = "1";
|
|
|
|
|
redisUtils.set("SHOP:CODE:" + clientType + ":" + shopId + ":" + day,"1");
|
|
|
|
|
redisTemplate.opsForValue().set("SHOP:CODE:" + clientType + ":" + shopId + ":" + day, "1");
|
|
|
|
|
} else {
|
|
|
|
|
orderCode =String.valueOf(Integer.parseInt(code)+1);
|
|
|
|
|
orderCode = String.valueOf(Integer.parseInt(code) + 1);
|
|
|
|
|
}
|
|
|
|
|
redisUtils.set("SHOP:CODE:" + clientType + ":" + shopId + ":" + day, "#" + Integer.parseInt(code.replace("#", "")) + 2);
|
|
|
|
|
boolean flag = redisUtils.setNx("SHOP:CODE:SET" + clientType + ":" + shopId + ":" + day, orderCode);
|
|
|
|
|
if (flag){
|
|
|
|
|
return generateOrderCode(day,clientType,shopId);
|
|
|
|
|
redisTemplate.opsForValue().set("SHOP:CODE:" + clientType + ":" + shopId + ":" + day, "#" + Integer.parseInt(code.replace("#", "")) + 2);
|
|
|
|
|
boolean flag = Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent("SHOP:CODE:SET" + clientType + ":" + shopId + ":" + day, orderCode));
|
|
|
|
|
if (flag) {
|
|
|
|
|
return generateOrderCode(day, clientType, shopId);
|
|
|
|
|
}
|
|
|
|
|
// 增加计数器
|
|
|
|
|
|
|
|
|
|
return orderCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// @Override
|
|
|
|
|
// public Object getMasterId(Long tableId, Integer shopId) {
|
|
|
|
|
// String day = DateUtils.getDay();
|
|
|
|
|
// JSONObject jsonObject = new JSONObject();
|
|
|
|
|
// String key="SHOP:CODE:USER:pc" + ":" + shopId + ":" + day + userId;
|
|
|
|
|
// String userCode = redisUtils.get(key)+"";
|
|
|
|
|
// if ("1".equals(type)) {
|
|
|
|
|
// String code = "#" + generateOrderCode(day, clientType, shopId);
|
|
|
|
|
// redisUtil.saveMessage(key, code);
|
|
|
|
|
// jsonObject.put("code", code);
|
|
|
|
|
// } else {
|
|
|
|
|
// if (StringUtils.isEmpty(userCode)||"null".equals(userCode)||"#null".equals(userCode)) {
|
|
|
|
|
// String code = "#" + generateOrderCode(day, clientType, shopId);
|
|
|
|
|
// redisUtil.saveMessage(key, code);
|
|
|
|
|
// jsonObject.put("code", code);
|
|
|
|
|
// } else {
|
|
|
|
|
// jsonObject.put("code", userCode);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
private final StringRedisTemplate redisTemplate;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Object getMasterId(Long tableId, Integer shopId) {
|
|
|
|
|
return null;
|
|
|
|
|
public Object getMasterId(Integer shopId, Long tableId, Integer vipUserId) {
|
|
|
|
|
String account = tokenProvider.getSubject();
|
|
|
|
|
if (account == null) {
|
|
|
|
|
throw new BadRequestException("token解析失败");
|
|
|
|
|
}
|
|
|
|
|
TbMerchantAccount merchantAccount = merchantAccountMapper.selectOne(new LambdaQueryWrapper<TbMerchantAccount>().eq(TbMerchantAccount::getAccount, account));
|
|
|
|
|
String day = DateUtils.getDay();
|
|
|
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
|
|
String key = "SHOP:CODE:USER:pc" + ":" + shopId + ":" + day + ":" + tableId + ":" + (vipUserId == null ? "" : vipUserId);
|
|
|
|
|
String userCode = redisTemplate.opsForValue().get(key);
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isEmpty(userCode) || "null".equals(userCode) || "#null".equals(userCode)) {
|
|
|
|
|
String code = "#" + generateOrderCode(day, "pc", String.valueOf(shopId));
|
|
|
|
|
redisTemplate.opsForValue().set(key, code);
|
|
|
|
|
jsonObject.put("masterId", code);
|
|
|
|
|
} else {
|
|
|
|
|
jsonObject.put("masterId", userCode);
|
|
|
|
|
}
|
|
|
|
|
return jsonObject;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|