商品起售
This commit is contained in:
@@ -50,10 +50,7 @@ public class OrderController {
|
|||||||
@RequestParam Integer size, @RequestParam String status){
|
@RequestParam Integer size, @RequestParam String status){
|
||||||
return orderService.orderList(userId,page,size,status);
|
return orderService.orderList(userId,page,size,status);
|
||||||
}
|
}
|
||||||
@GetMapping("/testMessage")
|
|
||||||
private void testMessage(@RequestParam("tableId") String tableId, @RequestParam("message") String message) throws IOException {
|
|
||||||
orderService.testMessage(tableId,message);
|
|
||||||
}
|
|
||||||
@GetMapping("/tradeIntegral")
|
@GetMapping("/tradeIntegral")
|
||||||
private Result tradeIntegral(@RequestParam("userId") String userId, @RequestParam("id") String id) throws IOException, ParseException {
|
private Result tradeIntegral(@RequestParam("userId") String userId, @RequestParam("id") String id) throws IOException, ParseException {
|
||||||
return orderService.tradeIntegral(userId,id);
|
return orderService.tradeIntegral(userId,id);
|
||||||
|
|||||||
@@ -15,19 +15,11 @@ import java.util.List;
|
|||||||
public interface TbProductSkuMapper {
|
public interface TbProductSkuMapper {
|
||||||
int deleteByPrimaryKey(Integer id);
|
int deleteByPrimaryKey(Integer id);
|
||||||
|
|
||||||
int insert(TbProductSkuWithBLOBs record);
|
|
||||||
|
|
||||||
int insertSelective(TbProductSkuWithBLOBs record);
|
|
||||||
|
|
||||||
TbProductSkuWithBLOBs selectByPrimaryKey(Integer id);
|
TbProductSkuWithBLOBs selectByPrimaryKey(Integer id);
|
||||||
Integer selectBySpecSnap(@Param("shopId")String shopId,@Param("tableId") Integer tableId,@Param("specSnap") String specSnap);
|
Integer selectBySpecSnap(@Param("shopId")String shopId,@Param("tableId") Integer tableId,@Param("specSnap") String specSnap);
|
||||||
int updateByPrimaryKeySelective(TbProductSkuWithBLOBs record);
|
|
||||||
List<HomeVO> selectSale();
|
List<HomeVO> selectSale();
|
||||||
|
|
||||||
List<HomeVO> selectDay();
|
List<HomeVO> selectDay();
|
||||||
int updateByPrimaryKeyWithBLOBs(TbProductSkuWithBLOBs record);
|
|
||||||
|
|
||||||
int updateByPrimaryKey(TbProductSku record);
|
|
||||||
|
|
||||||
TbProductSkuWithBLOBs selectByShopIdAndProductIdAndSpec(@Param("shopId") String shopId, @Param("productId") String productId, @Param("spec") String spec);
|
TbProductSkuWithBLOBs selectByShopIdAndProductIdAndSpec(@Param("shopId") String shopId, @Param("productId") String productId, @Param("spec") String spec);
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ public class TbProductSku implements Serializable {
|
|||||||
|
|
||||||
private BigDecimal guidePrice;
|
private BigDecimal guidePrice;
|
||||||
|
|
||||||
|
private Integer suit;
|
||||||
|
|
||||||
private BigDecimal strategyPrice;
|
private BigDecimal strategyPrice;
|
||||||
|
|
||||||
private Double stockNumber;
|
private Double stockNumber;
|
||||||
@@ -47,6 +49,7 @@ public class TbProductSku implements Serializable {
|
|||||||
private Long updatedAt;
|
private Long updatedAt;
|
||||||
|
|
||||||
private Integer isPauseSale = 0;
|
private Integer isPauseSale = 0;
|
||||||
|
private Integer isDel;
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@@ -186,6 +189,14 @@ public class TbProductSku implements Serializable {
|
|||||||
this.realSalesNumber = realSalesNumber;
|
this.realSalesNumber = realSalesNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getSuit() {
|
||||||
|
return suit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuit(Integer suit) {
|
||||||
|
this.suit = suit;
|
||||||
|
}
|
||||||
|
|
||||||
public BigDecimal getFirstShared() {
|
public BigDecimal getFirstShared() {
|
||||||
return firstShared;
|
return firstShared;
|
||||||
}
|
}
|
||||||
@@ -225,4 +236,12 @@ public class TbProductSku implements Serializable {
|
|||||||
public void setIsPauseSale(Integer isPauseSale) {
|
public void setIsPauseSale(Integer isPauseSale) {
|
||||||
this.isPauseSale = isPauseSale;
|
this.isPauseSale = isPauseSale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getIsDel() {
|
||||||
|
return isDel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsDel(Integer isDel) {
|
||||||
|
this.isDel = isDel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -160,54 +160,6 @@ public class PushToClientChannelHandlerAdapter extends NettyChannelHandlerAdapte
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param message 发送的消息内容
|
|
||||||
* @param shopId 店铺Id
|
|
||||||
// * @param clientId 客户端Id
|
|
||||||
// * @param userFlag 为true 单发给clientId
|
|
||||||
* 为false 群发 shopId为空 发给所有人
|
|
||||||
*/
|
|
||||||
// @Async
|
|
||||||
// public void AppSendInfo(String message, String shopId,String clientId, boolean userFlag) {
|
|
||||||
// log.info("netty连接client 发送消息 shopId:{} clientId:{} userFlag:{} message:{}",shopId,clientId,userFlag, JSONUtil.toJSONString(message));
|
|
||||||
// if (userFlag) {
|
|
||||||
// if (webSocketMap.containsKey(shopId)) {
|
|
||||||
// ConcurrentHashMap<String, ChannelHandlerContext> webSockets = webSocketMap.get(shopId);
|
|
||||||
// if(!webSockets.isEmpty()){
|
|
||||||
// if (StringUtils.isNotBlank(clientId)) {
|
|
||||||
// ChannelHandlerContext ctx = webSockets.get(clientId);
|
|
||||||
// if (ctx != null) {
|
|
||||||
// sendMesToApp(message,ctx);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// if (StringUtils.isEmpty(shopId)) {
|
|
||||||
// // 向所有用户发送信息
|
|
||||||
// for (ConcurrentHashMap<String, ChannelHandlerContext> value : webSocketMap.values()) {
|
|
||||||
// for (ChannelHandlerContext ctx : value.values()) {
|
|
||||||
// sendMesToApp(message,ctx);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else if (webSocketMap.containsKey(shopId)) {
|
|
||||||
// ConcurrentHashMap<String, ChannelHandlerContext> webSockets = webSocketMap.get(shopId);
|
|
||||||
// if((!webSockets.isEmpty() && !webSockets.keySet().isEmpty())) {
|
|
||||||
// for (String user : webSockets.keySet()) {
|
|
||||||
// ChannelHandlerContext ctx = webSockets.get(user);
|
|
||||||
// if (ctx != null) {
|
|
||||||
// log.info("netty连接client 发送消息 桌码群发 clientId:{}",user);
|
|
||||||
// sendMesToApp(message,ctx);
|
|
||||||
// }else {
|
|
||||||
// log.info("netty连接client 发送消息 桌码群发 clientId:{} 失败",user);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }else {
|
|
||||||
// log.info("netty连接client 发送消息 桌码群发 clientId:{} 失败",clientId);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
public void AppSendInfoV1(String shopId, String orderNo, JSONObject message) {
|
public void AppSendInfoV1(String shopId, String orderNo, JSONObject message) {
|
||||||
log.info("netty连接client 发送消息 shopId:{} clientId:{} userFlag:{} message:{}", shopId, message.get("orderInfo"));
|
log.info("netty连接client 发送消息 shopId:{} clientId:{} userFlag:{} message:{}", shopId, message.get("orderInfo"));
|
||||||
retryQueue.computeIfAbsent(shopId, k -> new ConcurrentLinkedQueue<>()).offer(message);
|
retryQueue.computeIfAbsent(shopId, k -> new ConcurrentLinkedQueue<>()).offer(message);
|
||||||
|
|||||||
@@ -288,7 +288,6 @@ public class CartService {
|
|||||||
// log.error("长链接错误 createCart{}", e.getMessage());
|
// log.error("长链接错误 createCart{}", e.getMessage());
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public void createCart(JSONObject jsonObject) {
|
public void createCart(JSONObject jsonObject) {
|
||||||
try {
|
try {
|
||||||
String tableId = jsonObject.getString("tableId");
|
String tableId = jsonObject.getString("tableId");
|
||||||
@@ -311,10 +310,11 @@ public class CartService {
|
|||||||
Integer buyNum = jsonObject.getInteger("num");
|
Integer buyNum = jsonObject.getInteger("num");
|
||||||
|
|
||||||
String skuId = jsonObject.getString("skuId");
|
String skuId = jsonObject.getString("skuId");
|
||||||
|
TbProductSkuWithBLOBs tbProductSkuWithBLOBs = productSkuMapper.selectByPrimaryKey(Integer.valueOf(skuId));
|
||||||
if (tbProduct.getIsStock() == 1) {
|
if (tbProduct.getIsStock() == 1) {
|
||||||
// 1:共享库存 0:独立库存
|
// 1:共享库存 0:独立库存
|
||||||
if (Integer.valueOf(tbProduct.getIsDistribute()).equals(1)) {
|
if (Integer.valueOf(tbProduct.getIsDistribute()).equals(1)) {
|
||||||
if (tbProduct.getIsPauseSale() == 1 || tbProduct.getStockNumber() - buyNum < 0) {//是否售罄
|
if (tbProduct.getIsPauseSale() == 1 || tbProduct.getStockNumber() < buyNum ) {//是否售罄
|
||||||
JSONObject jsonObject1 = new JSONObject();
|
JSONObject jsonObject1 = new JSONObject();
|
||||||
jsonObject1.put("status", "fail");
|
jsonObject1.put("status", "fail");
|
||||||
jsonObject1.put("msg", "该商品已售罄");
|
jsonObject1.put("msg", "该商品已售罄");
|
||||||
@@ -326,8 +326,7 @@ public class CartService {
|
|||||||
throw new MsgException("该商品已售罄");
|
throw new MsgException("该商品已售罄");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TbProductSkuWithBLOBs tbProductSkuWithBLOBs = productSkuMapper.selectByPrimaryKey(Integer.valueOf(skuId));
|
if (tbProductSkuWithBLOBs.getIsPauseSale() == 1 || tbProductSkuWithBLOBs.getStockNumber() < buyNum ) {//是否售罄
|
||||||
if(tbProductSkuWithBLOBs.getIsPauseSale() == 1 || tbProductSkuWithBLOBs.getStockNumber() - buyNum < 0){//是否售罄
|
|
||||||
JSONObject jsonObject1 = new JSONObject();
|
JSONObject jsonObject1 = new JSONObject();
|
||||||
jsonObject1.put("status", "fail");
|
jsonObject1.put("status", "fail");
|
||||||
jsonObject1.put("msg", "该商品已售罄");
|
jsonObject1.put("msg", "该商品已售罄");
|
||||||
@@ -360,6 +359,10 @@ public class CartService {
|
|||||||
if (cashierCart.getSkuId().equals(skuId)) {
|
if (cashierCart.getSkuId().equals(skuId)) {
|
||||||
cashierCart.setTotalNumber(cashierCart.getTotalNumber() + buyNum);
|
cashierCart.setTotalNumber(cashierCart.getTotalNumber() + buyNum);
|
||||||
cashierCart.setNumber(cashierCart.getNumber() + buyNum);
|
cashierCart.setNumber(cashierCart.getNumber() + buyNum);
|
||||||
|
if (buyNum < 0 && tbProductSkuWithBLOBs.getSuit() != null && tbProductSkuWithBLOBs.getSuit() > 1 && cashierCart.getNumber() <= tbProductSkuWithBLOBs.getSuit()) {
|
||||||
|
cashierCartMapper.deleteByPrimaryKey(cashierCart.getId());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (cashierCart.getNumber() > 0) {
|
if (cashierCart.getNumber() > 0) {
|
||||||
cashierCart.setTotalAmount(new BigDecimal(cashierCart.getTotalNumber()).multiply(cashierCart.getSalePrice().add(cashierCart.getPackFee())));
|
cashierCart.setTotalAmount(new BigDecimal(cashierCart.getTotalNumber()).multiply(cashierCart.getSalePrice().add(cashierCart.getPackFee())));
|
||||||
cashierCart.setUpdatedAt(Instant.now().toEpochMilli());
|
cashierCart.setUpdatedAt(Instant.now().toEpochMilli());
|
||||||
@@ -491,9 +494,24 @@ public class CartService {
|
|||||||
throw new MsgException("该商品规格不存在");
|
throw new MsgException("该商品规格不存在");
|
||||||
}
|
}
|
||||||
TbCashierCart cashierCart = new TbCashierCart();
|
TbCashierCart cashierCart = new TbCashierCart();
|
||||||
|
if (productSku.getSuit() != null && productSku.getSuit() > 1) {
|
||||||
|
if (productSku.getSuit() > productSku.getStockNumber()) {
|
||||||
|
JSONObject jsonObject1 = new JSONObject();
|
||||||
|
jsonObject1.put("status", "fail");
|
||||||
|
jsonObject1.put("msg", "该商品" + productSku.getSuit() + "起售,现库存不足");
|
||||||
|
jsonObject1.put("data", new ArrayList<>());
|
||||||
|
PushToAppChannelHandlerAdapter.getInstance().AppSendInfo(jsonObject1.toString(), key, userId.toString(), true);
|
||||||
|
log.error("购物车添加商品异常,该商品起售库存不足:{}", productId);
|
||||||
|
throw new MsgException("该商品起售库存不足");
|
||||||
|
}
|
||||||
|
cashierCart.setNumber(productSku.getSuit());
|
||||||
|
cashierCart.setTotalNumber(productSku.getSuit());
|
||||||
|
}else {
|
||||||
|
cashierCart.setNumber(num);
|
||||||
|
cashierCart.setTotalNumber(num);
|
||||||
|
}
|
||||||
cashierCart.setProductId(productId);
|
cashierCart.setProductId(productId);
|
||||||
cashierCart.setSkuId(skuId);
|
cashierCart.setSkuId(skuId);
|
||||||
cashierCart.setNumber(num);
|
|
||||||
cashierCart.setCoverImg(product.getCoverImg());
|
cashierCart.setCoverImg(product.getCoverImg());
|
||||||
cashierCart.setName(product.getName());
|
cashierCart.setName(product.getName());
|
||||||
cashierCart.setCategoryId(product.getCategoryId());
|
cashierCart.setCategoryId(product.getCategoryId());
|
||||||
@@ -508,7 +526,6 @@ public class CartService {
|
|||||||
cashierCart.setSalePrice(productSku.getSalePrice());
|
cashierCart.setSalePrice(productSku.getSalePrice());
|
||||||
cashierCart.setCreatedAt(Instant.now().toEpochMilli());
|
cashierCart.setCreatedAt(Instant.now().toEpochMilli());
|
||||||
cashierCart.setUpdatedAt(Instant.now().toEpochMilli());
|
cashierCart.setUpdatedAt(Instant.now().toEpochMilli());
|
||||||
cashierCart.setTotalNumber(num);
|
|
||||||
cashierCart.setPackFee(BigDecimal.ZERO);
|
cashierCart.setPackFee(BigDecimal.ZERO);
|
||||||
cashierCart.setRefundNumber(0);
|
cashierCart.setRefundNumber(0);
|
||||||
cashierCart.setTotalAmount(new BigDecimal(cashierCart.getTotalNumber()).multiply(productSku.getSalePrice().add(cashierCart.getPackFee())));
|
cashierCart.setTotalAmount(new BigDecimal(cashierCart.getTotalNumber()).multiply(productSku.getSalePrice().add(cashierCart.getPackFee())));
|
||||||
@@ -570,10 +587,10 @@ public class CartService {
|
|||||||
try {
|
try {
|
||||||
if (tbProduct1.getIsStock() == 1) {
|
if (tbProduct1.getIsStock() == 1) {
|
||||||
productService.updateStock(tbProduct.getProductId(), tbProduct.getId(), cashierCart.getNumber(), tbProduct1.getIsDistribute() == 1);
|
productService.updateStock(tbProduct.getProductId(), tbProduct.getId(), cashierCart.getNumber(), tbProduct1.getIsDistribute() == 1);
|
||||||
}else {
|
} else {
|
||||||
productService.updateStockAndNoCheck(tbProduct.getProductId(), tbProduct.getId(), cashierCart.getNumber(), tbProduct1.getIsDistribute() == 1);
|
productService.updateStockAndNoCheck(tbProduct.getProductId(), tbProduct.getId(), cashierCart.getNumber(), tbProduct1.getIsDistribute() == 1);
|
||||||
}
|
}
|
||||||
}catch (Exception e) {
|
} catch (Exception e) {
|
||||||
JSONObject jsonObject1 = new JSONObject();
|
JSONObject jsonObject1 = new JSONObject();
|
||||||
jsonObject1.put("status", "fail");
|
jsonObject1.put("status", "fail");
|
||||||
jsonObject1.put("msg", "商品库存不足" + tbProduct1.getName());
|
jsonObject1.put("msg", "商品库存不足" + tbProduct1.getName());
|
||||||
@@ -583,9 +600,9 @@ public class CartService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 发送判断耗材是否耗尽消息
|
// 发送判断耗材是否耗尽消息
|
||||||
JSONObject objectMsg=new JSONObject();
|
JSONObject objectMsg = new JSONObject();
|
||||||
objectMsg.put("skuId",Integer.valueOf(cashierCart.getSkuId()));
|
objectMsg.put("skuId", Integer.valueOf(cashierCart.getSkuId()));
|
||||||
objectMsg.put("shopId",Integer.valueOf(cashierCart.getShopId()));
|
objectMsg.put("shopId", Integer.valueOf(cashierCart.getShopId()));
|
||||||
producer.con_msg(objectMsg.toString());
|
producer.con_msg(objectMsg.toString());
|
||||||
|
|
||||||
totalAmount = totalAmount.add(cashierCart.getTotalAmount());
|
totalAmount = totalAmount.add(cashierCart.getTotalAmount());
|
||||||
|
|||||||
@@ -248,18 +248,6 @@ public class OrderService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testMessage(String tableId, String message) throws IOException {
|
|
||||||
// AppWebSocketServer.AppSendInfo(message,tableId);
|
|
||||||
// redisUtil.seckill(tableId,message);
|
|
||||||
// AppWebSocketServer.onClosed(tableId);
|
|
||||||
List<TbProductSku> list = productSkuMapper.selectAll();
|
|
||||||
for (TbProductSku productSku : list) {
|
|
||||||
// productSku.setStockNumber(200.00);
|
|
||||||
redisUtil.saveMessage("PRODUCT:" + productSku.getShopId() + ":" + productSku.getId(), "10000");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Result tradeIntegral(String userId, String id) throws ParseException {
|
public Result tradeIntegral(String userId, String id) throws ParseException {
|
||||||
updateIntegral(userId, id);
|
updateIntegral(userId, id);
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
<result column="meal_price" jdbcType="DECIMAL" property="mealPrice" />
|
<result column="meal_price" jdbcType="DECIMAL" property="mealPrice" />
|
||||||
<result column="sale_price" jdbcType="DECIMAL" property="salePrice" />
|
<result column="sale_price" jdbcType="DECIMAL" property="salePrice" />
|
||||||
<result column="guide_price" jdbcType="DECIMAL" property="guidePrice" />
|
<result column="guide_price" jdbcType="DECIMAL" property="guidePrice" />
|
||||||
|
<result column="suit" jdbcType="INTEGER" property="suit" />
|
||||||
<result column="strategy_price" jdbcType="DECIMAL" property="strategyPrice" />
|
<result column="strategy_price" jdbcType="DECIMAL" property="strategyPrice" />
|
||||||
<result column="stock_number" jdbcType="DOUBLE" property="stockNumber" />
|
<result column="stock_number" jdbcType="DOUBLE" property="stockNumber" />
|
||||||
<result column="cover_img" jdbcType="VARCHAR" property="coverImg" />
|
<result column="cover_img" jdbcType="VARCHAR" property="coverImg" />
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
<result column="created_at" jdbcType="BIGINT" property="createdAt" />
|
<result column="created_at" jdbcType="BIGINT" property="createdAt" />
|
||||||
<result column="updated_at" jdbcType="BIGINT" property="updatedAt" />
|
<result column="updated_at" jdbcType="BIGINT" property="updatedAt" />
|
||||||
<result column="is_pause_sale" jdbcType="INTEGER" property="isPauseSale" />
|
<result column="is_pause_sale" jdbcType="INTEGER" property="isPauseSale" />
|
||||||
|
<result column="is_del" jdbcType="INTEGER" property="isDel" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.chaozhanggui.system.cashierservice.entity.TbProductSkuWithBLOBs">
|
<resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.chaozhanggui.system.cashierservice.entity.TbProductSkuWithBLOBs">
|
||||||
<result column="spec_info" jdbcType="LONGVARCHAR" property="specInfo" />
|
<result column="spec_info" jdbcType="LONGVARCHAR" property="specInfo" />
|
||||||
@@ -31,8 +33,8 @@
|
|||||||
</resultMap>
|
</resultMap>
|
||||||
<sql id="Base_Column_List">
|
<sql id="Base_Column_List">
|
||||||
id, shop_id, bar_code, product_id, origin_price, cost_price, member_price, meal_price,
|
id, shop_id, bar_code, product_id, origin_price, cost_price, member_price, meal_price,
|
||||||
sale_price, guide_price, strategy_price, stock_number, cover_img, warn_line, weight,
|
sale_price, guide_price,suit, strategy_price, stock_number, cover_img, warn_line, weight,
|
||||||
volume, real_sales_number, first_shared, second_shared, created_at, updated_at, is_pause_sale
|
volume, real_sales_number, first_shared, second_shared, created_at, updated_at, is_pause_sale ,is_del
|
||||||
</sql>
|
</sql>
|
||||||
<sql id="Blob_Column_List">
|
<sql id="Blob_Column_List">
|
||||||
spec_info, spec_snap
|
spec_info, spec_snap
|
||||||
@@ -359,7 +361,7 @@
|
|||||||
</update>
|
</update>
|
||||||
|
|
||||||
<select id="selectByShopIdAndProductIdAndSpec" resultMap="ResultMapWithBLOBs">
|
<select id="selectByShopIdAndProductIdAndSpec" resultMap="ResultMapWithBLOBs">
|
||||||
select * from tb_product_sku where shop_id=#{shopId} and product_id=#{productId}
|
select * from tb_product_sku where shop_id=#{shopId} and product_id=#{productId} and is_del = 0
|
||||||
|
|
||||||
<if test="spec != null and spec !=''">
|
<if test="spec != null and spec !=''">
|
||||||
and spec_snap = #{spec}
|
and spec_snap = #{spec}
|
||||||
|
|||||||
Reference in New Issue
Block a user