记得上下班打卡 | git大法好,push需谨慎

Commit 7f2a0922 authored by 胡佳晨's avatar 胡佳晨

提交 erp 同步库存接口

parent 22cec264
package com.liquidnet.service.goblin.service;
import com.liquidnet.service.base.ResponseDto;
public interface IGoblinErpService {
public ResponseDto<Boolean> initErpStock(String spuId,int min);
}
package com.liquidnet.service.erp.utils;
import com.liquidnet.service.erp.vo.SyncStockVo;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @class: ObjectUtil
* @Package com.liquidnet.service.dragon.utils
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/21 16:00
*/
@Component
public class ObjectUtil {
private static final HashMap<String, SyncStockVo> syncStockVo = new HashMap<String, SyncStockVo>();
private static final ArrayList<SyncStockVo> syncStockVoList = new ArrayList();
public static HashMap<String, SyncStockVo> syncStockVo() {
return (HashMap<String, SyncStockVo>) syncStockVo.clone();
}
public static ArrayList<SyncStockVo> syncStockVoList() {
return (ArrayList<SyncStockVo>) syncStockVoList.clone();
}
}
package com.liquidnet.service.erp.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 同步库存用 vo 和 erp无关,关联业务
*/
@Data
public class SyncStockVo implements Serializable, Cloneable {
// erp sku编码
private String specNo;
// erp sku库存
private BigDecimal stockErpNum;
// 自研商城 sku库存
private BigDecimal stockNum;
// erp sku所属仓库编码
private String warehouseNo;
private static final SyncStockVo obj = new SyncStockVo();
public static SyncStockVo getNew() {
try {
return (SyncStockVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new SyncStockVo();
}
}
}
package com.liquidnet.service.feign.platform.task;
import com.liquidnet.service.base.ResponseDto;
import feign.hystrix.FallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(
name = "liquidnet-service-platform",
contextId = "FeignPlatformErpTaskClient",
path = "platform",
url = "${liquidnet.service.platform.url}",
fallback = FallbackFactory.Default.class
)
public interface FeignPlatformErpTaskClient {
@PostMapping("wdt/syncErpSpuStock")
ResponseDto<Boolean> syncErpSpuStock(@RequestParam("spuId") String spuId,@RequestParam("min") Integer min);
}
package com.liquidnet.service.executor.main.handler;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DESUtils;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.service.feign.platform.task.FeignPlatformErpTaskClient;
import com.liquidnet.service.feign.platform.task.FeignPlatformGoblinTaskClient;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
/**
* platform:goblin
*/
@Component
public class PlatformErpTaskHandler {
@Autowired
private FeignPlatformErpTaskClient feignPlatformErpTaskClient;
@XxlJob(value = "sev-platform:syncErpSpuStock")
public void syncErpSpuStock() {
try {
XxlJobHelper.handleSuccess("结果:" + feignPlatformErpTaskClient.syncErpSpuStock("",Integer.parseInt(XxlJobHelper.getJobParam())).getData());
} catch (Exception e) {
XxlJobHelper.log(e);
XxlJobHelper.handleFail();
}
}
}
package com.liquidnet.service.platform.controller.erp; package com.liquidnet.service.platform.controller.erp;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.service.IGoblinErpService;
import io.swagger.annotations.*; import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -11,4 +14,19 @@ import org.springframework.web.bind.annotation.*; ...@@ -11,4 +14,19 @@ import org.springframework.web.bind.annotation.*;
@Validated @Validated
public class WdtController { public class WdtController {
@Autowired
IGoblinErpService goblinErpService;
@PostMapping("syncErpSpuStock")
@ApiOperation("同步库存")
@ApiResponse(code = 200, message = "接口返回对象参数")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "spuId", value = "spuId"),
@ApiImplicitParam(type = "form", required = true, dataType = "Integer", name = "min", value = "间隔时间"),
})
public ResponseDto<Boolean> initErpStock(@RequestParam("spuId") String spuId,
@RequestParam("min") Integer min) {
return goblinErpService.initErpStock(spuId,min);
}
} }
package com.liquidnet.service.platform.service.impl.erp; package com.liquidnet.service.platform.service.impl.erp;
import com.liquidnet.service.platform.service.erp.IWdtService; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.candy.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.erp.config.ErpWdtClient;
import com.liquidnet.service.erp.constant.ErpEnum;
import com.liquidnet.service.erp.utils.ObjectUtil;
import com.liquidnet.service.erp.vo.StockQueryBaseVo;
import com.liquidnet.service.erp.vo.StockQueryVo;
import com.liquidnet.service.erp.vo.SyncStockVo;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsInfoVo;
import com.liquidnet.service.goblin.dto.vo.GoblinGoodsSkuInfoVo;
import com.liquidnet.service.goblin.entity.GoblinGoodsSku;
import com.liquidnet.service.goblin.mapper.GoblinGoodsSkuMapper;
import com.liquidnet.service.goblin.service.IGoblinErpService;
import com.liquidnet.service.platform.utils.GoblinRedisUtils;
import com.liquidnet.service.platform.utils.QueueUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
* 支付订单表 服务实现类 * 支付订单表 服务实现类
...@@ -12,6 +42,102 @@ import org.springframework.stereotype.Service; ...@@ -12,6 +42,102 @@ import org.springframework.stereotype.Service;
* @since 2021-07-20 * @since 2021-07-20
*/ */
@Service @Service
public class WdtServiceImpl implements IWdtService { @Slf4j
public class WdtServiceImpl implements IGoblinErpService {
@Autowired
ErpWdtClient erpWdtClient;
@Autowired
GoblinGoodsSkuMapper goblinGoodsSkuMapper;
@Autowired
GoblinRedisUtils goblinRedisUtils;
@Autowired
MongoTemplate mongoTemplate;
@Autowired
QueueUtils queueUtils;
@Override
public ResponseDto<Boolean> initErpStock(String spuId, int min) {
try {
Date nowTime = DateUtil.now();
String json;
Map<String, String> param = CollectionUtil.linkMapStringString();
param.put("start_time", DateUtil.format(DateUtil.addMin(nowTime, -min), DateUtil.Formatter.yyyyMMddHHmmss));
param.put("end_time", DateUtil.format(nowTime, DateUtil.Formatter.yyyyMMddHHmmss));
if (null != spuId && !"".equals(spuId)) {
//查询 spu下的sku
GoblinGoodsInfoVo goblinGoodsInfoVo = goblinRedisUtils.getGoodsInfoVo(spuId);
for (String skuId : goblinGoodsInfoVo.getSkuIdList()) {
GoblinGoodsSkuInfoVo skuInfoVo = goblinRedisUtils.getGoodsSkuInfoVo(skuId);
if (skuInfoVo.getErpHosting() == 1) {
param.put("warehouse_no", skuInfoVo.getErpWarehouseNo());
param.put("spec_no", skuInfoVo.getSkuErpCode());
json = erpWdtClient.execute(ErpEnum.WdtAPI.STOCK_QUERY.getUri(), param);
ArrayList<SyncStockVo> list = baseStock(json);
syncStock(list);
}
}
} else {
int pageSize = 40;
int allCount = (int) mongoTemplate.count(Query.query(Criteria.where("erpHosting").is(1)), GoblinGoodsSkuInfoVo.class, GoblinGoodsSkuInfoVo.class.getSimpleName());//总条数
int pageCount = (allCount / pageSize) + 1;
param.put("page_size", pageSize + "");
for (int i = 0; i < pageCount; i++) {
param.put("page_no", i + "");
json = erpWdtClient.execute(ErpEnum.WdtAPI.STOCK_QUERY.getUri(), param);
ArrayList<SyncStockVo> list = baseStock(json);
syncStock(list);
}
}
} catch (Exception e) {
log.error("调用接口失败 spuId:{},min:{}", spuId, min);
return ResponseDto.failure();
}
return ResponseDto.success();
}
private ArrayList<SyncStockVo> baseStock(String json) {
ArrayList<SyncStockVo> stockMap = ObjectUtil.syncStockVoList();
try {
StockQueryBaseVo data = JsonUtils.fromJson(json, StockQueryBaseVo.class);
List<StockQueryVo> stockQueryVos = data.getStocks();
for (StockQueryVo stockQueryVo : stockQueryVos) {
try {
BigDecimal avaliableNum = stockQueryVo.getAvaliable_num();//可发库存
SyncStockVo vo = SyncStockVo.getNew();
vo.setSpecNo(stockQueryVo.getSpec_no());
vo.setStockErpNum(avaliableNum);
vo.setWarehouseNo(stockQueryVo.getWarehouse_no());
stockMap.add(vo);
} catch (Exception e) {
log.error("解析erp数据失败 内层:{}", stockQueryVo);
}
}
} catch (Exception e) {
log.error("解析erp数据失败 外层:{}", json);
}
return stockMap;
}
//同步库存
private boolean syncStock(ArrayList<SyncStockVo> stockMap) {
for (SyncStockVo vo : stockMap) {
String skuId = "";
try {
GoblinGoodsSkuInfoVo skuInfoVo = mongoTemplate.findOne(Query.query(Criteria.where("skuErpCode").is(vo.getSpecNo()).and("erpWarehouseNo").is(vo.getWarehouseNo())), GoblinGoodsSkuInfoVo.class, GoblinGoodsSkuInfoVo.class.getSimpleName());
int changeStock = vo.getStockNum().subtract(BigDecimal.valueOf(skuInfoVo.getSkuStock())).intValue();
skuId = skuInfoVo.getSkuId();
//sql 当前库存 增加changeStock
queueUtils.sendMsgByGoblinRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey(),
SqlMapping.get("goblin_sku.stock", vo.getStockNum().intValue(), LocalDateTime.now(), vo.getSpecNo(), vo.getWarehouseNo()));
//redis incr 增加changeStock
goblinRedisUtils.incrSkuStock(null, skuId, changeStock);
} catch (Exception e) {
log.error("同步库存失败 skuId:{},erpSpecNo:{},warehouseNo:{}", skuId, vo.getSpecNo(), vo.getWarehouseNo());
}
}
return true;
}
} }
...@@ -40,6 +40,7 @@ public class GoblinRedisUtils { ...@@ -40,6 +40,7 @@ public class GoblinRedisUtils {
public void del(String... keys) { public void del(String... keys) {
getRedis().del(keys); getRedis().del(keys);
} }
public boolean set(String key, Object val) { public boolean set(String key, Object val) {
return getRedis().set(key, val); return getRedis().set(key, val);
} }
...@@ -65,6 +66,7 @@ public class GoblinRedisUtils { ...@@ -65,6 +66,7 @@ public class GoblinRedisUtils {
return (GoblinOrderSkuVo) obj; return (GoblinOrderSkuVo) obj;
} }
} }
//获取 spu销量 //获取 spu销量
public Integer getSpuSaleCount(String spuId) { public Integer getSpuSaleCount(String spuId) {
String redisKey = GoblinRedisConst.REDIS_GOBLIN_SALE_SPU_COUNT.concat(spuId); String redisKey = GoblinRedisConst.REDIS_GOBLIN_SALE_SPU_COUNT.concat(spuId);
...@@ -121,7 +123,7 @@ public class GoblinRedisUtils { ...@@ -121,7 +123,7 @@ public class GoblinRedisUtils {
// 减少库存 // 减少库存
public int decrSkuStock(String marketPre, String skuId, Integer stock){ public int decrSkuStock(String marketPre, String skuId, Integer stock) {
String rk = GoblinRedisConst.REAL_STOCK_SKU; String rk = GoblinRedisConst.REAL_STOCK_SKU;
if (marketPre != null && !marketPre.equals("null")) { if (marketPre != null && !marketPre.equals("null")) {
rk = rk.concat(marketPre + ":"); rk = rk.concat(marketPre + ":");
...@@ -202,6 +204,7 @@ public class GoblinRedisUtils { ...@@ -202,6 +204,7 @@ public class GoblinRedisUtils {
/** /**
* 添加code码 添加过期时间 * 添加code码 添加过期时间
*
* @param code * @param code
* @param goblinNftExCodeVo * @param goblinNftExCodeVo
* @param millisNum * @param millisNum
...@@ -209,7 +212,7 @@ public class GoblinRedisUtils { ...@@ -209,7 +212,7 @@ public class GoblinRedisUtils {
*/ */
public boolean addCode(String code, GoblinNftExCodeVo goblinNftExCodeVo, long millisNum) { public boolean addCode(String code, GoblinNftExCodeVo goblinNftExCodeVo, long millisNum) {
String key = GoblinRedisConst.ACTIVITY_SKU_CODE.concat(code); String key = GoblinRedisConst.ACTIVITY_SKU_CODE.concat(code);
return getRedis().set(key,goblinNftExCodeVo,millisNum); return getRedis().set(key, goblinNftExCodeVo, millisNum);
} }
/** /**
...@@ -235,7 +238,7 @@ public class GoblinRedisUtils { ...@@ -235,7 +238,7 @@ public class GoblinRedisUtils {
) {// 可以返回库存 ) {// 可以返回库存
String rk = GoblinRedisConst.REAL_STOCK_SKU.concat(info.getSkuId()); String rk = GoblinRedisConst.REAL_STOCK_SKU.concat(info.getSkuId());
return (int)getRedis().get(rk); return (int) getRedis().get(rk);
} else {// 不计入库存 } else {// 不计入库存
return 0; return 0;
} }
...@@ -243,6 +246,7 @@ public class GoblinRedisUtils { ...@@ -243,6 +246,7 @@ public class GoblinRedisUtils {
/** /**
* redis codes主动失效 * redis codes主动失效
*
* @param code * @param code
*/ */
public void removeCode(String code) { public void removeCode(String code) {
...@@ -252,31 +256,34 @@ public class GoblinRedisUtils { ...@@ -252,31 +256,34 @@ public class GoblinRedisUtils {
/** /**
* 获取sku时间 * 获取sku时间
*
* @param skuId * @param skuId
* @return * @return
*/ */
public GoblinNftExSkuVo getSkuTime(String skuId) { public GoblinNftExSkuVo getSkuTime(String skuId) {
String key = GoblinRedisConst.ACTIVITY_SKU_TIME.concat(skuId); String key = GoblinRedisConst.ACTIVITY_SKU_TIME.concat(skuId);
Object val = getRedis().get(key); Object val = getRedis().get(key);
if (!StringUtil.isEmpty(val)){ if (!StringUtil.isEmpty(val)) {
return (GoblinNftExSkuVo)val; return (GoblinNftExSkuVo) val;
} }
return null; return null;
} }
/** /**
* sku时间赋值 * sku时间赋值
*
* @param skuId * @param skuId
* @param obj * @param obj
* @return * @return
*/ */
public boolean addSkuTime(String skuId,GoblinNftExSkuVo goblinNftExSkuVo) { public boolean addSkuTime(String skuId, GoblinNftExSkuVo goblinNftExSkuVo) {
String key = GoblinRedisConst.ACTIVITY_SKU_TIME.concat(skuId); String key = GoblinRedisConst.ACTIVITY_SKU_TIME.concat(skuId);
return getRedis().set(key,goblinNftExSkuVo); return getRedis().set(key, goblinNftExSkuVo);
} }
/** /**
* 获取sku库存 * 获取sku库存
*
* @param skuId * @param skuId
* @return * @return
*/ */
...@@ -302,7 +309,87 @@ public class GoblinRedisUtils { ...@@ -302,7 +309,87 @@ public class GoblinRedisUtils {
} }
/**
* 商品基础信息
*
* @param spuId 商品ID
* @return GoblinGoodsInfoVo
*/
public GoblinGoodsInfoVo getGoodsInfoVo(String spuId) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(spuId);
if (pre != null && pre.equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
String[] spuSplitArr = spuId.split(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue());
String rk = GoblinRedisConst.BASIC_GOODS.concat(spuSplitArr[0]);
GoblinGoodsInfoVo vo = (GoblinGoodsInfoVo) getRedis().get(rk);
if (vo == null) {
return vo;
}
String marketrk = GoblinRedisConst.BASIC_GOODS.concat(spuId);
GoblinGoodsInfoVo marketVo = (GoblinGoodsInfoVo) getRedis().get(marketrk);
if (marketVo == null) {
return marketVo;
}
vo.setSpuId(marketVo.getSpuId());
List<String> skuIdList = CollectionUtil.linkedListString();
for (String skuIds : vo.getSkuIdList()) {
skuIdList.add(skuIds.concat(pre).concat(spuSplitArr[1]));
}
vo.setSkuIdList(skuIdList);
vo.setPriceGe(marketVo.getPriceGe());
vo.setPriceLe(marketVo.getPriceLe());
vo.setMarketId(marketVo.getMarketId());
vo.setDelFlg(marketVo.getDelFlg().equals("1") ? marketVo.getDelFlg() : vo.getDelFlg());
return vo;
} else {
String rk = GoblinRedisConst.BASIC_GOODS.concat(spuId);
GoblinGoodsInfoVo vo = (GoblinGoodsInfoVo) getRedis().get(rk);
if (null == vo) {
getRedis().set(rk, vo);
}
return vo;
}
}
/**
* 单品信息
*
* @param skuId 单品ID
* @return GoblinGoodsSkuInfoVo
*/
public GoblinGoodsSkuInfoVo getGoodsSkuInfoVo(String skuId) {
String pre = GoblinStatusConst.MarketPreStatus.getPre(skuId);
if (pre != null && pre.equals(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())) {
String rk = GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId.split(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue())[0]);
GoblinGoodsSkuInfoVo vo = (GoblinGoodsSkuInfoVo) getRedis().get(rk);
if (vo == null) {
return vo;
}
String marketrk = GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId);
GoblinGoodsSkuInfoVo marketVo = (GoblinGoodsSkuInfoVo) getRedis().get(marketrk);
if (marketVo == null) {
return marketVo;
}
vo.setSpuId(marketVo.getSpuId());
vo.setSkuId(marketVo.getSkuId());
vo.setPrice(marketVo.getPrice());
vo.setPriceMember(marketVo.getPriceMember());
vo.setSkuStock(marketVo.getSkuStock());
vo.setBuyLimit(marketVo.getBuyLimit());
vo.setBuyRoster(marketVo.getBuyRoster());
vo.setBuyFactor(marketVo.getBuyFactor());
// vo.setDelFlg("0");
vo.setDelFlg(marketVo.getDelFlg().equals("1") ? marketVo.getDelFlg() : vo.getDelFlg());
vo.setMarketId(marketVo.getMarketId());
vo.setCreatedAt(LocalDateTime.now());
return vo;
} else {
String rk = GoblinRedisConst.BASIC_GOODS_SKU.concat(skuId);
GoblinGoodsSkuInfoVo vo = (GoblinGoodsSkuInfoVo) getRedis().get(rk);
return vo;
}
}
/* ---------------------------------------- ---------------------------------------- */ /* ---------------------------------------- ---------------------------------------- */
/* ---------------------------------------- ---------------------------------------- */ /* ---------------------------------------- ---------------------------------------- */
......
...@@ -68,6 +68,7 @@ public class ObjectUtil { ...@@ -68,6 +68,7 @@ public class ObjectUtil {
private static final ArrayList<GoblinNftExCodeTask> goblinNftExCodeTaskArrayList = new ArrayList<>(); private static final ArrayList<GoblinNftExCodeTask> goblinNftExCodeTaskArrayList = new ArrayList<>();
private static final ArrayList<GoblinStoreMarketDto> goblinStoreMarketDtoArrayList = new ArrayList<>(); private static final ArrayList<GoblinStoreMarketDto> goblinStoreMarketDtoArrayList = new ArrayList<>();
private static final ArrayList<GoblinNftExCode> goblinNftExCodeArrayList = new ArrayList<>(); private static final ArrayList<GoblinNftExCode> goblinNftExCodeArrayList = new ArrayList<>();
private static final ArrayList<GoblinGoodsSkuInfoVo> goblinGoodsSkuInfoVo = new ArrayList<>();
private static final ArrayList<GoblinNftTransferOrder> goblinNftTransferOrders = new ArrayList<>(); private static final ArrayList<GoblinNftTransferOrder> goblinNftTransferOrders = new ArrayList<>();
private static final ArrayList<GoblinUserDigitalArtwork> goblinUserDigitalArtworks = new ArrayList<>(); private static final ArrayList<GoblinUserDigitalArtwork> goblinUserDigitalArtworks = new ArrayList<>();
...@@ -75,6 +76,10 @@ public class ObjectUtil { ...@@ -75,6 +76,10 @@ public class ObjectUtil {
return (ArrayList<SellDataOneVO>) sellDataOneVOArrayList.clone(); return (ArrayList<SellDataOneVO>) sellDataOneVOArrayList.clone();
} }
public static ArrayList<GoblinGoodsSkuInfoVo> goblinGoodsSkuInfoVo() {
return (ArrayList<GoblinGoodsSkuInfoVo>) goblinGoodsSkuInfoVo.clone();
}
public static ArrayList<AdamTagParentVo> getAdamTagParentVoArrayList() { public static ArrayList<AdamTagParentVo> getAdamTagParentVoArrayList() {
return (ArrayList<AdamTagParentVo>) adamTagParentVoArrayList.clone(); return (ArrayList<AdamTagParentVo>) adamTagParentVoArrayList.clone();
} }
......
...@@ -4,3 +4,4 @@ goblin_order.close.sku=UPDATE goblin_order_sku SET status = ? ,updated_at = ? WH ...@@ -4,3 +4,4 @@ goblin_order.close.sku=UPDATE goblin_order_sku SET status = ? ,updated_at = ? WH
# ------------------------????---------------------------- # ------------------------????----------------------------
kylin_camera_record.insert=INSERT INTO kylin_camera_record (camera_record_id, camera_id, person_num) VALUES (?,?,?) kylin_camera_record.insert=INSERT INTO kylin_camera_record (camera_record_id, camera_id, person_num) VALUES (?,?,?)
goblin_sku.stock=UPDATE goblin_goods_sku SET sku_stock = ? ,updated_at = ? WHERE sku_erp_code = ? and erp_warehouse_no = ?
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment