Commit 6167df76 by huluobin

销量预测算法注释

parent 47e64c27
...@@ -11,6 +11,9 @@ ...@@ -11,6 +11,9 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>base-sync-cost-first</artifactId> <artifactId>base-sync-cost-first</artifactId>
<properties>
<maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
</properties>
<dependencies> <dependencies>
<dependency> <dependency>
...@@ -29,36 +32,61 @@ ...@@ -29,36 +32,61 @@
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<!--maven编译插件-->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<!--指定编译jdk版本-->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin> </plugin>
<!--资源文件插件-->
<plugin> <plugin>
<artifactId>maven-assembly-plugin</artifactId> <groupId>org.apache.maven.plugins</groupId>
<version>3.1.0</version> <artifactId>maven-resources-plugin</artifactId>
<configuration> <configuration>
<archive> <encoding>UTF-8</encoding>
<manifest>
<mainClass>com.bailuntec.Application</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration> </configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin> </plugin>
<!--测试用例插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<!-- 跳过测试-->
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--镜像名称:镜像版本-->
<imageName>ccr.ccs.tencentyun.com/bit.publish/ana-ds-order-api:${maven.build.timestamp}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>bailuntec-docker</serverId>
</configuration>
</plugin>
</plugins> </plugins>
<resources> <resources>
...@@ -71,6 +99,7 @@ ...@@ -71,6 +99,7 @@
<!--默认是true--> <!--默认是true-->
<filtering>true</filtering> <filtering>true</filtering>
</resource> </resource>
<resource> <resource>
<directory>src/main/java</directory> <directory>src/main/java</directory>
<includes> <includes>
...@@ -78,6 +107,7 @@ ...@@ -78,6 +107,7 @@
<include>**/*.properties</include> <include>**/*.properties</include>
</includes> </includes>
</resource> </resource>
</resources> </resources>
</build> </build>
</project> </project>
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD base-sync-cost-first-1.0-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Xms30m","-Xmx180m","-jar","/app.jar"]
...@@ -158,12 +158,14 @@ public class SyncCostFirstFinishJob extends PointJob { ...@@ -158,12 +158,14 @@ public class SyncCostFirstFinishJob extends PointJob {
.andBailunSkuEqualTo(sku.getBailunSku()) .andBailunSkuEqualTo(sku.getBailunSku())
.example()); .example());
//瞬时库存 //瞬时库存
dcBaseCostFirstFinish.setSkuStockQuantity(dcBaseStock.getUsableStock() + dcBaseStock.getOccupyStock()); dcBaseCostFirstFinish.setSkuStockQuantity(dcBaseStock.getUsableStock() + dcBaseStock.getOccupyStock());
//sku重量 //sku重量
dcBaseCostFirstFinish.setSkuWeight(dcBaseSku.getWeight()); dcBaseCostFirstFinish.setSkuWeight(dcBaseSku.getWeight());
return dcBaseCostFirstFinish; return dcBaseCostFirstFinish;
} else {
dcBaseCostFirstFinish.setOperationTime(costFirstFinishData.getOperationTime());
dcBaseCostFirstFinishMapper.updateByPrimaryKey(dcBaseCostFirstFinish);
} }
return null; return null;
} catch (Exception e) { } catch (Exception e) {
......
#EVENT_RDB_STORAGE_DRIVER=com.mysql.jdbc.Driver #EVENT_RDB_STORAGE_DRIVER=com.mysql.jdbc.Driver
#EVENT_RDB_STORAGE_URL=jdbc:mysql://192.168.6.140:3306/bailun_datacenter?serverTimezone=GMT%2B8&characterEncoding=utf-8 EVENT_RDB_STORAGE_URL=jdbc:mysql://gz-cdb-kp7s5i79.sql.tencentcdb.com:61691/bailun_datacenter?useUnicode=true&characterEncoding=utf-8
#EVENT_RDB_STORAGE_USERNAME=root #EVENT_RDB_STORAGE_USERNAME=root
#EVENT_RDB_STORAGE_PASSWORD=123456 #EVENT_RDB_STORAGE_PASSWORD=123456
#ZOOKEEPER_SERVER=127.0.0.1:2181 #ZOOKEEPER_SERVER=127.0.0.1:2181
EVENT_RDB_STORAGE_DRIVER=com.mysql.jdbc.Driver EVENT_RDB_STORAGE_DRIVER=com.mysql.jdbc.Driver
EVENT_RDB_STORAGE_URL=jdbc:mysql://10.0.8.15:3306/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 #EVENT_RDB_STORAGE_URL=jdbc:mysql://10.0.8.15:3306/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
EVENT_RDB_STORAGE_USERNAME=root EVENT_RDB_STORAGE_USERNAME=root
EVENT_RDB_STORAGE_PASSWORD=#7kfnymAM$Y9-Ntf EVENT_RDB_STORAGE_PASSWORD=#7kfnymAM$Y9-Ntf
ZOOKEEPER_SERVER=172.31.255.120:2181 ZOOKEEPER_SERVER=172.31.255.120:2181
NAME_SPACE=data-center NAME_SPACE=data-center
JOB_NAME=base-sync-cost-first JOB_NAME=base-sync-cost-first
JOB_CRON=0 10 0/1 * * ? * JOB_CRON=0 10 0/1 * * ? *
......
package com.bailuntec.job; package com.bailuntec.job;
import com.bailuntec.domain.entity.JobPointLog; import com.bailuntec.domain.entity.JobPointLog;
import com.bailuntec.support.PointJob;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.executor.ShardingContexts;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap;
/** /**
* <p> * <p>
...@@ -20,9 +24,18 @@ public class SyncCostFirstFinishJobTest { ...@@ -20,9 +24,18 @@ public class SyncCostFirstFinishJobTest {
public void test() { public void test() {
SyncCostFirstFinishJob syncCostFirstFinishJob = new SyncCostFirstFinishJob(); SyncCostFirstFinishJob syncCostFirstFinishJob = new SyncCostFirstFinishJob();
JobPointLog jobPointLog = new JobPointLog("base-sync-cost-first-finish", 1, 1000, 1, 1, JobPointLog jobPointLog = new JobPointLog("base-sync-cost-first-finish", 1, 1000, 1, 1,
LocalDateTime.of(2020, 8, 1, 0, 0, 0), LocalDateTime.of(2020, 9, 7, 15, 10, 0),
LocalDateTime.of(2020, 9, 2, 0, 0, 0)); LocalDateTime.of(2020, 9, 7, 16, 10, 0));
syncCostFirstFinishJob.executeJob(null, jobPointLog); syncCostFirstFinishJob.executeJob(null, jobPointLog);
} }
@Test
public void test2() {
PointJob syncCostFirstFinishJob = new SyncCostFirstFinishJob();
ShardingContext job = new ShardingContext(new ShardingContexts("1", "base-sync-cost-first-finish", 1, "", new HashMap<>()), 0);
syncCostFirstFinishJob.execute(job);
}
} }
...@@ -33,6 +33,7 @@ public class Application { ...@@ -33,6 +33,7 @@ public class Application {
new JobScheduler(createRegistryCenter(), createJobConfiguration2(), createJobEventConfiguration(), new OrderSyncJobListener()).init(); new JobScheduler(createRegistryCenter(), createJobConfiguration2(), createJobEventConfiguration(), new OrderSyncJobListener()).init();
} }
private static CoordinatorRegistryCenter createRegistryCenter() { private static CoordinatorRegistryCenter createRegistryCenter() {
CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration( CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration(
propertiesUtil.getPropertyAsString("ZOOKEEPER_SERVER"), propertiesUtil.getPropertyAsString("ZOOKEEPER_SERVER"),
...@@ -41,6 +42,7 @@ public class Application { ...@@ -41,6 +42,7 @@ public class Application {
return regCenter; return regCenter;
} }
private static LiteJobConfiguration createJobConfiguration() { private static LiteJobConfiguration createJobConfiguration() {
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder( JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(
propertiesUtil.getPropertyAsString("JOB_NAME"), propertiesUtil.getPropertyAsString("JOB_NAME"),
......
...@@ -21,4 +21,5 @@ JOB_CRON30=0 0 22,23,00 * * ? * ...@@ -21,4 +21,5 @@ JOB_CRON30=0 0 22,23,00 * * ? *
JOB_COROUTINE_NAME=base-sync-oms-order-task2 JOB_COROUTINE_NAME=base-sync-oms-order-task2
JOB_COROUTINE_CRON=0/1 * * * * ? JOB_COROUTINE_CRON=0/1 * * * * ?
SHARDING_TOTAL_COUNT=1 SHARDING_TOTAL_COUNT=1
...@@ -54,6 +54,7 @@ public class CalculateStockRecordJob extends PointJob { ...@@ -54,6 +54,7 @@ public class CalculateStockRecordJob extends PointJob {
// 根据仓库、sku,入库时间升序查询入库sku记录 // 根据仓库、sku,入库时间升序查询入库sku记录
DcBaseStockRecordMapper midDcBaseStockRecordMapper = SessionUtil.getSession().getMapper(DcBaseStockRecordMapper.class); DcBaseStockRecordMapper midDcBaseStockRecordMapper = SessionUtil.getSession().getMapper(DcBaseStockRecordMapper.class);
List<DcBaseStockRecord> baseStockRecordList = midDcBaseStockRecordMapper.selectByStockTime(dcBaseStockRecord.getBailunSku(), dcBaseStockRecord.getWarehouseCode()); List<DcBaseStockRecord> baseStockRecordList = midDcBaseStockRecordMapper.selectByStockTime(dcBaseStockRecord.getBailunSku(), dcBaseStockRecord.getWarehouseCode());
Integer quantityStock = 0; Integer quantityStock = 0;
boolean firstMatch = true; boolean firstMatch = true;
......
...@@ -390,10 +390,10 @@ public class AutoTurnoverJob extends PointJob { ...@@ -390,10 +390,10 @@ public class AutoTurnoverJob extends PointJob {
* 均值, 配置安全库存法: 销量上下限 根据过去30天销量,计算出合理的销量封顶值和销量最低值 * 均值, 配置安全库存法: 销量上下限 根据过去30天销量,计算出合理的销量封顶值和销量最低值
* 曲线拟合 :销量预测, 根据销量走势和上下限,计算出销量预测曲线, 如果历史销量包含0, 无法使用指数函数拟合 * 曲线拟合 :销量预测, 根据销量走势和上下限,计算出销量预测曲线, 如果历史销量包含0, 无法使用指数函数拟合
*/ */
forecastSalesList = autoTurnoverService.getAutoTurnoverSaleDetails(dcAutoTurnover, turnoverDays, autoForecastDay); // forecastSalesList = autoTurnoverService.getAutoTurnoverSaleDetails(dcAutoTurnover, turnoverDays, autoForecastDay);
// calculateForecastSales(salesUpperLimit, autoForecastDay, dcAutoSales, forecastSalesList, turnoverSku, recordTime, bailunSku, warehouseCode, dcAutoWarehouseweekSales); calculateForecastSales(salesUpperLimit, autoForecastDay, dcAutoSales, forecastSalesList, turnoverSku, recordTime, bailunSku, warehouseCode, dcAutoWarehouseweekSales);
List<String> forecastSalesListFormula = autoTurnoverService.getAutoTurnoverSaleDetailsFormula(dcAutoTurnover, turnoverDays, autoForecastDay); // List<String> forecastSalesListFormula = autoTurnoverService.getAutoTurnoverSaleDetailsFormula(dcAutoTurnover, turnoverDays, autoForecastDay);
/* /*
* 处理矫正信息 * 处理矫正信息
...@@ -667,7 +667,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -667,7 +667,7 @@ public class AutoTurnoverJob extends PointJob {
if (i < 7) { if (i < 7) {
avgForecastSevendaySales = avgForecastSevendaySales.add(forecastSalesList.get(i)); avgForecastSevendaySales = avgForecastSevendaySales.add(forecastSalesList.get(i));
forecastSalesList.add(i, BigDecimal.valueOf(historySalesList.get(23 + i))); forecastSalesList.add(i, BigDecimal.valueOf(historySalesList.get(23 + i)));
forecastSalesListFormula.add(i, StringUtils.SPACE); // forecastSalesListFormula.add(i, StringUtils.SPACE);
forecastSalesExplainList.add(i, "历史销量"); forecastSalesExplainList.add(i, "历史销量");
forecastInboundList.add(i, 0); forecastInboundList.add(i, 0);
forecastInventoryList.add(i, BigDecimal.ZERO); forecastInventoryList.add(i, BigDecimal.ZERO);
...@@ -743,7 +743,7 @@ public class AutoTurnoverJob extends PointJob { ...@@ -743,7 +743,7 @@ public class AutoTurnoverJob extends PointJob {
dcAutoTurnover.setTurnoverDays(turnoverDays); dcAutoTurnover.setTurnoverDays(turnoverDays);
dcAutoTurnover.setQuantitySafeInventory(totalSafeInventory); dcAutoTurnover.setQuantitySafeInventory(totalSafeInventory);
dcAutoTurnover.setHqType(dcBaseWarehouse.getHqType()); dcAutoTurnover.setHqType(dcBaseWarehouse.getHqType());
dcAutoTurnover.setSalesDetailsFormula(new Gson().toJson(forecastSalesListFormula)); // dcAutoTurnover.setSalesDetailsFormula(new Gson().toJson(forecastSalesListFormula));
/*dcBaseStock.setSkuTitleCn(turnoverSku.getSkuTitleCn()); /*dcBaseStock.setSkuTitleCn(turnoverSku.getSkuTitleCn());
dcBaseStock.setProductInnerCode(turnoverSku.getProductInnerCode()); dcBaseStock.setProductInnerCode(turnoverSku.getProductInnerCode());
......
...@@ -119,7 +119,7 @@ public class AutoTurnoverServiceImpl implements AutoTurnoverService { ...@@ -119,7 +119,7 @@ public class AutoTurnoverServiceImpl implements AutoTurnoverService {
log.info("没有匹配销量预测规则,采用平均销量"); log.info("没有匹配销量预测规则,采用平均销量");
for (int i = 0; i < turnoverDays; i++) { for (int i = 0; i < turnoverDays; i++) {
if (autoForecastDay >= forecastSalesDetails.size()) { if (autoForecastDay >= forecastSalesDetails.size()) {
forecastSalesDetails.offer(dcAutoTurnover.getDailyWeightedSales()); forecastSalesDetails.offer(dcAutoTurnover.getDailyWeightedSales() == null ? BigDecimal.ZERO : dcAutoTurnover.getDailyWeightedSales());
} }
} }
} }
...@@ -187,11 +187,11 @@ public class AutoTurnoverServiceImpl implements AutoTurnoverService { ...@@ -187,11 +187,11 @@ public class AutoTurnoverServiceImpl implements AutoTurnoverService {
for (int i = 0; i < duration2; i++) { for (int i = 0; i < duration2; i++) {
if (autoForecastDay >= forecastSalesDetailsFormula.size()) { if (autoForecastDay >= forecastSalesDetailsFormula.size()) {
forecastSalesDetailsFormula.offer("(" + dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getTwoN1().intValue()), midNight, bailunSku, warehouseCode, twoN1 == 0 ? 1 : twoN1).setScale(2,BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getTwoN2() + ")" forecastSalesDetailsFormula.offer("(" + dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getTwoN1().intValue()), midNight, bailunSku, warehouseCode, twoN1 == 0 ? 1 : twoN1).setScale(2, BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getTwoN2() + ")"
+ "+" + "+"
+ "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getTwoN3().intValue()), midNight, bailunSku, warehouseCode, twoN3 == 0 ? 1 : twoN3)).orElse(BigDecimal.ZERO).setScale(2,BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getTwoN4() + ")" + "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getTwoN3().intValue()), midNight, bailunSku, warehouseCode, twoN3 == 0 ? 1 : twoN3)).orElse(BigDecimal.ZERO).setScale(2, BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getTwoN4() + ")"
+ "+" + "+"
+ "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getTwoN5().intValue()), midNight, bailunSku, warehouseCode, twoN5 == 0 ? 1 : twoN5)).orElse(BigDecimal.ZERO).setScale(2,BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getTwoN6() + ")"); + "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getTwoN5().intValue()), midNight, bailunSku, warehouseCode, twoN5 == 0 ? 1 : twoN5)).orElse(BigDecimal.ZERO).setScale(2, BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getTwoN6() + ")");
} }
} }
...@@ -200,11 +200,11 @@ public class AutoTurnoverServiceImpl implements AutoTurnoverService { ...@@ -200,11 +200,11 @@ public class AutoTurnoverServiceImpl implements AutoTurnoverService {
for (int i = 0; i < duration3; i++) { for (int i = 0; i < duration3; i++) {
if (autoForecastDay >= forecastSalesDetailsFormula.size()) { if (autoForecastDay >= forecastSalesDetailsFormula.size()) {
forecastSalesDetailsFormula.offer("(" + dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getThreeN1().intValue()), midNight, bailunSku, warehouseCode, threeN1 == 0 ? 1 : threeN1).setScale(2,BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getThreeN2() + ")" forecastSalesDetailsFormula.offer("(" + dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getThreeN1().intValue()), midNight, bailunSku, warehouseCode, threeN1 == 0 ? 1 : threeN1).setScale(2, BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getThreeN2() + ")"
+ "+" + "+"
+ "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getThreeN3().intValue()), midNight, bailunSku, warehouseCode, threeN3 == 0 ? 1 : threeN3)).orElse(BigDecimal.ZERO).setScale(2,BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getThreeN4() + ")" + "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getThreeN3().intValue()), midNight, bailunSku, warehouseCode, threeN3 == 0 ? 1 : threeN3)).orElse(BigDecimal.ZERO).setScale(2, BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getThreeN4() + ")"
+ "+" + "+"
+ "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getThreeN5().intValue()), midNight, bailunSku, warehouseCode, threeN5 == 0 ? 1 : threeN5)).orElse(BigDecimal.ZERO).setScale(2,BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getThreeN6() + ")"); + "(" + Optional.ofNullable(dcBaseOmsSkuMapper.omsSkuSellerCount(midNight.minusDays(dcAutoSalesForecastStageConfig.getThreeN5().intValue()), midNight, bailunSku, warehouseCode, threeN5 == 0 ? 1 : threeN5)).orElse(BigDecimal.ZERO).setScale(2, BigDecimal.ROUND_HALF_UP) + "*" + dcAutoSalesForecastStageConfig.getThreeN6() + ")");
} }
} }
......
...@@ -74,7 +74,7 @@ public class AutoTurnoverJobTest { ...@@ -74,7 +74,7 @@ public class AutoTurnoverJobTest {
DcBaseStockMapper dcBaseStockMapper = sqlSession.getMapper(DcBaseStockMapper.class); DcBaseStockMapper dcBaseStockMapper = sqlSession.getMapper(DcBaseStockMapper.class);
DcBaseStock dcBaseStock = dcBaseStockMapper.selectOneByExample(DcBaseStockExample.newAndCreateCriteria() DcBaseStock dcBaseStock = dcBaseStockMapper.selectOneByExample(DcBaseStockExample.newAndCreateCriteria()
.andBailunSkuEqualTo("228442801") .andBailunSkuEqualTo("948259717")
.andWarehouseCodeEqualTo("GZBLWH") .andWarehouseCodeEqualTo("GZBLWH")
.example()); .example());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment