运营端修改

This commit is contained in:
dev 2025-04-08 18:55:30 +08:00
parent 022f73dd9e
commit e3c2a12a19
62 changed files with 1699 additions and 224 deletions

2
.gitignore vendored
View File

@ -45,3 +45,5 @@ nbdist/
!*/build/*.xml !*/build/*.xml
.flattened-pom.xml .flattened-pom.xml
.lingma

View File

@ -1,12 +1,23 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="asinkj-gateway" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="asinkj-gateway" type="docker-deploy" factoryName="dockerfile" server-name="阿里云">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="asinkj/asinkj-gateway:2.2.2" /> <option name="imageTag" value="asinkj/asinkj-gateway:2.2.2" />
<option name="buildOnly" value="true" /> <option name="containerName" value="asinkj-gateway" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="--network 1panel-network" />
<option name="sourceFilePath" value="asinkj-gateway/Dockerfile" /> <option name="sourceFilePath" value="asinkj-gateway/Dockerfile" />
</settings> </settings>
</deployment> </deployment>
<method v="2" /> <method v="2">
<option name="Maven.BeforeRunTask" enabled="true" file="F:\Asinkj-Cloud\asinkj-gateway/pom.xml" goal="package" />
</method>
</configuration> </configuration>
</component> </component>

View File

@ -1,12 +1,23 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="asinkj-job" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="asinkj-job" type="docker-deploy" factoryName="dockerfile" server-name="阿里云">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="asinkj/asinkj-job:2.2.2" /> <option name="imageTag" value="asinkj/asinkj-job:2.2.2" />
<option name="buildOnly" value="true" /> <option name="containerName" value="asinkj-job" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="9203" />
<option name="hostPort" value="9203" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="--network 1panel-network" />
<option name="sourceFilePath" value="asinkj-modules/asinkj-job/Dockerfile" /> <option name="sourceFilePath" value="asinkj-modules/asinkj-job/Dockerfile" />
</settings> </settings>
</deployment> </deployment>
<method v="2" /> <method v="2">
<option name="Maven.BeforeRunTask" enabled="true" file="$PROJECT_DIR$/asinkj-modules/asinkj-job/pom.xml" goal="package -Pprod" />
</method>
</configuration> </configuration>
</component> </component>

View File

@ -1,12 +1,23 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="asinkj-resource" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="asinkj-resource" type="docker-deploy" factoryName="dockerfile" server-name="阿里云">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="asinkj/asinkj-resource:2.2.2" /> <option name="imageTag" value="asinkj/asinkj-resource:2.2.2" />
<option name="buildOnly" value="true" /> <option name="containerName" value="asinkj-resource" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="9204" />
<option name="hostPort" value="9204" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="--network 1panel-network" />
<option name="sourceFilePath" value="asinkj-modules/asinkj-resource/Dockerfile" /> <option name="sourceFilePath" value="asinkj-modules/asinkj-resource/Dockerfile" />
</settings> </settings>
</deployment> </deployment>
<method v="2" /> <method v="2">
<option name="Maven.BeforeRunTask" enabled="true" file="F:\Asinkj-Cloud\asinkj-modules\asinkj-resource/pom.xml" goal="package" />
</method>
</configuration> </configuration>
</component> </component>

View File

@ -1,12 +1,27 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="asinkj-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="asinkj-snailjob-server" type="docker-deploy" factoryName="dockerfile" server-name="阿里云">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="asinkj/asinkj-snailjob-server:2.2.2" /> <option name="imageTag" value="asinkj/asinkj-snailjob-server:2.2.2" />
<option name="buildOnly" value="true" /> <option name="containerName" value="asinkj-snailjob-server" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8800" />
<option name="hostPort" value="8800" />
</DockerPortBindingImpl>
<DockerPortBindingImpl>
<option name="containerPort" value="17888" />
<option name="hostPort" value="17888" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="--network 1panel-network" />
<option name="sourceFilePath" value="asinkj-visual/asinkj-snailjob-server/Dockerfile" /> <option name="sourceFilePath" value="asinkj-visual/asinkj-snailjob-server/Dockerfile" />
</settings> </settings>
</deployment> </deployment>
<method v="2" /> <method v="2">
<option name="Maven.BeforeRunTask" enabled="true" file="F:\Asinkj-Cloud\asinkj-visual\asinkj-snailjob-server/pom.xml" goal="package" />
</method>
</configuration> </configuration>
</component> </component>

View File

@ -1,12 +1,23 @@
<component name="ProjectRunConfigurationManager"> <component name="ProjectRunConfigurationManager">
<configuration default="false" name="asinkj-system" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> <configuration default="false" name="asinkj-system" type="docker-deploy" factoryName="dockerfile" server-name="阿里云">
<deployment type="dockerfile"> <deployment type="dockerfile">
<settings> <settings>
<option name="imageTag" value="asinkj/asinkj-system:2.2.2" /> <option name="imageTag" value="asinkj/asinkj-system:2.2.2" />
<option name="buildOnly" value="true" /> <option name="containerName" value="asinkj-system" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="9201" />
<option name="hostPort" value="9201" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="--network 1panel-network" />
<option name="sourceFilePath" value="asinkj-modules/asinkj-system/Dockerfile" /> <option name="sourceFilePath" value="asinkj-modules/asinkj-system/Dockerfile" />
</settings> </settings>
</deployment> </deployment>
<method v="2" /> <method v="2">
<option name="Maven.BeforeRunTask" enabled="true" file="F:\Asinkj-Cloud\asinkj-modules\asinkj-system/pom.xml" goal="package" />
</method>
</configuration> </configuration>
</component> </component>

View File

@ -1,10 +1,10 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds FROM amazoncorretto:17.0.14
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native
LABEL maintainer="Shuo Hu " LABEL maintainer="Shuo Hu "
ENV TZ=Asia/Shanghai
RUN mkdir -p /asinkj/auth/logs \ RUN mkdir -p /asinkj/auth/logs \
/asinkj/auth/temp \ /asinkj/auth/temp \
/asinkj/skywalking/agent /asinkj/skywalking/agent
@ -18,7 +18,7 @@ EXPOSE ${SERVER_PORT}
ADD ./target/asinkj-auth.jar ./app.jar ADD ./target/asinkj-auth.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
-Dspring.profiles.active='prod' \ # 动态读取环境变量 -Dspring.profiles.active="prod" \
#-Dskywalking.agent.service_name=asinkj-auth \ #-Dskywalking.agent.service_name=asinkj-auth \
#-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \ #-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \

View File

@ -0,0 +1,27 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
#FROM bellsoft/liberica-openjdk-debian:17.0.11-cds
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native
FROM amazoncorretto:17.0.14
LABEL maintainer="Shuo Hu "
RUN mkdir -p /asinkj/amz/logs \
/asinkj/amz/temp \
/asinkj/skywalking/agent
WORKDIR /asinkj/amz
ENV SERVER_PORT=9404 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}
ADD ./target/asinkj-amz.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
-Dspring.profiles.active="prod" \
#-Dskywalking.agent.service_name=asinkj-auth \
#-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \
-jar app.jar

View File

@ -2,21 +2,16 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.asinkj</groupId> <groupId>org.asinkj</groupId>
<artifactId>asinkj-cloud-plus</artifactId> <artifactId>asinkj-biz</artifactId>
<version>2.2.2</version> <version>${revision}</version>
<relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>asinkj-amz</artifactId> <artifactId>asinkj-amz</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.asinkj</groupId> <groupId>org.asinkj</groupId>
@ -113,8 +108,25 @@
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> </project>

View File

@ -64,7 +64,7 @@ public class BizInquiryRequestController extends BaseController {
*/ */
@SaCheckPermission("amz:inquiryRequest:list") @SaCheckPermission("amz:inquiryRequest:list")
@GetMapping("/create/{destination}/{channelId}/{date}") @GetMapping("/create/{destination}/{channelId}/{date}")
public R<Void> createWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination, public R<String> createWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination,
@PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId, @PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId,
@PathVariable("date") @NotNull(message = "日期不能为空") String date) { @PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizInquiryRequestService.createWithDesAndChannel(destination, channelId,date); return bizInquiryRequestService.createWithDesAndChannel(destination, channelId,date);

View File

@ -46,7 +46,7 @@ public class BizLogisticsChannelController extends BaseController {
return bizLogisticsChannelService.queryPageList(bo, pageQuery); return bizLogisticsChannelService.queryPageList(bo, pageQuery);
} }
@SaCheckPermission("amz:logisticsChannel:list") // @SaCheckPermission("amz:logisticsChannel:list")
@GetMapping("/list/all") @GetMapping("/list/all")
public TableDataInfo<BizLogisticsChannelVo> listAll() { public TableDataInfo<BizLogisticsChannelVo> listAll() {
return bizLogisticsChannelService.queryListAll(); return bizLogisticsChannelService.queryListAll();

View File

@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import org.asinkj.common.excel.core.ExcelResult;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.asinkj.common.idempotent.annotation.RepeatSubmit; import org.asinkj.common.idempotent.annotation.RepeatSubmit;
@ -21,6 +23,7 @@ import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo;
import org.asinkj.amz.domain.bo.BizLogisticsOrderDetailBo; import org.asinkj.amz.domain.bo.BizLogisticsOrderDetailBo;
import org.asinkj.amz.service.IBizLogisticsOrderDetailService; import org.asinkj.amz.service.IBizLogisticsOrderDetailService;
import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/** /**
* 物流订单明细按箱子维度存储 * 物流订单明细按箱子维度存储
@ -57,6 +60,16 @@ public class BizLogisticsOrderDetailController extends BaseController {
ExcelUtil.exportExcel(list, "物流订单明细(按箱子维度存储)", BizLogisticsOrderDetailVo.class, response); ExcelUtil.exportExcel(list, "物流订单明细(按箱子维度存储)", BizLogisticsOrderDetailVo.class, response);
} }
@SaCheckPermission("amz:logisticsOrderDetail:export")
@Log(title = "物流订单明细(按箱子维度存储)", businessType = BusinessType.EXPORT)
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
bizLogisticsOrderDetailService.importExcel(file.getInputStream());
return R.ok();
}
/** /**
* 获取物流订单明细按箱子维度存储详细信息 * 获取物流订单明细按箱子维度存储详细信息
* *

View File

@ -111,6 +111,16 @@ public class BizLogisticsQuoteController extends BaseController {
} }
@SaCheckPermission("amz:logisticsQuote:add")
@Log(title = "生成报价建议", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/check-quote-price")
public R<Boolean> checkQuotePrice(@Validated(AddGroup.class) @RequestBody BizLogisticsQuoteMostBo bo) {
return R.ok(bizLogisticsQuoteService.checkPriceQuoteByBo(bo));
}
@GetMapping("/today-quote-status") @GetMapping("/today-quote-status")
@RepeatSubmit() @RepeatSubmit()
public R<List<InquiryQuoteStatusDTO>> getTodayQuoteStatus() { public R<List<InquiryQuoteStatusDTO>> getTodayQuoteStatus() {

View File

@ -118,4 +118,17 @@ public class BizShipmentPlanController extends BaseController {
return R.ok(bizShipmentPlanService.getQuote(destination,channel)); return R.ok(bizShipmentPlanService.getQuote(destination,channel));
} }
/**
* 获取货件计划详细信息
*
*
*/
@SaCheckPermission("amz:shipmentPlan:query")
@GetMapping("/take-today-amz-plan-data")
public R<Void> takeTodayAmzPlanData() {
bizShipmentPlanService.takeTodayAmzPlanData();
return R.ok();
}
} }

View File

@ -27,7 +27,7 @@ import org.asinkj.common.mybatis.core.page.TableDataInfo;
* 前端访问路由地址为:/amz/shipmentTracking * 前端访问路由地址为:/amz/shipmentTracking
* *
* @author shuo hu * @author shuo hu
* @date 2025-03-20 * @date 2025-04-03
*/ */
@Validated @Validated
@RequiredArgsConstructor @RequiredArgsConstructor

View File

@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import org.asinkj.amz.service.LingxinCallback;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.asinkj.common.idempotent.annotation.RepeatSubmit; import org.asinkj.common.idempotent.annotation.RepeatSubmit;
@ -135,12 +136,29 @@ public class SysAmazonStoreController extends BaseController {
return R.ok(); return R.ok();
} }
@SaCheckPermission("amz:amazonStore:remove")
@Log(title = "亚马逊STA", businessType = BusinessType.OTHER)
@GetMapping("/amz-sta/{startDate}/{endDate}")
public R<Void> getAmzStaToken(@PathVariable String startDate, @PathVariable String endDate) {
try {
sysAmazonStoreService.pullAmzStaData(startDate, endDate, new LingxinCallback() {
@Override
public void onFinished(String result, int status) {
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
return R.ok();
}
@SaCheckPermission("amz:amazonStore:remove") @SaCheckPermission("amz:amazonStore:remove")
@Log(title = "亚马逊FBAtest", businessType = BusinessType.OTHER) @Log(title = "亚马逊FBAtest", businessType = BusinessType.OTHER)
@GetMapping("/test") @GetMapping("/test")
public R<Void> testAmzFbaToken() { public R<Void> testAmzFbaToken() {
try { try {
sysAmazonStoreService.testAmazonData(); sysAmazonStoreService.pullAmzBoxData2();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@ -4,6 +4,8 @@ import org.asinkj.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
@ -51,7 +53,7 @@ public class BizLogisticsQuote extends TenantEntity {
/** /**
* 基础价格 * 基础价格
*/ */
private Long price; private BigDecimal price;
/** /**
* 时效单位 * 时效单位

View File

@ -6,8 +6,9 @@ import org.asinkj.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial; import java.io.Serial;
@ -40,6 +41,11 @@ public class BizShipmentPlan extends TenantEntity {
*/ */
private String shipmentId; private String shipmentId;
/**
* 货件唯一编号
*/
private String shipmentUniqueId;
/** /**
* 货件名称 * 货件名称
*/ */
@ -83,7 +89,7 @@ public class BizShipmentPlan extends TenantEntity {
/** /**
* 同步时间 * 同步时间
*/ */
private Date syncTime; private Date receivingTime;
/** /**
* 计划发货日期 * 计划发货日期
@ -127,11 +133,32 @@ public class BizShipmentPlan extends TenantEntity {
*/ */
private String isSta; private String isSta;
/**
* box_quantity
* box_size
* logistics_weight
* set_total
*/
private Long boxQuantity;
private String boxSize;
private BigDecimal logisticsWeight;
private Long setTotal;
/** /**
* 删除标记 * 删除标记
*/ */
@TableLogic @TableLogic
private String delFlag; private String delFlag;
/**
* sta 计划ID
*/
private String inboundPlanId;
} }

View File

@ -11,7 +11,7 @@ import java.io.Serial;
* 物流追踪对象 biz_shipment_tracking * 物流追踪对象 biz_shipment_tracking
* *
* @author shuo hu * @author shuo hu
* @date 2025-03-20 * @date 2025-04-03
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ -47,5 +47,65 @@ public class BizShipmentTracking extends TenantEntity {
@TableLogic @TableLogic
private String delFlag; private String delFlag;
/**
* 本地箱子编号
*/
private String localBoxId;
/**
* 包裹唯一标识
*/
private String packageId;
/**
* 总数量
*/
private Long total;
/**
* 重量
*/
private Long weight;
/**
* 重量单位
*/
private String weightUnit;
/**
* 长度
*/
private Long length;
/**
* 宽度
*/
private Long width;
/**
* 高度
*/
private Long height;
/**
* 尺寸单位
*/
private String lengthUnit;
/**
* 箱子展示名称
*/
private String boxName;
/**
* 货件唯一编号
*/
private String shipmentUniqueId;
/**
* STA任务编号
*/
private String inboundPlanId;
} }

View File

@ -12,6 +12,7 @@ import org.asinkj.common.core.validate.EditGroup;
import org.asinkj.common.mybatis.core.domain.BaseEntity; import org.asinkj.common.mybatis.core.domain.BaseEntity;
import java.io.Serial; import java.io.Serial;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
/** /**
@ -55,7 +56,7 @@ public class BizLogisticsQuoteMostBo extends BaseEntity {
* 基础价格 * 基础价格
*/ */
@NotNull(message = "基础价格不能为空", groups = { AddGroup.class, EditGroup.class }) @NotNull(message = "基础价格不能为空", groups = { AddGroup.class, EditGroup.class })
private Long price; private BigDecimal price;
/** /**
* 时效单位 * 时效单位

View File

@ -1,5 +1,6 @@
package org.asinkj.amz.domain.bo; package org.asinkj.amz.domain.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import org.asinkj.amz.domain.BizShipmentPlan; import org.asinkj.amz.domain.BizShipmentPlan;
import org.asinkj.asinking.entity.FbaShipmentApiResponse; import org.asinkj.asinking.entity.FbaShipmentApiResponse;
import org.asinkj.common.mybatis.core.domain.BaseEntity; import org.asinkj.common.mybatis.core.domain.BaseEntity;
@ -9,6 +10,8 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@ -93,7 +96,7 @@ public class BizShipmentPlanBo extends BaseEntity {
* 同步时间 * 同步时间
*/ */
@NotNull(message = "同步时间不能为空", groups = { AddGroup.class, EditGroup.class }) @NotNull(message = "同步时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date syncTime; private Date receivingTime;
/** /**
* 计划发货日期 * 计划发货日期
@ -144,4 +147,16 @@ public class BizShipmentPlanBo extends BaseEntity {
private String isSta; private String isSta;
@ExcelProperty(value = "箱子数量")
private Long boxQuantity;
@ExcelProperty(value = "箱子尺寸")
private String boxSize;
@ExcelProperty(value = "总的物流商计重")
private BigDecimal logisticsWeight;
@ExcelProperty(value = "套数(系统中的申报量)")
private Long setTotal;
} }

View File

@ -13,7 +13,7 @@ import jakarta.validation.constraints.*;
* 物流追踪业务对象 biz_shipment_tracking * 物流追踪业务对象 biz_shipment_tracking
* *
* @author shuo hu * @author shuo hu
* @date 2025-03-20 * @date 2025-04-03
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ -44,5 +44,77 @@ public class BizShipmentTrackingBo extends BaseEntity {
@NotBlank(message = "物流单号不能为空", groups = { AddGroup.class, EditGroup.class }) @NotBlank(message = "物流单号不能为空", groups = { AddGroup.class, EditGroup.class })
private String trackingNumber; private String trackingNumber;
/**
* 本地箱子编号
*/
@NotBlank(message = "本地箱子编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String localBoxId;
/**
* 包裹唯一标识
*/
@NotBlank(message = "包裹唯一标识不能为空", groups = { AddGroup.class, EditGroup.class })
private String packageId;
/**
* 总数量
*/
@NotNull(message = "总数量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long total;
/**
* 重量
*/
@NotNull(message = "重量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long weight;
/**
* 重量单位
*/
@NotBlank(message = "重量单位不能为空", groups = { AddGroup.class, EditGroup.class })
private String weightUnit;
/**
* 长度
*/
@NotNull(message = "长度不能为空", groups = { AddGroup.class, EditGroup.class })
private Long length;
/**
* 宽度
*/
@NotNull(message = "宽度不能为空", groups = { AddGroup.class, EditGroup.class })
private Long width;
/**
* 高度
*/
@NotNull(message = "高度不能为空", groups = { AddGroup.class, EditGroup.class })
private Long height;
/**
* 尺寸单位
*/
@NotBlank(message = "尺寸单位不能为空", groups = { AddGroup.class, EditGroup.class })
private String lengthUnit;
/**
* 箱子展示名称
*/
@NotBlank(message = "箱子展示名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String boxName;
/**
* 货件唯一编号
*/
@NotBlank(message = "货件唯一编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String shipmentUniqueId;
/**
* STA任务编号
*/
@NotBlank(message = "STA任务编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String inboundPlanId;
} }

View File

@ -1,6 +1,10 @@
package org.asinkj.amz.domain.vo; package org.asinkj.amz.domain.vo;
import java.util.Date; import java.util.Date;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.BooleanEnum;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import org.asinkj.amz.domain.BizLogisticsOrderDetail; import org.asinkj.amz.domain.BizLogisticsOrderDetail;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
@ -25,6 +29,7 @@ import java.util.Date;
@Data @Data
@ExcelIgnoreUnannotated @ExcelIgnoreUnannotated
@AutoMapper(target = BizLogisticsOrderDetail.class) @AutoMapper(target = BizLogisticsOrderDetail.class)
@ContentStyle(locked = BooleanEnum.TRUE)
public class BizLogisticsOrderDetailVo implements Serializable { public class BizLogisticsOrderDetailVo implements Serializable {
@Serial @Serial
@ -42,6 +47,7 @@ public class BizLogisticsOrderDetailVo implements Serializable {
*/ */
@ExcelProperty(value = "订单号") @ExcelProperty(value = "订单号")
// @ExcelDictFormat(readConverterExp = "b=iz_logistics_order.id") // @ExcelDictFormat(readConverterExp = "b=iz_logistics_order.id")
@ContentStyle(locked = BooleanEnum.TRUE)
private String orderId; private String orderId;
/** /**

View File

@ -71,7 +71,7 @@ public class BizLogisticsOrderVo implements Serializable {
*/ */
@ExcelProperty(value = "物流渠道", converter = ExcelDictConvert.class) @ExcelProperty(value = "物流渠道", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "如=空运/海运/快递等") @ExcelDictFormat(readConverterExp = "如=空运/海运/快递等")
private String logisticsChannel; private String channelName;
/** /**
* 目的地仓库名称或编码 * 目的地仓库名称或编码

View File

@ -1,5 +1,6 @@
package org.asinkj.amz.domain.vo; package org.asinkj.amz.domain.vo;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.annotation.JSONField;
@ -20,7 +21,6 @@ import java.io.Serializable;
import java.util.Date; import java.util.Date;
/** /**
* 货件计划视图对象 biz_shipment_plan * 货件计划视图对象 biz_shipment_plan
* *
@ -105,7 +105,7 @@ public class BizShipmentPlanVo implements Serializable {
* 同步时间 * 同步时间
*/ */
@ExcelProperty(value = "同步时间") @ExcelProperty(value = "同步时间")
private Date syncTime; private Date receivingTime;
/** /**
* 计划发货日期 * 计划发货日期
@ -158,9 +158,26 @@ public class BizShipmentPlanVo implements Serializable {
private String isSta; private String isSta;
@ExcelProperty(value = "箱子数量")
private Long boxNum;
@ExcelProperty(value = "箱子数量")
private Long boxQuantity;
@ExcelProperty(value = "箱子尺寸")
private String boxSize;
@ExcelProperty(value = "总的物流商计重")
private BigDecimal logisticsWeight;
@ExcelProperty(value = "套数(系统中的申报量)")
private Long setTotal;
// 显式添加 Setter即使使用 @Data // 显式添加 Setter即使使用 @Data
public void setShipFromAddress(FbaShipmentApiResponse.Address shipFromAddress) { public void setShipFromAddress(FbaShipmentApiResponse.Address shipFromAddress) {
System.out.printf(String.valueOf(shipToAddress)); // System.out.printf(String.valueOf(shipToAddress));
this.shipFromAddress = shipFromAddress; this.shipFromAddress = shipFromAddress;
} }

View File

@ -18,7 +18,7 @@ import java.util.Date;
* 物流追踪视图对象 biz_shipment_tracking * 物流追踪视图对象 biz_shipment_tracking
* *
* @author shuo hu * @author shuo hu
* @date 2025-03-20 * @date 2025-04-03
*/ */
@Data @Data
@ExcelIgnoreUnannotated @ExcelIgnoreUnannotated
@ -52,5 +52,77 @@ public class BizShipmentTrackingVo implements Serializable {
@ExcelProperty(value = "物流单号") @ExcelProperty(value = "物流单号")
private String trackingNumber; private String trackingNumber;
/**
* 本地箱子编号
*/
@ExcelProperty(value = "本地箱子编号")
private String localBoxId;
/**
* 包裹唯一标识
*/
@ExcelProperty(value = "包裹唯一标识")
private String packageId;
/**
* 总数量
*/
@ExcelProperty(value = "总数量")
private Long total;
/**
* 重量
*/
@ExcelProperty(value = "重量")
private Long weight;
/**
* 重量单位
*/
@ExcelProperty(value = "重量单位")
private String weightUnit;
/**
* 长度
*/
@ExcelProperty(value = "长度")
private Long length;
/**
* 宽度
*/
@ExcelProperty(value = "宽度")
private Long width;
/**
* 高度
*/
@ExcelProperty(value = "高度")
private Long height;
/**
* 尺寸单位
*/
@ExcelProperty(value = "尺寸单位")
private String lengthUnit;
/**
* 箱子展示名称
*/
@ExcelProperty(value = "箱子展示名称")
private String boxName;
/**
* 货件唯一编号
*/
@ExcelProperty(value = "货件唯一编号")
private String shipmentUniqueId;
/**
* STA任务编号
*/
@ExcelProperty(value = "STA任务编号")
private String inboundPlanId;
} }

View File

@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService; import org.apache.dubbo.config.annotation.DubboService;
import org.asinkj.amz.api.RemoteFBADataService; import org.asinkj.amz.api.RemoteFBADataService;
import org.asinkj.amz.service.ISysAmazonStoreService; import org.asinkj.amz.service.ISysAmazonStoreService;
import org.asinkj.amz.service.LingxinCallback;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -18,6 +19,8 @@ public class RemoteFBADataServiceImpl implements RemoteFBADataService {
@Override @Override
public void pullAmzFbaDataToken(String startDate, String endDate) throws Exception { public void pullAmzFbaDataToken(String startDate, String endDate) throws Exception {
sysAmazonStoreService.pullAmzFBAData(startDate,endDate); sysAmazonStoreService.pullAmzStaData(startDate, endDate, (result, status) -> {
});
} }
} }

View File

@ -30,7 +30,6 @@ public class AddressTypeHandler extends BaseTypeHandler<FbaShipmentApiResponse.A
@Override @Override
public Address getNullableResult(ResultSet rs, String columnName) throws SQLException { public Address getNullableResult(ResultSet rs, String columnName) throws SQLException {
log.info("getNullableResult: {}", columnName);
return parseJsonb(rs.getString(columnName)); return parseJsonb(rs.getString(columnName));
} }
@ -45,7 +44,6 @@ public class AddressTypeHandler extends BaseTypeHandler<FbaShipmentApiResponse.A
} }
private Address parseJsonb(String json) { private Address parseJsonb(String json) {
log.info("parseJsonb: {}", json);
return com.alibaba.fastjson2.JSON.parseObject(json, Address.class); return com.alibaba.fastjson2.JSON.parseObject(json, Address.class);
} }
} }

View File

@ -4,6 +4,8 @@ import org.asinkj.amz.domain.BizLogisticsOrderDetail;
import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo; import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo;
import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
import java.util.List;
/** /**
* 物流订单明细按箱子维度存储Mapper接口 * 物流订单明细按箱子维度存储Mapper接口
* *
@ -12,4 +14,5 @@ import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
*/ */
public interface BizLogisticsOrderDetailMapper extends BaseMapperPlus<BizLogisticsOrderDetail, BizLogisticsOrderDetailVo> { public interface BizLogisticsOrderDetailMapper extends BaseMapperPlus<BizLogisticsOrderDetail, BizLogisticsOrderDetailVo> {
void updateByBoxId(List<BizLogisticsOrderDetailVo> bizLogisticsOrderDetailVos);
} }

View File

@ -8,7 +8,7 @@ import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
* 物流追踪Mapper接口 * 物流追踪Mapper接口
* *
* @author shuo hu * @author shuo hu
* @date 2025-03-20 * @date 2025-04-03
*/ */
public interface BizShipmentTrackingMapper extends BaseMapperPlus<BizShipmentTracking, BizShipmentTrackingVo> { public interface BizShipmentTrackingMapper extends BaseMapperPlus<BizShipmentTracking, BizShipmentTrackingVo> {

View File

@ -69,7 +69,7 @@ public interface IBizInquiryRequestService {
*/ */
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
R<Void> createWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date); R<String> createWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date);
TableDataInfo<BizInquiryRequestVo> queryWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date); TableDataInfo<BizInquiryRequestVo> queryWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date);
} }

View File

@ -6,6 +6,7 @@ import org.asinkj.amz.domain.bo.BizLogisticsOrderDetailBo;
import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery; import org.asinkj.common.mybatis.core.page.PageQuery;
import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -68,4 +69,6 @@ public interface IBizLogisticsOrderDetailService {
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
void updateList(List<BizLogisticsOrderDetailBo> list); void updateList(List<BizLogisticsOrderDetailBo> list);
void importExcel(InputStream inputStream);
} }

View File

@ -8,6 +8,7 @@ import org.asinkj.amz.domain.vo.InquiryQuoteStatusDTO;
import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery; import org.asinkj.common.mybatis.core.page.PageQuery;
import java.math.BigDecimal;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -79,5 +80,7 @@ public interface IBizLogisticsQuoteService {
void insertMostQuoteByBo(BizLogisticsQuoteMostBo bo); void insertMostQuoteByBo(BizLogisticsQuoteMostBo bo);
Boolean checkPriceQuoteByBo(BizLogisticsQuoteMostBo bo);
List<InquiryQuoteStatusDTO> getTodayQuoteStatus(); List<InquiryQuoteStatusDTO> getTodayQuoteStatus();
} }

View File

@ -72,4 +72,6 @@ public interface IBizShipmentPlanService {
List<BizLogisticsQuoteVo> getQuote(@NotNull(message = "主键不能为空") String destination, String channel); List<BizLogisticsQuoteVo> getQuote(@NotNull(message = "主键不能为空") String destination, String channel);
BizShipmentPlanVo queryByfbaShipmentId(String fbaShipmentId); BizShipmentPlanVo queryByfbaShipmentId(String fbaShipmentId);
void takeTodayAmzPlanData();
} }

View File

@ -13,7 +13,7 @@ import java.util.List;
* 物流追踪Service接口 * 物流追踪Service接口
* *
* @author shuo hu * @author shuo hu
* @date 2025-03-20 * @date 2025-04-03
*/ */
public interface IBizShipmentTrackingService { public interface IBizShipmentTrackingService {

View File

@ -1,5 +1,6 @@
package org.asinkj.amz.service; package org.asinkj.amz.service;
import okhttp3.Callback;
import org.asinkj.amz.domain.SysAmazonStore; import org.asinkj.amz.domain.SysAmazonStore;
import org.asinkj.amz.domain.vo.SysAmazonStoreVo; import org.asinkj.amz.domain.vo.SysAmazonStoreVo;
import org.asinkj.amz.domain.bo.SysAmazonStoreBo; import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
@ -74,9 +75,17 @@ public interface ISysAmazonStoreService {
void pullAmzFBAData(String startDate,String endDate) throws Exception; void pullAmzFBAData(String startDate,String endDate) throws Exception;
void pullAmzStaData(String startDate, String endDate, LingxinCallback lingxinCallback);
void pullAmzBoxData() throws Exception;
void pullAmzBoxData2() throws Exception;
void getAmzStoreTokenData() throws Exception; void getAmzStoreTokenData() throws Exception;
void testAmazonData() throws Exception; void testAmazonData() throws Exception;
void testAmazonData2() throws Exception; void testAmazonData2() throws Exception;
// void pullAmzStaData(String startDate, String endDate);
} }

View File

@ -0,0 +1,5 @@
package org.asinkj.amz.service;
public interface LingxinCallback {
void onFinished(String result, int status); // 自定义方法名
}

View File

@ -18,7 +18,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.asinkj.common.satoken.utils.LoginHelper; import org.asinkj.common.satoken.utils.LoginHelper;
import org.asinkj.resource.api.RemoteMessageService;
import org.asinkj.utils.SerialNoGenerator; import org.asinkj.utils.SerialNoGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.asinkj.amz.domain.bo.BizInquiryRequestBo; import org.asinkj.amz.domain.bo.BizInquiryRequestBo;
import org.asinkj.amz.domain.vo.BizInquiryRequestVo; import org.asinkj.amz.domain.vo.BizInquiryRequestVo;
@ -59,6 +61,8 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
@Resource @Resource
private BizLogisticsQuoteMapper logisticsQuoteMapper; private BizLogisticsQuoteMapper logisticsQuoteMapper;
@Resource
private RemoteMessageService remoteMessageService;
/** /**
* 查询物流询价 * 查询物流询价
@ -167,7 +171,7 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
} }
@Override @Override
public R<Void> createWithDesAndChannel(String destination, String channelId,String date) { public R<String> createWithDesAndChannel(String destination, String channelId,String date) {
@ -216,7 +220,9 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
billingRequestMapper.insert(bizInquiryRequest); billingRequestMapper.insert(bizInquiryRequest);
return R.ok(); remoteMessageService.publishMessage(LoginHelper.getUserId(), "您好,您的询价单创建成功。具体询价单号为:"+bizInquiryRequest.getInquiryNo());
return R.ok(bizInquiryRequest.getInquiryNo());
} }
@Override @Override

View File

@ -149,8 +149,10 @@ public class BizLogisticsChannelServiceImpl implements IBizLogisticsChannelServi
public TableDataInfo<BizLogisticsChannelVo> queryListAll() { public TableDataInfo<BizLogisticsChannelVo> queryListAll() {
LambdaQueryWrapper<BizLogisticsChannel> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<BizLogisticsChannel> lqw = Wrappers.lambdaQuery();
lqw.eq(BizLogisticsChannel::getChannelType, "system"); // lqw.eq(BizLogisticsChannel::getChannelType, "system");
return TableDataInfo.build(baseMapper.selectVoList(lqw)); TableDataInfo<BizLogisticsChannelVo> build = TableDataInfo.build(baseMapper.selectVoList(lqw));
return build;
} }
} }

View File

@ -1,8 +1,12 @@
package org.asinkj.amz.service.impl; package org.asinkj.amz.service.impl;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.asinkj.amz.domain.BizLogisticsOrder; import org.asinkj.amz.domain.BizLogisticsOrder;
import org.asinkj.common.core.exception.ServiceException;
import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils; import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.excel.utils.ExcelUtil;
import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery; import org.asinkj.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -17,9 +21,11 @@ import org.asinkj.amz.domain.BizLogisticsOrderDetail;
import org.asinkj.amz.mapper.BizLogisticsOrderDetailMapper; import org.asinkj.amz.mapper.BizLogisticsOrderDetailMapper;
import org.asinkj.amz.service.IBizLogisticsOrderDetailService; import org.asinkj.amz.service.IBizLogisticsOrderDetailService;
import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.stream.Collectors;
/** /**
* 物流订单明细按箱子维度存储Service业务层处理 * 物流订单明细按箱子维度存储Service业务层处理
@ -27,6 +33,7 @@ import java.util.Collection;
* @author shuo hu * @author shuo hu
* @date 2025-03-24 * @date 2025-03-24
*/ */
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class BizLogisticsOrderDetailServiceImpl implements IBizLogisticsOrderDetailService { public class BizLogisticsOrderDetailServiceImpl implements IBizLogisticsOrderDetailService {
@ -156,4 +163,25 @@ public class BizLogisticsOrderDetailServiceImpl implements IBizLogisticsOrderDet
public void updateList(List<BizLogisticsOrderDetailBo> list) { public void updateList(List<BizLogisticsOrderDetailBo> list) {
baseMapper.updateBatchById(MapstructUtils.convert(list, BizLogisticsOrderDetail.class)); baseMapper.updateBatchById(MapstructUtils.convert(list, BizLogisticsOrderDetail.class));
} }
@Override
public void importExcel(InputStream inputStream) {
List<BizLogisticsOrderDetailVo> bizLogisticsOrderDetailVos = ExcelUtil.importExcel(inputStream, BizLogisticsOrderDetailVo.class);
checkData(bizLogisticsOrderDetailVos);
log.info("导入数据条数:{}", JSONObject.toJSONString(bizLogisticsOrderDetailVos));
baseMapper.updateByBoxId(bizLogisticsOrderDetailVos);
}
private void checkData(List<BizLogisticsOrderDetailVo> bizLogisticsOrderDetailVos) {
boolean isAllSame = bizLogisticsOrderDetailVos.stream()
.map(BizLogisticsOrderDetailVo::getFbaShipmentId)
.collect(Collectors.toSet())
.size() == 1;
if (!isAllSame) {
throw new ServiceException("FBA货件编号不一致请检查后重新导入");
}
}
} }

View File

@ -27,6 +27,8 @@ import org.asinkj.amz.domain.vo.BizLogisticsOrderVo;
import org.asinkj.amz.mapper.BizLogisticsOrderMapper; import org.asinkj.amz.mapper.BizLogisticsOrderMapper;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -41,6 +43,8 @@ import java.util.stream.Collectors;
@Service @Service
public class BizLogisticsOrderServiceImpl implements IBizLogisticsOrderService { public class BizLogisticsOrderServiceImpl implements IBizLogisticsOrderService {
private static final BigDecimal LB_TO_KG_RATIO = new BigDecimal("0.45359237");
private final BizLogisticsOrderMapper baseMapper; private final BizLogisticsOrderMapper baseMapper;
@Resource @Resource
@ -246,7 +250,19 @@ public class BizLogisticsOrderServiceImpl implements IBizLogisticsOrderService {
detail.setChannelName(quoteVo.getChannelName()); detail.setChannelName(quoteVo.getChannelName());
detail.setDestination(quoteVo.getDestination()); detail.setDestination(quoteVo.getDestination());
detail.setPricePerKg(quoteVo.getPrice()); detail.setPricePerKg(quoteVo.getPrice());
detail.setLogisticsStatus("pending"); detail.setPlannedQuantity(bizShipmentTracking.getTotal());
BigDecimal lb = new BigDecimal(bizShipmentTracking.getWeight());
// 计算kg值乘法运算
BigDecimal kgValue = lb.multiply(LB_TO_KG_RATIO);
// 保留两位小数并四舍五入
kgValue = kgValue.setScale(2, RoundingMode.HALF_UP);
detail.setSupplierWeight(kgValue.longValue());
detail.setLogisticsStatus("IN_WAREHOUSE");
// detail.setPlannedQuantity(bizShipmentTracking.getQuantity()); // detail.setPlannedQuantity(bizShipmentTracking.getQuantity());
// detail.setShipmentQuantity(sum); // detail.setShipmentQuantity(sum);
// detail.setTrackingNumber(bizShipmentTracking.getTrackingNumber()); // detail.setTrackingNumber(bizShipmentTracking.getTrackingNumber());

View File

@ -31,6 +31,8 @@ import org.asinkj.amz.mapper.BizLogisticsQuoteMapper;
import org.asinkj.amz.service.IBizLogisticsQuoteService; import org.asinkj.amz.service.IBizLogisticsQuoteService;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
@ -75,10 +77,6 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
} }
@Override @Override
public List<Map<String, Object>> generateReport() { public List<Map<String, Object>> generateReport() {
// 1. 获取所有渠道名称 // 1. 获取所有渠道名称
@ -211,6 +209,8 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
@Override @Override
public void insertMostQuoteByBo(BizLogisticsQuoteMostBo bo) { public void insertMostQuoteByBo(BizLogisticsQuoteMostBo bo) {
//检查是否重复报价 //检查是否重复报价
LambdaQueryWrapper<BizLogisticsQuote> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<BizLogisticsQuote> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BizLogisticsQuote::getInquiryId, bo.getId()); queryWrapper.eq(BizLogisticsQuote::getInquiryId, bo.getId());
@ -219,6 +219,7 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
throw new ServiceException("该询价单已报价,请勿重复报价"); throw new ServiceException("该询价单已报价,请勿重复报价");
} }
Date quoteStartDate = bo.getQuoteStartDate(); Date quoteStartDate = bo.getQuoteStartDate();
Date quoteEndDate = bo.getQuoteEndDate(); Date quoteEndDate = bo.getQuoteEndDate();
//计算中间的每一天的日期 //计算中间的每一天的日期
@ -248,6 +249,29 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
} }
@Override
public Boolean checkPriceQuoteByBo(BizLogisticsQuoteMostBo bo) {
LambdaQueryWrapper<BizLogisticsQuote> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BizLogisticsQuote::getDestination, bo.getDestination())
.eq(BizLogisticsQuote::getChannelName, bo.getChannelName())
.eq(BizLogisticsQuote::getQuoteDate, bo.getQuoteEndDate())
;
List<BizLogisticsQuote> bizLogisticsQuotes = baseMapper.selectList(queryWrapper);
if (bizLogisticsQuotes.size() == 0){
return Boolean.TRUE;
}
BigDecimal average = bizLogisticsQuotes.stream()
.map(BizLogisticsQuote::getPrice)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(new BigDecimal(bizLogisticsQuotes.size()), 2, RoundingMode.HALF_UP);
if (average.compareTo(bo.getPrice()) > 0){
return Boolean.FALSE;
}
return Boolean.TRUE;
}
@Override @Override
public List<InquiryQuoteStatusDTO> getTodayQuoteStatus() { public List<InquiryQuoteStatusDTO> getTodayQuoteStatus() {

View File

@ -1,9 +1,18 @@
package org.asinkj.amz.service.impl; package org.asinkj.amz.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import org.asinkj.amz.domain.BizLogisticsQuote; import lombok.extern.slf4j.Slf4j;
import org.asinkj.amz.domain.BizShipmentTracking;
import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
import org.asinkj.amz.domain.vo.SysAmazonStoreVo;
import org.asinkj.amz.mapper.BizShipmentTrackingMapper;
import org.asinkj.amz.service.IBizLogisticsQuoteService; import org.asinkj.amz.service.IBizLogisticsQuoteService;
import org.asinkj.amz.service.ISysAmazonStoreService;
import org.asinkj.amz.service.LingxinCallback;
import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils; import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.mybatis.core.page.TableDataInfo; import org.asinkj.common.mybatis.core.page.TableDataInfo;
@ -12,6 +21,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.asinkj.common.satoken.utils.LoginHelper;
import org.asinkj.resource.api.RemoteMessageService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.asinkj.amz.domain.bo.BizShipmentPlanBo; import org.asinkj.amz.domain.bo.BizShipmentPlanBo;
import org.asinkj.amz.domain.vo.BizShipmentPlanVo; import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
@ -23,6 +34,8 @@ import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* 货件计划Service业务层处理 * 货件计划Service业务层处理
@ -32,12 +45,23 @@ import java.util.Collection;
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
@Slf4j
public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService { public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
private final BizShipmentPlanMapper baseMapper; private final BizShipmentPlanMapper baseMapper;
@Resource @Resource
private IBizLogisticsQuoteService iLogisticsQuoteService;; private IBizLogisticsQuoteService iLogisticsQuoteService;
;
@Resource
private ISysAmazonStoreService iSysAmazonStoreService;
@Resource
private BizShipmentTrackingMapper bizShipmentTrackingMapper;
@Resource
private RemoteMessageService remoteMessageService;
/** /**
* 查询货件计划 * 查询货件计划
@ -61,6 +85,22 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
public TableDataInfo<BizShipmentPlanVo> queryPageList(BizShipmentPlanBo bo, PageQuery pageQuery) { public TableDataInfo<BizShipmentPlanVo> queryPageList(BizShipmentPlanBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BizShipmentPlan> lqw = buildQueryWrapper(bo); LambdaQueryWrapper<BizShipmentPlan> lqw = buildQueryWrapper(bo);
Page<BizShipmentPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); Page<BizShipmentPlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
Set<String> shipmentIds = result.getRecords().stream().map(BizShipmentPlanVo::getShipmentId).collect(Collectors.toSet());
if (CollectionUtil.isNotEmpty(shipmentIds)) {
LambdaQueryWrapper<BizShipmentTracking> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(BizShipmentTracking::getShipmentId, shipmentIds);
List<BizShipmentTracking> bizShipmentTrackings = bizShipmentTrackingMapper.selectList(queryWrapper);
Map<String, Long> collect = bizShipmentTrackings.stream()
.collect(Collectors.groupingBy(
BizShipmentTracking::getShipmentId,
Collectors.counting()
));
for (BizShipmentPlanVo bizShipmentPlanVo : result.getRecords()) {
Long count = collect.get(bizShipmentPlanVo.getShipmentId());
bizShipmentPlanVo.setBoxNum(count);
}
}
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
@ -73,7 +113,21 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
@Override @Override
public List<BizShipmentPlanVo> queryList(BizShipmentPlanBo bo) { public List<BizShipmentPlanVo> queryList(BizShipmentPlanBo bo) {
LambdaQueryWrapper<BizShipmentPlan> lqw = buildQueryWrapper(bo); LambdaQueryWrapper<BizShipmentPlan> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw); List<BizShipmentPlanVo> bizShipmentPlanVos = baseMapper.selectVoList(lqw);
Set<String> shipmentIds = bizShipmentPlanVos.stream().map(BizShipmentPlanVo::getShipmentId).collect(Collectors.toSet());
LambdaQueryWrapper<BizShipmentTracking> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(BizShipmentTracking::getShipmentId, shipmentIds);
List<BizShipmentTracking> bizShipmentTrackings = bizShipmentTrackingMapper.selectList(queryWrapper);
Map<String, Long> collect = bizShipmentTrackings.stream()
.collect(Collectors.groupingBy(
BizShipmentTracking::getShipmentId,
Collectors.counting()
));
for (BizShipmentPlanVo bizShipmentPlanVo : bizShipmentPlanVos) {
Long count = collect.get(bizShipmentPlanVo.getShipmentId());
bizShipmentPlanVo.setBoxNum(count);
}
return bizShipmentPlanVos;
} }
private LambdaQueryWrapper<BizShipmentPlan> buildQueryWrapper(BizShipmentPlanBo bo) { private LambdaQueryWrapper<BizShipmentPlan> buildQueryWrapper(BizShipmentPlanBo bo) {
@ -89,7 +143,7 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
lqw.eq(StringUtils.isNotBlank(bo.getShippingSolution()), BizShipmentPlan::getShippingSolution, bo.getShippingSolution()); lqw.eq(StringUtils.isNotBlank(bo.getShippingSolution()), BizShipmentPlan::getShippingSolution, bo.getShippingSolution());
lqw.eq(bo.getGmtModified() != null, BizShipmentPlan::getGmtModified, bo.getGmtModified()); lqw.eq(bo.getGmtModified() != null, BizShipmentPlan::getGmtModified, bo.getGmtModified());
lqw.eq(bo.getGmtCreate() != null, BizShipmentPlan::getGmtCreate, bo.getGmtCreate()); lqw.eq(bo.getGmtCreate() != null, BizShipmentPlan::getGmtCreate, bo.getGmtCreate());
lqw.eq(bo.getSyncTime() != null, BizShipmentPlan::getSyncTime, bo.getSyncTime()); lqw.eq(bo.getReceivingTime() != null, BizShipmentPlan::getReceivingTime, bo.getReceivingTime());
lqw.eq(bo.getStaShipmentDate() != null, BizShipmentPlan::getStaShipmentDate, bo.getStaShipmentDate()); lqw.eq(bo.getStaShipmentDate() != null, BizShipmentPlan::getStaShipmentDate, bo.getStaShipmentDate());
lqw.eq(bo.getStaDeliveryStartDate() != null, BizShipmentPlan::getStaDeliveryStartDate, bo.getStaDeliveryStartDate()); lqw.eq(bo.getStaDeliveryStartDate() != null, BizShipmentPlan::getStaDeliveryStartDate, bo.getStaDeliveryStartDate());
lqw.eq(bo.getStaDeliveryEndDate() != null, BizShipmentPlan::getStaDeliveryEndDate, bo.getStaDeliveryEndDate()); lqw.eq(bo.getStaDeliveryEndDate() != null, BizShipmentPlan::getStaDeliveryEndDate, bo.getStaDeliveryEndDate());
@ -98,6 +152,14 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
lqw.eq(StringUtils.isNotBlank(bo.getReferenceId()), BizShipmentPlan::getReferenceId, bo.getReferenceId()); lqw.eq(StringUtils.isNotBlank(bo.getReferenceId()), BizShipmentPlan::getReferenceId, bo.getReferenceId());
lqw.eq(StringUtils.isNotBlank(bo.getStaInboundPlanId()), BizShipmentPlan::getStaInboundPlanId, bo.getStaInboundPlanId()); lqw.eq(StringUtils.isNotBlank(bo.getStaInboundPlanId()), BizShipmentPlan::getStaInboundPlanId, bo.getStaInboundPlanId());
lqw.eq(StringUtils.isNotBlank(bo.getIsSta()), BizShipmentPlan::getIsSta, bo.getIsSta()); lqw.eq(StringUtils.isNotBlank(bo.getIsSta()), BizShipmentPlan::getIsSta, bo.getIsSta());
SysAmazonStoreBo sysAmazonStoreBo = new SysAmazonStoreBo();
sysAmazonStoreBo.setUserId(LoginHelper.getUserId());
List<SysAmazonStoreVo> sysAmazonStoreVos = iSysAmazonStoreService.queryList(sysAmazonStoreBo);
Set<Long> collect = sysAmazonStoreVos.stream().map(SysAmazonStoreVo::getSid).collect(Collectors.toSet());
if (CollectionUtil.isNotEmpty(collect)) {
lqw.in(BizShipmentPlan::getSid, collect);
}
return lqw; return lqw;
} }
@ -168,4 +230,26 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
} }
return null; return null;
} }
@Override
public void takeTodayAmzPlanData() {
DateTime today = DateUtil.date();
String todayString = today.toString("yyyy-MM-dd");
log.info("yesterdayString. yesterdayString:{}", todayString);
//获取今天的日期
DateTime tomorrow = DateUtil.tomorrow();
String tomorrowString = tomorrow.toString("yyyy-MM-dd");
log.info("todayString. todayString:{}", tomorrowString);
// remoteFBADataService.pullAmzFbaDataToken(todayString, tomorrowString);
Long userId = LoginHelper.getUserId();
iSysAmazonStoreService.pullAmzStaData(todayString, tomorrowString, new LingxinCallback() {
@Override
public void onFinished(String result, int status) {
remoteMessageService.publishMessage(userId, result);
}
});
}
} }

View File

@ -23,7 +23,7 @@ import java.util.Collection;
* 物流追踪Service业务层处理 * 物流追踪Service业务层处理
* *
* @author shuo hu * @author shuo hu
* @date 2025-03-20 * @date 2025-04-03
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
@ -74,6 +74,18 @@ public class BizShipmentTrackingServiceImpl implements IBizShipmentTrackingServi
lqw.eq(StringUtils.isNotBlank(bo.getShipmentId()), BizShipmentTracking::getShipmentId, bo.getShipmentId()); lqw.eq(StringUtils.isNotBlank(bo.getShipmentId()), BizShipmentTracking::getShipmentId, bo.getShipmentId());
lqw.eq(StringUtils.isNotBlank(bo.getBoxId()), BizShipmentTracking::getBoxId, bo.getBoxId()); lqw.eq(StringUtils.isNotBlank(bo.getBoxId()), BizShipmentTracking::getBoxId, bo.getBoxId());
lqw.eq(StringUtils.isNotBlank(bo.getTrackingNumber()), BizShipmentTracking::getTrackingNumber, bo.getTrackingNumber()); lqw.eq(StringUtils.isNotBlank(bo.getTrackingNumber()), BizShipmentTracking::getTrackingNumber, bo.getTrackingNumber());
lqw.eq(StringUtils.isNotBlank(bo.getLocalBoxId()), BizShipmentTracking::getLocalBoxId, bo.getLocalBoxId());
lqw.eq(StringUtils.isNotBlank(bo.getPackageId()), BizShipmentTracking::getPackageId, bo.getPackageId());
lqw.eq(bo.getTotal() != null, BizShipmentTracking::getTotal, bo.getTotal());
lqw.eq(bo.getWeight() != null, BizShipmentTracking::getWeight, bo.getWeight());
lqw.eq(StringUtils.isNotBlank(bo.getWeightUnit()), BizShipmentTracking::getWeightUnit, bo.getWeightUnit());
lqw.eq(bo.getLength() != null, BizShipmentTracking::getLength, bo.getLength());
lqw.eq(bo.getWidth() != null, BizShipmentTracking::getWidth, bo.getWidth());
lqw.eq(bo.getHeight() != null, BizShipmentTracking::getHeight, bo.getHeight());
lqw.eq(StringUtils.isNotBlank(bo.getLengthUnit()), BizShipmentTracking::getLengthUnit, bo.getLengthUnit());
lqw.like(StringUtils.isNotBlank(bo.getBoxName()), BizShipmentTracking::getBoxName, bo.getBoxName());
lqw.eq(StringUtils.isNotBlank(bo.getShipmentUniqueId()), BizShipmentTracking::getShipmentUniqueId, bo.getShipmentUniqueId());
lqw.eq(StringUtils.isNotBlank(bo.getInboundPlanId()), BizShipmentTracking::getInboundPlanId, bo.getInboundPlanId());
return lqw; return lqw;
} }
@ -132,10 +144,9 @@ public class BizShipmentTrackingServiceImpl implements IBizShipmentTrackingServi
@Override @Override
public List<BizShipmentTracking> queryByPlanId(String shipmentId) { public List<BizShipmentTracking> queryByPlanId(String shipmentId) {
if (StringUtils.isNotBlank(shipmentId)) { if (StringUtils.isNotBlank(shipmentId)) {
return baseMapper.selectList(Wrappers.<BizShipmentTracking>lambdaQuery().eq(BizShipmentTracking::getShipmentId, shipmentId)); return baseMapper.selectList(Wrappers.lambdaQuery(BizShipmentTracking.class)
.eq(BizShipmentTracking::getShipmentId, shipmentId));
} }
return List.of(); return List.of();
} }
} }

View File

@ -1,10 +1,15 @@
package org.asinkj.amz.service.impl; package org.asinkj.amz.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import okhttp3.Call; import okhttp3.Call;
@ -17,10 +22,8 @@ import org.asinkj.amz.domain.BizShipmentTracking;
import org.asinkj.amz.mapper.BizShipmentItemMapper; import org.asinkj.amz.mapper.BizShipmentItemMapper;
import org.asinkj.amz.mapper.BizShipmentPlanMapper; import org.asinkj.amz.mapper.BizShipmentPlanMapper;
import org.asinkj.amz.mapper.BizShipmentTrackingMapper; import org.asinkj.amz.mapper.BizShipmentTrackingMapper;
import org.asinkj.asinking.entity.FbaShipmentApiResponse; import org.asinkj.amz.service.LingxinCallback;
import org.asinkj.asinking.entity.Result; import org.asinkj.asinking.entity.*;
import org.asinkj.asinking.entity.SellerAccountResponse;
import org.asinkj.asinking.entity.TokenInfo;
import org.asinkj.asinking.okhttp.AKRestClientBuild; import org.asinkj.asinking.okhttp.AKRestClientBuild;
import org.asinkj.common.core.utils.MapstructUtils; import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils; import org.asinkj.common.core.utils.StringUtils;
@ -51,6 +54,8 @@ import java.time.Duration;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static jodd.util.ThreadUtil.sleep;
/** /**
* 亚马逊店铺信息Service业务层处理 * 亚马逊店铺信息Service业务层处理
* *
@ -79,6 +84,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
@Resource @Resource
private BizShipmentTrackingMapper bizShipmentTrackingMapper; private BizShipmentTrackingMapper bizShipmentTrackingMapper;
@Value("${lingxing.appId}") @Value("${lingxing.appId}")
private String appId; private String appId;
@ -161,6 +167,45 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
return flag; return flag;
} }
@Override
public void getAmzStoreTokenData() throws Exception {
// 如果用postman等其他工具调试时需要将appSecret用urlencode.encode()进行转义
if (ObjectUtil.isNull(RedisUtils.getCacheObject(REFRESH_TOKEN))) {
Result result = AKRestClientBuild.builder().endpoint(url).getAccessToken(appId, appSecret);
Object data = result.getData();
if (data instanceof LinkedHashMap) {
// 将LinkedHashMap转为TokenInfo
ObjectMapper mapper = new ObjectMapper();
TokenInfo tokenInfo = mapper.convertValue(data, TokenInfo.class); // 关键点
log.info("token:{}", tokenInfo.getRefreshToken());
RedisUtils.setCacheObject(REFRESH_TOKEN, tokenInfo.getRefreshToken(), Duration.ofHours(2));
RedisUtils.setCacheObject(ACCESS_TOKEN, tokenInfo.getAccessToken(), Duration.ofSeconds(tokenInfo.getExpiresIn()));
} else {
throw new IllegalStateException("data字段类型不匹配");
}
} else {
Object result = AKRestClientBuild.builder().endpoint(url).refreshToken(appId, RedisUtils.getCacheObject(REFRESH_TOKEN));
ObjectMapper mapper = new ObjectMapper();
Result result1 = mapper.convertValue(result, Result.class); // 关键点
if (result1.getData() != null && result1.getData() instanceof LinkedHashMap) {
TokenInfo tokenInfo = mapper.convertValue(result1.getData(), TokenInfo.class); // 关键点
log.info("tokenInfo:{}", tokenInfo.getRefreshToken());
RedisUtils.setCacheObject(REFRESH_TOKEN, tokenInfo.getRefreshToken(), Duration.ofHours(2));
RedisUtils.setCacheObject(ACCESS_TOKEN, tokenInfo.getAccessToken(), Duration.ofSeconds(tokenInfo.getExpiresIn()));
} else {
log.info("删除Redis存储的token");
RedisUtils.deleteObject(REFRESH_TOKEN);
RedisUtils.deleteObject(ACCESS_TOKEN);
}
}
}
/** /**
* 修改亚马逊店铺信息 * 修改亚马逊店铺信息
* *
@ -276,7 +321,10 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
public void pullAmzFBAData(String startDate, String endDate) throws Exception { public void pullAmzFBAData(String startDate, String endDate) throws Exception {
Map<String, String> queryParam = new HashMap<>(); Map<String, String> queryParam = new HashMap<>();
queryParam.put("sid", String.valueOf(143)); List<SysAmazonStore> sysAmazonStores = baseMapper.selectList();
String sids = sysAmazonStores.stream().map(item -> String.valueOf(item.getSid())).collect(Collectors.joining(","));
log.info("sids:{}", sids);
queryParam.put("sid", "153");
queryParam.put("start_date", startDate); queryParam.put("start_date", startDate);
queryParam.put("end_date", endDate); queryParam.put("end_date", endDate);
queryParam.put("shipment_status", "READY_TO_SHIP"); queryParam.put("shipment_status", "READY_TO_SHIP");
@ -326,6 +374,8 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
for (FbaShipmentApiResponse.ShipmentPlan listDatum : listData) { for (FbaShipmentApiResponse.ShipmentPlan listDatum : listData) {
listDatum.setId(null); listDatum.setId(null);
BizShipmentPlan bizShipmentPlan = BeanUtil.copyProperties(listDatum, BizShipmentPlan.class); BizShipmentPlan bizShipmentPlan = BeanUtil.copyProperties(listDatum, BizShipmentPlan.class);
bizShipmentPlan.setCreateBy(1L);
bizShipmentPlan.setDestination(listDatum.getDestination());
BizShipmentPlanList.add(bizShipmentPlan); BizShipmentPlanList.add(bizShipmentPlan);
listDatum.getItemList().forEach(item -> { listDatum.getItemList().forEach(item -> {
item.setId(null); item.setId(null);
@ -335,6 +385,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
List<BizShipmentItem> bizShipmentItems = BeanUtil.copyToList(listDatum.getItemList(), BizShipmentItem.class); List<BizShipmentItem> bizShipmentItems = BeanUtil.copyToList(listDatum.getItemList(), BizShipmentItem.class);
for (BizShipmentItem bizShipmentItem : bizShipmentItems) { for (BizShipmentItem bizShipmentItem : bizShipmentItems) {
bizShipmentItem.setId(null); bizShipmentItem.setId(null);
bizShipmentItem.setCreateBy(1L);
bizShipmentItem.setShipmentId(bizShipmentPlan.getShipmentId()); bizShipmentItem.setShipmentId(bizShipmentPlan.getShipmentId());
} }
@ -342,6 +393,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
List<BizShipmentTracking> bizShipmentTrackings = BeanUtil.copyToList(listDatum.getTrackingNumberList(), BizShipmentTracking.class); List<BizShipmentTracking> bizShipmentTrackings = BeanUtil.copyToList(listDatum.getTrackingNumberList(), BizShipmentTracking.class);
for (BizShipmentTracking bizShipmentTracking : bizShipmentTrackings) { for (BizShipmentTracking bizShipmentTracking : bizShipmentTrackings) {
bizShipmentTracking.setId(null); bizShipmentTracking.setId(null);
bizShipmentTracking.setCreateBy(1L);
bizShipmentTracking.setShipmentId(bizShipmentPlan.getShipmentId()); bizShipmentTracking.setShipmentId(bizShipmentPlan.getShipmentId());
} }
bizShipmentTrackingsList.addAll(bizShipmentTrackings); bizShipmentTrackingsList.addAll(bizShipmentTrackings);
@ -355,76 +407,297 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
} }
} }
}); });
// if (ObjectUtil.isNull(RedisUtils.getCacheObject(ACCESS_TOKEN))){
// getAmzStoreTokenData();
// } }
//
// Map<String, Object> queryParam = new HashMap<>(); /**
// queryParam.put("timestamp", System.currentTimeMillis() / 1000 + ""); * 通过STA查询STA任务
// queryParam.put("access_token", RedisUtils.getCacheObject(ACCESS_TOKEN)); *
// queryParam.put("app_key", appId); * @param startDate
// queryParam.put("sid",536); * @param endDate
// queryParam.put("start_date","2025-01-17"); */
// queryParam.put("end_date","2025-03-18"); @Override
//// queryParam.put("offset", 0); public void pullAmzStaData(String startDate, String endDate, LingxinCallback lingxinCallback) {
//// queryParam.put("length", 20); Map<String, Object> queryParam = new HashMap<>();
// queryParam.put("page", 1);
// String sign = ApiSign.sign(queryParam, appId); queryParam.put("length", 200);
// queryParam.put("sign", sign); queryParam.put("dateBegin", startDate);
// queryParam.put("dateEnd", endDate);
// log.info("sign:{}", sign); queryParam.put("dateType", 1);
//
// HttpRequest<Object> build = HttpRequest.builder(Object.class) HttpUtil.postWithParams("/amzStaServer/openapi/inbound-plan/page", queryParam, new Callback() {
// .method(HttpMethod.POST) @Override
// .endpoint(url) public void onFailure(@NotNull Call call, @NotNull IOException e) {
// .path("erp/sc/data/fba_report/shipmentList")
// .queryParams(queryParam) }
// .build();
// HttpResponse execute = HttpExecutor.create().execute(build); @Override
// Object o = execute.readEntity(Object.class); public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
// log.info("execute:{}", o);
// Shipment shipment = execute.readEntity(Shipment.class); try {
// log.info("HttpResponse:{}", JSON.toJSON(shipment)); String string = response.body().string();
log.info("string:+{}", string);
AmzStaApiResponse amzStaApiResponse = JSON.parseObject(string, new TypeReference<AmzStaApiResponse>() {
});
log.info("amzStaApiResponse:{}", amzStaApiResponse);
List<BizShipmentPlan> bizShipmentPlans = new ArrayList<>();
List<BizShipmentTracking> bizTrackingList = new ArrayList<>();
List<BizShipmentItem> bizShipmentItems = new ArrayList<>();
List<String> shipmentIds = new ArrayList<>();
if (amzStaApiResponse.getData() == null || amzStaApiResponse.getData().getTotal().equals(0)) {
log.info("没有获取到数据");
return;
}
List<AmzStaApiResponse.InboundPlanRecord> records = amzStaApiResponse.getData().getRecords();
HashMap<String, List<AmzStaApiResponse.Shipment>> shipmentHashMap = new HashMap<>();
HashMap<String, String> gmtCreateDateMap = new HashMap<>();
for (AmzStaApiResponse.InboundPlanRecord record : records) {
String inboundPlanId = record.getInboundPlanId();
List<AmzStaApiResponse.Shipment> shipmentList = record.getShipmentList();
Set<String> shipmentCollect = shipmentList.stream().map(AmzStaApiResponse.Shipment::getShipmentId).collect(Collectors.toSet());
Set<String> shipmentConfiramtionIds = shipmentList.stream().map(AmzStaApiResponse.Shipment::getShipmentConfirmationId).collect(Collectors.toSet());
shipmentIds.addAll(shipmentConfiramtionIds);
if (CollectionUtil.isEmpty(shipmentCollect)) {
log.info("shipmentCollect:{}", shipmentCollect);
continue;
}
shipmentHashMap.put(inboundPlanId + "," + record.getSid(), shipmentList);
gmtCreateDateMap.put(inboundPlanId + "," + record.getSid(), record.getGmtCreate());
}
if (CollectionUtil.isEmpty(shipmentIds)) {
log.info("shipmentIds:{}", shipmentIds);
return;
}
List<String> selectExistingShipmentIds = bizShipmentPlanMapper.selectList(new LambdaQueryWrapper<BizShipmentPlan>().in(BizShipmentPlan::getShipmentId, shipmentIds)).stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toList());
Collection<String> subtract = CollUtil.subtract(shipmentIds, selectExistingShipmentIds);
log.info("shipmentIds过滤以后:{}", subtract);
if (CollectionUtil.isEmpty(subtract)) {
lingxinCallback.onFinished("没有最新的数据", 100);
return;
}
for (String key : shipmentHashMap.keySet()) {
List<String> split = StrUtil.split(key, ",");
log.info("key:{}", key);
List<AmzStaApiResponse.Shipment> shipments = shipmentHashMap.get(key);
List<String> shipmentIdList = shipments.stream().map(c->{
if (selectExistingShipmentIds.contains(c.getShipmentConfirmationId())){
return null;
}
return c.getShipmentId();
}).filter(Objects::nonNull).collect(Collectors.toList());
if (CollectionUtil.isEmpty(shipmentIdList)) {
log.info("shipmentIdList过滤以后:{}", shipmentIdList);
continue;
}
Map<String, String> shipmentMap = shipments.stream().collect(Collectors.toMap(AmzStaApiResponse.Shipment::getShipmentId, AmzStaApiResponse.Shipment::getShipmentConfirmationId));
Map<String, Object> shipmentParms = new HashMap<>();
shipmentParms.put("inboundPlanId", split.get(0));
shipmentParms.put("sid", Long.valueOf(split.get(1)));
shipmentParms.put("shipmentIds", JSON.toJSON(shipmentIdList));
String gmtDate = gmtCreateDateMap.get(key);
makeShipmentRequest(shipmentParms, bizShipmentPlans,bizShipmentItems,gmtDate);
Map<String, Object> boxParms = new HashMap<>();
boxParms.put("inboundPlanId", split.get(0));
boxParms.put("sid", split.get(1));
boxParms.put("shipmentIdList", JSON.toJSON(shipmentIdList));
// 查询货件装箱详情
makeBoxRequest(boxParms, shipmentMap, bizTrackingList);
}
log.info("bizShipmentPlans:{}", bizShipmentPlans);
if (CollectionUtil.isNotEmpty(bizShipmentPlans)) {
bizShipmentPlanMapper.insertBatch(bizShipmentPlans);
}
if (CollectionUtil.isNotEmpty(bizTrackingList)) {
bizShipmentTrackingMapper.insertBatch(bizTrackingList);
}
if (CollectionUtil.isNotEmpty(bizShipmentItems)) {
bizShipmentItemMapper.insertBatch(bizShipmentItems);
}
lingxinCallback.onFinished("获取货件信息完成", 200);
} catch (Exception e) {
log.error("Sta货件获取出错了", e);
}
}
});
}
private void makeBoxRequest(Map<String, Object> boxParms, Map<String, String> shipmentMap, List<BizShipmentTracking> bizTrackingList) throws IOException {
String boxString = HttpUtil.postWithParamsSync("/amzStaServer/openapi/inbound-shipment/listShipmentBoxes", boxParms);
log.info("查询货件装箱详情:{}", boxString);
AmzBoxResponse amzBoxResponse = JSON.parseObject(boxString, new TypeReference<>() {
});
if (amzBoxResponse.getCode() != 0) {
log.error("查询货件装箱详情出错了:{}", amzBoxResponse.getMessage());
return;
}
String inboundPlanId = amzBoxResponse.getData().getInboundPlanId();
List<AmzBoxResponse.Shipment> shipmentList = amzBoxResponse.getData().getShipmentList();
for (AmzBoxResponse.Shipment shipment : shipmentList) {
List<AmzBoxResponse.PackageBox> packageBoxList = shipment.getShipmentPackingList();
List<BizShipmentTracking> bizShipmentTrackings = BeanUtil.copyToList(packageBoxList, BizShipmentTracking.class);
for (BizShipmentTracking bizShipmentTracking : bizShipmentTrackings) {
bizShipmentTracking.setCreateBy(1L);
bizShipmentTracking.setInboundPlanId(inboundPlanId);
bizShipmentTracking.setShipmentId(shipmentMap.get(shipment.getShipmentId()));
bizTrackingList.add(bizShipmentTracking);
}
}
sleep(1000);
}
private List<BizShipmentPlan> makeShipmentRequest(Map<String, Object> shipmentParms, List<BizShipmentPlan> bizShipmentPlans,List<BizShipmentItem> bizShipmentItems,String gmtDate) throws IOException {
String shipmentString = HttpUtil.postWithParamsSync("/amzStaServer/openapi/inbound-shipment/shipmentDetailList", shipmentParms);
log.info("查询货件详情:{}", shipmentString);
AmzShippingResponse amzShippingResponse = JSON.parseObject(shipmentString, new TypeReference<>() {
});
List<AmzShippingResponse.Shipment> shipmentList1 = amzShippingResponse.getData().getShipmentList();
for (AmzShippingResponse.Shipment shipment : shipmentList1) {
BizShipmentPlan bizShipmentPlan = new BizShipmentPlan();
bizShipmentPlan.setCreateBy(1L);
bizShipmentPlan.setSid(shipment.getSid());
bizShipmentPlan.setStaInboundPlanId((String) shipmentParms.get("inboundPlanId"));
bizShipmentPlan.setInboundPlanId((String) shipmentParms.get("inboundPlanId"));
bizShipmentPlan.setShipmentId(shipment.getShipmentConfirmationId());
bizShipmentPlan.setShipmentUniqueId(shipment.getShipmentId());
bizShipmentPlan.setGmtCreate(DateUtil.parse(gmtDate));
bizShipmentPlan.setShipmentName(shipment.getShipmentName());
bizShipmentPlan.setShipmentStatus(shipment.getStatus());
bizShipmentPlan.setDestination(shipment.getWarehouseId());
bizShipmentPlan.setStaShipmentDate(shipment.getShipingTime());
FbaShipmentApiResponse.Address shipFromAddress = new FbaShipmentApiResponse.Address();
shipFromAddress.setAddressLine1(shipment.getSendAddress().getAddressLine1());
shipFromAddress.setAddressLine2(shipment.getSendAddress().getAddressLine2());
shipFromAddress.setCity(shipment.getSendAddress().getCity());
shipFromAddress.setCountryCode(shipment.getSendAddress().getCountryCode());
shipFromAddress.setDoorplate(shipment.getSendAddress().getPostalCode());
shipFromAddress.setPhone(shipment.getSendAddress().getPhoneNumber());
shipFromAddress.setPostalCode(shipment.getSendAddress().getPostalCode());
shipFromAddress.setRegion(shipment.getSendAddress().getStateOrProvinceCode());
bizShipmentPlan.setShipFromAddress(shipFromAddress);
FbaShipmentApiResponse.Address shipToAddress = new FbaShipmentApiResponse.Address();
shipToAddress.setAddressLine1(shipment.getShippingAddress().getAddressLine1());
shipToAddress.setAddressLine2(shipment.getShippingAddress().getAddressLine2());
shipToAddress.setCity(shipment.getShippingAddress().getCity());
shipToAddress.setCountryCode(shipment.getShippingAddress().getCountryCode());
shipToAddress.setDoorplate(shipment.getShippingAddress().getPostalCode());
shipToAddress.setPhone(shipment.getShippingAddress().getPhoneNumber());
shipToAddress.setPostalCode(shipment.getShippingAddress().getPostalCode());
shipToAddress.setRegion(shipment.getShippingAddress().getStateOrProvinceCode());
bizShipmentPlan.setShipToAddress(shipToAddress);
bizShipmentPlans.add(bizShipmentPlan);
List<AmzShippingResponse.Item> itemList = shipment.getItemList();
for (AmzShippingResponse.Item item : itemList) {
BizShipmentItem bizShipmentItem = new BizShipmentItem();
bizShipmentItem.setCreateBy(1L);
bizShipmentItem.setShipmentId(shipment.getShipmentConfirmationId());
bizShipmentItem.setMsku(item.getMsku());
bizShipmentItem.setFnsku(item.getFnsku());
bizShipmentItem.setSku(item.getSku());
// bizShipmentItem.setQuantityShipped(item.getQuantity());
bizShipmentItems.add(bizShipmentItem);
}
}
sleep(1000);
return bizShipmentPlans;
}
@Override
public void pullAmzBoxData() throws Exception {
Map<String, Object> queryParam = new HashMap<>();
queryParam.put("page", 1);
queryParam.put("length", 200);
queryParam.put("dateBegin", "2025-04-02");
queryParam.put("dateEnd", "2025-04-02");
queryParam.put("dateType", 1);
HttpUtil.postWithParams("/amzStaServer/openapi/inbound-plan/page", queryParam, new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String string = response.body().string();
AmzStaApiResponse amzStaApiResponse = JSONObject.parseObject(string, AmzStaApiResponse.class);
log.info("amzStaApiResponse:{}", amzStaApiResponse);
try {
} catch (Exception e) {
log.error("Sta货件获取出错了", e);
}
}
});
} }
@Override @Override
public void getAmzStoreTokenData() throws Exception { public void pullAmzBoxData2() throws Exception {
Map<String, Object> queryParam = new HashMap<>();
// 如果用postman等其他工具调试时需要将appSecret用urlencode.encode()进行转义 queryParam.put("inboundPlanId", "wfc758b280-f9d1-4a54-873f-31de17da1e88");
if (ObjectUtil.isNull(RedisUtils.getCacheObject(REFRESH_TOKEN))) { queryParam.put("sid", 153);
Result result = AKRestClientBuild.builder().endpoint(url).getAccessToken(appId, appSecret); // queryParam.put("shipmentIdList", JSON.toJSON(List.of("shfb03a733-5928-4754-aeff-b02727d69176")));
Object data = result.getData();
if (data instanceof LinkedHashMap) {
// 将LinkedHashMap转为TokenInfo
ObjectMapper mapper = new ObjectMapper();
TokenInfo tokenInfo = mapper.convertValue(data, TokenInfo.class); // 关键点
log.info("token:{}", tokenInfo.getRefreshToken());
RedisUtils.setCacheObject(REFRESH_TOKEN, tokenInfo.getRefreshToken(), Duration.ofHours(2));
RedisUtils.setCacheObject(ACCESS_TOKEN, tokenInfo.getAccessToken(), Duration.ofSeconds(tokenInfo.getExpiresIn()));
} else {
throw new IllegalStateException("data字段类型不匹配");
}
} else {
Object result = AKRestClientBuild.builder().endpoint(url).refreshToken(appId, RedisUtils.getCacheObject(REFRESH_TOKEN));
ObjectMapper mapper = new ObjectMapper();
Result result1 = mapper.convertValue(result, Result.class); // 关键点
if (result1.getData() != null && result1.getData() instanceof LinkedHashMap) {
TokenInfo tokenInfo = mapper.convertValue(result1.getData(), TokenInfo.class); // 关键点
log.info("tokenInfo:{}", tokenInfo.getRefreshToken());
RedisUtils.setCacheObject(REFRESH_TOKEN, tokenInfo.getRefreshToken(), Duration.ofHours(2));
RedisUtils.setCacheObject(ACCESS_TOKEN, tokenInfo.getAccessToken(), Duration.ofSeconds(tokenInfo.getExpiresIn()));
} else {
log.info("删除Redis存储的token");
RedisUtils.deleteObject(REFRESH_TOKEN);
RedisUtils.deleteObject(ACCESS_TOKEN);
}
// /amzStaServer/openapi/inbound-shipment/listShipmentBoxes
// /amzStaServer/openapi/inbound-shipment/shipmentDetailList
// /amzStaServer/openapi/inbound-packing/getInboundPackingBoxInfo
HttpUtil.postWithParams("/amzStaServer/openapi/inbound-packing/getInboundPackingBoxInfo", queryParam, new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
} }
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
System.out.println(response.body().string());
}
});
} }
@ -436,24 +709,6 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
queryParam.put("type", 2); queryParam.put("type", 2);
//
// HttpUtil.postWithUrlParams("/erp/sc/data/sales_report/asinList", queryParam, new Callback() {
// @Override
// public void onFailure(@NotNull Call call, @NotNull IOException e) {
//
// log.info("onFailure");
// }
//
// @Override
// public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//
// System.out.println(response.body().string());
// }
// });
HttpUtil.postWithParams("/erp/sc/data/sales_report/asinDailyLists", queryParam, new Callback() { HttpUtil.postWithParams("/erp/sc/data/sales_report/asinDailyLists", queryParam, new Callback() {
@Override @Override
public void onFailure(@NotNull Call call, @NotNull IOException e) { public void onFailure(@NotNull Call call, @NotNull IOException e) {
@ -476,7 +731,6 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
queryParam.put("end_date", "2025-03-27"); queryParam.put("end_date", "2025-03-27");
// //
// HttpUtil.postWithUrlParams("/erp/sc/data/sales_report/asinList", queryParam, new Callback() { // HttpUtil.postWithUrlParams("/erp/sc/data/sales_report/asinList", queryParam, new Callback() {
// @Override // @Override
@ -493,7 +747,6 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
// }); // });
HttpUtil.postWithParams("/erp/sc/data/sales_report/asinList", queryParam, new Callback() { HttpUtil.postWithParams("/erp/sc/data/sales_report/asinList", queryParam, new Callback() {
@Override @Override
public void onFailure(@NotNull Call call, @NotNull IOException e) { public void onFailure(@NotNull Call call, @NotNull IOException e) {

View File

@ -0,0 +1,149 @@
package org.asinkj.asinking.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.experimental.Accessors;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class AmzBoxResponse {
@JSONField(name = "code")
private Integer code;
@JSONField(name = "message")
private String message;
@JSONField(name = "errorDetails")
private String errorDetails;
@JSONField(name = "requestId")
private String requestId;
@JSONField(name = "responseTime")
private String responseTime;
@JSONField(name = "data")
private BoxData data;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class BoxData {
@JSONField(name = "inboundPlanId")
private String inboundPlanId;
@JSONField(name = "shipmentList")
private List<Shipment> shipmentList;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Accessors(chain = true)
public static class Shipment {
@JSONField(name = "shipmentId")
private String shipmentId;
@JSONField(name = "shipmentPackingList")
private List<PackageBox> shipmentPackingList;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Accessors(chain = true)
public static class PackageBox {
@JSONField(name = "localBoxId")
private String localBoxId;
@JSONField(name = "packageId")
private String packageId;
@JSONField(name = "boxId")
private String boxId;
@JSONField(name = "total")
private Integer total;
@JSONField(name = "weight")
private Double weight;
@JSONField(name = "weightUnit")
private String weightUnit;
@JSONField(name = "length")
private Double length;
@JSONField(name = "width")
private Double width;
@JSONField(name = "height")
private Double height;
@JSONField(name = "lengthUnit")
private String lengthUnit;
@JSONField(name = "boxName")
private String boxName;
@JSONField(name = "productList")
private List<Product> productList;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class Product {
@JSONField(name = "msku")
private String msku;
@JSONField(name = "fnsku")
private String fnsku;
@JSONField(name = "asin")
private String asin;
@JSONField(name = "parentAsin")
private String parentAsin;
@JSONField(name = "productName")
private String productName;
@JSONField(name = "sku")
private String sku;
@JSONField(name = "title")
private String title;
@JSONField(name = "url")
private String url;
@JSONField(name = "expiration")
private String expiration;
@JSONField(name = "quantityInBox")
private Integer quantityInBox;
@JSONField(name = "prepOwner")
private String prepOwner;
@JSONField(name = "labelOwner")
private String labelOwner;
}
}

View File

@ -0,0 +1,200 @@
package org.asinkj.asinking.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.experimental.Accessors;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class AmzShippingResponse {
@JSONField(name = "code")
private Integer code;
@JSONField(name = "message")
private String message;
@JSONField(name = "errorDetails")
private String errorDetails;
@JSONField(name = "requestId")
private String requestId;
@JSONField(name = "responseTime")
private String responseTime;
@JSONField(name = "data")
private ShippingData data;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class ShippingData {
@JSONField(name = "inboundPlanId")
private String inboundPlanId;
@JSONField(name = "shipmentList")
private List<Shipment> shipmentList;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Accessors(chain = true)
public static class Shipment {
@JSONField(name = "shipmentId")
private String shipmentId;
@JSONField(name = "shipmentConfirmationId")
private String shipmentConfirmationId;
@JSONField(name = "sid")
private Long sid;
@JSONField(name = "shipmentName")
private String shipmentName;
@JSONField(name = "shippingAddress")
private ShippingAddress shippingAddress;
@JSONField(name = "inboundRegion")
private String inboundRegion;
@JSONField(name = "warehouseId")
private String warehouseId;
@JSONField(name = "sendAddress")
private ShippingAddress sendAddress;
@JSONField(name = "amazonReferenceId")
private String amazonReferenceId;
@JSONField(name = "status")
private String status;
@JSONField(name = "itemCount")
private Integer itemCount;
@JSONField(name = "itemList")
private List<Item> itemList;
@JSONField(name = "shippingMode")
private String shippingMode;
@JSONField(name = "shippingSolution")
private String shippingSolution;
@JSONField(name = "alphaCode")
private String alphaCode;
@JSONField(name = "shipingTime")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date shipingTime;
@JSONField(name = "startDate")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date startDate;
@JSONField(name = "endDate")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date endDate;
@JSONField(name = "pickUpId")
private String pickUpId;
@JSONField(name = "trackingNumber")
private String trackingNumber;
@JSONField(name = "trackingNumberList")
private List<?> trackingNumberList = List.of();
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class ShippingAddress {
@JSONField(name = "addressLine1")
private String addressLine1;
@JSONField(name = "addressLine2")
private String addressLine2;
@JSONField(name = "city")
private String city;
@JSONField(name = "countryCode")
private String countryCode;
@JSONField(name = "country")
private String country;
@JSONField(name = "stateOrProvinceCode")
private String stateOrProvinceCode;
@JSONField(name = "addressName")
private String addressName;
@JSONField(name = "postalCode")
private String postalCode;
@JSONField(name = "email")
private String email;
@JSONField(name = "phoneNumber")
private String phoneNumber;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class Item {
@JSONField(name = "msku")
private String msku;
@JSONField(name = "fnsku")
private String fnsku;
@JSONField(name = "asin")
private String asin;
@JSONField(name = "parentAsin")
private String parentAsin;
@JSONField(name = "productName")
private String productName;
@JSONField(name = "sku")
private String sku;
@JSONField(name = "title")
private String title;
@JSONField(name = "url")
private String url;
@JSONField(name = "quantity")
private Integer quantity;
@JSONField(name = "labelOwner")
private String labelOwner;
@JSONField(name = "prepOwner")
private String prepOwner;
@JSONField(name = "expiration")
private Object expiration;
}
}

View File

@ -0,0 +1,126 @@
package org.asinkj.asinking.entity;
import lombok.Data;
import com.alibaba.fastjson.annotation.JSONField;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class AmzStaApiResponse {
@JSONField(name = "code")
private Integer code;
@JSONField(name = "message")
private String message;
@JSONField(name = "errorDetails")
private String errorDetails;
@JSONField(name = "requestId")
private String requestId;
@JSONField(name = "responseTime")
private String responseTime;
@JSONField(name = "data")
private PageData data;
@Data
public static class PageData {
@JSONField(name = "records")
private List<InboundPlanRecord> records;
@JSONField(name = "total")
private Integer total;
@JSONField(name = "size")
private Integer size;
@JSONField(name = "current")
private Integer current;
}
@Data
public static class InboundPlanRecord {
@JSONField(name = "sid")
private Long sid;
@JSONField(name = "inboundPlanId")
private String inboundPlanId;
@JSONField(name = "planName")
private String planName;
@JSONField(name = "gmtCreate")
private String gmtCreate;
@JSONField(name = "gmtModified")
private String gmtModified;
@JSONField(name = "status")
private String status;
@JSONField(name = "positionType")
private String positionType;
@JSONField(name = "shipmentList")
private List<Shipment> shipmentList;
@JSONField(name = "inboundPlanItemList")
private List<PlanItem> inboundPlanItemList;
}
@Data
public static class Shipment {
@JSONField(name = "shipmentId")
private String shipmentId;
@JSONField(name = "shipmentConfirmationId")
private String shipmentConfirmationId;
@JSONField(name = "freightBillNumber")
private Object freightBillNumber;
@JSONField(name = "pickUpId")
private Object pickUpId;
}
@Data
public static class PlanItem {
@JSONField(name = "msku")
private String msku;
@JSONField(name = "fnsku")
private String fnsku;
@JSONField(name = "asin")
private String asin;
@JSONField(name = "parentAsin")
private String parentAsin;
@JSONField(name = "productName")
private String productName;
@JSONField(name = "sku")
private String sku;
@JSONField(name = "title")
private String title;
@JSONField(name = "url")
private String url;
@JSONField(name = "quantity")
private Integer quantity;
@JSONField(name = "labelOwner")
private String labelOwner;
@JSONField(name = "prepOwner")
private String prepOwner;
@JSONField(name = "expiration")
private Object expiration;
}
}

View File

@ -52,7 +52,7 @@ public class FbaShipmentApiResponse {
@JSONField(name = "sync_time") @JSONField(name = "sync_time")
private String syncTime; private String syncTime;
@JSONField(name = "destination") @JSONField(name = "destination_fulfillment_center_id")
private String destination; private String destination;
private String username; private String username;

View File

@ -29,6 +29,6 @@ public class Token {
public static void main(String[] args) { public static void main(String[] args) {
Token token = new Token(false); Token token = new Token(false);
System.out.println(token.toString()); log.info(token.toString());
} }
} }

View File

@ -76,38 +76,8 @@ public class HttpUtil {
buildAndSendRequest(url, queryParams, "POST", RequestBody.create(new byte[0], null), callback); buildAndSendRequest(url, queryParams, "POST", RequestBody.create(new byte[0], null), callback);
} }
public static void postWithParams(String url, Map<String, Object> queryParams, Callback callback) {
checkInitialized();
Map<String, Object> signParams = new HashMap<>();
Map<String, String> baseParams = new HashMap<>();
// 动态获取最新access_token
baseParams.put("app_key", appId);
baseParams.put("access_token", RedisUtils.getCacheObject(ACCESS_TOKEN));
long l = System.currentTimeMillis() / 1000;
baseParams.put("timestamp", String.valueOf(l));
signParams.putAll(baseParams);
signParams.putAll(queryParams);
String sign = ApiSign.sign(signParams, appId);
baseParams.put("sign", sign);
// Map<String, String> queryParams = convertToStringMap(allParams);
String json = JSON.toJSONString(queryParams);
// 3. 创建 RequestBody指定 MediaType JSON
RequestBody requestBody = RequestBody.create(
json,
MediaType.parse("application/json; charset=utf-8")
);
buildAndSendRequest(url, baseParams, "POST", requestBody, callback);
}
// POST JSON // POST JSON
public static void postJson(String url, String jsonBody, Callback callback) { public static void postJson(String url, String jsonBody, Callback callback) {
RequestBody body = RequestBody.create(jsonBody, MediaType.get("application/json")); RequestBody body = RequestBody.create(jsonBody, MediaType.get("application/json"));
@ -223,6 +193,39 @@ public class HttpUtil {
.build(); .build();
} }
public static void postWithParams(String url, Map<String, Object> queryParams, Callback callback) {
checkInitialized();
Map<String, Object> signParams = new HashMap<>();
Map<String, String> baseParams = new HashMap<>();
// 动态获取最新access_token
baseParams.put("app_key", appId);
baseParams.put("access_token", RedisUtils.getCacheObject(ACCESS_TOKEN));
long l = System.currentTimeMillis() / 1000;
baseParams.put("timestamp", String.valueOf(l));
signParams.putAll(baseParams);
signParams.putAll(queryParams);
String sign = ApiSign.sign(signParams, appId);
baseParams.put("sign", sign);
// Map<String, String> queryParams = convertToStringMap(allParams);
String json = JSON.toJSONString(queryParams);
// 3. 创建 RequestBody指定 MediaType JSON
RequestBody requestBody = RequestBody.create(
json,
MediaType.parse("application/json; charset=utf-8")
);
buildAndSendRequest(url, baseParams, "POST", requestBody, callback);
}
private static void buildAndSendRequest(String url, Map<String, String> queryParams, private static void buildAndSendRequest(String url, Map<String, String> queryParams,
String method, RequestBody body, Callback callback) { String method, RequestBody body, Callback callback) {
try { try {
@ -241,4 +244,71 @@ public class HttpUtil {
callback.onFailure(null, new IOException("请求配置错误", e)); callback.onFailure(null, new IOException("请求配置错误", e));
} }
} }
public static String postWithParamsSync(String url, Map<String, Object> queryParams) throws IOException {
checkInitialized();
Map<String, Object> signParams = new HashMap<>();
Map<String, String> baseParams = new HashMap<>();
// 动态获取最新 access_token
baseParams.put("app_key", appId);
baseParams.put("access_token", RedisUtils.getCacheObject(ACCESS_TOKEN));
long l = System.currentTimeMillis() / 1000;
baseParams.put("timestamp", String.valueOf(l));
signParams.putAll(baseParams);
signParams.putAll(queryParams);
String sign = ApiSign.sign(signParams, appId);
baseParams.put("sign", sign);
// queryParams 转换为 JSON 字符串
String json = JSON.toJSONString(queryParams);
// 创建 RequestBody
RequestBody requestBody = RequestBody.create(
json,
MediaType.parse("application/json; charset=utf-8")
);
// 发送同步请求并获取响应
Response response = buildAndSendSyncRequest(url, baseParams, "POST", requestBody);
// 解析响应根据业务需求调整
if (!response.isSuccessful()) {
throw new IOException("请求失败,状态码: " + response.code());
}
String responseData = response.body().string();
response.close(); // 确保关闭资源
return responseData;
}
private static Response buildAndSendSyncRequest(
String url,
Map<String, String> queryParams,
String method,
RequestBody body
) throws IOException {
// 构建完整 URL
HttpUrl.Builder urlBuilder = HttpUrl.parse(baseurl + url).newBuilder();
if (queryParams != null) {
queryParams.forEach(urlBuilder::addQueryParameter);
}
// 创建 Request
Request.Builder requestBuilder = new Request.Builder()
.url(urlBuilder.build());
// 设置请求方法
if ("POST".equalsIgnoreCase(method)) {
requestBuilder.post(body);
} else {
requestBuilder.get();
}
// 同步执行请求
return client.newCall(requestBuilder.build()).execute();
}
} }

View File

@ -4,4 +4,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.asinkj.amz.mapper.BizLogisticsOrderDetailMapper"> <mapper namespace="org.asinkj.amz.mapper.BizLogisticsOrderDetailMapper">
<update id="updateByBoxId" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";">
UPDATE biz_logistics_order_detail
<set>
<if test="item.logisticsStatus != null">
logistics_status = #{item.logisticsStatus},
</if>
<if test="item.logisticsProviderName != null and item.logisticsProviderName != ''">
logistics_provider_name = #{item.logisticsProviderName},
</if>
</set>
WHERE fba_box_number = #{item.fbaBoxNumber}
</foreach>
</update>
</mapper> </mapper>

View File

@ -324,7 +324,8 @@ public interface BaseMapperPlus<T, V> extends BaseMapper<T> {
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return (P) voPage; return (P) voPage;
} }
voPage.setRecords(MapstructUtils.convert(list, voClass)); List<C> convert = MapstructUtils.convert(list, voClass);
voPage.setRecords(convert);
return (P) voPage; return (P) voPage;
} }

View File

@ -1,10 +1,10 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds FROM amazoncorretto:17.0.14
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native
LABEL maintainer="Shuo Hu " LABEL maintainer="Shuo Hu "
ENV TZ=Asia/Shanghai
RUN mkdir -p /asinkj/gateway/logs \ RUN mkdir -p /asinkj/gateway/logs \
/asinkj/gateway/temp \ /asinkj/gateway/temp \
/asinkj/skywalking/agent /asinkj/skywalking/agent
@ -18,6 +18,7 @@ EXPOSE ${SERVER_PORT}
ADD ./target/asinkj-gateway.jar ./app.jar ADD ./target/asinkj-gateway.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
-Dspring.profiles.active="prod" \
#-Dskywalking.agent.service_name=asinkj-gateway \ #-Dskywalking.agent.service_name=asinkj-gateway \
#-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \ #-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \

View File

@ -1,10 +1,10 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds FROM amazoncorretto:17.0.14
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native
LABEL maintainer="Shuo Hu " LABEL maintainer="Shuo Hu "
ENV TZ=Asia/Shanghai
RUN mkdir -p /asinkj/job/logs \ RUN mkdir -p /asinkj/job/logs \
/asinkj/job/temp \ /asinkj/job/temp \
/asinkj/skywalking/agent /asinkj/skywalking/agent
@ -18,6 +18,7 @@ EXPOSE ${SERVER_PORT}
ADD ./target/asinkj-job.jar ./app.jar ADD ./target/asinkj-job.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
-Dspring.profiles.active="prod" \
#-Dskywalking.agent.service_name=asinkj-job \ #-Dskywalking.agent.service_name=asinkj-job \
#-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \ #-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \

View File

@ -38,18 +38,52 @@ public class AmzPullFBAJobExecutor {
String yesterdayString = yesterday.toString("yyyy-MM-dd"); String yesterdayString = yesterday.toString("yyyy-MM-dd");
SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", yesterdayString); SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", yesterdayString);
//获取今天的日期 //获取今天的日期
DateTime today = DateUtil.date(); DateTime tomorrow = DateUtil.tomorrow();
String todayString = today.toString("yyyy-MM-dd"); String tomorrowString = tomorrow.toString("yyyy-MM-dd");
SnailJobLog.LOCAL.info("todayString. todayString:{}", todayString); SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
remoteFBADataService.pullAmzFbaDataToken(yesterdayString, todayString); remoteFBADataService.pullAmzFbaDataToken(yesterdayString, tomorrowString);
return ExecuteResult.success("获取从昨天开始的FBA货件数据"); return ExecuteResult.success("获取从昨天开始的FBA货件数据");
} else if ("today".equals(jobArgs.getJobParams())) { } else if ("today".equals(jobArgs.getJobParams())) {
DateTime today = DateUtil.date(); DateTime today = DateUtil.date();
String todayString = today.toString("yyyy-MM-dd"); String todayString = today.toString("yyyy-MM-dd");
SnailJobLog.LOCAL.info("todayString. todayString:{}", todayString); SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", todayString);
remoteFBADataService.pullAmzFbaDataToken(todayString, todayString); //获取今天的日期
return ExecuteResult.success("获取今天的FBA货件数据"); DateTime tomorrow = DateUtil.tomorrow();
String tomorrowString = tomorrow.toString("yyyy-MM-dd");
SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
remoteFBADataService.pullAmzFbaDataToken(todayString, tomorrowString);
} }
return ExecuteResult.success("请指定参数yesterday或者today"); return ExecuteResult.success("请指定参数yesterday或者today");
} }
// public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception {
// SnailJobLog.LOCAL.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
// SnailJobLog.REMOTE.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
// log.info("amzPullFBAJobExecutor {}", jobArgs.getJobParams());
// //昨天的日期yyyy-MM-dd
// // 获取昨天的日期
// if ("yesterday".equals(jobArgs.getJobParams())) {
// DateTime yesterday = DateUtil.yesterday();
// String yesterdayString = yesterday.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", yesterdayString);
// //获取今天的日期
// DateTime tomorrow = DateUtil.tomorrow();
// String tomorrowString = tomorrow.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
// remoteFBADataService.pullAmzFbaDataToken(yesterdayString, tomorrowString);
// return ExecuteResult.success("获取从昨天开始的FBA货件数据");
// } else if ("today".equals(jobArgs.getJobParams())) {
// DateTime today = DateUtil.date();
// String todayString = today.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", todayString);
// //获取今天的日期
// DateTime tomorrow = DateUtil.tomorrow();
// String tomorrowString = tomorrow.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
// remoteFBADataService.pullAmzFbaDataToken(todayString, tomorrowString);
// }
// return ExecuteResult.success("请指定参数yesterday或者today");
// }
} }

View File

@ -1,10 +1,10 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds FROM amazoncorretto:17.0.14
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native
LABEL maintainer="Shuo Hu " LABEL maintainer="Shuo Hu "
ENV TZ=Asia/Shanghai
RUN mkdir -p /asinkj/resource/logs \ RUN mkdir -p /asinkj/resource/logs \
/asinkj/resource/temp \ /asinkj/resource/temp \
/asinkj/skywalking/agent /asinkj/skywalking/agent
@ -18,6 +18,7 @@ EXPOSE ${SERVER_PORT}
ADD ./target/asinkj-resource.jar ./app.jar ADD ./target/asinkj-resource.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
-Dspring.profiles.active="prod" \
#-Dskywalking.agent.service_name=asinkj-resource \ #-Dskywalking.agent.service_name=asinkj-resource \
#-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \ #-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \

View File

@ -1,10 +1,11 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds FROM amazoncorretto:17.0.14
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native
LABEL maintainer="Shuo Hu " LABEL maintainer="Shuo Hu "
# 设置时区为上海
ENV TZ=Asia/Shanghai
RUN mkdir -p /asinkj/system/logs \ RUN mkdir -p /asinkj/system/logs \
/asinkj/system/temp \ /asinkj/system/temp \
/asinkj/skywalking/agent /asinkj/skywalking/agent
@ -18,8 +19,8 @@ EXPOSE ${SERVER_PORT}
ADD ./target/asinkj-system.jar ./app.jar ADD ./target/asinkj-system.jar ./app.jar
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \ ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Dserver.port=${SERVER_PORT} \
-Dspring.profiles.active="prod" \
#-Dskywalking.agent.service_name=asinkj-system \ #-Dskywalking.agent.service_name=asinkj-system \
#-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \ #-javaagent:/asinkj/skywalking/agent/skywalking-agent.jar \
-XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \ -XX:+HeapDumpOnOutOfMemoryError -XX:+UseZGC ${JAVA_OPTS} \
-jar app.jar -jar app.jar

View File

@ -161,7 +161,7 @@ public class SysRoleController extends BaseController {
/** /**
* 查询已分配用户角色列表 * 查询已分配用户角色列表
*/ */
@SaCheckPermission("system:role:list") @SaCheckPermission("system:user:list")
@GetMapping("/authUser/allocatedList") @GetMapping("/authUser/allocatedList")
public TableDataInfo<SysUserVo> allocatedList(SysUserBo user, PageQuery pageQuery) { public TableDataInfo<SysUserVo> allocatedList(SysUserBo user, PageQuery pageQuery) {
return userService.selectAllocatedList(user, pageQuery); return userService.selectAllocatedList(user, pageQuery);

View File

@ -48,6 +48,7 @@ db.password.0=mysql_FP56kH
#db.user.0=root #db.user.0=root
#db.password.0=123456 #db.password.0=123456
### the maximum retry times for push ### the maximum retry times for push
nacos.config.push.maxRetryTime=50 nacos.config.push.maxRetryTime=50

View File

@ -1,10 +1,10 @@
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/ # 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds FROM amazoncorretto:17.0.14
#FROM bellsoft/liberica-openjdk-debian:21.0.3-cds
#FROM findepi/graalvm:java17-native
LABEL maintainer="Shuo Hu " LABEL maintainer="Shuo Hu "
ENV TZ=Asia/Shanghai
RUN mkdir -p /asinkj/snailjob/logs RUN mkdir -p /asinkj/snailjob/logs
WORKDIR /asinkj/snailjob WORKDIR /asinkj/snailjob

View File

@ -89,7 +89,7 @@
<id>prod</id> <id>prod</id>
<properties> <properties>
<profiles.active>prod</profiles.active> <profiles.active>prod</profiles.active>
<nacos.server>112.74.106.216:8848</nacos.server> <nacos.server>asinkj-nacos</nacos.server>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group> <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
<nacos.config.group>DEFAULT_GROUP</nacos.config.group> <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
<nacos.username>nacos</nacos.username> <nacos.username>nacos</nacos.username>