From de1b4c3e5630ea5e0e98c051641acfa2a69ac3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E9=BD=90?= <280645618@qq.com> Date: Wed, 19 Jun 2024 16:17:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84dou=E7=94=B5=E5=AD=90?= =?UTF-8?q?=E9=9D=A2=E5=8D=95=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/qihang-erp.sql | 39 ++- .../java/com/qihang/oms/domain/SShop.java | 4 + .../com/qihang/oms/domain/SShopPlatform.java | 4 + .../{dou-api-0.3.jar => dou-api-0.6.18.jar} | Bin 129899 -> 155983 bytes open-api/dou-api/pom.xml | 4 +- .../dou/controller/EwaybillController.java | 324 +++++++++++------- .../dou/controller/OrderApiController.java | 4 +- .../com/qihang/dou/domain/ErpShipWaybill.java | 78 +++++ .../com/qihang/dou/domain/OmsDouOrder.java | 15 +- .../dou/domain/OmsDouWaybillAccount.java | 117 +++++++ .../java/com/qihang/dou/domain/SShop.java | 4 + .../com/qihang/dou/domain/SShopPlatform.java | 4 + .../qihang/dou/domain/SShopPullLasttime.java | 4 + .../com/qihang/dou/domain/bo/DouOrderBo.java | 3 +- .../qihang/dou/domain/bo/DouWaybillGetBo.java | 4 +- .../dou/mapper/ErpShipWaybillMapper.java | 18 + .../mapper/OmsDouWaybillAccountMapper.java | 18 + .../dou/service/ErpShipWaybillService.java | 20 ++ .../dou/service/OmsDouOrderService.java | 1 + .../service/OmsDouWaybillAccountService.java | 13 + .../impl/ErpShipWaybillServiceImpl.java | 161 +++++++++ .../service/impl/OmsDouOrderServiceImpl.java | 25 +- .../impl/OmsDouWaybillAccountServiceImpl.java | 22 ++ .../resources/mapper/ErpShipWaybillMapper.xml | 28 ++ .../resources/mapper/OmsDouOrderMapper.xml | 5 +- .../mapper/OmsDouWaybillAccountMapper.xml | 39 +++ .../main/java/com/qihang/jd/domain/SShop.java | 4 + .../com/qihang/jd/domain/SShopPlatform.java | 4 + .../qihang/jd/domain/SysShopPullLasttime.java | 3 + .../com/qihang/kwai/domain/SysPlatform.java | 1 + .../java/com/qihang/kwai/domain/SysShop.java | 1 + .../java/com/qihang/pdd/domain/SShop.java | 4 + .../com/qihang/pdd/domain/SShopPlatform.java | 4 + .../pdd/domain/SysShopPullLasttime.java | 3 + .../java/com/qihang/tao/domain/SShop.java | 4 + .../com/qihang/tao/domain/SShopPlatform.java | 4 + .../tao/domain/SysShopPullLasttime.java | 3 + .../java/com/qihang/wei/domain/SShop.java | 4 + .../com/qihang/wei/domain/SShopPlatform.java | 4 + .../com/qihang/wei/domain/SShopSetting.java | 4 + vue/src/api/dou/ewaybill.js | 10 +- vue/src/views/shop/dou/ewaybill/index.vue | 72 ++-- 42 files changed, 903 insertions(+), 184 deletions(-) rename open-api/dou-api/libs/{dou-api-0.3.jar => dou-api-0.6.18.jar} (71%) create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/domain/ErpShipWaybill.java create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouWaybillAccount.java create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/mapper/ErpShipWaybillMapper.java create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/mapper/OmsDouWaybillAccountMapper.java create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/service/ErpShipWaybillService.java create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouWaybillAccountService.java create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/service/impl/ErpShipWaybillServiceImpl.java create mode 100644 open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouWaybillAccountServiceImpl.java create mode 100644 open-api/dou-api/src/main/resources/mapper/ErpShipWaybillMapper.xml create mode 100644 open-api/dou-api/src/main/resources/mapper/OmsDouWaybillAccountMapper.xml diff --git a/docs/qihang-erp.sql b/docs/qihang-erp.sql index 0166d80f..f1150716 100644 --- a/docs/qihang-erp.sql +++ b/docs/qihang-erp.sql @@ -11,7 +11,7 @@ Target Server Version : 80032 File Encoding : 65001 - Date: 18/06/2024 19:59:12 + Date: 19/06/2024 16:16:35 */ SET NAMES utf8mb4; @@ -383,7 +383,7 @@ CREATE TABLE `erp_sale_order` ( PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `order_sn_index`(`order_num`) USING BTREE, INDEX `shopid_index`(`shop_id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1801809140794216449 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 1801809140794216450 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for erp_sale_order_item @@ -570,7 +570,7 @@ CREATE TABLE `erp_ship_stock_up` ( `update_time` datetime(0) DEFAULT NULL COMMENT '更新时间', `update_by` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '备货表' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '备货表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for erp_ship_waybill @@ -590,7 +590,7 @@ CREATE TABLE `erp_ship_waybill` ( `update_time` datetime(0) DEFAULT NULL COMMENT '更新时间', `update_by` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1802644906957025282 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '发货电子面单记录表' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '发货电子面单记录表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for oms_dou_goods @@ -741,6 +741,9 @@ CREATE TABLE `oms_dou_order` ( `last_pull_time` datetime(0) DEFAULT NULL COMMENT '最后一次拉取时间', `audit_status` int(0) NOT NULL DEFAULT 0 COMMENT '0待确认,1已确认2已拦截-9未拉取', `audit_time` datetime(0) DEFAULT NULL COMMENT '审核时间', + `erp_send_company` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'erp发货快递公司', + `erp_send_code` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'erp发货快递单号', + `erp_send_status` int(0) DEFAULT 0 COMMENT 'erp发货状态', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '抖店订单表' ROW_FORMAT = Dynamic; @@ -862,6 +865,34 @@ CREATE TABLE `oms_dou_refund` ( PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1800783607092436994 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '抖店退款表' ROW_FORMAT = Dynamic; +-- ---------------------------- +-- Table structure for oms_dou_waybill_account +-- ---------------------------- +DROP TABLE IF EXISTS `oms_dou_waybill_account`; +CREATE TABLE `oms_dou_waybill_account` ( + `id` bigint(0) NOT NULL AUTO_INCREMENT, + `shop_id` bigint(0) NOT NULL COMMENT '店铺id', + `seller_id` bigint(0) DEFAULT NULL COMMENT '商家ID', + `company` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '快递公司编码', + `company_type` int(0) DEFAULT NULL COMMENT '物流服务商业务类型 1:直营 2:加盟 3:落地配 4:直营带网点', + `amount` int(0) DEFAULT NULL COMMENT '电子面单余额数量,-1表示没有额度限制', + `allocated_quantity` int(0) DEFAULT NULL COMMENT '已取单号数量,若业务本身无值,则传-1,前端可展示为“-”', + `cancelled_quantity` int(0) DEFAULT NULL COMMENT '已取消单号数量,若业务本身无值,则传-1,前端可展示为“-”', + `recycled_quantity` int(0) DEFAULT NULL COMMENT '已回收单号数量,若业务本身无值,则传-1,前端可展示为“-”', + `netsite_code` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '网点Code', + `netsite_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '网点名称', + `province_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '省名称(一级地址)', + `city_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '市名称(二级地址)', + `district_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `street_name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '区名称(三级地址)', + `detail_address` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '详细地址', + `name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发货人', + `mobile` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发货手机号', + `phone` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '发货固定电话', + `is_show` int(0) DEFAULT NULL COMMENT '是否前台显示1显示0不显示', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '抖店电子面单账户信息表' ROW_FORMAT = Dynamic; + -- ---------------------------- -- Table structure for oms_jd_after_sale -- ---------------------------- diff --git a/oms-api/src/main/java/com/qihang/oms/domain/SShop.java b/oms-api/src/main/java/com/qihang/oms/domain/SShop.java index 7e73dfca..7c5d6d24 100644 --- a/oms-api/src/main/java/com/qihang/oms/domain/SShop.java +++ b/oms-api/src/main/java/com/qihang/oms/domain/SShop.java @@ -2,6 +2,9 @@ package com.qihang.oms.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShop implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/oms-api/src/main/java/com/qihang/oms/domain/SShopPlatform.java b/oms-api/src/main/java/com/qihang/oms/domain/SShopPlatform.java index 37ed8312..9141be62 100644 --- a/oms-api/src/main/java/com/qihang/oms/domain/SShopPlatform.java +++ b/oms-api/src/main/java/com/qihang/oms/domain/SShopPlatform.java @@ -2,6 +2,9 @@ package com.qihang.oms.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShopPlatform implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/dou-api/libs/dou-api-0.3.jar b/open-api/dou-api/libs/dou-api-0.6.18.jar similarity index 71% rename from open-api/dou-api/libs/dou-api-0.3.jar rename to open-api/dou-api/libs/dou-api-0.6.18.jar index 13452ea003505e13a7bca41f426ad840f07d2e9b..388636e7fdf7b0d82431a4102d4ce99fbb3795ed 100644 GIT binary patch delta 38121 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ºmlvGU?q9_?!F{r` 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 LjW+BkgGBxTnRY+L delta 12744 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 doudian dou-api - 0.3 + 0.6.18 system - ${project.basedir}/libs/dou-api-0.3.jar + ${project.basedir}/libs/dou-api-0.6.18.jar diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/controller/EwaybillController.java b/open-api/dou-api/src/main/java/com/qihang/dou/controller/EwaybillController.java index 2b3d21f9..28dfbb40 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/controller/EwaybillController.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/controller/EwaybillController.java @@ -1,51 +1,50 @@ -package com.qihang.pdd.controller; +package com.qihang.dou.controller; -import cn.qihangerp.open.pdd.WaybillAccountApiHelper; -import cn.qihangerp.open.pdd.WaybillApiHelper; -import cn.qihangerp.open.pdd.common.ApiResultVo; -import cn.qihangerp.open.pdd.model.WaybillAccount; -import cn.qihangerp.open.pdd.model.WaybillCodeModule; -import cn.qihangerp.open.pdd.request.*; +import cn.qihangerp.open.dou.DouTokenApiHelper; +import cn.qihangerp.open.dou.WaybillAccountApiHelper; +import cn.qihangerp.open.dou.WaybillApiHelper; +import cn.qihangerp.open.dou.common.ApiResultVo; +import cn.qihangerp.open.dou.model.Token; +import cn.qihangerp.open.dou.model.WaybillAccount; +import cn.qihangerp.open.dou.model.WaybillCode; +import cn.qihangerp.open.dou.model.WaybillPrintData; +import cn.qihangerp.open.dou.request.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.qihang.common.common.AjaxResult; +import com.qihang.common.common.ResultVoEnum; import com.qihang.common.enums.HttpStatus; -import com.qihang.pdd.domain.ErpShipWaybill; -import com.qihang.pdd.domain.OmsPddOrder; -import com.qihang.pdd.domain.OmsPddWaybillAccount; -import com.qihang.pdd.domain.bo.PddWaybillGetBo; -import com.qihang.pdd.openapi.ApiCommon; -import com.qihang.pdd.openapi.PullRequest; -import com.qihang.pdd.service.ErpShipWaybillService; -import com.qihang.pdd.service.OmsPddOrderService; -import com.qihang.pdd.service.OmsPddWaybillAccountService; +import com.qihang.dou.domain.ErpShipWaybill; +import com.qihang.dou.domain.OmsDouOrder; +import com.qihang.dou.domain.OmsDouWaybillAccount; +import com.qihang.dou.domain.bo.DouRequest; +import com.qihang.dou.domain.bo.DouWaybillGetBo; +import com.qihang.dou.service.ErpShipWaybillService; +import com.qihang.dou.service.OmsDouOrderService; +import com.qihang.dou.service.OmsDouWaybillAccountService; import com.qihang.security.common.BaseController; import lombok.AllArgsConstructor; import lombok.extern.java.Log; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @Log @AllArgsConstructor @RestController @RequestMapping("/ewaybill") public class EwaybillController extends BaseController { - private final ApiCommon apiCommon; - private final OmsPddWaybillAccountService waybillAccountService; - private final OmsPddOrderService orderService; + private final DouApiHelper apiCommon; + private final OmsDouWaybillAccountService waybillAccountService; + private final OmsDouOrderService orderService; private final ErpShipWaybillService erpShipWaybillService; @GetMapping(value = "/get_waybill_account_list") public AjaxResult getWaybillAccountList(@RequestParam Long shopId) throws Exception { -// if (params.getShopId() == null || params.getShopId() <= 0) { -// return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有店铺Id"); -// } - List list = waybillAccountService.list( - new LambdaQueryWrapper().eq(OmsPddWaybillAccount::getShopId, shopId) - .eq(OmsPddWaybillAccount::getIsShow, 1)); + List list = waybillAccountService.list( + new LambdaQueryWrapper().eq(OmsDouWaybillAccount::getShopId, shopId) + .eq(OmsDouWaybillAccount::getIsShow, 1)); return AjaxResult.success(list); } @@ -56,59 +55,61 @@ public class EwaybillController extends BaseController { * @throws Exception */ @RequestMapping(value = "/pull_waybill_account", method = RequestMethod.POST) - public AjaxResult pullWaybillAccount(@RequestBody PullRequest params) throws Exception { + public AjaxResult pullWaybillAccount(@RequestBody DouRequest params) throws Exception { if (params.getShopId() == null || params.getShopId() <= 0) { return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有店铺Id"); } var checkResult = apiCommon.checkBefore(params.getShopId()); - if (checkResult.getCode() != HttpStatus.SUCCESS) { + if (checkResult.getCode() != ResultVoEnum.SUCCESS.getIndex()) { return AjaxResult.error(checkResult.getCode(), checkResult.getMsg(), checkResult.getData()); } String accessToken = checkResult.getData().getAccessToken(); String appKey = checkResult.getData().getAppKey(); String appSecret = checkResult.getData().getAppSecret(); Long sellId = checkResult.getData().getSellerShopId(); + ApiResultVo token = DouTokenApiHelper.getToken(appKey, appSecret,checkResult.getData().getSellerShopId()); + if(token.getCode()==0) { + accessToken = token.getData().getAccessToken(); + }else{ + return AjaxResult.error(token.getMsg()); + } + ApiResultVo apiResultVo = WaybillAccountApiHelper.listWaybillAccount(appKey, appSecret, accessToken); + List list = new ArrayList<>(); + if(apiResultVo.getCode()==0) { + for (var item : apiResultVo.getList()) { - ApiResultVo apiResultVo = WaybillAccountApiHelper.pullWaybillBranchAccountList(appKey, appSecret, accessToken); - List list = new ArrayList<>(); - if(apiResultVo.getCode()==0){ - for (var item : apiResultVo.getList()){ - for(var acc:item.getBranchAccountCols()){ - OmsPddWaybillAccount vo = new OmsPddWaybillAccount(); - vo.setShopId(params.getShopId()); - vo.setSellerId(sellId); - vo.setIsShow(1); - vo.setCpCode(item.getWpCode()); - vo.setCpType(item.getWpType()); - vo.setAllocatedQuantity(acc.getAllocatedQuantity()); - vo.setBranchCode(acc.getBranchCode()); - vo.setBranchName(acc.getBranchName()); - vo.setCancelQuantity(acc.getCancelQuantity()); -// vo.setPrintQuantity(acc.getPrintQuantity()); - vo.setQuantity(acc.getQuantity()); - if(acc.getShippAddressCols().size()>0) { - vo.setAddressDetail(acc.getShippAddressCols().get(0).getDetail()); - vo.setArea(acc.getShippAddressCols().get(0).getDistrict()); - vo.setCity(acc.getShippAddressCols().get(0).getCity()); - vo.setProvince(acc.getShippAddressCols().get(0).getProvince()); -// vo.setWaybillAddressId(acc.getShippAddressCols().get(0).getWaybillAddressId().longValue()); - list.add(vo); - } - - waybillAccountService.save(vo); - log.info("========添加pdd电子面单账户信息=========="); + OmsDouWaybillAccount vo = new OmsDouWaybillAccount(); + vo.setShopId(params.getShopId()); + vo.setSellerId(sellId); + vo.setIsShow(1); + vo.setCompany(item.getCompany()); + vo.setCompanyType(item.getCompanyType()); + vo.setAmount(Integer.parseInt(item.getAmount())); + vo.setAllocatedQuantity(item.getAllocatedQuantity()); + vo.setCancelledQuantity(item.getCancelledQuantity()); + vo.setRecycledQuantity(item.getRecycledQuantity()); + vo.setNetsiteCode(item.getNetsiteCode()); + vo.setNetsiteName(item.getNetsiteName()); + if (item.getSenderAddress() != null && item.getSenderAddress().size() > 0) { + vo.setProvinceName(item.getSenderAddress().get(0).getProvinceName()); + vo.setDistrictName(item.getSenderAddress().get(0).getDistrictName()); + vo.setCityName(item.getSenderAddress().get(0).getCityName()); + vo.setStreetName(item.getSenderAddress().get(0).getStreetName()); + vo.setDetailAddress(item.getSenderAddress().get(0).getDetailAddress()); } + list.add(vo); + waybillAccountService.save(vo); + log.info("========添加dou电子面单账户信息=========="); + } } - - return AjaxResult.success(list); } @PostMapping("/get_waybill_code") @ResponseBody - public AjaxResult getWaybillCode(@RequestBody PddWaybillGetBo req) { + public AjaxResult getWaybillCode(@RequestBody DouWaybillGetBo req) { if (req.getAccountId() == null || req.getAccountId() <= 0) { return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,请选择电子面单账户"); } @@ -119,7 +120,7 @@ public class EwaybillController extends BaseController { return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有选择订单"); } var checkResult = apiCommon.checkBefore(req.getShopId()); - if (checkResult.getCode() != HttpStatus.SUCCESS) { + if (checkResult.getCode() != ResultVoEnum.SUCCESS.getIndex()) { return AjaxResult.error(checkResult.getCode(), checkResult.getMsg(), checkResult.getData()); } String accessToken = checkResult.getData().getAccessToken(); @@ -127,85 +128,99 @@ public class EwaybillController extends BaseController { String appSecret = checkResult.getData().getAppSecret(); Long sellerShopId = checkResult.getData().getSellerShopId(); + ApiResultVo token = DouTokenApiHelper.getToken(appKey, appSecret,checkResult.getData().getSellerShopId()); + if(token.getCode()==0) { + accessToken = token.getData().getAccessToken(); + }else{ + return AjaxResult.error(token.getMsg()); + } + // 获取电子面单账户信息(包含了发货地址信息) - OmsPddWaybillAccount account = waybillAccountService.getById(req.getAccountId()); + OmsDouWaybillAccount waybillAccount = waybillAccountService.getById(req.getAccountId()); - WaybillCloudPrintApplyNewRequest request = new WaybillCloudPrintApplyNewRequest(); - request.setWp_code(account.getCpCode()); - request.setNeed_encrypt(true); + WaybillCodeRequest request = new WaybillCodeRequest(); + request.setLogistics_code(waybillAccount.getCompany()); + request.setOrder_channel("1"); - WaybillCloudPrintApplyNewRequestContact sender = new WaybillCloudPrintApplyNewRequestContact(); - sender.setName(account.getName()); - sender.setMobile(account.getMobile()); - WaybillCloudPrintApplyNewRequestContactAddress addressDTO = new WaybillCloudPrintApplyNewRequestContactAddress(); - addressDTO.setCity(account.getCity()); - addressDTO.setProvince(account.getProvince()); - addressDTO.setDistrict(account.getArea()); - addressDTO.setTown(""); - addressDTO.setDetail(account.getAddressDetail()); - sender.setAddress(addressDTO); - request.setSender(sender); + WaybillAddressInfo sender = new WaybillAddressInfo(); + WaybillAddress address = new WaybillAddress(); + address.setCountry_code("CHN"); + address.setProvince_name(waybillAccount.getProvinceName()); + address.setCity_name(waybillAccount.getCityName()); + address.setDistrict_name(waybillAccount.getDistrictName()); + address.setStreet_name(waybillAccount.getStreetName()); + address.setDetail_address(waybillAccount.getDetailAddress()); + sender.setAddress(address); - // 组合取号的订单信息trade_order_info_dtos - List orderList = new ArrayList<>(); + WaybillContact contact = new WaybillContact(); + contact.setName(waybillAccount.getName()); + contact.setMobile(waybillAccount.getMobile()); - for(String orderSn:req.getIds()){ - if(StringUtils.hasText(orderSn)){ - OmsPddOrder order = orderService.queryDetailByOrderSn(orderSn); + sender.setContact(contact); + + request.setSender_info(sender); + + + // 开始组装订单 + List orderInfos=new ArrayList<>(); + + for(String orderId:req.getIds()){ + if(StringUtils.hasText(orderId)){ + OmsDouOrder order = orderService.queryDetailByOrderId(orderId); if(order!=null) { - WaybillCloudPrintApplyNewRequestTradeOrderInfoDto dto = new WaybillCloudPrintApplyNewRequestTradeOrderInfoDto(); - dto.setObject_id(order.getOrderSn()); - dto.setTemplate_url("https://file-link.pinduoduo.com/yunda_std"); - dto.setUser_id(sellerShopId); - OrderInfo orderInfo = new OrderInfo(); - orderInfo.setOrder_channels_type("PDD"); - orderInfo.setTrade_order_list(new String[] {order.getOrderSn()}); - dto.setOrder_info(orderInfo); + WaybillOrderInfo orderInfo = new WaybillOrderInfo(); + orderInfo.setOrder_id(order.getOrderId()); + WaybillAddressInfo receiver = new WaybillAddressInfo(); + WaybillAddress address1 = new WaybillAddress(); + address1.setCountry_code("CHN"); + address1.setProvince_name(order.getProvinceName()); + address1.setCity_name(order.getCityName()); + address1.setDistrict_name(order.getTownName()); + address1.setStreet_name(order.getStreetName()); + address1.setDetail_address(order.getMaskPostAddress()); + receiver.setAddress(address1); - PackageInfo packageInfo = new PackageInfo(); - List items = new ArrayList<>(); - for (var orderItem : order.getItemList()) { - PackageInfoItem item = new PackageInfoItem(); - item.setName(orderItem.getGoodsName()); - item.setCount(orderItem.getGoodsCount()); - items.add(item); + WaybillContact contact1 = new WaybillContact(); + contact1.setName(order.getMaskPostReceiver()); + contact1.setMobile("-"); + receiver.setContact(contact1); + + orderInfo.setReceiver_info(receiver); + + // + List items=new ArrayList<>(); + if(order.getItems()!=null&&order.getItems().size()>0) { + for (var it: order.getItems()) { + WaybillOrderItem item = new WaybillOrderItem(); + item.setItem_count(it.getItemNum()); + item.setItem_name(it.getProductName()); + item.setItem_specs(it.getSpec()); + items.add(item); + } + orderInfo.setItems(items); } - packageInfo.setItems(items); - dto.setPackage_info(packageInfo); - - WaybillCloudPrintApplyNewRequestContact recipient = new WaybillCloudPrintApplyNewRequestContact(); - recipient.setName("启航"); - recipient.setMobile("15818590112"); - WaybillCloudPrintApplyNewRequestContactAddress recipientAddress = new WaybillCloudPrintApplyNewRequestContactAddress(); - recipientAddress.setProvince(order.getProvince()); - recipientAddress.setCity(order.getCity()); - recipientAddress.setDistrict(order.getTown()); - recipientAddress.setDetail(order.getAddress()); - recipient.setAddress(recipientAddress); - dto.setRecipient(recipient); - - orderList.add(dto); + orderInfos.add(orderInfo); } } } - request.setTrade_order_info_dtos(orderList); + request.setOrder_infos(orderInfos); + ApiResultVo apiResultVo = WaybillApiHelper.getWaybillCode(appKey, appSecret, token.getData().getAccessToken(), request); - ApiResultVo apiResultVo = WaybillApiHelper.getWaybillCode(appKey, appSecret, accessToken, request); if(apiResultVo.getCode()==0){ // 保持数据 for(var result: apiResultVo.getList()){ ErpShipWaybill waybill = new ErpShipWaybill(); waybill.setShopId(req.getShopId()); - waybill.setOrderId(result.getObject_id()); - waybill.setWaybillCode(result.getWaybill_code()); - waybill.setLogisticsCode(account.getCpCode()); - waybill.setPrintData(result.getPrint_data()); + waybill.setOrderId(result.getOrderId()); + waybill.setWaybillCode(result.getTrackNo()); + waybill.setLogisticsCode(result.getCompany()); +// waybill.setPrintData(result.getPrint_data()); erpShipWaybillService.waybillUpdate(waybill); - log.info("====保存電子面單信息========"+result.getObject_id()); + log.info("====保存電子面單信息========"+result.getOrderId()); } }else{ return AjaxResult.error(apiResultVo.getMsg()); @@ -214,22 +229,69 @@ public class EwaybillController extends BaseController { return success(); } - @PostMapping("/get_print_data") - @ResponseBody - public AjaxResult getPrintData(@RequestBody PddWaybillGetBo req) { - if (req.getShopId() == null || req.getShopId() <= 0) { - return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有店铺Id"); - } - if (req.getIds() == null || req.getIds().length <= 0) { - return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有选择订单"); - } - List listByOrderIds = erpShipWaybillService.getListByOrderIds(req.getShopId(), req.getIds()); - return AjaxResult.success(listByOrderIds); +@PostMapping("/get_print_data") +@ResponseBody +public AjaxResult getPrintData(@RequestBody DouWaybillGetBo req) { + if (req.getShopId() == null || req.getShopId() <= 0) { + return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有店铺Id"); } + if (req.getIds() == null || req.getIds().length <= 0) { + return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有选择订单"); + } + var checkResult = apiCommon.checkBefore(req.getShopId()); + if (checkResult.getCode() != 0) { + return AjaxResult.error(checkResult.getCode(), checkResult.getMsg(), checkResult.getData()); + } + String accessToken = checkResult.getData().getAccessToken(); + String appKey = checkResult.getData().getAppKey(); + String appSecret = checkResult.getData().getAppSecret(); + Long sellerShopId = checkResult.getData().getSellerShopId(); + ApiResultVo token = DouTokenApiHelper.getToken(appKey, appSecret,checkResult.getData().getSellerShopId()); + if(token.getCode()==0) { + accessToken = token.getData().getAccessToken(); + }else{ + return AjaxResult.error(token.getMsg()); + } + + List list = erpShipWaybillService.getListByOrderIds(req.getShopId(), req.getIds()); + WaybillApplyRequest request = new WaybillApplyRequest(); + List waybillApplyList = new ArrayList<>(); + if(list!=null && list.size()>0) { + for (var ship:list) { + if(!StringUtils.hasText(ship.getPrintData())) { + WaybillApply dto = new WaybillApply(); + dto.setLogistics_code(ship.getLogisticsCode()); + dto.setTrack_no(ship.getWaybillCode()); + waybillApplyList.add(dto); + } + } + } + request.setWaybill_applies(waybillApplyList); + ApiResultVo apiResultVo = WaybillApiHelper.pullWaybillPrintData(appKey, appSecret, accessToken, request); + if(apiResultVo.getCode()==0){ + // 更新数据 + for (var item:apiResultVo.getList()) { + ErpShipWaybill waybillNew = new ErpShipWaybill(); + waybillNew.setPrintData(item.getPrintData()); + waybillNew.setUpdateBy("获取打印数据"); + waybillNew.setUpdateTime(new Date()); + erpShipWaybillService.update(waybillNew,new LambdaQueryWrapper().eq(ErpShipWaybill::getWaybillCode,item.getTrackNo())); + log.info("====保存電子面單打印信息jd========"+item.getOrderId()); + ErpShipWaybill list1 = list.stream().filter(x -> x.getWaybillCode().equals(item.getTrackNo())).findFirst().get(); + if(list1!=null){ + list1.setPrintData(item.getPrintData()); + } + } + + }else{ + return AjaxResult.error(apiResultVo.getMsg()); + } + return AjaxResult.success(list); +} @PostMapping("/push_print_success") @ResponseBody - public AjaxResult pushPrintSuccess(@RequestBody PddWaybillGetBo req) { + public AjaxResult pushPrintSuccess(@RequestBody DouWaybillGetBo req) { if (req.getShopId() == null || req.getShopId() <= 0) { return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有店铺Id"); } @@ -247,7 +309,7 @@ public class EwaybillController extends BaseController { */ @PostMapping("/push_ship_send") @ResponseBody - public AjaxResult pushShipSend(@RequestBody PddWaybillGetBo req) { + public AjaxResult pushShipSend(@RequestBody DouWaybillGetBo req) { if (req.getShopId() == null || req.getShopId() <= 0) { return AjaxResult.error(HttpStatus.PARAMS_ERROR, "参数错误,没有店铺Id"); } diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/controller/OrderApiController.java b/open-api/dou-api/src/main/java/com/qihang/dou/controller/OrderApiController.java index 9020f343..73f5adcf 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/controller/OrderApiController.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/controller/OrderApiController.java @@ -116,7 +116,7 @@ public class OrderApiController { } //获取 - ApiResultVo resultVo = DouOrderApiHelper.pullOrderList(startTimestamp, endTimestamp, 1, 20, appKey, appSecret, accessToken); + ApiResultVo resultVo = DouOrderApiHelper.pullOrderList(startTimestamp, endTimestamp, 0, 20, appKey, appSecret, accessToken); if(resultVo.getCode() !=0 ){ SShopPullLogs logs = new SShopPullLogs(); @@ -215,7 +215,7 @@ public class OrderApiController { logs.setDuration(System.currentTimeMillis() - currTimeMillis); pullLogsService.save(logs); - String msg = "成功{startTime:"+startTime.format(df)+",endTime:"+endTime.format(df)+"}总共找到:" + resultVo.getTotalRecords() + "条订单,新增:" + insertSuccess + "条,添加错误:" + totalError + "条,更新:" + hasExistOrder + "条"; + String msg = "成功{startTime:"+startTimeStr+",endTime:"+endTimeStr+"}总共找到:" + resultVo.getTotalRecords() + "条订单,新增:" + insertSuccess + "条,添加错误:" + totalError + "条,更新:" + hasExistOrder + "条"; log.info("/**************主动更新DOU订单:END:" + msg + "****************/"); return AjaxResult.success(msg); } diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/ErpShipWaybill.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/ErpShipWaybill.java new file mode 100644 index 00000000..9fd9fd91 --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/ErpShipWaybill.java @@ -0,0 +1,78 @@ +package com.qihang.dou.domain; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * 发货电子面单记录表 + * @TableName erp_ship_waybill + */ +@Data +public class ErpShipWaybill implements Serializable { + /** + * + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 订单号 + */ + private String orderId; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 店铺类型 + */ + private Integer shopType; + + /** + * 快递单号 + */ + private String waybillCode; + + /** + * 快递公司编码 + */ + private String logisticsCode; + + /** + * 打印数据 + */ + private String printData; + + /** + * 状态(1已取号2已打印3已发货) + */ + private Integer status; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 更新人 + */ + private String updateBy; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouOrder.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouOrder.java index a343c2b8..9ca8d426 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouOrder.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouOrder.java @@ -16,7 +16,7 @@ public class OmsDouOrder implements Serializable { /** * */ - private Long id; + private String id; /** * 店铺父订单号,抖店平台生成,平台下唯一; @@ -407,7 +407,20 @@ public class OmsDouOrder implements Serializable { private Date lastPullTime; private Integer auditStatus; private Date auditTime; + /** + * erp发货快递公司 + */ + private String erpSendCompany; + /** + * erp发货快递单号 + */ + private String erpSendCode; + + /** + * erp发货状态 + */ + private Integer erpSendStatus; @TableField(exist = false) private List items; private static final long serialVersionUID = 1L; diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouWaybillAccount.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouWaybillAccount.java new file mode 100644 index 00000000..1099a19b --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/OmsDouWaybillAccount.java @@ -0,0 +1,117 @@ +package com.qihang.dou.domain; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * 抖店电子面单账户信息表 + * @TableName oms_dou_waybill_account + */ +@Data +public class OmsDouWaybillAccount implements Serializable { + /** + * + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 店铺id + */ + private Long shopId; + + /** + * 商家ID + */ + private Long sellerId; + + /** + * 快递公司编码 + */ + private String company; + + /** + * 物流服务商业务类型 1:直营 2:加盟 3:落地配 4:直营带网点 + */ + private Integer companyType; + + /** + * 电子面单余额数量,-1表示没有额度限制 + */ + private Integer amount; + + /** + * 已取单号数量,若业务本身无值,则传-1,前端可展示为“-” + */ + private Integer allocatedQuantity; + + /** + * 已取消单号数量,若业务本身无值,则传-1,前端可展示为“-” + */ + private Integer cancelledQuantity; + + /** + * 已回收单号数量,若业务本身无值,则传-1,前端可展示为“-” + */ + private Integer recycledQuantity; + + /** + * 网点Code + */ + private String netsiteCode; + + /** + * 网点名称 + */ + private String netsiteName; + + /** + * 省名称(一级地址) + */ + private String provinceName; + + /** + * 市名称(二级地址) + */ + private String cityName; + + /** + * + */ + private String districtName; + + /** + * 区名称(三级地址) + */ + private String streetName; + + /** + * 详细地址 + */ + private String detailAddress; + + /** + * 发货人 + */ + private String name; + + /** + * 发货手机号 + */ + private String mobile; + + /** + * 发货固定电话 + */ + private String phone; + + /** + * 是否前台显示1显示0不显示 + */ + private Integer isShow; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShop.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShop.java index 15a5801d..26db42d3 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShop.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShop.java @@ -2,6 +2,9 @@ package com.qihang.dou.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShop implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPlatform.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPlatform.java index aa0ab35e..1e371189 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPlatform.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPlatform.java @@ -2,6 +2,9 @@ package com.qihang.dou.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShopPlatform implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPullLasttime.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPullLasttime.java index 15908f74..fa9ed5d9 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPullLasttime.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/SShopPullLasttime.java @@ -3,6 +3,9 @@ package com.qihang.dou.domain; import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -14,6 +17,7 @@ public class SShopPullLasttime implements Serializable { /** * */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouOrderBo.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouOrderBo.java index f4b0090b..a4a44e19 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouOrderBo.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouOrderBo.java @@ -10,7 +10,8 @@ public class DouOrderBo implements Serializable { private Long skuId; private Long erpGoodsSkuId; private Integer shopId; - private String orderStatus; + private Integer orderStatus; + private Integer erpSendStatus; private String startTime; private String endTime; } diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouWaybillGetBo.java b/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouWaybillGetBo.java index 2dea66c2..09955487 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouWaybillGetBo.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/domain/bo/DouWaybillGetBo.java @@ -1,9 +1,9 @@ -package com.qihang.pdd.domain.bo; +package com.qihang.dou.domain.bo; import lombok.Data; @Data -public class PddWaybillGetBo { +public class DouWaybillGetBo { private Long accountId;//电子面单账户id private String[] ids; private Long shopId;//店铺Id diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/mapper/ErpShipWaybillMapper.java b/open-api/dou-api/src/main/java/com/qihang/dou/mapper/ErpShipWaybillMapper.java new file mode 100644 index 00000000..1518a9ae --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/mapper/ErpShipWaybillMapper.java @@ -0,0 +1,18 @@ +package com.qihang.dou.mapper; + +import com.qihang.dou.domain.ErpShipWaybill; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author TW +* @description 针对表【erp_ship_waybill(发货电子面单记录表)】的数据库操作Mapper +* @createDate 2024-06-19 15:53:49 +* @Entity com.qihang.dou.domain.ErpShipWaybill +*/ +public interface ErpShipWaybillMapper extends BaseMapper { + +} + + + + diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/mapper/OmsDouWaybillAccountMapper.java b/open-api/dou-api/src/main/java/com/qihang/dou/mapper/OmsDouWaybillAccountMapper.java new file mode 100644 index 00000000..e494328f --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/mapper/OmsDouWaybillAccountMapper.java @@ -0,0 +1,18 @@ +package com.qihang.dou.mapper; + +import com.qihang.dou.domain.OmsDouWaybillAccount; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author TW +* @description 针对表【oms_dou_waybill_account(抖店电子面单账户信息表)】的数据库操作Mapper +* @createDate 2024-06-19 14:35:56 +* @Entity com.qihang.dou.domain.OmsDouWaybillAccount +*/ +public interface OmsDouWaybillAccountMapper extends BaseMapper { + +} + + + + diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/service/ErpShipWaybillService.java b/open-api/dou-api/src/main/java/com/qihang/dou/service/ErpShipWaybillService.java new file mode 100644 index 00000000..3b061953 --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/service/ErpShipWaybillService.java @@ -0,0 +1,20 @@ +package com.qihang.dou.service; + +import com.qihang.common.common.ResultVo; +import com.qihang.dou.domain.ErpShipWaybill; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* @author TW +* @description 针对表【erp_ship_waybill(发货电子面单记录表)】的数据库操作Service +* @createDate 2024-06-19 15:53:49 +*/ +public interface ErpShipWaybillService extends IService { + ResultVo waybillUpdate(ErpShipWaybill shipWaybill); + List getListByOrderIds(Long shopId, String[] orderIds); + + ResultVo printSuccess(Long shopId,String[] orderIds); + ResultVo pushShipSend(Long shopId,String[] orderIds); +} diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouOrderService.java b/open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouOrderService.java index 0e86ca26..c68994f2 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouOrderService.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouOrderService.java @@ -16,6 +16,7 @@ public interface OmsDouOrderService extends IService { PageResult queryPageList(DouOrderBo bo, PageQuery pageQuery); OmsDouOrder queryDetailById(Long id); + OmsDouOrder queryDetailByOrderId(String orderId); /** * 保存店铺订单 * @param shopId diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouWaybillAccountService.java b/open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouWaybillAccountService.java new file mode 100644 index 00000000..db83dd32 --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/service/OmsDouWaybillAccountService.java @@ -0,0 +1,13 @@ +package com.qihang.dou.service; + +import com.qihang.dou.domain.OmsDouWaybillAccount; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author TW +* @description 针对表【oms_dou_waybill_account(抖店电子面单账户信息表)】的数据库操作Service +* @createDate 2024-06-19 14:35:56 +*/ +public interface OmsDouWaybillAccountService extends IService { + +} diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/ErpShipWaybillServiceImpl.java b/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/ErpShipWaybillServiceImpl.java new file mode 100644 index 00000000..41fe3f80 --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/ErpShipWaybillServiceImpl.java @@ -0,0 +1,161 @@ +package com.qihang.dou.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qihang.common.common.ResultVo; +import com.qihang.common.enums.EnumShopType; +import com.qihang.common.mq.MqMessage; +import com.qihang.common.mq.MqType; +import com.qihang.dou.domain.ErpShipWaybill; +import com.qihang.dou.domain.OmsDouOrder; +import com.qihang.dou.mapper.OmsDouOrderMapper; +import com.qihang.dou.service.ErpShipWaybillService; +import com.qihang.dou.mapper.ErpShipWaybillMapper; +import lombok.AllArgsConstructor; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** +* @author TW +* @description 针对表【erp_ship_waybill(发货电子面单记录表)】的数据库操作Service实现 +* @createDate 2024-06-19 15:53:49 +*/ +@AllArgsConstructor +@Service +public class ErpShipWaybillServiceImpl extends ServiceImpl + implements ErpShipWaybillService{ + private final ErpShipWaybillMapper mapper; + private final OmsDouOrderMapper orderMapper; + private final KafkaTemplate kafkaTemplate; + + /** + * 更新电子面单信息 + * @param shipWaybill + * @return + */ + @Transactional + @Override + public ResultVo waybillUpdate(ErpShipWaybill shipWaybill) { + String orderId= shipWaybill.getOrderId(); + if(shipWaybill.getId()!=null&&shipWaybill.getId()>0){ + // 存在,修改 + shipWaybill.setCreateBy(null); + shipWaybill.setCreateTime(null); + shipWaybill.setOrderId(null); + shipWaybill.setShopId(null); + shipWaybill.setShopType(null); + mapper.updateById(shipWaybill); + }else{ + // 新增 + List erpShipWaybills = mapper.selectList(new LambdaQueryWrapper().eq(ErpShipWaybill::getOrderId, orderId)); + if(erpShipWaybills==null|| erpShipWaybills.size()==0) { + shipWaybill.setStatus(1);//已取号 + shipWaybill.setShopType(EnumShopType.TAO.getIndex()); + shipWaybill.setCreateTime(new Date()); + mapper.insert(shipWaybill); + }else{ + ErpShipWaybill update = new ErpShipWaybill(); + update.setId(erpShipWaybills.get(0).getId()); + update.setWaybillCode(shipWaybill.getWaybillCode()); + update.setLogisticsCode(shipWaybill.getLogisticsCode()); + update.setPrintData(shipWaybill.getPrintData()); + update.setStatus(1); + update.setUpdateTime(new Date()); + update.setUpdateBy("重新取号"); + mapper.updateById(update); + } + } + // 更新关联订单erp_send_status状态 + OmsDouOrder orderUpdate = new OmsDouOrder(); + orderUpdate.setErpSendStatus(shipWaybill.getStatus()); + orderUpdate.setErpSendCode(shipWaybill.getWaybillCode()); + orderUpdate.setErpSendCompany(shipWaybill.getLogisticsCode()); + orderMapper.update(orderUpdate,new LambdaQueryWrapper().eq(OmsDouOrder::getOrderId,orderId)); + + return ResultVo.success(); + } + + @Override + public List getListByOrderIds(Long shopId, String[] orderIds) { + List erpShipWaybills = mapper.selectList( + new LambdaQueryWrapper() + .eq(ErpShipWaybill::getShopId,shopId) + .in(ErpShipWaybill::getOrderId, Arrays.stream(orderIds).toList())); + return erpShipWaybills; + } + + @Transactional + @Override + public ResultVo printSuccess(Long shopId, String[] orderIds) { + List erpShipWaybills = mapper.selectList( + new LambdaQueryWrapper() + .eq(ErpShipWaybill::getShopId,shopId) + .in(ErpShipWaybill::getOrderId, Arrays.stream(orderIds).toList())); + if(erpShipWaybills!=null){ + for (var w : erpShipWaybills){ + if(w.getStatus()==1) { + ErpShipWaybill update = new ErpShipWaybill(); + update.setId(erpShipWaybills.get(0).getId()); + update.setStatus(2); + update.setUpdateTime(new Date()); + update.setUpdateBy("打印面单"); + mapper.updateById(update); + + // 更新关联订单erp_send_status状态 + OmsDouOrder orderUpdate = new OmsDouOrder(); + orderUpdate.setErpSendStatus(update.getStatus()); + + orderMapper.update(orderUpdate, new LambdaQueryWrapper().eq(OmsDouOrder::getOrderId, w.getOrderId())); + + //TODO: 打印成功之后 加入备货清单 采用kafka推送消息处理 + + // 打印完成,通知备货 + kafkaTemplate.send(MqType.SHIP_STOCK_UP_MQ, JSONObject.toJSONString(MqMessage.build(w.getShopId(), w.getOrderId()))); + } + } + } + return ResultVo.success(); + } + + @Transactional + @Override + public ResultVo pushShipSend(Long shopId, String[] orderIds) { + List erpShipWaybills = mapper.selectList( + new LambdaQueryWrapper() + .eq(ErpShipWaybill::getShopId,shopId) + .in(ErpShipWaybill::getOrderId, Arrays.stream(orderIds).toList())); + if(erpShipWaybills!=null){ + for (var w : erpShipWaybills){ + if(w.getStatus() > 0 && w.getStatus()<3) { + ErpShipWaybill update = new ErpShipWaybill(); + update.setId(erpShipWaybills.get(0).getId()); + update.setStatus(3);// 已发货 + update.setUpdateTime(new Date()); + update.setUpdateBy("电子面单发货"); + mapper.updateById(update); + + // 更新关联订单erp_send_status状态 + OmsDouOrder orderUpdate = new OmsDouOrder(); + orderUpdate.setErpSendStatus(update.getStatus()); + + orderMapper.update(orderUpdate, new LambdaQueryWrapper().eq(OmsDouOrder::getOrderId, w.getOrderId())); + + // 更新erp_sale_order发货状态(controller层采用kafka推送消息处理) + // 发货完成,通知发货出库 + kafkaTemplate.send(MqType.SHIP_SEND_MQ, JSONObject.toJSONString(MqMessage.build(w.getShopId(),w.getOrderId(),w.getLogisticsCode(),w.getWaybillCode()))); + } + } + } + return ResultVo.success(); + } +} + + + + diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouOrderServiceImpl.java b/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouOrderServiceImpl.java index 78110e22..7180e1d2 100644 --- a/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouOrderServiceImpl.java +++ b/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouOrderServiceImpl.java @@ -65,10 +65,18 @@ public class OmsDouOrderServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper() .eq(bo.getShopId()!=null,OmsDouOrder::getShopId,bo.getShopId()) .eq(StringUtils.hasText(bo.getOrderId()),OmsDouOrder::getOrderId,bo.getOrderId()) - .eq(StringUtils.hasText(bo.getOrderStatus()),OmsDouOrder::getOrderStatus,bo.getOrderStatus()) + .eq(bo.getOrderStatus()!=null,OmsDouOrder::getOrderStatus,bo.getOrderStatus()) .ge(StringUtils.hasText(bo.getStartTime()),OmsDouOrder::getCreateTime, startTimeStamp) .le(StringUtils.hasText(bo.getEndTime()),OmsDouOrder::getCreateTime,endTimeStamp) ; + if(bo.getErpSendStatus()!=null){ + if(bo.getErpSendStatus()==-1) { + queryWrapper.lt(OmsDouOrder::getErpSendStatus,3); + }else { + queryWrapper.eq(OmsDouOrder::getErpSendStatus, bo.getErpSendStatus()); + } + } + pageQuery.setOrderByColumn("create_time"); pageQuery.setIsAsc("desc"); Page taoGoodsPage = mapper.selectPage(pageQuery.build(), queryWrapper); @@ -82,7 +90,20 @@ public class OmsDouOrderServiceImpl extends ServiceImpl().eq(OmsDouOrderItem::getParentOrderId,order.getOrderId()))); + } + return order; + } + + @Override + public OmsDouOrder queryDetailByOrderId(String orderId) { + var orders = mapper.selectList(new LambdaQueryWrapper().eq(OmsDouOrder::getOrderId,orderId)); + if(orders!=null&&orders.size()>0){ + orders.get(0).setItems(itemMapper.selectList(new LambdaQueryWrapper().eq(OmsDouOrderItem::getParentOrderId,orders.get(0).getOrderId()))); + return orders.get(0); + }else return null; } @Transactional diff --git a/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouWaybillAccountServiceImpl.java b/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouWaybillAccountServiceImpl.java new file mode 100644 index 00000000..5a1efc94 --- /dev/null +++ b/open-api/dou-api/src/main/java/com/qihang/dou/service/impl/OmsDouWaybillAccountServiceImpl.java @@ -0,0 +1,22 @@ +package com.qihang.dou.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qihang.dou.domain.OmsDouWaybillAccount; +import com.qihang.dou.service.OmsDouWaybillAccountService; +import com.qihang.dou.mapper.OmsDouWaybillAccountMapper; +import org.springframework.stereotype.Service; + +/** +* @author TW +* @description 针对表【oms_dou_waybill_account(抖店电子面单账户信息表)】的数据库操作Service实现 +* @createDate 2024-06-19 14:35:56 +*/ +@Service +public class OmsDouWaybillAccountServiceImpl extends ServiceImpl + implements OmsDouWaybillAccountService{ + +} + + + + diff --git a/open-api/dou-api/src/main/resources/mapper/ErpShipWaybillMapper.xml b/open-api/dou-api/src/main/resources/mapper/ErpShipWaybillMapper.xml new file mode 100644 index 00000000..3ce893de --- /dev/null +++ b/open-api/dou-api/src/main/resources/mapper/ErpShipWaybillMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + id,order_id,shop_id, + shop_type,waybill_code,logistics_code, + print_data,status,create_time, + create_by,update_time,update_by + + diff --git a/open-api/dou-api/src/main/resources/mapper/OmsDouOrderMapper.xml b/open-api/dou-api/src/main/resources/mapper/OmsDouOrderMapper.xml index 90c73fa1..13acfab3 100644 --- a/open-api/dou-api/src/main/resources/mapper/OmsDouOrderMapper.xml +++ b/open-api/dou-api/src/main/resources/mapper/OmsDouOrderMapper.xml @@ -86,6 +86,9 @@ + + + @@ -115,6 +118,6 @@ ship_time,shop_cost_amount,platform_cost_amount, shop_id,shop_name,total_promotion_amount, user_tag_ui,s_shop_id,pull_time, - last_pull_time,audit_status,audit_time + last_pull_time,audit_status,audit_time,erp_send_company,erp_send_code,erp_send_status diff --git a/open-api/dou-api/src/main/resources/mapper/OmsDouWaybillAccountMapper.xml b/open-api/dou-api/src/main/resources/mapper/OmsDouWaybillAccountMapper.xml new file mode 100644 index 00000000..656574a2 --- /dev/null +++ b/open-api/dou-api/src/main/resources/mapper/OmsDouWaybillAccountMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,shop_id,seller_id, + company,company_type,amount, + allocated_quantity,cancelled_quantity,recycled_quantity, + netsite_code,netsite_name,province_name, + city_name,district_name,street_name, + detail_address,name,mobile, + phone,is_show + + diff --git a/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShop.java b/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShop.java index d2b3a014..9f21fabe 100644 --- a/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShop.java +++ b/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShop.java @@ -2,6 +2,9 @@ package com.qihang.jd.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShop implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Long id; /** diff --git a/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShopPlatform.java b/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShopPlatform.java index 7a0d51e9..4ae9e0b8 100644 --- a/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShopPlatform.java +++ b/open-api/jd-api/src/main/java/com/qihang/jd/domain/SShopPlatform.java @@ -2,6 +2,9 @@ package com.qihang.jd.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShopPlatform implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/jd-api/src/main/java/com/qihang/jd/domain/SysShopPullLasttime.java b/open-api/jd-api/src/main/java/com/qihang/jd/domain/SysShopPullLasttime.java index 87c01a18..0adbc8aa 100644 --- a/open-api/jd-api/src/main/java/com/qihang/jd/domain/SysShopPullLasttime.java +++ b/open-api/jd-api/src/main/java/com/qihang/jd/domain/SysShopPullLasttime.java @@ -1,5 +1,7 @@ package com.qihang.jd.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; @@ -15,6 +17,7 @@ public class SysShopPullLasttime implements Serializable { /** * */ + @TableId(value = "id", type = IdType.AUTO) private Long id; /** diff --git a/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysPlatform.java b/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysPlatform.java index 098642ca..c90d684c 100644 --- a/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysPlatform.java +++ b/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysPlatform.java @@ -12,6 +12,7 @@ public class SysPlatform implements Serializable { /** * */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysShop.java b/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysShop.java index 01c247ce..7b50558d 100644 --- a/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysShop.java +++ b/open-api/kwai-api/src/main/java/com/qihang/kwai/domain/SysShop.java @@ -12,6 +12,7 @@ public class SysShop implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShop.java b/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShop.java index be396999..76ae77e0 100644 --- a/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShop.java +++ b/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShop.java @@ -2,6 +2,9 @@ package com.qihang.pdd.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShop implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShopPlatform.java b/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShopPlatform.java index 8c8ba84b..add7473b 100644 --- a/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShopPlatform.java +++ b/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SShopPlatform.java @@ -2,6 +2,9 @@ package com.qihang.pdd.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShopPlatform implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SysShopPullLasttime.java b/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SysShopPullLasttime.java index bb965239..bc327d37 100644 --- a/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SysShopPullLasttime.java +++ b/open-api/pdd-api/src/main/java/com/qihang/pdd/domain/SysShopPullLasttime.java @@ -1,5 +1,7 @@ package com.qihang.pdd.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serializable; @@ -15,6 +17,7 @@ public class SysShopPullLasttime implements Serializable { /** * */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShop.java b/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShop.java index e508163d..1c1350ba 100644 --- a/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShop.java +++ b/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShop.java @@ -2,6 +2,9 @@ package com.qihang.tao.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShop implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Long id; /** diff --git a/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShopPlatform.java b/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShopPlatform.java index f7008ab7..53d6b2bd 100644 --- a/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShopPlatform.java +++ b/open-api/tao-api/src/main/java/com/qihang/tao/domain/SShopPlatform.java @@ -2,6 +2,9 @@ package com.qihang.tao.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShopPlatform implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/tao-api/src/main/java/com/qihang/tao/domain/SysShopPullLasttime.java b/open-api/tao-api/src/main/java/com/qihang/tao/domain/SysShopPullLasttime.java index 3284f7ab..d4bc692e 100644 --- a/open-api/tao-api/src/main/java/com/qihang/tao/domain/SysShopPullLasttime.java +++ b/open-api/tao-api/src/main/java/com/qihang/tao/domain/SysShopPullLasttime.java @@ -1,5 +1,7 @@ package com.qihang.tao.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; @@ -15,6 +17,7 @@ public class SysShopPullLasttime implements Serializable { /** * */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShop.java b/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShop.java index 4a45cabb..f883a4d9 100644 --- a/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShop.java +++ b/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShop.java @@ -2,6 +2,9 @@ package com.qihang.wei.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShop implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Long id; /** diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopPlatform.java b/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopPlatform.java index 79846709..d80bfbdf 100644 --- a/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopPlatform.java +++ b/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopPlatform.java @@ -2,6 +2,9 @@ package com.qihang.wei.domain; import java.io.Serializable; import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -13,6 +16,7 @@ public class SShopPlatform implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopSetting.java b/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopSetting.java index bf2019d8..02da96fb 100644 --- a/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopSetting.java +++ b/open-api/wei-api/src/main/java/com/qihang/wei/domain/SShopSetting.java @@ -1,6 +1,9 @@ package com.qihang.wei.domain; import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; /** @@ -12,6 +15,7 @@ public class SShopSetting implements Serializable { /** * 主键 */ + @TableId(value = "id", type = IdType.AUTO) private Integer id; /** diff --git a/vue/src/api/dou/ewaybill.js b/vue/src/api/dou/ewaybill.js index faa6e2fd..8eb8f097 100644 --- a/vue/src/api/dou/ewaybill.js +++ b/vue/src/api/dou/ewaybill.js @@ -2,7 +2,7 @@ import request from '@/utils/request' // 获取电子面单账户list export function getWaybillAccountList(query) { return request({ - url: '/api/pdd-api/ewaybill/get_waybill_account_list', + url: '/api/dou-api/ewaybill/get_waybill_account_list', method: 'get', params: query }) @@ -12,7 +12,7 @@ export function getWaybillAccountList(query) { // 更新电子面单账户 export function pullWaybillAccount(data) { return request({ - url: '/api/pdd-api/ewaybill/pull_waybill_account', + url: '/api/dou-api/ewaybill/pull_waybill_account', method: 'post', data: data }) @@ -21,7 +21,7 @@ export function pullWaybillAccount(data) { // 取号 export function getWaybillCode(data) { return request({ - url: '/api/pdd-api/ewaybill/get_waybill_code', + url: '/api/dou-api/ewaybill/get_waybill_code', method: 'post', data: data }) @@ -30,7 +30,7 @@ export function getWaybillCode(data) { // 获取打印的数据 export function getWaybillPrintData(data) { return request({ - url: '/api/pdd-api/ewaybill/get_print_data', + url: '/api/dou-api/ewaybill/get_print_data', method: 'post', data: data }) @@ -46,7 +46,7 @@ export function pushWaybillPrintSuccess(data) { } export function pushShipSend(data) { return request({ - url: '/api/pdd-api/ewaybill/push_ship_send', + url: '/api/dou-api/ewaybill/push_ship_send', method: 'post', data: data }) diff --git a/vue/src/views/shop/dou/ewaybill/index.vue b/vue/src/views/shop/dou/ewaybill/index.vue index 17991577..f3003c96 100644 --- a/vue/src/views/shop/dou/ewaybill/index.vue +++ b/vue/src/views/shop/dou/ewaybill/index.vue @@ -4,7 +4,7 @@ 取号 + >电子面单取号 @@ -62,7 +62,7 @@ icon="el-icon-printer" size="mini" @click="handlePrintEwaybill" - >打印电子面单 + >电子面单打印 发货 + >电子面单发货 @@ -82,18 +82,18 @@ - + + + + - - - - - - - - + + + - {{ item.cpCode }} - {{item.branchName}}:{{item.quantity}} + {{ item.company }} + {{item.netsiteName}}:{{item.amount}} 更新电子面单账户信息 @@ -179,14 +186,14 @@ import '@riophae/vue-treeselect/dist/vue-treeselect.css' import {listShop} from "@/api/shop/shop"; -import {listOrder} from "@/api/pdd/order"; +import {listOrder} from "@/api/dou/order"; import { getWaybillAccountList, pullWaybillAccount, getWaybillCode, getWaybillPrintData, pushWaybillPrintSuccess -} from "@/api/pdd/ewaybill"; +} from "@/api/dou/ewaybill"; export default { name: "printDou", @@ -213,9 +220,8 @@ export default { queryParams: { pageNum: 1, pageSize: 10, - orderStatus: 1, - refundStatus: 1, - erpSendStatus:0, + orderStatus: 2, + erpSendStatus:-1, shopId: null }, // 打印参数 @@ -236,7 +242,7 @@ export default { }, created() { this.openWs() - listShop({platform: 5}).then(response => { + listShop({platform: 6}).then(response => { this.shopList = response.rows; if (this.shopList && this.shopList.length > 0) { this.queryParams.shopId = this.shopList[0].id @@ -279,7 +285,7 @@ export default { }, // 多选框选中数据 handleSelectionChange(selection) { - this.ids = selection.map(item => item.orderSn) + this.ids = selection.map(item => item.orderId) this.single = selection.length !== 1 this.multiple = !selection.length },