Browse Source

更新仓库选择、类型选择算法

lwx_dev
erdanergou 3 years ago
parent
commit
7cc7af54ec
  1. 47
      src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java
  2. 2
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  3. 220
      src/main/java/com/dreamchaser/depository_manage/entity/Depository.java
  4. 4
      src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java
  5. 5
      src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml
  6. 5
      src/main/java/com/dreamchaser/depository_manage/service/DepositoryService.java
  7. 401
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java
  8. 8
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  9. 155
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialTypeServiceImpl.java
  10. 40
      src/main/java/com/dreamchaser/depository_manage/utils/LinkInterfaceUtil.java
  11. 1
      src/main/resources/static/css/public.css
  12. 2
      src/main/resources/static/lib/layui-v2.6.3/css/layui.css
  13. 9
      src/main/resources/templates/pages/application/application-in.html
  14. 9
      src/main/resources/templates/pages/application/application-in_back.html
  15. 13
      src/main/resources/templates/pages/application/application-in_scanQrCode.html
  16. 20
      src/main/resources/templates/pages/application/application-out.html
  17. 9
      src/main/resources/templates/pages/application/application-out_back.html
  18. 13
      src/main/resources/templates/pages/application/application-out_scanQrCode.html
  19. 4
      src/main/resources/templates/pages/application/application-review.html
  20. 10
      src/main/resources/templates/pages/application/application-transfer.html
  21. 11
      src/main/resources/templates/pages/application/application-transfer_back.html
  22. 2
      src/main/resources/templates/pages/application/application_in_multi.html
  23. 4
      src/main/resources/templates/pages/application/application_multi.html
  24. 3
      src/main/resources/templates/pages/application/my-apply.html
  25. 8
      src/main/resources/templates/pages/application/my-task.html
  26. 2
      src/main/resources/templates/pages/company/company_add.html
  27. 2
      src/main/resources/templates/pages/company/company_edit.html
  28. 2
      src/main/resources/templates/pages/material/material-add.html
  29. 2
      src/main/resources/templates/pages/material/material-view.html
  30. 2
      src/main/resources/templates/pages/materialtype/materialType_add.html
  31. 2
      src/main/resources/templates/pages/materialtype/materialType_edit.html
  32. 8
      src/main/resources/templates/pages/other/welcome_mobile.html
  33. 2
      src/main/resources/templates/pages/post/post-view.html
  34. 4
      src/main/resources/templates/pages/stockTaking/stockTakingReview.html
  35. 2
      src/main/resources/templates/pages/user/login.html
  36. 2
      src/main/resources/templates/pages/user/login_back.html
  37. 6
      src/main/resources/templates/pages/warehouse/depository_add.html
  38. 2
      src/main/resources/templates/pages/warehouse/warehouse_view.html
  39. 294
      src/test/java/com/dreamchaser/depository_manage/TestForDepositoryTree.java
  40. 1
      src/test/java/com/dreamchaser/depository_manage/TestForMaterialTree.java
  41. 163
      src/test/java/com/dreamchaser/depository_manage/TestForMaterialTypeTree.java

47
src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java

@ -1,16 +1,12 @@
package com.dreamchaser.depository_manage.controller;
import cn.hutool.core.lang.Snowflake;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.config.PortConfig;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.exception.MyException;
import com.dreamchaser.depository_manage.pojo.*;
import com.dreamchaser.depository_manage.service.*;
import com.dreamchaser.depository_manage.utils.*;
import lombok.Data;
import org.apache.http.protocol.HTTP;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -416,7 +412,7 @@ public class DepositoryController {
}
List<Depository> list = depositoryService.findDepositoryRecordPByCondition(map, userByPort);
// 获取所有行政单位
Map<String, Object> administration = findAdministration(userByPort);
Map<String, Object> administration = LinkInterfaceUtil.findAdministration(userByPort);
List<AdministrationP> administrationPList = (List<AdministrationP>) administration.get("administrationPList");
Integer total = (Integer) administration.get("total");
for (int i = 0; i < list.size(); i++) {
@ -431,44 +427,6 @@ public class DepositoryController {
}
/**
* 获取当前行政组织
*
* @return
*/
public static Map<String, Object> findAdministration(UserByPort userByPort) {
Map<String, Object> map = new HashMap<>();
String url = PortConfig.external_url + "/org/govlist";
String superior = "313";
map.put("superior", superior);
map.put("state", 1);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url, paramObject, HTTP.UTF_8, userByPort);
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(post);
JSONObject data = (JSONObject) jsonObject.get("data");
JSONArray list = (JSONArray) data.get("list");
if (list == null) {
list = new JSONArray();
}
Integer total = ObjectFormatUtil.toInteger(data.get("total"));
Map<String, Object> result = new HashMap();
List<AdministrationP> administrationPList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Administration administration = JSONObject.toJavaObject((JSONObject) list.get(i), Administration.class);
AdministrationP administrationP = new AdministrationP(administration);
administrationPList.add(administrationP);
}
result.put("administrationPList", administrationPList);
result.put("total", total);
return result;
}
/**
* 彻底删除仓库记录硬删除
*
@ -1609,9 +1567,10 @@ public class DepositoryController {
public RestResponse InitTreeMenus(@RequestParam(value = "adminorg", required = false) Integer adminorg) {
List<Object> list = new ArrayList<>();
if (Integer.compare(0, adminorg) == 0) {
list = depositoryService.InitTreeMenus();
list = depositoryService.InitTreeMenus("");
} else {
list = depositoryService.InitTreeMenus(adminorg.toString());
}
return new RestResponse(list);
}

2
src/main/java/com/dreamchaser/depository_manage/controller/PageController.java

@ -348,7 +348,7 @@ public class PageController {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/warehouse/depository_add");
Map<String, Object> administration = DepositoryController.findAdministration(userByPort);
Map<String, Object> administration = LinkInterfaceUtil.findAdministration(userByPort);
List<AdministrationP> administrationPList = (List<AdministrationP>) administration.get("administrationPList");
mv.addObject("administrationPList", administrationPList);
return mv;

220
src/main/java/com/dreamchaser/depository_manage/entity/Depository.java

@ -1,11 +1,14 @@
package com.dreamchaser.depository_manage.entity;
import lombok.Data;
/**
* depository
*
* @author bianj
* @version 1.0.0 2021-05-20
*/
@Data
public class Depository {
/** 版本号 */
private static final long serialVersionUID = -2259445638130429647L;
@ -62,222 +65,5 @@ public class Depository {
* 当前仓库最小存储量
*/
private Integer minNumber;
/**
* 获取id
*
* @return id
*/
public Integer getId() {
return this.id;
}
/**
* 设置id
*
* @param id
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取仓库名称
*
* @return 仓库名称
*/
public String getDname() {
return this.dname;
}
/**
* 设置仓库名称
*
* @param dname
* 仓库名称
*/
public void setDname(String dname) {
this.dname = dname;
}
/**
* 获取仓库地址
*
* @return 仓库地址
*/
public String getAddress() {
return this.address;
}
/**
* 设置仓库地址
*
* @param address
* 仓库地址
*/
public void setAddress(String address) {
this.address = address;
}
/**
* 获取仓库介绍
*
* @return 仓库介绍
*/
public String getIntroduce() {
return this.introduce;
}
/**
* 设置仓库介绍
*
* @param introduce
* 仓库介绍
*/
public void setIntroduce(String introduce) {
this.introduce = introduce;
}
/**
* 获取仓库状态
* @return
*/
public Integer getState() {
return state;
}
/**
* 设置仓库状态
* @param state
*/
public void setState(Integer state) {
this.state = state;
}
/**
* 获取父级编号
* @return
*/
public Integer getParentId() {
return parentId;
}
/**
* 设置父级编号
* @param parentId
*/
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
/**
* 获取公司编号
* @return
*/
public Integer getCid() {
return cid;
}
/**
* 设置公司编号
* @param cid
*/
public void setCid(Integer cid) {
this.cid = cid;
}
/**
* 获取公司名称
* @return
*/
public String getCname() {
return cname;
}
/**
* 设置公司名称
* @param cname
*/
public void setCname(String cname) {
this.cname = cname;
}
/**
* 获取仓库编码
* @return
*/
public String getCode() {
return code;
}
/**
* 设置仓库编码
* @param code
*/
public void setCode(String code) {
this.code = code;
}
/**
* 获取所属部门
* @return
*/
public String getAdminorg() {
return adminorg;
}
/**
* 设置所属部门
* @param adminorg
*/
public void setAdminorg(String adminorg) {
this.adminorg = adminorg;
}
/**
* 获取部门名称
* @return
*/
public String getAdminorgName() {
return adminorgName;
}
/**
* 设置部门名称
* @param adminorgName
*/
public void setAdminorgName(String adminorgName) {
this.adminorgName = adminorgName;
}
/**
* 获取当前仓库存储最大值
* @return
*/
public Integer getMaxNumber() {
return maxNumber;
}
/**
* 设置当前仓库存储最大值
* @return
*/
public void setMaxNumber(Integer maxNumber) {
this.maxNumber = maxNumber;
}
/**
* 获取当前仓库存储最小值
* @return
*/
public Integer getMinNumber() {
return minNumber;
}
/**
* 设置当前仓库存储最小值
* @return
*/
public void setMinNumber(Integer minNumber) {
this.minNumber = minNumber;
}
/* This code was generated by TableGo tools, mark 2 end. */
}

4
src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java

@ -32,7 +32,7 @@ public interface DepositoryMapper {
* @param ids
* @return
*/
List<Depository> selectDepositoryRecordByIds(List<Integer> ids);
List<Depository> selectDepositoryByIds(List<Integer> ids);
/**
* 根据仓库id查询仓库名称
@ -73,6 +73,8 @@ public interface DepositoryMapper {
*/
Depository findDepositoryById(Integer id);
/**
* 根据条件修改数据信息
* @param map

5
src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml

@ -58,6 +58,7 @@
Where dc.state != 3
</select>
<!-- 获取当前部门仓库以及公共仓库-->
<select id="findDepositoryByAdminorg" resultMap="depositoryMap" parameterType="string">
SELECT
@ -94,10 +95,10 @@
<!-- 根据主键查询多个数据-->
<select id="selectDepositoryRecordByIds" parameterType="list" resultMap="depositoryMap">
<select id="selectDepositoryByIds" parameterType="list" resultMap="depositoryMap">
select
<include refid="allColumns"></include>
FROM depository WHERE id IN
FROM depository d WHERE d.id IN
<foreach collection="list" index="index" item="id" open="(" separator="," close=")">
#{id}
</foreach>

5
src/main/java/com/dreamchaser/depository_manage/service/DepositoryService.java

@ -129,11 +129,6 @@ public interface DepositoryService {
List<Depository> getParentByDepository(Integer id);
/**
* 构造树形选择框
* @return
*/
List<Object> InitTreeMenus();
/**
* 根据部门构造树形选择框

401
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java

@ -1,5 +1,7 @@
package com.dreamchaser.depository_manage.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.*;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.PlaceMapper;
@ -14,10 +16,7 @@ import com.dreamchaser.depository_manage.utils.WordUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.*;
@Service
@ -325,6 +324,13 @@ public class DepositoryServiceImpl implements DepositoryService {
return depositoryMapper.getParentByDepository(id);
}
@Override
public List<Object> InitTreeMenus(String adminorg) {
List<Object> list = new ArrayList<>();
list = buildTree_New(InitTreeMenus_New(adminorg),0);
return list;
}
/**
* 根据多个主键id获取对应数据
@ -334,38 +340,58 @@ public class DepositoryServiceImpl implements DepositoryService {
*/
@Override
public List<Depository> selectDepositoryRecordByIds(List<Integer> ids) {
return depositoryMapper.selectDepositoryRecordByIds(ids);
return depositoryMapper.selectDepositoryByIds(ids);
}
/**
* 构造树形选择框
*
* @return
*/
@Override
public List<Object> InitTreeMenus() {
Map<String, Object> param = new HashMap<>();
param.put("parentId", 0);
List<Depository> depositories = depositoryMapper.findDepositoryRecordPByCondition(param);
public List<Object> InitTreeMenus_New(String adminorg) {
// 定义结果集
List<Object> list = new ArrayList<>();
// 定义仓库id列表
List<Integer> depositoryIdList = new ArrayList<>();
// 获取所有仓库
List<Depository> depositoryAll = depositoryMapper.findDepositoryAll();
Integer totalVal = depositoryAll.size();
// 定义分页数量
double size = 10.0;
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数目
Integer openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(depositories.size());
// 结果集
List<Object> list = new ArrayList<>();
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < depositoryAll.size(); i++) {
// 获取当前类型
Depository depository = depositoryAll.get(i);
if (((i + 1) % 100) == 0) { // 如果有100个开启线程进行处理
depositoryIdList.add(depository.getId());
Future<Object> future = completionService.submit(new Task(depositoryIdList,adminorg));
openThreadSize++;
futureList.add(future); // 添加到结果集
depositoryIdList = new ArrayList<>(); // 情况列表
} else {
// 添加id到列表中
depositoryIdList.add(depository.getId());
}
}
for (int i = 0; i < depositories.size(); i++) {
Depository d = depositories.get(i);
Future<Object> future = completionService.submit(new Task(d,""));
if (depositoryIdList.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<Object> future = completionService.submit(new Task(depositoryIdList,adminorg));
futureList.add(future);
openThreadSize++;
}
// 3.获取结果
for(int i=0;i<depositories.size();i++){
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
@ -374,72 +400,202 @@ public class DepositoryServiceImpl implements DepositoryService {
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
list.addAll((Collection<?>) result);
}
return list;
exs.shutdown();
for (int i = 0; i < list.size(); i++) {
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
Integer parentId = jsonObject.getInteger("parentId");
if(Integer.compare(parentId,0) != 0) {
if (!checkList(list, parentId)) {
// 如果当前列表中不存在其父级
Depository depositoryById = depositoryMapper.findDepositoryById(parentId);
list.add(InitTreeMenus2(depositoryById, new ArrayList<>()));
}
}
}
return list;
}
/**
* 根据部门构造树形选择框
*
* @param adminorg
* @return
*/
@Override
public List<Object> InitTreeMenus(String adminorg) {
Map<String, Object> param = new HashMap<>();
param.put("parentId", 0);
param.put("adminorg", 361);
List<Depository> depositories = depositoryMapper.findDepositoryRecordPByCondition(param);
List<Object> list = new ArrayList<>();
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(depositories.size());
// 结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 用于执行线程任务
class Task implements Callable<Object> {
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < depositories.size(); i++) {
Depository d = depositories.get(i);
Future<Object> future = completionService.submit(new Task(d,adminorg));
futureList.add(future);
// 仓库
List<Integer> depositoryIdList;
// 部门
String adminorg;
public Task(List<Integer> depositoryIdList,String adminorg){
this.depositoryIdList = depositoryIdList;
this.adminorg = adminorg;
}
@Override
public Object call() throws Exception {
/**
* 获取当前仓库id对应的仓库
*/
List<Depository> depositories = depositoryMapper.selectDepositoryByIds(depositoryIdList);
// 定义树结构结果集
List<Object> list = new ArrayList<>();
// 定义线程池
ExecutorService exs = Executors.newFixedThreadPool(depositories.size());
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService用于获取结果
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 定义开启线程数
Integer openThreadSize = 0;
for (int i = 0; i < depositories.size(); i++) {
Depository depository = depositories.get(i);
if("".equals(adminorg)||"361".equals(adminorg)){
Future<Object> submit = completionService.submit(new PlaceTask(depository));
futureList.add(submit);
openThreadSize++;
}else{
if(adminorg.equals(depository.getAdminorg())){
Future<Object> submit = completionService.submit(new PlaceTask(depository));
futureList.add(submit);
openThreadSize++;
}
}
// 3.获取结果
for(int i=0;i<depositories.size();i++){
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
return list;
}
// 用于执行线程任务
class Task implements Callable<Object> {
/**
* 用于给仓库添加对应的库位
*/
class PlaceTask implements Callable<Object>{
Depository d;
String adminorg;
public Task(Depository d,String adminorg){
PlaceTask(Depository d){
this.d = d;
this.adminorg = adminorg;
}
@Override
public Object call() throws Exception {
List<Object> childForMaterialTypeByParent = findChildForDepositoryByParent(d.getId(), adminorg);
Map<String, Object> stringObjectMap = InitTreeMenus2(d, childForMaterialTypeByParent);
return stringObjectMap;
// 获取当前仓库下的库位
List<Object> objectList = AddPlaceByDid(d);
// 将其构造成对应的树形结构类型
Map<String, Object> map = InitTreeMenus2(d, objectList);
return map;
}
}
// 在仓库后添加库位信息
public List<Object> AddPlaceByDid(Depository d) {
if (d != null) {
// 获取当前仓库下的所有库位
List<Object> result = new ArrayList<>();
// 获取该仓库的排
List<Integer> placeXByDid = placeMapper.findPlaceXByDid(d.getId());
if (placeXByDid.size() > 0) {
for (int i = 1; i <= placeXByDid.get(0); i++) {
Map<String, Object> placeX = new HashMap<>();
placeX.put("title", "第" + i + "排货架");
placeX.put("id", -1);
Map<String, Object> param = new HashMap<>();
param.put("did", d.getId());
param.put("x", i);
List<Place> placeByCondition = placeMapper.findPlaceByCondition(param);
if (placeByCondition.size() > 0) {
List<Object> children = new ArrayList<>();
for (int k = 1; k <= placeByCondition.size(); k++) {
Map<String, Object> map = new HashMap<>();
map.put("title", placeByCondition.get(k - 1).getCode());
map.put("id", d.getId() + "-" + placeByCondition.get(k - 1).getId());
children.add(map);
}
placeX.put("children", children);
}
// 获取该仓库该排的列数
result.add(placeX);
}
}
return result;
} else {
return null;
}
}
// 构造树形组件数据模板
public Map<String, Object> InitTreeMenus2(Depository d, List<Object> children) {
if (d != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", d.getDname());
map.put("id", d.getId());
map.put("children", children);
map.put("parentId",d.getParentId());
return map;
} else {
return null;
}
}
/**
* 用于构造树结构
* @param list 树列表
* @param parentId 父级id
* @return
*/
public List<Object> buildTree_New(List<Object> list,Integer parentId){
// 定义树结构
List<Object> result = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
// 构造为jsonObject类
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
// 获取当前父级id
Long parentId1 = jsonObject.getLong("parentId");
if(Long.compare(parentId,parentId1) == 0){ // 如果当前类型是其父类
List<Object> objectList = buildTree_New(list, jsonObject.getInteger("id")); // 获取当前类型的子类
JSONArray children = jsonObject.getJSONArray("children");
children.addAll(objectList);
result.add(jsonObject);
}
}
return result;
}
/**
* 判断当前父级id是否在列表中
* @param list
* @param parentId
* @return
*/
public Boolean checkList(List<Object> list,Integer parentId){
for (int i = 0; i < list.size(); i++) {
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
Integer pid = jsonObject.getInteger("id");
if(Integer.compare(pid,parentId) == 0){
return true;
}
}
return false;
}
/**
* 获取当前部门以及公共仓库
*
@ -532,119 +688,8 @@ public class DepositoryServiceImpl implements DepositoryService {
return depositoryMapper.getToDayInventoryByDNameTest();
}
//判断是否有子类
public boolean isChildForDepository(Integer parentId) {
boolean flag = false;
List<Depository> parentByDepository = depositoryMapper.getParentByDepository(parentId);
if (parentByDepository.size() > 0) {
flag = true;
}
return flag;
}
// 根据id获取子类
public List<Object> findChildForDepositoryByParent(Integer id, String adminorg) {
Map<String, Object> param = new HashMap<>();
List<Object> result = new ArrayList<>();
param.put("parentId", id);
if (!"".equals(adminorg)) {
param.put("adminorg", adminorg);
}
// 获取当前父类的子类
List<Depository> parentByDepository = depositoryMapper.findDepositoryByAdminorgAndParent(param);
if (parentByDepository.size() > 0) {
for (int i = 0; i < parentByDepository.size(); i++) {
Depository d = parentByDepository.get(i);
List<Object> childForMaterialTypeByParent = findChildForDepositoryByParent(d.getId(), adminorg);
if (childForMaterialTypeByParent != null) {
result.add(InitTreeMenus2(d, childForMaterialTypeByParent));
} else {
List<Object> placeList = AddPlaceByDid(d);
result.add(InitTreeMenus2(d, placeList));
}
}
return result;
} else {
return null;
}
}
// 在仓库后添加库位信息
public List<Object> AddPlaceByDid(Depository d) {
if (d != null) {
// 获取当前仓库下的所有库位
List<Object> result = new ArrayList<>();
// 获取该仓库的排
List<Integer> placeXByDid = placeMapper.findPlaceXByDid(d.getId());
if (placeXByDid.size() > 0) {
for (int i = 1; i <= placeXByDid.get(0); i++) {
Map<String, Object> placeX = new HashMap<>();
placeX.put("title", "第" + i + "排货架");
placeX.put("id", -1);
Map<String, Object> param = new HashMap<>();
param.put("did", d.getId());
param.put("x", i);
List<Place> placeByCondition = placeMapper.findPlaceByCondition(param);
if (placeByCondition.size() > 0) {
List<Object> children = new ArrayList<>();
for (int k = 1; k <= placeByCondition.size(); k++) {
Map<String, Object> map = new HashMap<>();
map.put("title", placeByCondition.get(k - 1).getCode());
map.put("id", d.getId() + "-" + placeByCondition.get(k - 1).getId());
children.add(map);
}
placeX.put("children", children);
}
// 获取该仓库该排的列数
/*
List<Integer> placeYByDid = placeMapper.findPlaceYByDid(param);
if(placeYByDid.size() > 0) {
List<Object> childrenY = new ArrayList<>();
for (int j = 1; j <= placeYByDid.get(0); j++) {
Map<String,Object> placeY = new HashMap<>();
placeY.put("title","第"+j+"列");
placeY.put("id",-1);
childrenY.add(placeY);
param.put("y",j);
// 获取该仓库该排该列的库位
List<Place> placeByCondition = placeMapper.findPlaceByCondition(param);
List<Object> children= new ArrayList<>();
if(placeByCondition.size() > 0) {
for (int k = 1; k <= placeByCondition.size(); k++) {
Map<String, Object> map = new HashMap<>();
map.put("title", placeByCondition.get(k - 1).getCode());
map.put("id", d.getId()+"-"+placeByCondition.get(k - 1).getId());
children.add(map);
}
placeY.put("children", children);
}
}
placeX.put("children",childrenY);
}*/
result.add(placeX);
}
}
return result;
} else {
return null;
}
}
// 构造树形组件数据模板
public Map<String, Object> InitTreeMenus2(Depository d, List<Object> children) {
if (d != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", d.getDname());
map.put("id", d.getId());
map.put("children", children);
return map;
} else {
return null;
}
}
private boolean hasDepository(List<Depository> list,Depository o){

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

@ -1736,6 +1736,9 @@ public class MaterialServiceImpl implements MaterialService {
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数
Integer openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 树结构结果集
@ -1754,6 +1757,7 @@ public class MaterialServiceImpl implements MaterialService {
materialTypeList.add(materialType.getOldId());
Future<Object> future = completionService.submit(new TaskTest_New(materialTypeList));
futureList.add(future); // 添加到结果集
openThreadSize++;
materialTypeList = new ArrayList<>(); // 情况列表
} else {
// 添加id到列表中
@ -1765,10 +1769,11 @@ public class MaterialServiceImpl implements MaterialService {
// 如果有剩余,开启线程进行处理
Future<Object> future = completionService.submit(new TaskTest_New(materialTypeList));
futureList.add(future);
openThreadSize++;
}
// 3.获取结果
for (int i = 0; i < threadSize; i++) {
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
@ -1779,6 +1784,7 @@ public class MaterialServiceImpl implements MaterialService {
}
list.addAll((Collection<?>) result);
}
exs.shutdown();
// 进行最终的封装
return list;
}

155
src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialTypeServiceImpl.java

@ -1,5 +1,7 @@
package com.dreamchaser.depository_manage.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.MaterialType;
import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper;
import com.dreamchaser.depository_manage.service.MaterialTypeService;
@ -8,10 +10,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
/**
@ -188,37 +188,61 @@ public class MaterialTypeServiceImpl implements MaterialTypeService {
* 构造树形选择框
* @return
*/
/*@Override
@Override
public List<Object> InitTreeMenus() {
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
List<Object> list = new ArrayList<>();
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType mt = materialTypeNoParent.get(i);
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId());
Map<String, Object> stringObjectMap = InitTreeMenus(mt,childForMaterialTypeByParent);
list.add(stringObjectMap);
}
list = buildTree_New(InitTreeMenus_New(),Long.valueOf(0));
return list;
}*/
@Override
public List<Object> InitTreeMenus() {
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
}
public List<Object> InitTreeMenus_New() {
// 获取所有物料类型
List<MaterialType> materialTypeAll = materialTypeMapper.findMaterialTypeAll();
// 物料总数
Integer totalVal = materialTypeAll.size();
// 定义分页数量
double size = 100.0;
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数
Integer openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(materialTypeNoParent.size());
// 结果集
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 树结构结果集
List<Object> list = new ArrayList<>();
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 物料类型id列表
List<Long> materialTypeList = new ArrayList<>();
for (int i = 0; i < materialTypeAll.size(); i++) {
// 获取当前类型
MaterialType materialType = materialTypeAll.get(i);
if (((i + 1) % 100) == 0) { // 如果有100个开启线程进行处理
materialTypeList.add(materialType.getOldId());
Future<Object> future = completionService.submit(new TaskTest_New(materialTypeList));
futureList.add(future); // 添加到结果集
openThreadSize++;
materialTypeList = new ArrayList<>(); // 情况列表
} else {
// 添加id到列表中
materialTypeList.add(materialType.getOldId());
}
}
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType mt = materialTypeNoParent.get(i);
Future<Object> future = completionService.submit(new Task(mt));
if (materialTypeList.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<Object> future = completionService.submit(new TaskTest_New(materialTypeList));
futureList.add(future);
openThreadSize++;
}
// 3.获取结果
for(int i=0;i<materialTypeNoParent.size();i++){
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
@ -227,72 +251,79 @@ public class MaterialTypeServiceImpl implements MaterialTypeService {
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
list.addAll((Collection<?>) result);
}
exs.shutdown();
// 进行最终的封装
return list;
}
// 用于执行线程任务
class Task implements Callable<Object> {
// 用于执行测试新算法
class TaskTest_New implements Callable<Object> {
MaterialType mt;
// 待处理的物料类型id列表
List<Long> materialTypeIdList;
public Task(MaterialType mt){
this.mt = mt;
public TaskTest_New(List<Long> materialTypeByCondition) {
this.materialTypeIdList = materialTypeByCondition;
}
@Override
public Object call() throws Exception {
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId());
Map<String, Object> stringObjectMap = InitTreeMenus(mt,childForMaterialTypeByParent);
return stringObjectMap;
// 定义树结构结果集
List<Object> list = new ArrayList<>();
// 查询当前物料类型id列表中的物料类型
List<MaterialType> materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList);
for (int i = 0; i < materialTypeByOldIds.size(); i++) {
MaterialType mt = materialTypeByOldIds.get(i);
Map<String, Object> map = InitTreeMenus(mt, new ArrayList<>());
list.add(map);
}
return list;
}
}
// 构造树形组件数据模板
public Map<String,Object> InitTreeMenus(MaterialType mt,List<Object> children){
if(mt != null) {
public Map<String, Object> InitTreeMenus(MaterialType mt, List<Object> children) {
if (mt != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", mt.getTname());
map.put("id", mt.getOldId());
map.put("parentId",mt.getParentId());
map.put("children",children);
return map;
}
else{
} else {
return null;
}
}
// 判断是否有子类
public boolean isChildForMaterialType(Integer id){
boolean flag = false;
Map<String,Object> param = new HashMap<>();
param.put("parentId",id);
Integer count = materialTypeMapper.findMaterialTypeCountByCondition(param);
if(count > 0){
flag = true;
}
return flag;
}
// 根据id获取子类
public List<Object> findChildForMaterialTypeByParent(Long Oldid){
Map<String,Object> param = new HashMap<>();
/**
* 用于构造树结构
* @param list 树列表
* @param parentId 父级id
* @return
*/
public List<Object> buildTree_New(List<Object> list,Long parentId){
// 定义树结构
List<Object> result = new ArrayList<>();
Map<String,Object> children = new HashMap<>();
param.put("parentId",Oldid);
// 获取当前父类的子类
List<MaterialType> materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(param);
if(materialTypeByCondition.size() > 0){
for (int i = 0; i < materialTypeByCondition.size(); i++) {
MaterialType mt = materialTypeByCondition.get(i);
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId());
result.add(InitTreeMenus(mt,childForMaterialTypeByParent));
for (int i = 0; i < list.size(); i++) {
// 构造为jsonObject类
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
// 获取当前父级id
Long parentId1 = jsonObject.getLong("parentId");
if(Long.compare(parentId,parentId1) == 0){ // 如果当前类型是其父类
List<Object> objectList = buildTree_New(list, jsonObject.getLong("id")); // 获取当前类型的子类
JSONArray children = jsonObject.getJSONArray("children");
children.addAll(objectList);
result.add(jsonObject);
}
return result;
}else{
return null;
}
return result;
}
}

40
src/main/java/com/dreamchaser/depository_manage/utils/LinkInterfaceUtil.java

@ -111,6 +111,8 @@ public class LinkInterfaceUtil {
String url = PortConfig.external_url + "/org/govlist";
Map<String, Object> map = new HashMap<>();
map.put("superior", superior);
map.put("level",4);
map.put("state",1);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
@ -179,4 +181,42 @@ public class LinkInterfaceUtil {
JSONObject data = (JSONObject) jsonObject.get("data");
return data;
}
/**
* 获取当前行政组织列表
* @return
*/
public static Map<String, Object> findAdministration(UserByPort userByPort) {
Map<String, Object> map = new HashMap<>();
String url = PortConfig.external_url + "/org/govlist";
String superior = "313";
map.put("superior", superior);
map.put("state", 1);
map.put("level",3);
String jsonString = JSONObject.toJSONString(map);
JSONObject paramObject = JSONObject.parseObject(jsonString);
String post = null;
try {
post = HttpUtils.send(url, paramObject, HTTP.UTF_8, userByPort);
} catch (IOException e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(post);
JSONObject data = (JSONObject) jsonObject.get("data");
JSONArray list = (JSONArray) data.get("list");
if (list == null) {
list = new JSONArray();
}
Integer total = ObjectFormatUtil.toInteger(data.get("total"));
Map<String, Object> result = new HashMap();
List<AdministrationP> administrationPList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Administration administration = JSONObject.toJavaObject((JSONObject) list.get(i), Administration.class);
AdministrationP administrationP = new AdministrationP(administration);
administrationPList.add(administrationP);
}
result.put("administrationPList", administrationPList);
result.put("total", total);
return result;
}
}

1
src/main/resources/static/css/public.css

@ -1,5 +1,4 @@
body {
margin: 15px 15px 15px 15px;
background: #f2f2f2;
}

2
src/main/resources/static/lib/layui-v2.6.3/css/layui.css

File diff suppressed because one or more lines are too long

9
src/main/resources/templates/pages/application/application-in.html

@ -36,6 +36,9 @@
.lay-step{
display: none;
}
.layui-form-select .layui-input{
border-style: none;
}
</style>
@ -47,7 +50,7 @@
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto; ">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem" style="padding-right: 0px">
<hr>
@ -415,8 +418,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>

9
src/main/resources/templates/pages/application/application-in_back.html

@ -26,6 +26,9 @@
.lay-step{
display: none;
}
.layui-form-select .layui-input{
border-style: none;
}
</style>
<div class="layuimini-container">
@ -37,7 +40,7 @@
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>
<div class="layui-input-block" style="margin: 0px;">
@ -96,8 +99,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<div class="layui-form-item">

13
src/main/resources/templates/pages/application/application-in_scanQrCode.html

@ -34,6 +34,9 @@
.lay-step{
display: none;
}
.layui-form-select .layui-input{
border-style: none;
}
</style>
@ -48,7 +51,7 @@
<input th:value="${place}" style="display: none" id="scanValue_placeId">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div class="layui-card" id="cardParent">
@ -304,8 +307,8 @@
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
@ -531,8 +534,8 @@
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>

20
src/main/resources/templates/pages/application/application-out.html

@ -41,6 +41,10 @@
.lay-step {
display: none;
}
.layui-form-select .layui-input{
border-style: none;
}
</style>
<div class="layuimini-container">
<div class="layuimini-main">
@ -49,7 +53,7 @@
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem">
<hr>
@ -108,8 +112,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
@ -121,7 +125,7 @@
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交申请&emsp;
&emsp;提交&emsp;
</button>
</div>
</div>
@ -340,8 +344,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
@ -410,8 +414,8 @@
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>

9
src/main/resources/templates/pages/application/application-out_back.html

@ -25,6 +25,9 @@
.lay-step{
display: none;
}
.layui-form-select .layui-input{
border-style: none;
}
</style>
<div class="layuimini-container">
<div class="layuimini-main">
@ -34,7 +37,7 @@
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>
<div class="layui-input-block">
@ -70,13 +73,13 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name="applyRemark" placeholder="请填写相关原因及申请原因" value="" class="layui-textarea"></textarea>
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value="" class="layui-input"/>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep">
&emsp;提交申请&emsp;
&emsp;提交&emsp;
</button>
</div>
</div>

13
src/main/resources/templates/pages/application/application-out_scanQrCode.html

@ -25,6 +25,9 @@
.lay-step{
display: none;
}
.layui-form-select .layui-input{
border-style: none;
}
</style>
<div class="layuimini-container">
<div class="layuimini-main">
@ -36,7 +39,7 @@
<input th:value="${place}" style="display: none" id="scanValue_placeId">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div class="layui-card" id="cardParent">
@ -225,8 +228,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
@ -394,8 +397,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>

4
src/main/resources/templates/pages/application/application-review.html

@ -96,7 +96,7 @@
<div class="layui-form-item">
<label class="layui-form-label">审核备注:</label>
<div class="layui-input-block">
<textarea id="departmentheadMessageF" name="departmentheadMessage" placeholder="请填写相关原因及申请原因" value="" class="layui-textarea"></textarea>
<input id="departmentheadMessageF" name="departmentheadMessage" placeholder="请填写相关原因及申请原因" value="" class="layui-input"/>
</div>
</div>
@ -124,7 +124,7 @@
<div class="layui-form-item">
<label class="layui-form-label">审核备注:</label>
<div class="layui-input-block">
<textarea id="depositoryManagerMessageF" name="depositoryManagerMessage" placeholder="请填写相关原因及申请原因" value="" class="layui-textarea"></textarea>
<input id="depositoryManagerMessageF" name="depositoryManagerMessage" placeholder="请填写相关原因及申请原因" value="" class="layui-input"/>
</div>
</div>

10
src/main/resources/templates/pages/application/application-transfer.html

@ -41,7 +41,7 @@
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem">
<hr>
@ -118,7 +118,7 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name="applyRemark" placeholder="请填写相关原因及申请原因" value="" class="layui-textarea"></textarea>
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value="" class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
@ -127,7 +127,7 @@
<div class="layui-form-item" id="btn_sub">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep" style="margin-bottom: 10px;margin-left: 15%">
&emsp;提交申请&emsp;
&emsp;提交&emsp;
</button>
</div>
</div>
@ -355,8 +355,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>

11
src/main/resources/templates/pages/application/application-transfer_back.html

@ -26,6 +26,7 @@
.lay-step{
display: none;
}
</style>
<div class="layuimini-container">
<div class="layuimini-main">
@ -35,7 +36,7 @@
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem1">
<hr>
@ -88,7 +89,7 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name="applyRemark" placeholder="请填写相关原因及申请原因" value="" class="layui-textarea"></textarea>
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value="" class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
@ -97,7 +98,7 @@
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep" style="margin-bottom: 10px;margin-left: 15%">
&emsp;提交申请&emsp;
&emsp;提交&emsp;
</button>
</div>
</div>
@ -274,8 +275,8 @@
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<textarea name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
<input name=`+"applyRemark"+NewIdNumber+` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>

2
src/main/resources/templates/pages/application/application_in_multi.html

@ -23,7 +23,7 @@
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
<script id="currentTableBar" type="text/html">
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-subclass" lay-event="applicationIn">入库申请</a>
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-subclass" lay-event="applicationIn">入库</a>
<a class="layui-btn layui-btn-xs data-count-edit" lay-event="applicationOut" >出库申请</a>
</script>

4
src/main/resources/templates/pages/application/application_multi.html

@ -17,14 +17,14 @@
<script id="toolbarDemo" type="text/html">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="delete">删除</button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="applicationIn">入库申请</button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="applicationIn">入库</button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="applicationOut">出库申请</button>
</div>
</script>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
<script id="currentTableBar" type="text/html">
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-subclass" lay-event="applicationIn">入库申请</a>
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-subclass" lay-event="applicationIn">入库</a>
<a class="layui-btn layui-btn-xs data-count-edit" lay-event="applicationOut" >出库申请</a>
</script>
</div>

3
src/main/resources/templates/pages/application/my-apply.html

@ -30,7 +30,7 @@
<li>出库申请</li>
<li>盘点申请</li>
</ul>
<div class="layui-tab-content" style="height: 100px;">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<ul id="LAY_floor_in" class="flow-default" style="width: 100%"></ul>
</div>
@ -88,7 +88,6 @@
+result[i].createTime+'</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
takingPre+=result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多

8
src/main/resources/templates/pages/application/my-task.html

@ -30,7 +30,7 @@
<li class="layui-this">未完成任务</li>
<li>已完成任务</li>
</ul>
<div class="layui-tab-content" style="height: 100px;">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-tab layui-tab-card">
<ul class="layui-tab-title">
@ -138,7 +138,6 @@
+ result[i].applicantTime + '</div></div></li>');
}
lis.push('</div>');
lis.push('<hr class="layui-border-black">')
pre1 += result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -160,7 +159,6 @@
+ result[i].createTime + '</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
pre3 += result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -197,7 +195,6 @@
+ result[i].applicantTime + '</div></div></li>');
}
lis.push("</div>");
lis.push('<hr class="layui-border-black">');
pre2 += result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -219,7 +216,6 @@
+ result[i].createTime + '</div></div></li>');
}
lis1.push('</div>');
lis1.push('<hr class="layui-border-black">')
pre4 += result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -258,7 +254,6 @@
}
lis.push("</div>");
lis.push('<hr class="layui-border-black">');
pre2 += result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多
@ -298,7 +293,6 @@
}
lis.push("</div>")
lis.push('<hr class="layui-border-black">');
pre2 += result.length;
//执行下一页渲染,第二参数为:满足“加载更多”的条件,即后面仍有分页
//pages为Ajax返回的总页数,只有当前页小于总页数的情况下,才会继续出现加载更多

2
src/main/resources/templates/pages/company/company_add.html

@ -18,7 +18,7 @@
<div class="layui-card">
<div class="layui-card-body" style="padding-top: 40px;">
<div>
<form class="layui-form" lay-filter="form1" style="margin: 0 auto;max-width: 460px;padding-top: 100px; padding-bottom: 200px">
<form class="layui-form layui-form-pane" lay-filter="form1" style="margin: 0 auto;max-width: 460px;padding-top: 100px; padding-bottom: 200px">
<div class="layui-form-item">
<label class="layui-form-label">公司名称:</label>
<div class="layui-input-block">

2
src/main/resources/templates/pages/company/company_edit.html

@ -12,7 +12,7 @@
</head>
<body>
<form class="layui-form" action="" >
<form class="layui-form layui-form-pane" action="" >
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">Id</label>
<div class="layui-input-block">

2
src/main/resources/templates/pages/material/material-add.html

@ -43,7 +43,7 @@
<div class="layui-card">
<div class="layui-card-body" style="padding-left:0px;padding-right:0px">
<div>
<form class="layui-form"
<form class="layui-form layui-form-pane"
style="margin: 0 auto;max-width: 700px;padding-top: 5px; padding-bottom: 50px" lay-filter="form1">
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>

2
src/main/resources/templates/pages/material/material-view.html

@ -36,7 +36,7 @@
<body>
<form class="layui-form" action="">
<form class="layui-form layui-form-pane" action="">
<input type="text" id="barCodeList" style="display:none;">
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">物料编号</label>

2
src/main/resources/templates/pages/materialtype/materialType_add.html

@ -19,7 +19,7 @@
<div class="layui-card">
<div class="layui-card-body" style="padding-top: 40px;">
<div>
<form class="layui-form" lay-filter="form1" style="margin: 0 auto;max-width: 460px;padding-top: 100px; padding-bottom: 200px">
<form class="layui-form layui-form-pane" lay-filter="form1" style="margin: 0 auto;max-width: 460px;padding-top: 100px; padding-bottom: 200px">
<div class="layui-form-item">
<label class="layui-form-label">种类名称:</label>
<div class="layui-input-block">

2
src/main/resources/templates/pages/materialtype/materialType_edit.html

@ -12,7 +12,7 @@
</head>
<body>
<form class="layui-form" action="" >
<form class="layui-form layui-form-pane" action="" >
<div class="layui-form-item" style="display:none;">
<label class="layui-form-label">类型编号</label>
<div class="layui-input-block">

8
src/main/resources/templates/pages/other/welcome_mobile.html

@ -55,7 +55,7 @@
</div>
<div class="panel-content">
<h1 class="no-margins" th:text="${depositoryCount}" >4</h1>
<small>当前分类总记录数</small>
<small>当前仓库总记录数</small>
</div>
</div>
</div>
@ -69,7 +69,7 @@
</div>
<div class="panel-content">
<h1 class="no-margins" th:text="${allPrice}" >12032</h1>
<small>当前分类总记录</small>
<small>当前库存总</small>
</div>
</div>
</div>
@ -83,7 +83,7 @@
</div>
<div class="panel-content">
<h1 class="no-margins" th:text="${allMaterial}"></h1>
<small>当前分类总记录数</small>
<small>当前物料总记录数</small>
</div>
</div>
</div>
@ -97,7 +97,7 @@
</div>
<div class="panel-content">
<h1 class="no-margins" th:text="${warehouseRecord}"></h1>
<small>当前分类总记录数</small>
<small>当前流水总记录数</small>
</div>
</div>
</div>

2
src/main/resources/templates/pages/post/post-view.html

@ -12,7 +12,7 @@
</head>
<body>
<form class="layui-form" action="" >
<form class="layui-form layui-form-pane" action="" >
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">Id</label>
<div class="layui-input-block">

4
src/main/resources/templates/pages/stockTaking/stockTakingReview.html

@ -226,9 +226,9 @@
<div class="layui-form-item">
<label class="layui-form-label">审核备注:</label>
<div class="layui-input-block">
<textarea id="auditOpinion" name="auditOpinion"
<input id="auditOpinion" name="auditOpinion"
placeholder="请填写相关原因及申请原因" value=""
class="layui-textarea"></textarea>
class="layui-input"/>
</div>
</div>
<div class="layui-row layui-col-space15">

2
src/main/resources/templates/pages/user/login.html

@ -35,7 +35,7 @@
<div class="layui-container">
<div class="admin-login-background">
<div class="layui-form login-form">
<form class="layui-form" action="">
<form class="layui-form layui-form-pane" action="">
<input name="userWxId" type="text" th:value="${userWxId}" style="display:none;">
<div class="layui-form-item logo-title">
<h1>仓库管理系统登录</h1>

2
src/main/resources/templates/pages/user/login_back.html

@ -35,7 +35,7 @@
<div class="layui-container">
<div class="admin-login-background">
<div class="layui-form login-form">
<form class="layui-form" action="">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item logo-title">
<h1>仓库管理系统登录</h1>
</div>

6
src/main/resources/templates/pages/warehouse/depository_add.html

@ -18,7 +18,7 @@
<div class="layui-card">
<div class="layui-card-body" style="padding-top: 40px;">
<div>
<form class="layui-form"
<form class="layui-form layui-form-pane"
style="margin: 0 auto;max-width: 700px;padding-top: 100px; padding-bottom: 200px" lay-filter="form1">
<div class="layui-form-item">
<label class="layui-form-label">仓库名称:</label>
@ -61,8 +61,8 @@
<div class="layui-form-item">
<label class="layui-form-label">仓库介绍:</label>
<div class="layui-input-block">
<textarea name="introduce" placeholder="请填写仓库介绍..."
class="layui-textarea"></textarea>
<input name="introduce" placeholder="请填写仓库介绍..."
class="layui-input"/>
</div>
</div>
<div class="layui-form-item">

2
src/main/resources/templates/pages/warehouse/warehouse_view.html

@ -12,7 +12,7 @@
</head>
<body>
<form class="layui-form" action="" >
<form class="layui-form layui-form-pane" action="" >
<div class="layui-form-item" style="display: none">
<label class="layui-form-label">仓库编号</label>
<div class="layui-input-block">

294
src/test/java/com/dreamchaser/depository_manage/TestForDepositoryTree.java

@ -0,0 +1,294 @@
package com.dreamchaser.depository_manage;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.Depository;
import com.dreamchaser.depository_manage.entity.MaterialType;
import com.dreamchaser.depository_manage.entity.Place;
import com.dreamchaser.depository_manage.mapper.DepositoryMapper;
import com.dreamchaser.depository_manage.mapper.PlaceMapper;
import com.dreamchaser.depository_manage.service.impl.DepositoryServiceImpl;
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
@RunWith(SpringRunner.class)
public class TestForDepositoryTree {
@Autowired
DepositoryMapper depositoryMapper;
@Autowired
PlaceMapper placeMapper;
@Test
public void test(){
List<Object> objectList1 = InitTreeMenus("116");
System.out.println(objectList1);
}
public List<Object> InitTreeMenus(String adminorg) {
// 定义结果集
List<Object> list = new ArrayList<>();
// 定义仓库id列表
List<Integer> depositoryIdList = new ArrayList<>();
// 获取所有仓库
List<Depository> depositoryAll = depositoryMapper.findDepositoryAll();
Integer totalVal = depositoryAll.size();
// 定义分页数量
double size = 10.0;
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数目
Integer openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < depositoryAll.size(); i++) {
// 获取当前类型
Depository depository = depositoryAll.get(i);
if (((i + 1) % 100) == 0) { // 如果有100个开启线程进行处理
depositoryIdList.add(depository.getId());
Future<Object> future = completionService.submit(new Task(depositoryIdList,adminorg));
openThreadSize++;
futureList.add(future); // 添加到结果集
depositoryIdList = new ArrayList<>(); // 情况列表
} else {
// 添加id到列表中
depositoryIdList.add(depository.getId());
}
}
if (depositoryIdList.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<Object> future = completionService.submit(new Task(depositoryIdList,adminorg));
futureList.add(future);
openThreadSize++;
}
// 3.获取结果
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.addAll((Collection<?>) result);
}
exs.shutdown();
for (int i = 0; i < list.size(); i++) {
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
Integer parentId = jsonObject.getInteger("parentId");
if(Integer.compare(parentId,0) != 0) {
if (!checkList(list, parentId)) {
// 如果当前列表中不存在其父级
Depository depositoryById = depositoryMapper.findDepositoryById(parentId);
list.add(InitTreeMenus2(depositoryById, new ArrayList<>()));
}
}
}
return list;
}
// 用于执行线程任务
class Task implements Callable<Object> {
// 仓库
List<Integer> depositoryIdList;
// 部门
String adminorg;
public Task(List<Integer> depositoryIdList,String adminorg){
this.depositoryIdList = depositoryIdList;
this.adminorg = adminorg;
}
@Override
public Object call() throws Exception {
/**
* 获取当前仓库id对应的仓库
*/
List<Depository> depositories = depositoryMapper.selectDepositoryByIds(depositoryIdList);
// 定义树结构结果集
List<Object> list = new ArrayList<>();
// 定义线程池
ExecutorService exs = Executors.newFixedThreadPool(depositories.size());
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService用于获取结果
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 定义开启线程数
Integer openThreadSize = 0;
for (int i = 0; i < depositories.size(); i++) {
// 获取当前仓库信息
Depository depository = depositories.get(i);
if("".equals(adminorg) ){
Future<Object> submit = completionService.submit(new PlaceTask(depository));
futureList.add(submit);
openThreadSize++;
}else{
if(adminorg.equals(depository.getAdminorg())){
Future<Object> submit = completionService.submit(new PlaceTask(depository));
futureList.add(submit);
openThreadSize++;
}
}
}
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
}
/**
* 用于给仓库添加对应的库位
*/
class PlaceTask implements Callable<Object>{
Depository d;
PlaceTask(Depository d){
this.d = d;
}
@Override
public Object call() throws Exception {
// 获取当前仓库下的库位
List<Object> objectList = AddPlaceByDid(d);
// 将其构造成对应的树形结构类型
Map<String, Object> map = InitTreeMenus2(d, objectList);
return map;
}
}
// 在仓库后添加库位信息
public List<Object> AddPlaceByDid(Depository d) {
if (d != null) {
// 获取当前仓库下的所有库位
List<Object> result = new ArrayList<>();
// 获取该仓库的排
List<Integer> placeXByDid = placeMapper.findPlaceXByDid(d.getId());
if (placeXByDid.size() > 0) {
for (int i = 1; i <= placeXByDid.get(0); i++) {
Map<String, Object> placeX = new HashMap<>();
placeX.put("title", "第" + i + "排货架");
placeX.put("id", -1);
Map<String, Object> param = new HashMap<>();
param.put("did", d.getId());
param.put("x", i);
List<Place> placeByCondition = placeMapper.findPlaceByCondition(param);
if (placeByCondition.size() > 0) {
List<Object> children = new ArrayList<>();
for (int k = 1; k <= placeByCondition.size(); k++) {
Map<String, Object> map = new HashMap<>();
map.put("title", placeByCondition.get(k - 1).getCode());
map.put("id", d.getId() + "-" + placeByCondition.get(k - 1).getId());
children.add(map);
}
placeX.put("children", children);
}
// 获取该仓库该排的列数
result.add(placeX);
}
}
return result;
} else {
return null;
}
}
// 构造树形组件数据模板
public Map<String, Object> InitTreeMenus2(Depository d, List<Object> children) {
if (d != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", d.getDname());
map.put("id", d.getId());
map.put("children", children);
map.put("parentId",d.getParentId());
return map;
} else {
return null;
}
}
/**
* 用于构造树结构
* @param list 树列表
* @param parentId 父级id
* @return
*/
public List<Object> buildTree_New(List<Object> list,Integer parentId){
// 定义树结构
List<Object> result = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
// 构造为jsonObject类
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
// 获取当前父级id
Long parentId1 = jsonObject.getLong("parentId");
if(Long.compare(parentId,parentId1) == 0){ // 如果当前类型是其父类
List<Object> objectList = buildTree_New(list, jsonObject.getInteger("id")); // 获取当前类型的子类
JSONArray children = jsonObject.getJSONArray("children");
children.addAll(objectList);
result.add(jsonObject);
}
}
return result;
}
/**
* 判断当前父级id是否在列表中
* @param list
* @param parentId
* @return
*/
public Boolean checkList(List<Object> list,Integer parentId){
for (int i = 0; i < list.size(); i++) {
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
Integer pid = jsonObject.getInteger("id");
if(Integer.compare(pid,parentId) == 0){
return true;
}
}
return false;
}
}

1
src/test/java/com/dreamchaser/depository_manage/TestForMaterialTree.java

@ -67,6 +67,7 @@ public class TestForMaterialTree {
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 树结构结果集

163
src/test/java/com/dreamchaser/depository_manage/TestForMaterialTypeTree.java

@ -0,0 +1,163 @@
package com.dreamchaser.depository_manage;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.Material;
import com.dreamchaser.depository_manage.entity.MaterialType;
import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper;
import com.dreamchaser.depository_manage.service.MaterialTypeService;
import com.dreamchaser.depository_manage.service.impl.MaterialTypeServiceImpl;
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
@RunWith(SpringRunner.class)
public class TestForMaterialTypeTree {
@Autowired
MaterialTypeMapper materialTypeMapper;
@Test
public void Test(){
}
public List<Object> InitTreeMenus() {
// 获取所有物料类型
List<MaterialType> materialTypeAll = materialTypeMapper.findMaterialTypeAll();
// 物料总数
Integer totalVal = materialTypeAll.size();
// 定义分页数量
double size = 100.0;
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数
Integer openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 树结构结果集
List<Object> list = new ArrayList<>();
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 物料类型id列表
List<Long> materialTypeList = new ArrayList<>();
for (int i = 0; i < materialTypeAll.size(); i++) {
// 获取当前类型
MaterialType materialType = materialTypeAll.get(i);
if (((i + 1) % 100) == 0) { // 如果有100个开启线程进行处理
materialTypeList.add(materialType.getOldId());
Future<Object> future = completionService.submit(new TaskTest_New(materialTypeList));
openThreadSize++;
futureList.add(future); // 添加到结果集
materialTypeList = new ArrayList<>(); // 情况列表
} else {
// 添加id到列表中
materialTypeList.add(materialType.getOldId());
}
}
if (materialTypeList.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<Object> future = completionService.submit(new TaskTest_New(materialTypeList));
futureList.add(future);
openThreadSize++;
}
// 3.获取结果
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.addAll((Collection<?>) result);
}
exs.shutdown();
// 进行最终的封装
return list;
}
// 用于执行测试新算法
class TaskTest_New implements Callable<Object> {
// 待处理的物料类型id列表
List<Long> materialTypeIdList;
public TaskTest_New(List<Long> materialTypeByCondition) {
this.materialTypeIdList = materialTypeByCondition;
}
@Override
public Object call() throws Exception {
// 定义树结构结果集
List<Object> list = new ArrayList<>();
// 查询当前物料类型id列表中的物料类型
List<MaterialType> materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList);
for (int i = 0; i < materialTypeByOldIds.size(); i++) {
MaterialType mt = materialTypeByOldIds.get(i);
Map<String, Object> map = InitTreeMenus(mt, new ArrayList<>());
list.add(map);
}
return list;
}
}
// 构造树形组件数据模板
public Map<String, Object> InitTreeMenus(MaterialType mt, List<Object> children) {
if (mt != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", mt.getTname());
map.put("id", mt.getOldId());
map.put("parentId",mt.getParentId());
map.put("children",children);
return map;
} else {
return null;
}
}
/**
* 用于构造树结构
* @param list 树列表
* @param parentId 父级id
* @return
*/
public List<Object> buildTree_New(List<Object> list,Long parentId){
// 定义树结构
List<Object> result = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
// 构造为jsonObject类
JSONObject jsonObject = new JSONObject((Map<String, Object>) list.get(i));
// 获取当前父级id
Long parentId1 = jsonObject.getLong("parentId");
if(Long.compare(parentId,parentId1) == 0){ // 如果当前类型是其父类
List<Object> objectList = buildTree_New(list, jsonObject.getLong("id")); // 获取当前类型的子类
JSONArray children = jsonObject.getJSONArray("children");
children.addAll(objectList);
result.add(jsonObject);
}
}
return result;
}
}
Loading…
Cancel
Save