Browse Source

完成库存折线图、柱状图算法设计

lwx_dev
erdanergou 2 years ago
parent
commit
c91a08b659
  1. 45
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java
  2. 67
      src/main/java/com/dreamchaser/depository_manage/entity/SplitInventoryView.java
  3. 8
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  4. 6
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  5. 9
      src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.java
  6. 28
      src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.xml
  7. 9
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java
  8. 8
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  9. 246
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  10. 32
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  11. 5
      src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html
  12. 21
      src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html
  13. 9
      src/main/resources/templates/pages/depository/table-out.html
  14. 46
      src/main/resources/templates/pages/depository/table-stock.html
  15. 362
      src/test/java/com/dreamchaser/depository_manage/InventoryLineChartTest.java
  16. 318
      src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java
  17. 111
      src/test/java/com/dreamchaser/depository_manage/LineChartForInventoryTest.java
  18. 12
      src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java

45
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java

@ -485,7 +485,7 @@ public class DepositoryRecordController {
List<UserByPort> userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, null, null);
for (UserByPort userByPort : userByPortList) {
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -546,7 +546,7 @@ public class DepositoryRecordController {
List<UserByPort> userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserKey, finalToken);
for (UserByPort userByPort : userByPortList) {
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -1770,7 +1770,7 @@ public class DepositoryRecordController {
UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken);
// 获取用户的用工关系
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -1788,7 +1788,7 @@ public class DepositoryRecordController {
List<UserByPort> userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken);
for (UserByPort userByPort : userByPortList) {
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -1835,7 +1835,7 @@ public class DepositoryRecordController {
UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken);
// 获取用户的用工关系
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -1852,7 +1852,7 @@ public class DepositoryRecordController {
List<UserByPort> userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken);
for (UserByPort userByPort : userByPortList) {
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -2072,7 +2072,7 @@ public class DepositoryRecordController {
UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken);
// 获取用户的用工关系
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -2087,7 +2087,7 @@ public class DepositoryRecordController {
List<UserByPort> userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken);
for (UserByPort userByPort : userByPortList) {
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -2131,7 +2131,7 @@ public class DepositoryRecordController {
UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken);
// 获取用户的用工关系
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -2146,7 +2146,7 @@ public class DepositoryRecordController {
List<UserByPort> userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken);
for (UserByPort userByPort : userByPortList) {
int emptype = userByPort.getEmptype();
if(emptype > 10){
if (emptype > 10) {
continue;
}
String workwechat = userByPort.getWorkwechat();
@ -2515,8 +2515,8 @@ public class DepositoryRecordController {
* @param request
* @return
*/
@PostMapping("/getBarChartDataByDateType")
public RestResponse getBarChartDataByDateType(@RequestBody Map<String, String> map, HttpServletRequest request) {
@PostMapping("/getLineOrBarChartDataByDateType")
public RestResponse getLineOrBarChartDataByDateType(@RequestBody Map<String, String> map, HttpServletRequest request) {
if (!map.containsKey("echartType")) {
throw new MyException("错误,请指定图表类型");
}
@ -2550,7 +2550,12 @@ public class DepositoryRecordController {
}
Map<Object, Object> data = new HashMap<>();
if (depositoryId != -1) {
if ("3".equals(type)) {
data = depositoryRecordService.getLineOrBarChartDataForInventory(depositoryId, dateType, echartType);
} else {
data = depositoryRecordService.getLineOrBarChartData(depositoryId, type, dateType, echartType);
}
}
return new RestResponse(data);
}
@ -2558,6 +2563,7 @@ public class DepositoryRecordController {
/**
* 用于获取出入库的旭日图的数据
*
* @param map 查询数据
* @param request
* @return
@ -2605,19 +2611,20 @@ public class DepositoryRecordController {
Long end = timeSpaceMap.get("end");
// 获取所有顶级物料类型
List<MaterialType> materialTypeNoParent = materialTypeService.findMaterialTypeNoParent();
Map<String, Object> data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent,depositoryId);
Map<String, Object> data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent, depositoryId);
return new RestResponse(data);
}
/**
* 用于获取出入库的旭日图的数据
*
* @param map 查询数据
* @return
*/
@PostMapping("/getSunBurstDataForMtName")
public RestResponse getSunBurstDataForMtName(@RequestBody Map<String,String> map){
if(!map.containsKey("depositoryId")){
public RestResponse getSunBurstDataForMtName(@RequestBody Map<String, String> map) {
if (!map.containsKey("depositoryId")) {
throw new MyException("错误,未选择查看的仓库");
}
Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId"));
@ -2639,14 +2646,14 @@ public class DepositoryRecordController {
Long start = timeSpaceMap.get("start");
Long end = timeSpaceMap.get("end");
Map<String, Object> data = new HashMap<>();
if(map.containsKey("mtName")){
if (map.containsKey("mtName")) {
// 如果包含名称
String mtName = map.get("mtName");
data = depositoryRecordService.getSunBurstDataByMtName(mtName,type,start,end,mtName,depositoryId);
}else{
data = depositoryRecordService.getSunBurstDataByMtName(mtName, type, start, end, mtName, depositoryId);
} else {
// 如果不包含名称
List<MaterialType> materialTypeNoParent = materialTypeService.findMaterialTypeNoParent();
data = depositoryRecordService.getSunBurstDataByForApplication(dateName,type,start,end,materialTypeNoParent,depositoryId);
data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent, depositoryId);
}
return new RestResponse(data);
}

67
src/main/java/com/dreamchaser/depository_manage/entity/SplitInventoryView.java

@ -0,0 +1,67 @@
package com.dreamchaser.depository_manage.entity;
import lombok.Data;
/**
* 拆单库存记录视图
*/
@Data
public class SplitInventoryView {
/**
* 拆单库存id
*/
private Integer id;
/**
* 拆单记录
*/
private Integer sid;
/**
* 库存库位映射id
*/
private Integer mpId;
/**
* 拆单库存数
*/
private Integer siQuantity;
/**
* 拆单物料id
*/
private Integer mid;
/**
* 所处仓库id
*/
private Integer depositoryId;
/**
* 库存id
*/
private Integer iid;
/**
* 库位id
*/
private Integer pid;
/**
* 拆单记录状态
*/
private Integer sstate;
/**
* 当前拆单记录的进制
*/
private Integer scale;
/**
* 旧单位
*/
private String oldUnit ;
/**
* 新单位
*/
private String newUnit;
/**
* 物料名称
*/
private String mname ;
/**
* 仓库名称
*/
private String dname ;
}

8
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java

@ -158,6 +158,14 @@ public interface MaterialMapper {
List<Inventory> findInventory(Map<String, Object> map);
/**
* 获取当前仓库的库存总额
* @param depositoryId 带查询仓库id
* @return
*/
Integer findInventorySumForDepository(Integer depositoryId);
/**
* 根据条件查询符合条件的库存
*

6
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml

@ -373,6 +373,12 @@
</select>
<select id="findInventorySumForDepository" resultType="int" parameterType="int">
select ifnull(sum(quantity),0)
from inventory
where depository_id = #{depositoryId}
</select>
<select id="findInventoryByDids" resultMap="InventoryMap" parameterType="map">
SELECT
<include refid="allColumnsAndTypeNameOnViewByInventory"/>

9
src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.java

@ -2,6 +2,7 @@ package com.dreamchaser.depository_manage.mapper;
import com.dreamchaser.depository_manage.entity.SplitInfo;
import com.dreamchaser.depository_manage.entity.SplitInventory;
import com.dreamchaser.depository_manage.entity.SplitInventoryView;
import com.dreamchaser.depository_manage.pojo.SplitInfoP;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@ -169,4 +170,12 @@ public interface SplitUnitMapper {
*/
SplitInfo findSplitInfoByParentId(Integer parentId);
/**
* 查询当前仓库下的拆单库存记录
* @param depositoryId 待查询仓库
* @return
*/
List<SplitInventoryView> findSplitInventoryViewByDepository(Integer depositoryId);
}

28
src/main/java/com/dreamchaser/depository_manage/mapper/SplitUnitMapper.xml

@ -46,6 +46,23 @@
<result column="remark" property="remark" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="splitInventoryViewMap" type="com.dreamchaser.depository_manage.entity.SplitInventoryView">
<id column="id" property="id" jdbcType="INTEGER" />
<id column="sid" property="sid" jdbcType="INTEGER" />
<id column="mpId" property="mpId" jdbcType="INTEGER" />
<id column="siQuantity" property="siQuantity" jdbcType="INTEGER" />
<id column="mid" property="mid" jdbcType="INTEGER" />
<id column="depositoryId" property="depositoryId" jdbcType="INTEGER" />
<id column="iid" property="iid" jdbcType="INTEGER" />
<id column="pid" property="pid" jdbcType="INTEGER" />
<id column="sstate" property="sstate" jdbcType="INTEGER" />
<id column="scale" property="scale" jdbcType="INTEGER" />
<result column="mname" property="mname" jdbcType="VARCHAR" />
<result column="oldUnit" property="oldUnit" jdbcType="VARCHAR" />
<result column="newUnit" property="newUnit" jdbcType="VARCHAR" />
<result column="dname" property="dname" jdbcType="VARCHAR" />
</resultMap>
<sql id="splitInfoAllColumns">
s.id,s.mid,s.oldUnit,s.newUnit,s.quantity,s.parentId,s.state
</sql>
@ -58,6 +75,10 @@
id,mid,oldUnit,newUnit,quantity,sparentId,sstate,shelfLife,productionPlace,brand,remark,mname,typeName,mcode,mstate,version,texture
</sql>
<sql id="splitInventoryForView">
id,sid,mpId,siQuantity,mid,depositoryId,iid,pid,sstate,scale,oldUnit,newUnit,mname,dname
</sql>
<select id="findSplitInfoByMidAndUnit" parameterType="map" resultMap="splitInfoMap">
select
<include refid="splitInfoAllColumns"/>
@ -328,5 +349,12 @@
</select>
<select id="findSplitInventoryViewByDepository" parameterType="int" resultMap="splitInventoryViewMap">
select
<include refid="splitInventoryForView"/>
from splitinventoryinfo
where depositoryId = #{depositoryId}
</select>
</mapper>

9
src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java

@ -510,6 +510,15 @@ public interface DepositoryRecordService {
Map<Object, Object> getLineOrBarChartData(Integer depositoryId, String type, String dateType, String echartType);
/**
* 用于获取库存折线图数据
* @param depositoryId 待获取仓库id
* @param dateType 日期类型
* @param echartType 图表类型
* @return
*/
public Map<Object, Object> getLineOrBarChartDataForInventory(Integer depositoryId, String dateType, String echartType);
/**
* 用于获取出入库的旭日图数据
* @param name 当前旭日图名称

8
src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java

@ -438,4 +438,12 @@ public interface MaterialService {
* @return
*/
List<Integer> findInventoryForCompleteOutTask(Map<String,Object> map);
/**
* 获取当前仓库的库存总额
* @param depositoryId 带查询仓库id
* @return
*/
Double findInventorySumForDepository(Integer depositoryId);
}

246
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java

@ -1,5 +1,7 @@
package com.dreamchaser.depository_manage.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PublicConfig;
import com.dreamchaser.depository_manage.config.QyWxConfig;
@ -18,6 +20,8 @@ import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.RoleService;
import com.dreamchaser.depository_manage.service.SplitUnitService;
import com.dreamchaser.depository_manage.utils.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
@ -26,6 +30,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.sql.Time;
import java.util.*;
import java.util.concurrent.*;
@ -5819,31 +5824,41 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
/**
* 获取折线图数据
* 获取出入库折线图数据
*
* @param depositoryId 待获取仓库Id
* @param type 查看类型1入库2出库
* @param dateType 日期类型day按天month按月
* @param echartType 图表类型
* @return
*/
public Map<Object, Object> getLineOrBarChartData(Integer depositoryId, String type, String dateType, String echartType) {
// 最终返回结果
Map<Object, Object> show_data = new HashMap<>();
String redisKey = "depositoryId:" + depositoryId;
String valueKey = "";
if ("1".equals(type)) {
// 如果入库
valueKey = "in:" + dateType;
} else if ("2".equals(type)) {
// 如果出库
valueKey = "out:" + dateType;
}
// 获取至今的日期名称
List<String> dayNames = new ArrayList<>();
List<Long> dayTimeSpaces = new ArrayList<>();
if ("month".equals(dateType)) {
//获取获取系统的当前日历对象
Map<String, Object> monthBeginToNow = DateUtil.getPreviousMonth();
// 获取至今的日期名称
dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("monthNames"), String.class);
Collections.reverse(dayNames);
// 获取至今的日期时间戳
dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("months"), Long.class);
Collections.reverse(dayTimeSpaces);
} else if ("day".equals(dateType)) {
//获取获取系统的当前日历对象
Map<String, Object> monthBeginToNow = DateUtil.getMonthBeginToNow();
@ -5853,14 +5868,193 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class);
dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis());
}
Object value = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, valueKey);
if (value != null) {
// 获取当前redis中的数据(不含当天数据)
List<Double> doubleList = JSONArray.parseArray(value.toString(), Double.class);
Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), ObjectFormatUtil.toInteger(type), depositoryId);
doubleList.add(depositoryRecordByDate);
Map<String, Object> map = createLineOrBarMap(echartType);
map.put("data", doubleList);
show_data.put("data", map);
} else {
// 每天仓库出入库数目
Map<Object, Object> show_data = new HashMap<>();
Map<String, Object> applicationRecordByDate = getLineOrBarChartDataForApplicationRecord(type, dayTimeSpaces, depositoryId, echartType);
show_data.put("data", applicationRecordByDate);
List<Double> doubleList = ObjectFormatUtil.objToList(applicationRecordByDate.get("data"), Double.class);
// 去掉当天数据
doubleList.remove(doubleList.size() - 1);
redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, valueKey, JSONObject.toJSONString(doubleList));
redisPool.getRedisTemplateByDb(15).expire(redisKey,DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
}
show_data.put("dayNames", dayNames);
return show_data;
}
/**
* 用于获取库存折线图数据
* @param depositoryId 待获取仓库id
* @param dateType 日期类型
* @param echartType 图表类型
* @return
*/
public Map<Object, Object> getLineOrBarChartDataForInventory(Integer depositoryId, String dateType, String echartType) {
// 声明仓库库存数据
Map<Object, Object> show_data = new HashMap<>();
// redisKey
String redisKey = "depositoryId:" + depositoryId;
// 获取至今的日期名称
List<String> dayNames = new ArrayList<>();
List<Long> dayTimeSpaces = new ArrayList<>();
if ("month".equals(dateType)) {
//获取获取系统的当前日历对象
Map<String, Object> monthBeginToNow = DateUtil.getPreviousMonth();
// 获取至今的日期名称
dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("monthNames"), String.class);
Collections.reverse(dayNames);
// 获取至今的日期时间戳
dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("months"), Long.class);
Collections.reverse(dayTimeSpaces);
} else if ("day".equals(dateType)) {
//获取获取系统的当前日历对象
Map<String, Object> monthBeginToNow = DateUtil.getMonthBeginToNow();
// 获取至今的日期名称
dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("dayName"), String.class);
// 获取至今的日期时间戳
dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class);
dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis());
}
Set<Object> keys = redisPool.getRedisTemplateByDb(15).opsForHash().keys(redisKey);
// 声明仓库入库数据列表
List<Double> applicationInDataList = new ArrayList<>();
// 声明仓库出库数据列表
List<Double> applicationOutDataList = new ArrayList<>();
// 声明仓库库存数据列表
List<Double> inventoryList = new ArrayList<>();
// 获取当前仓库的库存值
Integer sumForDepository = materialMapper.findInventorySumForDepository(depositoryId);
double depositoryInventory = ObjectFormatUtil.divide(sumForDepository, 100.0, 2);
List<SplitInventoryView> splitInventoryViewByDepository = splitUnitMapper.findSplitInventoryViewByDepository(depositoryId);
Map<Integer, Integer> scaleForSplitInfo = new HashMap<>();
for (SplitInventoryView splitInventoryView : splitInventoryViewByDepository) {
Integer sid = splitInventoryView.getSid();
int scale = 1;
if (scaleForSplitInfo.containsKey(sid)) {
scale = scaleForSplitInfo.get(sid);
} else {
SplitInfo splitInfoById = splitUnitMapper.findSplitInfoById(sid);
scale = splitUnitService.findSplitInfoScaleQuantity(splitInfoById, -1);
scaleForSplitInfo.put(sid, scale);
}
depositoryInventory = ObjectFormatUtil.sum(depositoryInventory, ObjectFormatUtil.divide(splitInventoryView.getSiQuantity(), scale, 2));
}
if (keys.contains("inventory:" + dateType)) {
// 如果redis中存在当前值
Object inventory = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "inventory:" + dateType);
if (inventory != null) {
inventoryList = JSONArray.parseArray(inventory.toString(), Double.class);
}
} else {
if (keys.contains("in:" + dateType)) {
// 如果包含入库数据
Object applicationInDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "in:" + dateType);
if (applicationInDataForRedis != null) {
applicationInDataList = JSONArray.parseArray(applicationInDataForRedis.toString(), Double.class);
Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 1, depositoryId);
applicationInDataList.add(depositoryRecordByDate);
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId);
applicationInDataList.add(depositoryRecordByDate);
}
}
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId);
applicationInDataList.add(depositoryRecordByDate);
}
}
if (keys.contains("out:" + dateType)) {
// 如果包含出库数据
Object applicationOutDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "out:" + dateType);
if (applicationOutDataForRedis != null) {
applicationOutDataList = JSONArray.parseArray(applicationOutDataForRedis.toString(), Double.class);
Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 2, depositoryId);
applicationOutDataList.add(depositoryRecordByDate);
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId);
applicationOutDataList.add(depositoryRecordByDate);
}
}
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId);
applicationOutDataList.add(depositoryRecordByDate);
}
}
}
inventoryList.add(depositoryInventory);
if (inventoryList.size() <= 1) {
// 如果没有
inventoryList.add(depositoryInventory);
for (int i = applicationInDataList.size() - 1; i > 0; i--) {
// 入库数
Double inQuantity = applicationInDataList.get(i);
// 出库数
Double outQuantity = applicationOutDataList.get(i);
depositoryInventory = depositoryInventory - inQuantity + outQuantity;
inventoryList.add(depositoryInventory);
}
Collections.reverse(inventoryList);
}
List<Double> inventoryListCopy = new ArrayList<>();
ObjectMapper objectMap = new ObjectMapper();
try {
inventoryListCopy = objectMap.readValue(objectMap.writeValueAsString(inventoryList), List.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
inventoryListCopy.remove(inventoryListCopy.size() - 1);
redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "inventory:" + dateType, JSONObject.toJSONString(inventoryListCopy));
if (applicationInDataList.size() > 0) {
applicationInDataList.remove(applicationInDataList.size() - 1);
redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "in:" + dateType, JSONObject.toJSONString(applicationInDataList));
}
if (applicationOutDataList.size() > 0) {
applicationOutDataList.remove(applicationOutDataList.size() - 1);
redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "out:" + dateType, JSONObject.toJSONString(applicationOutDataList));
}
redisPool.getRedisTemplateByDb(15).expire(redisKey, DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
Map<String, Object> map = createLineOrBarMap(echartType);
map.put("data", inventoryList);
show_data.put("data", map);
show_data.put("dayNames", dayNames);
return show_data;
}
/**
* 获取当前折线图的具体数据
*
@ -5870,21 +6064,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return
*/
public Map<String, Object> getLineOrBarChartDataForApplicationRecord(String type, List<Long> days, Integer depositoryId, String echartType) {
Map<String, Object> map = new HashMap<>();
if ("line".equals(echartType)) {
map.put("type", "line");
Map<String, Object> areaStyleItem = new HashMap<>();
map.put("areaStyle", areaStyleItem);
} else if ("bar".equals(echartType)) {
map.put("type", "bar");
Map<String, Object> emphasisItem = new HashMap<>();
emphasisItem.put("focus", "series");
map.put("emphasis", emphasisItem);
Map<String, Object> labelItem = new HashMap<>();
labelItem.put("show", true);
labelItem.put("position", "inside");
map.put("label", labelItem);
}
Map<String, Object> map = createLineOrBarMap(echartType);
int i;
List<Double> drCountbyDrName = new ArrayList<>();
for (i = 0; i < days.size() - 1; i++) {
@ -5893,6 +6073,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
Double depositoryRecordByDate = findApplicationRecordByDate(days.get(i + 1), days.get(i), ObjectFormatUtil.toInteger(type), depositoryId);
drCountbyDrName.add(depositoryRecordByDate);
}
map.put("data", drCountbyDrName);
return map;
}
@ -5909,7 +6090,6 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*/
public Map<String, Object> getSunBurstDataByForApplication(String name, String type, Long start, Long end, List<MaterialType> materialTypeAll, Integer depositoryId) {
Map<String, Object> result = new HashMap<>();
int maxThreadSize = materialTypeAll.size();
@ -5957,6 +6137,8 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
return result;
}
/**
* 用于获取当前类别名称下当前月份的出入库的旭日图数据
*
@ -6014,7 +6196,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
}
result.put("children", resultForData);
}else{
} else {
try {
Object call = new getSunBurstDataForApplicationByDepository(type, start, end, materialType, depositoryId).call();
sum = ObjectFormatUtil.sum(sum, ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(call, String.class, Object.class).get("value")));
@ -6136,4 +6318,24 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
}
public Map<String,Object> createLineOrBarMap(String echartType){
Map<String, Object> map = new HashMap<>();
if ("line".equals(echartType)) {
map.put("type", "line");
Map<String, Object> areaStyleItem = new HashMap<>();
map.put("areaStyle", areaStyleItem);
} else if ("bar".equals(echartType)) {
map.put("type", "bar");
Map<String, Object> emphasisItem = new HashMap<>();
emphasisItem.put("focus", "series");
map.put("emphasis", emphasisItem);
Map<String, Object> labelItem = new HashMap<>();
labelItem.put("show", true);
labelItem.put("position", "inside");
map.put("label", labelItem);
}
return map;
}
}

32
src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java

@ -2138,7 +2138,7 @@ public class MaterialServiceImpl implements MaterialService {
// 如果当前是库存
// 获取对应拆单库存处理记录
title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(),inventory.getNumberOfTemporary()), 100.0, 2));
title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(), inventory.getNumberOfTemporary()), 100.0, 2));
List<SplitInventory> splitInventoryList = splitUnitMapper.findSplitInventoryByIid(inventory.getId());
if (splitInventoryList.size() > 0) {
// 如果存在
@ -2168,7 +2168,7 @@ public class MaterialServiceImpl implements MaterialService {
// 如果当前是库存
// 获取对应拆单库存处理记录
title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(),inventory.getNumberOfTemporary()), 100.0, 2));
title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(), inventory.getNumberOfTemporary()), 100.0, 2));
List<SplitInventory> splitInventoryList = splitUnitMapper.findSplitInventoryByIid(inventory.getId());
if (splitInventoryList.size() > 0) {
// 如果存在
@ -2747,6 +2747,34 @@ public class MaterialServiceImpl implements MaterialService {
return midList;
}
/**
* 获取当前仓库的库存总额
* @param depositoryId 带查询仓库id
* @return
*/
@Override
public Double findInventorySumForDepository(Integer depositoryId) {
// 获取当前仓库的库存总数
Integer sumForDepository = materialMapper.findInventorySumForDepository(depositoryId);
double result = ObjectFormatUtil.divide(sumForDepository, 100.0, 2);
List<SplitInventoryView> splitInventoryViewByDepository = splitUnitMapper.findSplitInventoryViewByDepository(depositoryId);
Map<Integer, Integer> scaleForSplitInfo = new HashMap<>();
for (SplitInventoryView splitInventoryView : splitInventoryViewByDepository) {
Integer sid = splitInventoryView.getSid();
int scale = 1;
if (scaleForSplitInfo.containsKey(sid)) {
scale = scaleForSplitInfo.get(sid);
} else {
SplitInfo splitInfoById = splitUnitMapper.findSplitInfoById(sid);
scale = splitUnitService.findSplitInfoScaleQuantity(splitInfoById, -1);
scaleForSplitInfo.put(sid, scale);
}
result = ObjectFormatUtil.sum(result, ObjectFormatUtil.divide(splitInventoryView.getSiQuantity(), scale, 2));
}
return result;
}
List<MaterialAndPlaceForViewP> packMpvList(List<MaterialAndPlaceForViewP> materialAndPlaceForViewList, Map<String, Object> map) {
for (MaterialAndPlaceForViewP mpv : materialAndPlaceForViewList

5
src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html

@ -97,6 +97,9 @@
type: ''
}
],
tooltip: {
trigger: 'axis'
},
toolbox: {
feature: {
myFull: {
@ -169,7 +172,7 @@
initBarChartByDateType = function (req) {
$.ajax({
url: '/depositoryRecord/getBarChartDataByDateType',
url: '/depositoryRecord/getLineOrBarChartDataByDateType',
type: 'post',
dataType: "json",
data: JSON.stringify(req),

21
src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html

@ -81,6 +81,7 @@
// 旭日图
var echartSunburstChart = echarts.init(document.getElementById('echarts-sunburst-chart'));
var optionSunburstChart = {
title: {
textStyle: {
fontSize: 14,
@ -94,26 +95,8 @@
type: 'sunburst',
data: [],
radius: [0, '95%'],
itemStyle: {
borderWidth: 1,
borderColor: "white",
borderType: "solid",
shadowBlur: 0,
shadowColor: 'rgba(0, 0, 0, 0.2)',
shadowOffsetX: 0,
shadowOffsetY: 0,
opacity: 1
},
emphasis: {
focus: 'ancestor'
},
blue: {
itemStyle: {
opacity: 0.2
},
label: {
opacity: 0.1
}
focus: 'descendant'
},
label: {
rotate: '0'

9
src/main/resources/templates/pages/depository/table-out.html

@ -487,7 +487,8 @@
</ul>`;
$("#showEchart").append(listItem)
}else if(obj.event === "showSunburstEchart"){
}
else if(obj.event === "showSunburstEchart"){
layer.open({
type: 2,
offset: 'r',
@ -499,7 +500,8 @@
id: 'applicationOutInfoForLeft',
content: '/sunburstEchartForTable?type=2',
});
}else if(obj.event === "showLineEchart"){
}
else if(obj.event === "showLineEchart"){
layer.open({
type: 2,
offset: 'r',
@ -511,7 +513,8 @@
id: 'applicationOutInfoForLeft',
content: '/lineOrBarEchartForTable?type=2&echartType=line',
});
}else if(obj.event === "showBarEchart"){
}
else if(obj.event === "showBarEchart"){
layer.open({
type: 2,
offset: 'r',

46
src/main/resources/templates/pages/depository/table-stock.html

@ -469,15 +469,51 @@
}
else if (obj.event === 'showEchart') {
let listItem = `<ul class="layui-table-tool-panel" style="max-height: 685px;">
<li lay-event="showLineEchart">查看面积图</li>
<li lay-event="showLineEchart">查看折线图</li>
<li lay-event="showBarEchart">查看柱状图</li>
<li lay-event="showSunburstEchart">查看旭日图</li>
</ul>`;
$("#showEchart").append(listItem)
}else if(obj.event === 'showLineEchart'){
console.log("showLineEchart")
}else if(obj.event === "showSunburstEchart"){
console.log("showSunburstEchart")
}
else if(obj.event === "showSunburstEchart"){
/*layer.open({
type: 2,
offset: 'r',
anim: 'slideLeft', // 从右往左
area: ['40%', '100%'],
shade: 0.1,
title: "旭日图",
shadeClose: true,
id: 'applicationOutInfoForLeft',
content: '/sunburstEchartForTable?type=3',
});*/
}
else if(obj.event === "showLineEchart"){
layer.open({
type: 2,
offset: 'r',
anim: 'slideLeft', // 从右往左
area: ['40%', '100%'],
shade: 0.1,
title: "折线图",
shadeClose: true,
id: 'applicationOutInfoForLeft',
content: '/lineOrBarEchartForTable?type=3&echartType=line',
});
}
else if(obj.event === "showBarEchart"){
layer.open({
type: 2,
offset: 'r',
anim: 'slideLeft', // 从右往左
area: ['40%', '100%'],
shade: 0.1,
title: "柱状图",
shadeClose: true,
id: 'applicationOutInfoForLeft',
content: '/lineOrBarEchartForTable?type=3&echartType=bar',
});
}
});

362
src/test/java/com/dreamchaser/depository_manage/InventoryLineChartTest.java

@ -1,14 +1,19 @@
package com.dreamchaser.depository_manage;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PublicConfig;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.pojo.InventoryByDname;
import com.dreamchaser.depository_manage.security.pool.RedisPool;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.DepositoryService;
import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.service.MaterialTypeService;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@ -36,212 +41,211 @@ public class InventoryLineChartTest {
@Autowired
DepositoryService depositoryService;
@Autowired
RedisPool redisPool;
@Test
public void main() {
Map<Object, Object> day = getLineOrBarChartDataForInventory(41, "day", "line");
System.out.println(day);
}
/**
* 获取本月之前的月份
* 获取折线图数据
*
* @param depositoryId 待获取仓库Id
* @param dateType 日期类型day按天month按月
* @return
*/
public static Map<String, Object> getPreviousMonth() {
Calendar instance = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
Map<String, Object> source = new HashMap<>();
List<Object> sourceList = new ArrayList<>();
int month = instance.get(Calendar.MONTH) + 1;
// 获取下个月
instance.add(Calendar.MONTH, 1);
Long nextMonth = DateUtil.DateTimeByMonthToTimeStamp(formatter.format(instance.getTime()));
ArrayList<Object> months = new ArrayList<>();
months.add(nextMonth);
instance.add(Calendar.MONTH, -1);
while (month > 0) {
instance.set(Calendar.MONTH, month);
instance.set(Calendar.DAY_OF_MONTH, -1);
source.put("month", month + "月");
months.add(DateUtil.DateTimeByMonthToTimeStamp(formatter.format(instance.getTime())));
month--;
sourceList.add(((HashMap<String, Object>) source).clone());
}
instance.set(Calendar.MONTH, month);
instance.add(Calendar.MONTH, 1);
Map<String, Object> map = new HashMap<>();
map.put("months", months);
map.put("sourceList", sourceList);
return map;
}
public Map<Object, Object> getLineOrBarChartDataForInventory(Integer depositoryId, String dateType, String echartType) {
// 声明仓库库存数据
Map<Object, Object> show_data = new HashMap<>();
@Test
public void main() {
UserByPort userByPort = PublicConfig.FindUserById(87, null,null);
Map<String, Integer> depositoryAllNameAndId = depositoryService.findDepositoryAllNameAndId(userByPort);
Map<Object, Object> barChartData = getInventoryLineChartData(depositoryAllNameAndId);
System.out.println(JSONObject.toJSONString(barChartData));
}
// redisKey
String redisKey = "depositoryId:" + depositoryId;
// 获取柱状图数据
public Map<Object, Object> getInventoryLineChartData(Map<String, Integer> depositoryAllNameAndId) {
// 获取至今的日期名称
List<String> dayNames = new ArrayList<>();
List<Long> dayTimeSpaces = new ArrayList<>();
if ("month".equals(dateType)) {
//获取获取系统的当前日历对象
// 每天各仓库入库数目
Map<Object, Object> show_data = new HashMap<>();
Map<String, Object> monthBeginToNow = DateUtil.getPreviousMonth();
// 获取当前各仓库的库存数
List<InventoryByDname> toDayInventoryByDName = depositoryService.getToDayInventoryByDName();
// 获取遍历器
Iterator it = depositoryAllNameAndId.keySet().iterator();
// 获取至今的日期名称
dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("monthNames"), String.class);
Collections.reverse(dayNames);
// 获取至今的日期时间戳
dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("months"), Long.class);
Collections.reverse(dayTimeSpaces);
} else if ("day".equals(dateType)) {
//获取获取系统的当前日历对象
Calendar instance = Calendar.getInstance();
int weekDay = instance.get(Calendar.DAY_OF_WEEK);
weekDay = weekDay - 1;
if (weekDay == 1) {
while (it.hasNext()) {
List<Object> objectList = new ArrayList<>();
String key = it.next().toString();
String dname = key.split(",")[0];
Double inventoryByDname = getInventoryByDname(dname, toDayInventoryByDName);
Map<String, Object> map = new HashMap<>();
map.put("type", "line");
Map<String, Object> areaStyleItem = new HashMap<>();
map.put("areaStyle", areaStyleItem);
List<Double> doubleList = new ArrayList<>();
doubleList.add(inventoryByDname);
map.put("data", doubleList);
objectList.add(map);
show_data.put(key,objectList);
}
}else{
// 获取日期
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
int now = instance.get(Calendar.DAY_OF_WEEK) - 1 == 0 ? 7 : instance.get(Calendar.DAY_OF_WEEK) - 1;
List<Long> days = new ArrayList<>(); // 周一至今的每天
instance.add(Calendar.DATE, 1);
days.add(DateUtil.DateTimeByDayToTimeStamp(formatter.format(instance.getTime())));
instance.add(Calendar.DATE, -1);
days.add(DateUtil.DateTimeByDayToTimeStamp(formatter.format(instance.getTime())));
while (now - 1 > 0) {
now--;
instance.add(Calendar.DATE, -1);
Long format = DateUtil.DateTimeByDayToTimeStamp(formatter.format(instance.getTime()));
days.add(format);
}
// 定义线程
int threadSize = depositoryAllNameAndId.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
while (it.hasNext()) {
Object next = it.next();
getInventoryByDate getApplicationRecordByDate = new getInventoryByDate(next.toString(), days, depositoryAllNameAndId, toDayInventoryByDName);
Future<Object> future = completionService.submit(getApplicationRecordByDate);
futureList.add(future);
}
for (int i = 0; i < depositoryAllNameAndId.size(); i++) {
Object result = null;
Map<String, Object> monthBeginToNow = DateUtil.getMonthBeginToNow();
// 获取至今的日期名称
dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("dayName"), String.class);
// 获取至今的日期时间戳
dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class);
dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis());
}
Set<Object> keys = redisPool.getRedisTemplateByDb(15).opsForHash().keys(redisKey);
// 声明仓库入库数据列表
List<Double> applicationInDataList = new ArrayList<>();
// 声明仓库出库数据列表
List<Double> applicationOutDataList = new ArrayList<>();
// 声明仓库库存数据列表
List<Double> inventoryList = new ArrayList<>();
// 获取当前仓库的库存值
Double depositoryInventory = materialService.findInventorySumForDepository(depositoryId);
if (keys.contains("inventory:" + dateType)) {
// 如果redis中存在当前值
Object inventory = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "inventory:" + dateType);
if (inventory != null) {
inventoryList = JSONArray.parseArray(inventory.toString(), Double.class);
}
} else {
if (keys.contains("in:" + dateType)) {
// 如果包含入库数据
Object applicationInDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "in:" + dateType);
if (applicationInDataForRedis != null) {
applicationInDataList = JSONArray.parseArray(applicationInDataForRedis.toString(), Double.class);
Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 1, depositoryId);
applicationInDataList.add(depositoryRecordByDate);
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId);
applicationInDataList.add(depositoryRecordByDate);
}
}
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId);
applicationInDataList.add(depositoryRecordByDate);
}
}
if (keys.contains("out:" + dateType)) {
// 如果包含出库数据
Object applicationOutDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "out:" + dateType);
if (applicationOutDataForRedis != null) {
applicationOutDataList = JSONArray.parseArray(applicationOutDataForRedis.toString(), Double.class);
Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 2, depositoryId);
applicationOutDataList.add(depositoryRecordByDate);
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId);
applicationOutDataList.add(depositoryRecordByDate);
}
}
} else {
for (int i = 0; i < dayTimeSpaces.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId);
applicationOutDataList.add(depositoryRecordByDate);
}
}
}
inventoryList.add(depositoryInventory);
if (inventoryList.size() <= 1) {
// 如果没有
inventoryList.add(depositoryInventory);
for (int i = applicationInDataList.size() - 1; i > 0; i--) {
// 入库数
Double inQuantity = applicationInDataList.get(i);
// 出库数
Double outQuantity = applicationOutDataList.get(i);
depositoryInventory = depositoryInventory - inQuantity + outQuantity;
inventoryList.add(depositoryInventory);
}
Collections.reverse(inventoryList);
}
List<Double> inventoryListCopy = new ArrayList<>();
ObjectMapper objectMap = new ObjectMapper();
try {
result = completionService.take().get();
} catch (InterruptedException | ExecutionException e) {
inventoryListCopy = objectMap.readValue(objectMap.writeValueAsString(inventoryList), List.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
show_data.putAll((Map<?, ?>) result);
}
}
inventoryListCopy.remove(inventoryListCopy.size() - 1);
redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "inventory:" + dateType, JSONObject.toJSONString(inventoryListCopy));
if (applicationInDataList.size() > 0) {
applicationInDataList.remove(applicationInDataList.size() - 1);
redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "in:" + dateType, JSONObject.toJSONString(applicationInDataList));
return show_data;
}
/**
* 根据日期获取各仓库库存的数量
*/
class getInventoryByDate implements Callable<Object> {
String key;
List<Long> days;
Map<String, Integer> depositoryAllNameAndId;
List<InventoryByDname> inventoryByDnameList;
getInventoryByDate(String key, List<Long> days, Map<String, Integer> depositoryAllNameAndId, List<InventoryByDname> inventoryByDnameList) {
this.key = key;
this.depositoryAllNameAndId = depositoryAllNameAndId;
this.days = days;
this.inventoryByDnameList = inventoryByDnameList;
if (applicationOutDataList.size() > 0) {
applicationOutDataList.remove(applicationOutDataList.size() - 1);
redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "out:" + dateType, JSONObject.toJSONString(applicationOutDataList));
}
@Override
public Object call() throws Exception {
Map<Integer, Object> result = new HashMap<>();
redisPool.getRedisTemplateByDb(15).expire(redisKey, DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS);
Map<String, Object> map = new HashMap<>();
if ("line".equals(echartType)) {
map.put("type", "line");
Map<String, Object> areaStyleItem = new HashMap<>();
map.put("areaStyle", areaStyleItem);
int i;
List<Double> drCountbyDrName = new ArrayList<>();
// 获取当前仓库
String dname = key.split(",")[0];
// 获取当前仓库下的库存
Double inventoryByDname = getInventoryByDname(dname, inventoryByDnameList);
// 将当前仓库的库存添加到结果集中
drCountbyDrName.add(inventoryByDname);
Integer val = (Integer) depositoryAllNameAndId.get(key);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
boolean flag = false;
// 判断当天是否有出入口记录
Calendar IsInOut = Calendar.getInstance();
Long start = DateUtil.DateTimeByDayToTimeStamp(formatter.format(IsInOut.getTime()));
IsInOut.add(Calendar.DATE, 1);
Long end = DateUtil.DateTimeByDayToTimeStamp(formatter.format(IsInOut.getTime()));
// 判断今天是否有出入库记录
Integer inCount = depositoryRecordService.findApplicationInRecordByDate(end, start, null);
Integer OutCount = depositoryRecordService.findApplicationOutRecordByDate(end, start, null);
if (inCount > 0 || OutCount > 0) {
flag = true;
}
int j = 0;
for (i = days.size() - 1; i > 0; i--) {
// 当前日期额度
Double aDouble = drCountbyDrName.get(j++);
// 如果今天有出入库记录
if (flag) {
Integer inRecordByDate = depositoryRecordService.findApplicationInRecordByDate(end, start, val);
Integer OutRecordByDate = depositoryRecordService.findApplicationOutRecordByDate(end, start, val);
aDouble = aDouble - (inRecordByDate / 100.0) + (OutRecordByDate / 100.0);
flag = false;
}
// 获取当前仓库当前时间的入库数量
Double depositoryRecordByDateForIn = depositoryRecordService.findApplicationRecordByDate(days.get(i - 1), days.get(i), 1, val);
// 获取当前仓库当前时间的出库数量
Double depositoryRecordByDateForOut = depositoryRecordService.findApplicationRecordByDate(days.get(i - 1), days.get(i), 2, val);
Double warehouserCount = aDouble - depositoryRecordByDateForIn + depositoryRecordByDateForOut;
drCountbyDrName.add(warehouserCount);
}
Collections.reverse(drCountbyDrName);
map.put("data", drCountbyDrName);
result.put(val, map);
return result;
}
} else if ("bar".equals(echartType)) {
map.put("type", "bar");
Map<String, Object> emphasisItem = new HashMap<>();
emphasisItem.put("focus", "series");
map.put("emphasis", emphasisItem);
Map<String, Object> labelItem = new HashMap<>();
labelItem.put("show", true);
labelItem.put("position", "inside");
map.put("label", labelItem);
}
map.put("data", inventoryList);
show_data.put("data", map);
show_data.put("dayNames", dayNames);
return show_data;
}
/**
* 获取当前仓库下的库存
* 获取当前折线图的具体数据
*
* @param dname
* @param list
* @param type 查看类型1入库2出库
* @param days 查询日期
* @param depositoryId 仓库id
* @return
*/
public Double getInventoryByDname(String dname, List<InventoryByDname> list) {
for (InventoryByDname inventoryByDname : list) {
if (dname.equals(inventoryByDname.getDname())) {
return inventoryByDname.getInventory();
public Map<String, Object> getLineOrBarChartDataForApplicationRecord(String type, List<Long> days, Integer depositoryId, String echartType) {
Map<String, Object> map = new HashMap<>();
if ("line".equals(echartType)) {
map.put("type", "line");
Map<String, Object> areaStyleItem = new HashMap<>();
map.put("areaStyle", areaStyleItem);
} else if ("bar".equals(echartType)) {
map.put("type", "bar");
Map<String, Object> emphasisItem = new HashMap<>();
emphasisItem.put("focus", "series");
map.put("emphasis", emphasisItem);
Map<String, Object> labelItem = new HashMap<>();
labelItem.put("show", true);
labelItem.put("position", "inside");
map.put("label", labelItem);
}
int i;
List<Double> drCountbyDrName = new ArrayList<>();
for (i = 0; i < days.size() - 1; i++) {
// 遍历 Map并计算各仓库的入库数
// 获取一段时间内的库存额度
Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(days.get(i + 1), days.get(i), ObjectFormatUtil.toInteger(type), depositoryId);
drCountbyDrName.add(depositoryRecordByDate);
}
return 0.0;
map.put("data", drCountbyDrName);
return map;
}
}

318
src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java

@ -1,9 +1,11 @@
package com.dreamchaser.depository_manage;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PublicConfig;
import com.dreamchaser.depository_manage.entity.Depository;
import com.dreamchaser.depository_manage.entity.MaterialType;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.InventoryByMTAndDepository;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.DepositoryService;
@ -38,228 +40,194 @@ public class InventorySunburstDataTest {
@Autowired
DepositoryService depositoryService;
@Test
public void main() {
String type = "2";
// 获取本月之前的月份
Map<String, Object> previousMonth = DateUtil.getPreviousMonth();
// 获取月份的时间戳
List<Long> months = ObjectFormatUtil.objToList(previousMonth.get("months"), Long.class);
List<MaterialType> materialTypeNoParent = materialTypeService.findMaterialTypeNoParent();
Map<String, Object> sourceListTask = getSunBurstDataForApplication("7月", type, months.get(2), months.get(1), materialTypeNoParent);
System.out.println(JSONObject.toJSONString(sourceListTask));
}
/**
* 获取本月之前的月份
* 用于获取出入库的旭日图数据
*
* @param dayName 当前月份名称
* @param type 查看类型
* @param start 开始时间
* @param end 结束时间
* @param materialTypeAll 当前查看物料类型
* @return
*/
public static Map<String, Object> getPreviousMonth() {
Calendar instance = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
Map<String, Object> source = new HashMap<>();
List<Object> sourceList = new ArrayList<>();
int month = instance.get(Calendar.MONTH) + 1;
// 获取下个月
instance.add(Calendar.MONTH, 1);
Long nextMonth = DateUtil.DateTimeByMonthToTimeStamp(formatter.format(instance.getTime()));
ArrayList<Object> months = new ArrayList<>();
months.add(nextMonth);
instance.add(Calendar.MONTH, -1);
while (month > 0) {
instance.set(Calendar.MONTH, month);
instance.set(Calendar.DAY_OF_MONTH, -1);
source.put("month", month + "月");
months.add(DateUtil.DateTimeByMonthToTimeStamp(formatter.format(instance.getTime())));
month--;
sourceList.add(((HashMap<String, Object>) source).clone());
public Map<String, Object> getSunBurstDataForApplication(String dayName, String type, Long start, Long end, List<MaterialType> materialTypeAll) {
Map<String, Object> result = new HashMap<>();
int maxThreadSize = materialTypeAll.size();
int threadSize = Runtime.getRuntime().availableProcessors();
ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize));
// 结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
List<Object> resultForData = new ArrayList<>();
for (MaterialType materialType : materialTypeAll) {
// 测试
Future<Object> future = completionService.submit(new getSunBurstDataForApplicationByDepository(type, start, end, materialType));
futureList.add(future);
}
instance.set(Calendar.MONTH, month);
instance.add(Calendar.MONTH, 1);
Map<String, Object> map = new HashMap<>();
map.put("months", months);
map.put("sourceList", sourceList);
return map;
double sum = 0.0;
for (int i = 0; i < materialTypeAll.size(); i++) {
Object obj = null;
try {
obj = completionService.take().get();
sum = ObjectFormatUtil.sum(sum,ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(obj,String.class,Object.class).get("value")));
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
resultForData.add(obj);
}
result.put("children", resultForData);
result.put("name", dayName);
result.remove("month");
result.put("value", sum);
// 用于生产随机的颜色
Random random = new Random();
Map<String, String> itemStyle = new HashMap<>();
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")");
result.put("itemStyle", itemStyle);
return result;
}
@Test
public void main() {
/**
* 用于获取当前类别名称下当前月份的出入库的旭日图数据
*
* @param dayName 当前月份
* @param type 类型1入库2出库
* @param start 开始
* @param end 结束
* @param mtName 类别名称
* @return
*/
public Map<String, Object> getSunBurstDataByMtName(String dayName, String type, Long start, Long end, String mtName) {
List<MaterialType> materialTypeByNames = materialTypeService.findMaterialTypeByName(mtName);
MaterialType materialType = null;
if (materialTypeByNames.size() > 0) {
materialType = materialTypeByNames.get(0);
} else {
throw new MyException("错误,不存在当前名称的类型");
}
List<MaterialType> childMaterialTypeList = materialTypeService.findChildForMaterialTypeByParent(materialType.getOldId());
UserByPort userByPort = PublicConfig.FindUserById(78, null,null);
int threadSize = PublicConfig.availableVirtualMachine;
int maxThreadSize = childMaterialTypeList.size();
if (maxThreadSize < threadSize) {
maxThreadSize = threadSize * 2;
}
ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize));
public List<Object> getInventorySunburstData(UserByPort userByPort){
Map<String, Object> previousMonth = DateUtil.getPreviousMonth();
// 获取所有月份
List<Object> months = (List<Object>) previousMonth.get("months");
// 获取月份名称
List<Object> sourceList = (List<Object>) previousMonth.get("sourceList");
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MONTH, 1);
instance.set(Calendar.DATE, 1);
// 获取当前用于可见的仓库列表
List<Depository> depositoryList = depositoryService.findDepositoryByAdminorgAndUser(userByPort);
// 定义每次开启的线程数
int threadSize = depositoryList.size();
// 开启对应数量的线程
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 定义线程结果集
// 结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<>(exs);
// 用于存储当前仓库各物料类型的库存数
Map<Integer, List<InventoryByMTAndDepository>> inventoryForMTAndDepository = new HashMap<>();
// 定义结果集
List<Object> result = new ArrayList<>();
// 定义各
for (int num = 0; num < months.size() - 1; num++) {
// 获取起始时间
Object start = months.get(num + 1);
// 获取结束时间
Object end = months.get(num);
// 获取当前计算的月份
Object month = ((Map<String, Object>) sourceList.get(num)).get("month");
for (Depository depository : depositoryList
) {
// 获取当前仓库id
Integer depositoryId = depository.getId();
// 判断当前当前仓库各物料类型的库存是否存在
List<InventoryByMTAndDepository> inventoryByMTAndDepositories = inventoryForMTAndDepository.get(depositoryId);
if (inventoryByMTAndDepositories == null || inventoryByMTAndDepositories.size() == 0) {
// 如果不存在则获取
inventoryByMTAndDepositories = depositoryService.getTodayInventoryInfoByDidAndMt(depositoryId);
}
// 开启线程计算结果
Future<Object> submit = completionService.submit(new inventoryByMaterialTypeForMonth(start, end, depository, inventoryByMTAndDepositories));
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
int runThreadSize = 0;
for (MaterialType value : childMaterialTypeList) {
Future<Object> submit = completionService.submit(new getSunBurstDataForApplicationByDepository(type, start, end, value));
runThreadSize++;
futureList.add(submit);
}
List<Object> childItems = new ArrayList<>();
double value = 0.0;
for (int i = 0; i < depositoryList.size(); i++) {
double sum = 0.0;
List<Object> resultForData = new ArrayList<>();
for (int i = 0; i < runThreadSize; i++) {
Object obj = null;
try {
obj = completionService.take().get();
Map<String, Object> objectMap = (Map<String, Object>) obj;
Integer id = ObjectFormatUtil.toInteger((objectMap).get("id"));
List<InventoryByMTAndDepository> inventoryByMtAndD = (List<InventoryByMTAndDepository>)objectMap.get("inventoryByMtAndD");
value += ObjectFormatUtil.toDouble(objectMap.get("value"));
inventoryForMTAndDepository.put(id,inventoryByMtAndD);
(objectMap).remove("id");
(objectMap).remove("inventoryByMtAndD");
childItems.add(obj);
resultForData.add(obj);
sum = ObjectFormatUtil.sum(sum,ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(obj,String.class,Object.class).get("value")));
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
Map<String,Object> stringObjectMap = new HashMap<>();
stringObjectMap.put("children",childItems);
stringObjectMap.put("name",month);
stringObjectMap.put("value",value);
Map<String, Object> result = new HashMap<>();
result.put("children", resultForData);
result.put("name", dayName);
result.remove("month");
result.put("value", sum);
// 用于生产随机的颜色
Random random = new Random();
Map<String, String> itemStyle = new HashMap<>();
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
Map<String, String> itemStyle = new HashMap<>();
itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")");
stringObjectMap.put("itemStyle", itemStyle);
result.add(stringObjectMap);
}
result.put("itemStyle", itemStyle);
return result;
}
/**
* 用于计算当前时间段内当前仓库下各物料类型的库存
* 用于具体执行查询旭日图的多线程类
*/
class inventoryByMaterialTypeForMonth implements Callable<Object> {
// 开始时间
Object start;
// 结束时间
Object end;
// 查询仓库
Depository depository;
// 当前仓库各物料类型库存数
List<InventoryByMTAndDepository> todayInventoryInfoByDidAndMt;
public inventoryByMaterialTypeForMonth(Object start, Object end, Depository depository, List<InventoryByMTAndDepository> todayInventoryInfoByDidAndMt) {
class getSunBurstDataForApplicationByDepository implements Callable<Object> {
String type;
Long start;
Long end;
MaterialType materialType;
public getSunBurstDataForApplicationByDepository(String type, Long start, Long end, MaterialType materialType) {
this.type = type;
this.start = start;
this.end = end;
this.depository = depository;
this.todayInventoryInfoByDidAndMt = todayInventoryInfoByDidAndMt;
this.materialType = materialType;
}
@Override
public Object call() throws Exception {
// 定义当前返回结果
Map<String, Object> map = new HashMap<>();
map.put("type", ObjectFormatUtil.toInteger(type));
if (ObjectFormatUtil.toInteger(type) == 1) {
map.put("state", "已入库");
} else if (ObjectFormatUtil.toInteger(type) == 2) {
map.put("state", "已出库");
}
map.put("start", start);
map.put("end", end);
map.put("depositoryId", "41");
map.put("oldId", materialType.getOldId());
Map<String, Object> result = new HashMap<>();
// 定义当前仓库的总数
double inventorySum = 0.0;
for (InventoryByMTAndDepository item : todayInventoryInfoByDidAndMt
) {
inventorySum += item.getInventory();
}
result.put("name", depository.getDname());
result.put("id",depository.getId());
result.put("value", inventorySum);
Double materialCountByMonth = depositoryRecordService.calMaterialTypeTopCount(map);
result.put("name", materialType.getTname());
result.put("value", materialCountByMonth);
Map<String, String> itemStyle = new HashMap<>();
// 用于生产随机的颜色
Random random = new Random();
int r = random.nextInt(256);
int g = random.nextInt(256);
int b = random.nextInt(256);
Map<String, String> itemStyle = new HashMap<>();
itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")");
result.put("itemStyle", itemStyle);
// 获取所有顶级物料类型
List<MaterialType> materialTypeNoParent = materialTypeService.findMaterialTypeNoParent();
Map<String, Object> paramIn = new HashMap<>();
Map<String, Object> paramOut = new HashMap<>();
// 获取每月入库总额
paramIn.put("type", 1);
paramIn.put("state", "已入库");
paramIn.put("depository_id", depository.getId());
paramIn.put("start", start);
paramIn.put("end", end);
// 获取每月出库总额
paramOut.put("type", 2);
paramOut.put("state", "已出库");
paramOut.put("depository_id", depository.getId());
paramOut.put("start", start);
paramOut.put("end", end);
List<Object> children = new ArrayList<>();
for (MaterialType materialType : materialTypeNoParent
) {
// 生成子数据
Map<String, Object> resultItem = new HashMap<>();
resultItem.put("name", materialType.getTname());
// 用于生产随机的颜色
Map<String, String> itemStyleItem = new HashMap<>();
int rt = random.nextInt(256);
int gt = random.nextInt(256);
int bt = random.nextInt(256);
itemStyleItem.put("color", "rgb(" + rt + "," + gt + "," + bt + ")");
result.put("itemStyle", itemStyleItem);
long oldId = materialType.getOldId();
paramIn.put("oldId", oldId);
paramOut.put("oldId", oldId);
// 获取当前类别在当前仓库下当前月份的入库总额
Double wareHouseInCountByMonth = depositoryRecordService.calMaterialTypeTopCount(paramIn);
// 获取当前类别在当前仓库下当前月份的出库总额
Double wareHouseOutCountByMonth = depositoryRecordService.calMaterialTypeTopCount(paramOut);
for (InventoryByMTAndDepository item : todayInventoryInfoByDidAndMt
) {
long mtId = item.getMtId();
// 如果是同一类型
if (mtId == oldId) {
// 计算上个月该类型库存数
Double wareHouseCount = item.getInventory() - wareHouseInCountByMonth + wareHouseOutCountByMonth;
// 修改库存记录
item.setInventory(wareHouseCount);
resultItem.put("value", wareHouseCount);
}
}
children.add(resultItem);
}
result.put("children", children);
result.put("inventoryByMtAndD",todayInventoryInfoByDidAndMt);
return result;
}
}

111
src/test/java/com/dreamchaser/depository_manage/LineChartForInventoryTest.java

@ -1,111 +0,0 @@
package com.dreamchaser.depository_manage;
import com.dreamchaser.depository_manage.entity.Inventory;
import com.dreamchaser.depository_manage.pojo.RestResponse;
import com.dreamchaser.depository_manage.service.DepositoryRecordService;
import com.dreamchaser.depository_manage.service.MaterialService;
import com.dreamchaser.depository_manage.utils.DateUtil;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.*;
import java.util.concurrent.*;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class LineChartForInventoryTest {
@Autowired
private MaterialService materialService;
@Autowired
private DepositoryRecordService depositoryRecordService;
/**
* 用于获取当前物料的本月出入库记录
*
* @param id 带查询库存id
*/
public RestResponse getInventoryApplication(Integer id) {
// 获取当前物料的库存数据
Inventory inventoryById = materialService.findInventoryById(id);
// 获取本月至今的日期
Map<String, Object> monthBeginToNow = DateUtil.getMonthBeginToNow();
// 获取至今的日期名称
List<String> dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("dayName"), String.class);
// 获取至今的日期时间戳
List<Long> dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class);
dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis());
// 获取当前物料的入库总额与数量
Map<String, Object> seriesForApplicationIn = depositoryRecordService.getApplicationByMaterial(id, dayTimeSpaces, 1,true,null);
Object amountItemForIn = seriesForApplicationIn.get("amountItem");
Object countItemForIn = seriesForApplicationIn.get("countItem");
// 将入库总额项目转为map类型
Map<String, Object> countItemForInMapString = ObjectFormatUtil.objToMap(countItemForIn, String.class, Object.class);
// 获取入库总额data并转为list类型
List<Double> amountListForIn = ObjectFormatUtil.objToList(countItemForInMapString.get("data"), Double.class);
// 获取当前物料的出库总额与数量
Map<String, Object> seriesForApplicationOut = depositoryRecordService.getApplicationByMaterial(id, dayTimeSpaces, 2,true,null);
Object amountItemForOut = seriesForApplicationOut.get("amountItem");
Object countItemForOut = seriesForApplicationOut.get("countItem");
// 将出库总额项目转为map类型
Map<String, Object> countItemForOutMapString = ObjectFormatUtil.objToMap(countItemForOut, String.class, Object.class);
// 获取出库总额data并转为list类型
List<Double> amountListForOut = ObjectFormatUtil.objToList(countItemForOutMapString.get("data"), Double.class);
// 定义库存数量列表
List<Object> inventoryCountList = new ArrayList<>();
// 定义库存总额列表
List<Object> inventoryAmountList = new ArrayList<>();
// 获取当前库存
double inventory = inventoryById.getQuantity() / 100.0;
// 获取当前物料单价
Double price = inventoryById.getPrice();
// 获取当前物料总额
double amount = ObjectFormatUtil.multiply(inventory, price);
// 添加
inventoryAmountList.add(amount);
inventoryCountList.add(inventory);
for (int i = amountListForOut.size() - 1; i > 0; i--) {
// 获取当前日期下的库存 库存 = 库存 + 出库 - 入库
inventory = ObjectFormatUtil.subtract(ObjectFormatUtil.sum(inventory, amountListForOut.get(i)), amountListForIn.get(i));
inventoryCountList.add(inventory);
inventoryAmountList.add(ObjectFormatUtil.multiply(inventory, price));
}
// 反转
Collections.reverse(inventoryAmountList);
Collections.reverse(inventoryCountList);
Map<String, Object> countItemForInventory = depositoryRecordService.createStackedAreaChartSeriesItem("count", inventoryCountList);
Map<String, Object> amountItemForInventory = depositoryRecordService.createStackedAreaChartSeriesItem("count", inventoryAmountList);
Map<String, Object> result = new HashMap<>();
result.put("amountItemForIn", amountItemForIn);
result.put("countItemForIn", countItemForIn);
result.put("amountItemForOut", amountItemForOut);
result.put("countItemForOut", countItemForOut);
System.out.println(countItemForIn);
System.out.println(countItemForOut);
Map<String, List<String>> legendItem = new HashMap<>();
List<String> legends = new ArrayList<>();
legends.add("count");
legends.add("amount");
legendItem.put("data", legends);
result.put("legend", legendItem);
result.put("dayNames", dayNames);
result.put("countItemForInventory",countItemForInventory);
result.put("amountItemForInventory",amountItemForInventory);
return new RestResponse(result);
}
@Test
public void Test() {
getInventoryApplication(3537);
}
}

12
src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java

@ -49,17 +49,15 @@ public class SunburstChartTest {
// 获取月份名称
List<Object> sourceList = ObjectFormatUtil.objToList(previousMonth.get("sourceList"), Object.class);
// 结果集
// List<MaterialType> materialTypeNoParent = materialTypeService.findMaterialTypeNoParent();
List<MaterialType> materialTypeNoParent = materialTypeService.findMaterialTypeNoParent();
// 1.定义CompletionService
// Map<String, Object> map = ObjectFormatUtil.objToMap(sourceList.get(4), String.class, Object.class);
// Map<String, Object> sourceListTask = getSunBurstDataForApplication("map", type, months.get(2), months.get(1), materialTypeNoParent);
// System.out.println(JSONObject.toJSONString(sourceListTask));
Map<String, Object> sourceListTask = getSunBurstDataForApplication("map", type, months.get(2), months.get(1), materialTypeNoParent);
System.out.println(JSONObject.toJSONString(sourceListTask));
// 用于返回结果
Map<String, Object> sunBurstDataByMtName = getSunBurstDataByMtName("7月", "1", months.get(2), months.get(1), "化验器具");
System.out.println(sunBurstDataByMtName);
// Map<String, Object> sunBurstDataByMtName = getSunBurstDataByMtName("7月", "1", months.get(2), months.get(1), "化验器具");
// System.out.println(sunBurstDataByMtName);
}
/**

Loading…
Cancel
Save