From 5e8c9614ef68cab5af56e8faedd7a831107e29e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=92?= Date: Mon, 18 Aug 2025 01:58:23 +0800 Subject: [PATCH] 1 --- .../common/OpenCallbackController.java | 86 + .../web/controller/erp/ProductController.java | 466 +++ .../web/controller/erp/RegionController.java | 36 + .../controller/jarvis/JDOrderController.java | 51 + .../web/service/SysLoginService.java | 21 +- .../java/com/ruoyi/erp/domain/Address.java | 24 + .../java/com/ruoyi/erp/domain/AdventData.java | 25 + .../ruoyi/erp/domain/AdventDataExpire.java | 16 + .../erp/domain/AdventDataProduction.java | 12 + .../java/com/ruoyi/erp/domain/AssumeRule.java | 22 + .../com/ruoyi/erp/domain/BeautyMakeup.java | 34 + .../java/com/ruoyi/erp/domain/BookData.java | 24 + .../java/com/ruoyi/erp/domain/BrandData.java | 24 + .../com/ruoyi/erp/domain/BrandDataExpire.java | 16 + .../ruoyi/erp/domain/BrandDataProduction.java | 12 + .../java/com/ruoyi/erp/domain/Channelpv.java | 31 + .../main/java/com/ruoyi/erp/domain/Curio.java | 44 + .../java/com/ruoyi/erp/domain/ERPShop.java | 126 + .../main/java/com/ruoyi/erp/domain/Empty.java | 18 + .../java/com/ruoyi/erp/domain/FluffyUnit.java | 20 + .../java/com/ruoyi/erp/domain/FoodData.java | 28 + .../com/ruoyi/erp/domain/FoodDataExpire.java | 16 + .../ruoyi/erp/domain/FoodDataProduction.java | 16 + .../main/java/com/ruoyi/erp/domain/Game.java | 28 + .../main/java/com/ruoyi/erp/domain/Image.java | 22 + .../java/com/ruoyi/erp/domain/Jewelry.java | 36 + .../com/ruoyi/erp/domain/PublishShop.java | 52 + .../java/com/ruoyi/erp/domain/PurpleUnit.java | 24 + .../java/com/ruoyi/erp/domain/Region.java | 22 + .../java/com/ruoyi/erp/domain/ReportData.java | 35 + .../java/com/ruoyi/erp/domain/ReportItem.java | 33 + .../java/com/ruoyi/erp/domain/SkuImage.java | 26 + .../java/com/ruoyi/erp/domain/SkuItems.java | 30 + .../main/java/com/ruoyi/erp/domain/The3C.java | 52 + .../java/com/ruoyi/erp/domain/TradeRule.java | 22 + .../java/com/ruoyi/erp/domain/UsedCar.java | 34 + .../java/com/ruoyi/erp/domain/Valuable.java | 32 + .../ruoyi/erp/domain/enums/FlashSaleType.java | 23 + .../ruoyi/erp/domain/enums/ItemBizType.java | 17 + .../erp/domain/enums/ServiceSupport.java | 14 + .../com/ruoyi/erp/domain/enums/SpBizType.java | 32 + .../ruoyi/erp/domain/enums/StuffStatus.java | 24 + .../com/ruoyi/erp/mapper/RegionMapper.java | 18 + .../request/AuthorizeListQueryRequest.java | 35 + .../com/ruoyi/erp/request/ERPAccount.java | 31 + .../com/ruoyi/erp/request/ERPRequestBase.java | 99 + .../request/ExpressCompaniesQueryRequest.java | 14 + .../java/com/ruoyi/erp/request/HttpTest.java | 106 + .../erp/request/OrderDetailQueryRequest.java | 23 + .../erp/request/OrderKamListQueryRequest.java | 23 + .../erp/request/OrderListQueryRequest.java | 35 + .../erp/request/OrderModifyPriceRequest.java | 22 + .../ruoyi/erp/request/OrderShipRequest.java | 31 + .../request/ProductBatchCreateRequest.java | 231 ++ .../ProductCategoryListQueryRequest.java | 59 + .../erp/request/ProductCreateRequest.java | 142 + .../erp/request/ProductDeleteRequest.java | 25 + .../request/ProductDetailQueryRequest.java | 33 + .../erp/request/ProductDownShelfRequest.java | 25 + .../ruoyi/erp/request/ProductEditRequest.java | 89 + .../erp/request/ProductEditStockRequest.java | 37 + .../erp/request/ProductListQueryRequest.java | 69 + .../ProductPropertyListQueryRequest.java | 66 + .../erp/request/ProductPublishRequest.java | 45 + .../request/ProductSkuListQueryRequest.java | 58 + .../com/ruoyi/erp/request/RequestDemo.java | 17 + .../com/ruoyi/erp/service/IRegionService.java | 11 + .../erp/service/impl/RegionServiceImpl.java | 52 + .../resources/mapper/erp/RegionMapper.xml | 36 + sql/商品异常状态码.sql | 89 + sql/闲管家省市区.sql | 3623 +++++++++++++++++ 71 files changed, 6864 insertions(+), 6 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/OpenCallbackController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/erp/ProductController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/erp/RegionController.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Address.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/AdventData.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/AdventDataExpire.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/AdventDataProduction.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/AssumeRule.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/BeautyMakeup.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/BookData.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/BrandData.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/BrandDataExpire.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/BrandDataProduction.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Channelpv.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Curio.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/ERPShop.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Empty.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/FluffyUnit.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/FoodData.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/FoodDataExpire.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/FoodDataProduction.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Game.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Image.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Jewelry.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/PublishShop.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/PurpleUnit.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Region.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/ReportData.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/ReportItem.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/SkuImage.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/SkuItems.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/The3C.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/TradeRule.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/UsedCar.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/Valuable.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/enums/FlashSaleType.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/enums/ItemBizType.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/enums/ServiceSupport.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/enums/SpBizType.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/domain/enums/StuffStatus.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/mapper/RegionMapper.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/AuthorizeListQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ERPAccount.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ERPRequestBase.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ExpressCompaniesQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/HttpTest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/OrderDetailQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/OrderKamListQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/OrderListQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/OrderModifyPriceRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/OrderShipRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductBatchCreateRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductCategoryListQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductCreateRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductDeleteRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductDetailQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductDownShelfRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductEditRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductEditStockRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductListQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductPropertyListQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductPublishRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/ProductSkuListQueryRequest.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/request/RequestDemo.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/service/IRegionService.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/erp/service/impl/RegionServiceImpl.java create mode 100644 ruoyi-system/src/main/resources/mapper/erp/RegionMapper.xml create mode 100644 sql/商品异常状态码.sql create mode 100644 sql/闲管家省市区.sql diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/OpenCallbackController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/OpenCallbackController.java new file mode 100644 index 0000000..56fc891 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/OpenCallbackController.java @@ -0,0 +1,86 @@ +package com.ruoyi.web.controller.common; + +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * 开放平台回调接收端 + * 注意:/product/receive 与 /order/receive 为示例路径,请在开放平台配置时使用你自己的正式回调地址 + */ +@RestController +@RequestMapping("/open/callback") +public class OpenCallbackController extends BaseController { + + @PostMapping("/product/receive") + public JSONObject receiveProductCallback( + @RequestParam("appid") String appid, + @RequestParam(value = "timestamp", required = false) Long timestamp, + @RequestParam("sign") String sign, + @RequestBody JSONObject body + ) { + if (!verifySign(appid, timestamp, sign, body)) { + JSONObject fail = new JSONObject(); + fail.put("result", "fail"); + fail.put("msg", "签名失败"); + return fail; + } + JSONObject ok = new JSONObject(); + ok.put("result", "success"); + ok.put("msg", "接收成功"); + return ok; + } + + @PostMapping("/order/receive") + public JSONObject receiveOrderCallback( + @RequestParam("appid") String appid, + @RequestParam(value = "timestamp", required = false) Long timestamp, + @RequestParam("sign") String sign, + @RequestBody JSONObject body + ) { + if (!verifySign(appid, timestamp, sign, body)) { + JSONObject fail = new JSONObject(); + fail.put("result", "fail"); + fail.put("msg", "签名失败"); + return fail; + } + JSONObject ok = new JSONObject(); + ok.put("result", "success"); + ok.put("msg", "接收成功"); + return ok; + } + + private boolean verifySign(String appid, Long timestamp, String sign, JSONObject body) { + // TODO: 这里需要根据appid查出对应的 appKey/appSecret + // 为了示例,直接使用 ERPAccount.ACCOUNT_HUGE 的常量。生产请替换为从数据库/配置读取 + String appKey = "1016208368633221"; + String appSecret = "waLiRMgFcixLbcLjUSSwo370Hp1nBcBu"; + + String json = body == null ? "{}" : body.toJSONString(); + String data = appKey + "," + md5(json) + "," + (timestamp == null ? 0 : timestamp) + "," + appSecret; + String local = md5(data); + return StringUtils.equalsIgnoreCase(local, sign); + } + + private String md5(String str) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(str.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte b : digest) { + sb.append(String.format("%02x", b & 0xff)); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + } +} + + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/erp/ProductController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/erp/ProductController.java new file mode 100644 index 0000000..dfa47cb --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/erp/ProductController.java @@ -0,0 +1,466 @@ +package com.ruoyi.web.controller.erp; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.erp.domain.*; +import com.ruoyi.erp.request.ERPAccount; +import com.ruoyi.erp.request.ProductCreateRequest; +import com.ruoyi.erp.request.ProductCategoryListQueryRequest; +import com.ruoyi.erp.request.ProductPropertyListQueryRequest; +import com.ruoyi.erp.request.AuthorizeListQueryRequest; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * ERP 商品接口 + * 基于“生成的文案与图片”快速创建商品 + */ +@RestController +@RequestMapping("/erp/product") +@Validated +public class ProductController extends BaseController { + + @PostMapping("/createByPromotion") + public R createByPromotion(@RequestBody @Validated CreateProductFromPromotionRequest req) { + try { + ERPAccount account = resolveAccount(req.getAppid()); + // 1) 组装 ERPShop + ERPShop erpShop = new ERPShop(); + erpShop.setChannelCatid(req.getChannelCatId()); + erpShop.setItemBizType(req.getItemBizType()); + erpShop.setSpBizType(req.getSpBizType()); + erpShop.setPrice(req.getPrice()); + erpShop.setExpressFee(req.getExpressFee()); + erpShop.setStock(req.getStock()); + erpShop.setOuterid(req.getOuterId()); + erpShop.setStuffStatus(req.getStuffStatus()); + + // 发布店铺(必填) + PublishShop shop = new PublishShop(); + shop.setUserName(req.getUserName()); + shop.setProvince(req.getProvince()); + shop.setCity(req.getCity()); + shop.setDistrict(req.getDistrict()); + shop.setTitle(req.getTitle()); + shop.setContent(req.getContent()); + shop.setImages(req.getImages()); + shop.setWhiteImages(req.getWhiteImages()); + shop.setServiceSupport(req.getServiceSupport()); + List publishShops = new ArrayList<>(); + publishShops.add(shop); + erpShop.setPublishShop(publishShops); + + // 属性(选填) + if (req.getChannelPv() != null && !req.getChannelPv().isEmpty()) { + List pvList = new ArrayList<>(); + for (CreateProductFromPromotionRequest.ChannelPvDto pvDto : req.getChannelPv()) { + Channelpv pv = new Channelpv(); + pv.setPropertyid(pvDto.getPropertyId()); + pv.setPropertyName(pvDto.getPropertyName()); + pv.setValueid(pvDto.getValueId()); + pv.setValueName(pvDto.getValueName()); + pvList.add(pv); + } + erpShop.setChannelpv(pvList); + } + + // 多规格(选填) + if (req.getSkuItems() != null && !req.getSkuItems().isEmpty()) { + List skuItems = new ArrayList<>(); + for (CreateProductFromPromotionRequest.SkuItemDto s : req.getSkuItems()) { + SkuItems si = new SkuItems(); + si.setPrice(s.getPrice()); + si.setStock(s.getStock()); + si.setSkuText(s.getSkuText()); + si.setOuterid(s.getOuterId()); + skuItems.add(si); + } + erpShop.setSkuItems(skuItems); + } + + // 2) 调用开放接口 + ProductCreateRequest createRequest = new ProductCreateRequest(account); + JSONObject body = JSONObject.parseObject(JSON.toJSONString(erpShop)); + createRequest.setRequestBody(body); + String resp = createRequest.getResponseBody(); + return R.ok(JSONObject.parse(resp)); + } catch (Exception e) { + return R.fail("创建失败: " + e.getMessage()); + } + } + + /** + * 获取类目下拉 + */ + @GetMapping("/categories") + public R categories(@RequestParam int itemBizType, + @RequestParam(required = false) Integer spBizType, + @RequestParam(required = false) Integer flashSaleType, + @RequestParam(required = false) String appid) { + try { + ProductCategoryListQueryRequest req = new ProductCategoryListQueryRequest(resolveAccount(appid)); + req.setItemBizType(itemBizType); + if (spBizType != null) req.setSpBizType(spBizType); + if (flashSaleType != null) req.setFlashSaleType(flashSaleType); + String resp = req.getResponseBody(); + + JSONObject jo = JSONObject.parseObject(resp); + // 兼容不同返回格式:{"code":0,"data":{"list":[...]}} + List rows = new java.util.ArrayList<>(); + Object dataObj = jo.get("data"); + if (dataObj instanceof com.alibaba.fastjson2.JSONArray) { + rows.addAll(((com.alibaba.fastjson2.JSONArray) dataObj).toJavaList(JSONObject.class)); + } else if (dataObj instanceof JSONObject) { + JSONObject dataJson = (JSONObject) dataObj; + if (dataJson.get("list") instanceof com.alibaba.fastjson2.JSONArray) { + rows.addAll(dataJson.getJSONArray("list").toJavaList(JSONObject.class)); + } else if (dataJson.get("categories") instanceof com.alibaba.fastjson2.JSONArray) { + rows.addAll(dataJson.getJSONArray("categories").toJavaList(JSONObject.class)); + } + } else if (jo.get("list") instanceof com.alibaba.fastjson2.JSONArray) { + rows.addAll(jo.getJSONArray("list").toJavaList(JSONObject.class)); + } else if (jo.get("categories") instanceof com.alibaba.fastjson2.JSONArray) { + rows.addAll(jo.getJSONArray("categories").toJavaList(JSONObject.class)); + } + List