Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
dc-java
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
bltdc
dc-java
Commits
dbf89432
Commit
dbf89432
authored
Aug 15, 2020
by
huluobin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
周转波动预测修改
parent
59838603
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
104 additions
and
103 deletions
+104
-103
AutoTurnoverJob.java
...over/src/main/java/com/bailuntec/job/AutoTurnoverJob.java
+104
-103
No files found.
data-show/show-auto-turnover/src/main/java/com/bailuntec/job/AutoTurnoverJob.java
View file @
dbf89432
...
@@ -390,9 +390,10 @@ public class AutoTurnoverJob extends PointJob {
...
@@ -390,9 +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
);
List
<
String
>
forecastSalesListFormula
=
autoTurnoverService
.
getAutoTurnoverSaleDetailsFormula
(
dcAutoTurnover
,
turnoverDays
,
autoForecastDay
);
//
List<String> forecastSalesListFormula = autoTurnoverService.getAutoTurnoverSaleDetailsFormula(dcAutoTurnover, turnoverDays, autoForecastDay);
/*
/*
* 处理矫正信息
* 处理矫正信息
...
@@ -647,7 +648,7 @@ public class AutoTurnoverJob extends PointJob {
...
@@ -647,7 +648,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
(
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
);
...
@@ -723,7 +724,7 @@ public class AutoTurnoverJob extends PointJob {
...
@@ -723,7 +724,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());
...
@@ -1251,105 +1252,105 @@ public class AutoTurnoverJob extends PointJob {
...
@@ -1251,105 +1252,105 @@ public class AutoTurnoverJob extends PointJob {
}*/
}*/
// JIT 推送时间21天之内的sku 预测销量为最近7天均值
// JIT 推送时间21天之内的sku 预测销量为最近7天均值
//
if (turnoverSku.getPushTime() != null && recordTime.minusDays(21L).isBefore(turnoverSku.getPushTime().toLocalDate()) && !(turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_1)) && !(turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_2)) && !(turnoverSku.getBuyerName().equals(Constant.BUYER_JIT_4))) {
if
(
turnoverSku
.
getPushTime
()
!=
null
&&
recordTime
.
minusDays
(
21L
).
isBefore
(
turnoverSku
.
getPushTime
().
toLocalDate
())
&&
!(
turnoverSku
.
getBuyerName
().
equals
(
Constant
.
BUYER_JIT_1
))
&&
!(
turnoverSku
.
getBuyerName
().
equals
(
Constant
.
BUYER_JIT_2
))
&&
!(
turnoverSku
.
getBuyerName
().
equals
(
Constant
.
BUYER_JIT_4
)))
{
//
/*DcBaseOmsSkuMapper dcBaseOmsSkuMapper = SessionUtil.getSession().getMapper(DcBaseOmsSkuMapper.class);
/*DcBaseOmsSkuMapper dcBaseOmsSkuMapper = SessionUtil.getSession().getMapper(DcBaseOmsSkuMapper.class);
//
DcBaseOmsSku dcBaseOmsSku = dcBaseOmsSkuMapper.selectOneByCreateTime(bailunSku);*/
DcBaseOmsSku dcBaseOmsSku = dcBaseOmsSkuMapper.selectOneByCreateTime(bailunSku);*/
//
//
List<Integer> historySalesList = JSON.parseObject(dcAutoSales.getHistorySalesDetails(), new TypeReference<List<Integer>>() {
List
<
Integer
>
historySalesList
=
JSON
.
parseObject
(
dcAutoSales
.
getHistorySalesDetails
(),
new
TypeReference
<
List
<
Integer
>>()
{
//
});
});
//
Integer historySevenSales = 0;
Integer
historySevenSales
=
0
;
//
Integer historyThreeSales = 0;
Integer
historyThreeSales
=
0
;
//
for (int i = 0; i < 7; i++) {
for
(
int
i
=
0
;
i
<
7
;
i
++)
{
//
historySevenSales += historySalesList.get(23 + i);
historySevenSales
+=
historySalesList
.
get
(
23
+
i
);
//
}
}
//
BigDecimal avgHistorySevendaySales = BigDecimal.valueOf(historySevenSales.longValue()).divide(Constant.BIGDECIMAL_SEVEN, 3, RoundingMode.HALF_EVEN);
BigDecimal
avgHistorySevendaySales
=
BigDecimal
.
valueOf
(
historySevenSales
.
longValue
()).
divide
(
Constant
.
BIGDECIMAL_SEVEN
,
3
,
RoundingMode
.
HALF_EVEN
);
//
for (int j = 0; j < autoForecastDay; j++) {
for
(
int
j
=
0
;
j
<
autoForecastDay
;
j
++)
{
//
forecastSalesList.set(j, avgHistorySevendaySales);
forecastSalesList
.
set
(
j
,
avgHistorySevendaySales
);
//
}
}
//
//
} else {
}
else
{
//
BigDecimal forecastSales = BigDecimal.ZERO;
BigDecimal
forecastSales
=
BigDecimal
.
ZERO
;
//
List<Integer> historySalesList = JSON.parseObject(dcAutoSales.getHistorySalesDetails(), new TypeReference<List<Integer>>() {
List
<
Integer
>
historySalesList
=
JSON
.
parseObject
(
dcAutoSales
.
getHistorySalesDetails
(),
new
TypeReference
<
List
<
Integer
>>()
{
//
});
});
//
List<Integer> weekRateList = null;
List
<
Integer
>
weekRateList
=
null
;
//
int weekTime = 0;
int
weekTime
=
0
;
//
boolean hasValue = true;
boolean
hasValue
=
true
;
//
if (dcAutoWarehouseweekSales == null) {
if
(
dcAutoWarehouseweekSales
==
null
)
{
//
hasValue = false;
hasValue
=
false
;
//
} else {
}
else
{
//
weekRateList = JSON.parseObject("[" + dcAutoWarehouseweekSales.getRateDetail() + "]", new TypeReference<List<Integer>>() {
weekRateList
=
JSON
.
parseObject
(
"["
+
dcAutoWarehouseweekSales
.
getRateDetail
()
+
"]"
,
new
TypeReference
<
List
<
Integer
>>()
{
//
});
});
//
weekTime = Integer.valueOf(dcAutoWarehouseweekSales.getWeekTime());
weekTime
=
Integer
.
valueOf
(
dcAutoWarehouseweekSales
.
getWeekTime
());
//
}
}
//
for (int j = 0; j < autoForecastDay; j++) {
for
(
int
j
=
0
;
j
<
autoForecastDay
;
j
++)
{
//
// y = ae^bx
// y = ae^bx
//
/*double v;
/*double v;
//
if (dcAutoSales.getFitForecastFormula().contains("ln(x)")) {
if (dcAutoSales.getFitForecastFormula().contains("ln(x)")) {
//
//y = aln(x) + b
//y = aln(x) + b
//
v = dcAutoSales.getFitAVariable().doubleValue() * Math.log1p((j + 31)) + dcAutoSales.getFitBVariable().doubleValue();
v = dcAutoSales.getFitAVariable().doubleValue() * Math.log1p((j + 31)) + dcAutoSales.getFitBVariable().doubleValue();
//
} else {
} else {
//
v = dcAutoSales.getFitAVariable().doubleValue() * Math.exp(dcAutoSales.getFitBVariable().doubleValue() * (j + 31));
v = dcAutoSales.getFitAVariable().doubleValue() * Math.exp(dcAutoSales.getFitBVariable().doubleValue() * (j + 31));
//
}
}
//
BigDecimal forecastSales = BigDecimal.valueOf(v < 0 ? 0 : v).setScale(0, RoundingMode.HALF_EVEN);
BigDecimal forecastSales = BigDecimal.valueOf(v < 0 ? 0 : v).setScale(0, RoundingMode.HALF_EVEN);
//
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);*/
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);*/
//
//
//20191127 预测销量更改为:(过去第四周*0.1 + 过去第三周*0.1 + 过去第二周*0.3 + 过去第一周*0.5)* 周系数
//20191127 预测销量更改为:(过去第四周*0.1 + 过去第三周*0.1 + 过去第二周*0.3 + 过去第一周*0.5)* 周系数
//
if (0 <= j && j < 7) {
if
(
0
<=
j
&&
j
<
7
)
{
//
forecastSales = BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1)).
forecastSales
=
BigDecimal
.
valueOf
(
historySalesList
.
get
(
2
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.1
)).
//
add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
add
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
9
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(BigDecimal.valueOf(historySalesList.get(16 + j)).multiply(BigDecimal.valueOf(0.3))).
add
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
16
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.3
))).
//
add(BigDecimal.valueOf(historySalesList.get(23 + j)).multiply(BigDecimal.valueOf(0.5)));
add
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
23
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.5
)));
//
if (hasValue) {
if
(
hasValue
)
{
//
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
forecastSales
=
forecastSales
.
multiply
(
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)).
compareTo
(
BigDecimal
.
ZERO
)
==
0
?
BigDecimal
.
ONE
:
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)));
//
}
}
//
} else if (7 <= j && j < 14) {
}
else
if
(
7
<=
j
&&
j
<
14
)
{
//
forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
forecastSales
=
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
2
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
add
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
9
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(BigDecimal.valueOf(historySalesList.get(16 + j)).multiply(BigDecimal.valueOf(0.3))).
add
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
16
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.3
))).
//
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
add
(
forecastSalesList
.
get
(
j
-
7
).
multiply
(
BigDecimal
.
valueOf
(
0.5
)));
//
if (hasValue) {
if
(
hasValue
)
{
//
if (weekTime > 51) {
if
(
weekTime
>
51
)
{
//
weekTime = weekTime - 51;
weekTime
=
weekTime
-
51
;
//
}
}
//
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
forecastSales
=
forecastSales
.
multiply
(
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)).
compareTo
(
BigDecimal
.
ZERO
)
==
0
?
BigDecimal
.
ONE
:
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)));
//
}
}
//
} else if (14 <= j && j < 21) {
}
else
if
(
14
<=
j
&&
j
<
21
)
{
//
forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
forecastSales
=
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
2
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(BigDecimal.valueOf(historySalesList.get(9 + j)).multiply(BigDecimal.valueOf(0.1))).
add
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
9
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
add
(
forecastSalesList
.
get
(
j
-
14
).
multiply
(
BigDecimal
.
valueOf
(
0.3
))).
//
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
add
(
forecastSalesList
.
get
(
j
-
7
).
multiply
(
BigDecimal
.
valueOf
(
0.5
)));
//
if (hasValue) {
if
(
hasValue
)
{
//
if (weekTime > 50) {
if
(
weekTime
>
50
)
{
//
weekTime = weekTime - 50;
weekTime
=
weekTime
-
50
;
//
}
}
//
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
forecastSales
=
forecastSales
.
multiply
(
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)).
compareTo
(
BigDecimal
.
ZERO
)
==
0
?
BigDecimal
.
ONE
:
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)));
//
}
}
//
} else if (21 <= j && j < 27) {
}
else
if
(
21
<=
j
&&
j
<
27
)
{
//
forecastSales = (BigDecimal.valueOf(historySalesList.get(2 + j)).multiply(BigDecimal.valueOf(0.1))).
forecastSales
=
(
BigDecimal
.
valueOf
(
historySalesList
.
get
(
2
+
j
)).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(forecastSalesList.get(j - 21).multiply(BigDecimal.valueOf(0.1))).
add
(
forecastSalesList
.
get
(
j
-
21
).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
add
(
forecastSalesList
.
get
(
j
-
14
).
multiply
(
BigDecimal
.
valueOf
(
0.3
))).
//
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
add
(
forecastSalesList
.
get
(
j
-
7
).
multiply
(
BigDecimal
.
valueOf
(
0.5
)));
//
if (hasValue) {
if
(
hasValue
)
{
//
if (weekTime > 49) {
if
(
weekTime
>
49
)
{
//
weekTime = weekTime - 49;
weekTime
=
weekTime
-
49
;
//
}
}
//
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
forecastSales
=
forecastSales
.
multiply
(
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)).
compareTo
(
BigDecimal
.
ZERO
)
==
0
?
BigDecimal
.
ONE
:
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)));
//
}
}
//
} else if (27 <= j && j < autoForecastDay) {
}
else
if
(
27
<=
j
&&
j
<
autoForecastDay
)
{
//
forecastSales = (forecastSalesList.get(j - 27).multiply(BigDecimal.valueOf(0.1))).
forecastSales
=
(
forecastSalesList
.
get
(
j
-
27
).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(forecastSalesList.get(j - 21).multiply(BigDecimal.valueOf(0.1))).
add
(
forecastSalesList
.
get
(
j
-
21
).
multiply
(
BigDecimal
.
valueOf
(
0.1
))).
//
add(forecastSalesList.get(j - 14).multiply(BigDecimal.valueOf(0.3))).
add
(
forecastSalesList
.
get
(
j
-
14
).
multiply
(
BigDecimal
.
valueOf
(
0.3
))).
//
add(forecastSalesList.get(j - 7).multiply(BigDecimal.valueOf(0.5)));
add
(
forecastSalesList
.
get
(
j
-
7
).
multiply
(
BigDecimal
.
valueOf
(
0.5
)));
//
if (hasValue) {
if
(
hasValue
)
{
//
if (weekTime > 48) {
if
(
weekTime
>
48
)
{
//
weekTime = weekTime - 48;
weekTime
=
weekTime
-
48
;
//
}
}
//
forecastSales = forecastSales.multiply(BigDecimal.valueOf(weekRateList.get(weekTime)).compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : BigDecimal.valueOf(weekRateList.get(weekTime)));
forecastSales
=
forecastSales
.
multiply
(
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)).
compareTo
(
BigDecimal
.
ZERO
)
==
0
?
BigDecimal
.
ONE
:
BigDecimal
.
valueOf
(
weekRateList
.
get
(
weekTime
)));
//
}
}
//
}
}
//
forecastSalesList.set(j, forecastSales.compareTo(salesUpperLimit) == 1 ? salesUpperLimit : forecastSales);
forecastSalesList
.
set
(
j
,
forecastSales
.
compareTo
(
salesUpperLimit
)
==
1
?
salesUpperLimit
:
forecastSales
);
//
}
}
//
}
}
/*if(dcBasePurchase == null) {
/*if(dcBasePurchase == null) {
for(DcConfigForecastSales dcConfigForecastSales : configForecastSalesList) {
for(DcConfigForecastSales dcConfigForecastSales : configForecastSalesList) {
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment