diff --git a/microservices/jd-api/src/main/java/cn/qihangerp/api/jd/controller/JdGoodsController.java b/microservices/jd-api/src/main/java/cn/qihangerp/api/jd/controller/JdGoodsController.java index 551ce5d3..fe9f93f6 100644 --- a/microservices/jd-api/src/main/java/cn/qihangerp/api/jd/controller/JdGoodsController.java +++ b/microservices/jd-api/src/main/java/cn/qihangerp/api/jd/controller/JdGoodsController.java @@ -16,6 +16,9 @@ import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; +import java.util.Map; + @RequestMapping("/jd/goods") @RestController @AllArgsConstructor @@ -60,4 +63,30 @@ public class JdGoodsController extends BaseController { else return AjaxResult.error(resultVo.getMsg()); } + /** + * 推送商品到OMS + * @param ids + * @return + */ + @PostMapping("/push_oms") + @ResponseBody + public AjaxResult pushOms(@RequestBody String[] ids) { + if (ids == null || ids.length == 0) return AjaxResult.error("缺少参数"); + int success = 0; + int isExist = 0; + int fail = 0; + for (String id : ids) { + ResultVo resultVo = goodsService.pushToOms(Long.parseLong(id)); + if(resultVo.getCode()==0) success++; + else if(resultVo.getCode()==ResultVoEnum.DataExist.getIndex()) isExist++; + else fail++; + } + Map map = new HashMap<>(); + map.put("success", success); + map.put("isExist", isExist); + map.put("fail", fail); + map.put("total", success + isExist+fail); + return success(map); + } + } diff --git a/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/JdGoodsService.java b/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/JdGoodsService.java index 677d2111..1696fa7a 100644 --- a/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/JdGoodsService.java +++ b/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/JdGoodsService.java @@ -19,4 +19,5 @@ public interface JdGoodsService extends IService { PageResult queryPageList(JdGoodsBo bo, PageQuery pageQuery); ResultVo saveGoods(Long shopId, JdGoods goods); ResultVo saveGoodsSku(Long shopId, JdGoodsSku goodsSku); + ResultVo pushToOms(Long taoGoodsId); } diff --git a/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/impl/JdGoodsServiceImpl.java b/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/impl/JdGoodsServiceImpl.java index 2b36cf03..cb889fc0 100644 --- a/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/impl/JdGoodsServiceImpl.java +++ b/module/jd/src/main/java/cn/qihangerp/module/open/jd/service/impl/JdGoodsServiceImpl.java @@ -1,8 +1,15 @@ package cn.qihangerp.module.open.jd.service.impl; +import cn.qihangerp.common.ResultVoEnum; +import cn.qihangerp.module.goods.domain.OGoods; +import cn.qihangerp.module.goods.domain.OGoodsInventory; import cn.qihangerp.module.goods.domain.OGoodsSku; +import cn.qihangerp.module.goods.mapper.OGoodsInventoryMapper; +import cn.qihangerp.module.goods.mapper.OGoodsMapper; import cn.qihangerp.module.goods.mapper.OGoodsSkuMapper; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -22,7 +29,12 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @author qilip @@ -36,6 +48,8 @@ public class JdGoodsServiceImpl extends ServiceImpl private final JdGoodsMapper mapper; private final JdGoodsSkuMapper skuMapper; private final OGoodsSkuMapper goodsSkuMapper; + private final OGoodsMapper goodsMapper; + private final OGoodsInventoryMapper inventoryMapper; @Override public PageResult queryPageList(JdGoodsBo bo, PageQuery pageQuery) { @@ -118,6 +132,195 @@ public class JdGoodsServiceImpl extends ServiceImpl } return ResultVo.success(); } + + @Transactional(rollbackFor = Exception.class) + @Override + public ResultVo pushToOms(Long taoGoodsId) { + JdGoods shopGoods = mapper.selectById(taoGoodsId); + if(shopGoods==null) return ResultVo.error("店铺商品数据不存在"); + + List shopGoodsSkus = skuMapper.selectList(new LambdaQueryWrapper().eq(JdGoodsSku::getWareId, shopGoods.getWareId())); + if(shopGoodsSkus==null || shopGoodsSkus.isEmpty()) return ResultVo.error("店铺商品Sku数据不存在"); + + String goodsNum =""; + if(org.springframework.util.StringUtils.hasText(shopGoods.getItemNum())){ + goodsNum = shopGoods.getItemNum(); + // 用商家编码查询 + List erpGoodsList = goodsMapper.selectList(new LambdaQueryWrapper() + .eq(OGoods::getGoodsNum, goodsNum)); + if(erpGoodsList!=null && !erpGoodsList.isEmpty()){ + // 存在=======关联 + //更新shopGoods + JdGoods shopGoodsUpdate = new JdGoods(); + shopGoodsUpdate.setId(shopGoods.getId()); + shopGoodsUpdate.setLogo(erpGoodsList.get(0).getImage()); + shopGoodsUpdate.setErpGoodsId(erpGoodsList.get(0).getId()); + mapper.updateById(shopGoodsUpdate); + + List oGoodsSkus = goodsSkuMapper.selectList(new LambdaQueryWrapper() + .eq(OGoodsSku::getGoodsId, erpGoodsList.get(0).getId()) + ); + //更新skus + for (var sku:shopGoodsSkus){ + if(org.springframework.util.StringUtils.hasText(sku.getOuterId())){ + List oGoodsSkuList = oGoodsSkus.stream().filter(x -> x.getSkuCode().equals(sku.getOuterId())).collect(Collectors.toList()); + if(oGoodsSkuList!=null && !oGoodsSkuList.isEmpty()){ + //更新ShopGoodsSku + JdGoodsSku shopGoodsSkuUpdate = new JdGoodsSku(); + shopGoodsSkuUpdate.setId(sku.getId()); + shopGoodsSkuUpdate.setErpGoodsId(oGoodsSkuList.get(0).getGoodsId()); + shopGoodsSkuUpdate.setErpGoodsSkuId(oGoodsSkuList.get(0).getId()); + shopGoodsSkuUpdate.setLogo(oGoodsSkuList.get(0).getColorImage()); + skuMapper.updateById(shopGoodsSkuUpdate); + } + } + } + + return ResultVo.success("商品已存在,更新关联"); + } + + }else { + goodsNum = shopGoods.getWareId().toString(); + // 用商品ID查询 + List erpGoodsList = goodsMapper.selectList(new LambdaQueryWrapper() + .eq(OGoods::getGoodsNum, goodsNum)); + if(erpGoodsList!=null && !erpGoodsList.isEmpty()){ + return ResultVo.error(ResultVoEnum.DataExist.getIndex(),"商品已存在"); + } + } + + + // 添加商品 + OGoods erpGoods = new OGoods(); + erpGoods.setName(shopGoods.getTitle()); + erpGoods.setImage(shopGoods.getLogo()); + erpGoods.setGoodsNum(goodsNum); + erpGoods.setCategoryId(0L); + erpGoods.setRemark("JD店铺商品同步"); + erpGoods.setStatus(1); + erpGoods.setDisable(1); + if (shopGoods.getJdPrice() != null) { + erpGoods.setRetailPrice(shopGoods.getJdPrice()); + } + erpGoods.setCreateBy("JD店铺商品同步"); + erpGoods.setCreateTime(new Date()); + goodsMapper.insert(erpGoods); + + //更新shopGoods + JdGoods shopGoodsUpdate = new JdGoods(); + shopGoodsUpdate.setId(shopGoods.getId()); + shopGoodsUpdate.setErpGoodsId(erpGoods.getId()); + mapper.updateById(shopGoodsUpdate); + + // 添加商品SKU + for (var sku:shopGoodsSkus){ + OGoodsSku erpGoodsSku = new OGoodsSku(); + erpGoodsSku.setGoodsId(erpGoods.getId()); + erpGoodsSku.setGoodsName(erpGoods.getName()); + erpGoodsSku.setGoodsNum(erpGoods.getGoodsNum()); + //122216927:77835123:家具结构:框架结构;1627207:25326567650:颜色分类:奶油白【进口荔枝纹头层牛皮+碳素钢木排骨架】;21433:50753444:尺寸:1500mm*2000mm + // 组合规格 + String colorLabel=""; + String colorValue=""; + String sizeLabel=""; + String sizeValue=""; + String styleLabel=""; + String styleValue=""; + //组合属性 + if(org.springframework.util.StringUtils.hasText(sku.getSaleAttrs())) { + // 解析 JSON 字符串 + JSONArray jsonArray = JSONArray.parseArray(sku.getSaleAttrs()); + // 提取 attrValueAlias + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject item = jsonArray.getJSONObject(i); + JSONArray attrValueAlias = item.getJSONArray("attrValueAlias"); + String val=""; + try { + JSONArray jarr =JSONArray.parseArray(attrValueAlias.getString(0)); + for (int j = 0; j < jarr.size(); j++) { + val += jarr.getJSONObject(j).getString("value"); + if(jarr.getJSONObject(j).containsKey("unit")){ + val+= jarr.getJSONObject(j).getString("unit"); + } + } + }catch (Exception e){ + val = attrValueAlias.getString(0); + } + if (item.getInteger("index") == 1) { + colorLabel = "颜色分类"; + colorValue = val; + } else if (item.getInteger("index") == 2) { + sizeLabel = "尺寸"; + sizeValue =val; + }else if (item.getInteger("index") == 3) { + styleLabel = "款式"; + styleValue = val; + } + } + }else{ + colorValue="默认"; + colorLabel="颜色分类"; + } + + erpGoodsSku.setColorId(0L); + erpGoodsSku.setColorLabel(colorLabel); + erpGoodsSku.setColorValue(colorValue); + erpGoodsSku.setSizeId(0L); + erpGoodsSku.setSizeLabel(sizeLabel); + erpGoodsSku.setSizeValue(sizeValue); + erpGoodsSku.setStyleId(0L); + erpGoodsSku.setStyleLabel(styleLabel); + erpGoodsSku.setStyleValue(styleValue); + String skuName=""; + if(org.springframework.util.StringUtils.hasText(colorValue)){ + skuName += colorValue+" "; + } + if(org.springframework.util.StringUtils.hasText(sizeValue)){ + skuName += sizeValue+" "; + } + if(org.springframework.util.StringUtils.hasText(styleValue)){ + skuName += styleValue+" "; + } + if(!org.springframework.util.StringUtils.hasText(skuName)){ + skuName = "默认"; + } + erpGoodsSku.setSkuName(skuName); + erpGoodsSku.setSkuCode(sku.getOuterId()); + erpGoodsSku.setColorImage(erpGoods.getImage()); + + if(sku.getJdPrice()!=null){ + erpGoodsSku.setRetailPrice(sku.getJdPrice()); + } + erpGoodsSku.setStatus(1); + goodsSkuMapper.insert(erpGoodsSku); + + // 初始化商品库存 + OGoodsInventory inventory = new OGoodsInventory(); + + inventory.setGoodsId(erpGoods.getId()); + inventory.setGoodsNum(erpGoods.getGoodsNum()); + inventory.setGoodsName(erpGoods.getName()); + inventory.setGoodsImg(erpGoods.getImage()); + inventory.setSkuId(erpGoodsSku.getId()); + inventory.setSkuCode(erpGoodsSku.getSkuCode()); + inventory.setSkuName(erpGoodsSku.getSkuName()); + inventory.setQuantity(0L); + inventory.setIsDelete(0); + inventory.setCreateTime(new Date()); + inventory.setCreateBy("同步店铺商品初始化商品 sku 库存"); + inventoryMapper.insert(inventory); + + //更新ShopGoodsSku + JdGoodsSku shopGoodsSkuUpdate = new JdGoodsSku(); + shopGoodsSkuUpdate.setId(sku.getId()); + shopGoodsSkuUpdate.setErpGoodsId(erpGoods.getId()); + shopGoodsSkuUpdate.setErpGoodsSkuId(erpGoodsSku.getId()); + skuMapper.updateById(shopGoodsSkuUpdate); + + } + + return ResultVo.success(); + } } diff --git a/module/tao/src/main/java/cn/qihangerp/module/open/tao/service/impl/TaoGoodsServiceImpl.java b/module/tao/src/main/java/cn/qihangerp/module/open/tao/service/impl/TaoGoodsServiceImpl.java index a764bbae..bde1595b 100644 --- a/module/tao/src/main/java/cn/qihangerp/module/open/tao/service/impl/TaoGoodsServiceImpl.java +++ b/module/tao/src/main/java/cn/qihangerp/module/open/tao/service/impl/TaoGoodsServiceImpl.java @@ -134,16 +134,44 @@ public class TaoGoodsServiceImpl extends ServiceImpl String goodsNum =""; if(org.springframework.util.StringUtils.hasText(shopGoods.getOuterId())){ goodsNum = shopGoods.getOuterId(); + // 用商家编码查询 + List erpGoodsList = goodsMapper.selectList(new LambdaQueryWrapper() + .eq(OGoods::getGoodsNum, goodsNum)); + if(erpGoodsList!=null && !erpGoodsList.isEmpty()){ + // 存在=======关联 + //更新shopGoods + TaoGoods shopGoodsUpdate = new TaoGoods(); + shopGoodsUpdate.setId(shopGoods.getId()); + shopGoodsUpdate.setErpGoodsId(erpGoodsList.get(0).getId()); + mapper.updateById(shopGoodsUpdate); + + + List oGoodsSkus = goodsSkuMapper.selectList(new LambdaQueryWrapper() + .eq(OGoodsSku::getGoodsId, erpGoodsList.get(0).getId()) + ); + //更新skus + for (var sku:shopGoodsSkus){ + //更新ShopGoodsSku + TaoGoodsSku shopGoodsSkuUpdate = new TaoGoodsSku(); + shopGoodsSkuUpdate.setId(sku.getId()); + shopGoodsSkuUpdate.setErpGoodsId(oGoodsSkus.get(0).getGoodsId()); + shopGoodsSkuUpdate.setErpGoodsSkuId(oGoodsSkus.get(0).getId()); + skuMapper.updateById(shopGoodsSkuUpdate); + } + return ResultVo.success("商家编码已存在!更新成功"); + } + }else { goodsNum = shopGoods.getNumIid().toString(); + // 用商品ID查询 + List erpGoodsList = goodsMapper.selectList(new LambdaQueryWrapper() + .eq(OGoods::getGoodsNum, goodsNum)); + if(erpGoodsList!=null && !erpGoodsList.isEmpty()){ + return ResultVo.error(ResultVoEnum.DataExist.getIndex(),"商家编码已存在"); + } } - // 用商家编码查询 - List erpGoodsList = goodsMapper.selectList(new LambdaQueryWrapper() - .eq(OGoods::getGoodsNum, goodsNum)); - if(erpGoodsList!=null && !erpGoodsList.isEmpty()){ - return ResultVo.error(ResultVoEnum.DataExist.getIndex(),"商家编码已存在"); - } + // 添加商品 OGoods erpGoods = new OGoods(); @@ -152,13 +180,13 @@ public class TaoGoodsServiceImpl extends ServiceImpl erpGoods.setImage(shopGoods.getPicUrl()); erpGoods.setGoodsNum(goodsNum); erpGoods.setCategoryId(0L); - erpGoods.setRemark("店铺商品同步"); + erpGoods.setRemark("TAO店铺商品同步"); erpGoods.setStatus(1); erpGoods.setDisable(1); if (StringUtils.isNotEmpty(shopGoods.getPrice() )) { erpGoods.setRetailPrice(new BigDecimal(shopGoods.getPrice())); } - erpGoods.setCreateBy("店铺商品同步"); + erpGoods.setCreateBy("TAO店铺商品同步"); erpGoods.setCreateTime(new Date()); goodsMapper.insert(erpGoods); @@ -258,7 +286,7 @@ public class TaoGoodsServiceImpl extends ServiceImpl inventory.setQuantity(0L); inventory.setIsDelete(0); inventory.setCreateTime(new Date()); - inventory.setCreateBy("同步店铺商品初始化商品 sku 库存"); + inventory.setCreateBy("同步TAO店铺商品初始化商品 sku 库存"); inventoryMapper.insert(inventory); //更新ShopGoodsSku diff --git a/vue/src/api/jd/goods.js b/vue/src/api/jd/goods.js index 6181cfd0..c7b8c4ed 100644 --- a/vue/src/api/jd/goods.js +++ b/vue/src/api/jd/goods.js @@ -36,7 +36,7 @@ export function linkErpGoodsSkuId(data) { }) } -// 接口拉取淘宝商品 +// 接口拉取商品 export function pullGoodsList(data) { return request({ url: '/api/open-api/jd/goods/pull_goods', @@ -44,3 +44,11 @@ export function pullGoodsList(data) { data: data }) } +//推送商品到商品库 +export function pushToOms(data) { + return request({ + url: '/api/open-api/jd/goods/push_oms', + method: 'post', + data: data + }) +} diff --git a/vue/src/views/jd/goods/goods_list.vue b/vue/src/views/jd/goods/goods_list.vue index 8c1589ba..cf497ca9 100644 --- a/vue/src/views/jd/goods/goods_list.vue +++ b/vue/src/views/jd/goods/goods_list.vue @@ -96,6 +96,7 @@ + @@ -175,12 +176,13 @@ import Treeselect from '@riophae/vue-treeselect' import '@riophae/vue-treeselect/dist/vue-treeselect.css' import {getToken} from "@/utils/auth"; -import {listGoods,getGoodsSku,linkErpGoodsSkuId,pullGoodsList} from "@/api/jd/goods"; +import {listGoods,getGoodsSku,linkErpGoodsSkuId,pullGoodsList,pushToOms} from "@/api/jd/goods"; import {listShop} from "@/api/shop/shop"; import {MessageBox} from "element-ui"; import {isRelogin} from "@/utils/request"; import {amountFormatter} from "@/utils/zhijian"; + export default { name: "GoodsListJd", components: { Treeselect }, @@ -339,6 +341,21 @@ export default { // this.$modal.msgSuccess("请先配置API"); }, + handlePushOms(){ + this.$confirm('确认同步所有商品到商品库吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + this.loading = true + pushToOms( this.ids ).then(response => { + this.$message.success('商品同步成功') + this.getList() + }).finally(() => { + this.loading = false + }) + }) + }, } }; diff --git a/vue/src/views/tao/goods/goods_list.vue b/vue/src/views/tao/goods/goods_list.vue index a1f49b52..99e58ea1 100644 --- a/vue/src/views/tao/goods/goods_list.vue +++ b/vue/src/views/tao/goods/goods_list.vue @@ -89,6 +89,8 @@ + +