diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java index a5da41bf..10bb23c5 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java @@ -246,7 +246,11 @@ public class MaterialController { }else if("4".equals(type)){ list = materialService.InitTreeMenus_Test(); }*/ - list = materialService.InitTreeMenus_Test(); + if(!"".equals(mname)){ + list = materialService.InitTreeForSelectName(mname.split(",")[0]); + }else { + list = materialService.InitTreeMenus_Test(); + } return new RestResponse(list); } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java index 08d65c26..24eba018 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java @@ -396,6 +396,25 @@ public class PageController { return mv; } + + @GetMapping("split-out") + public ModelAndView split_out(HttpServletRequest request) { + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + ModelAndView mv = new ModelAndView(); + mv.setViewName("pages/split/split-out"); + Map map = new HashMap<>(); + Integer role = userToken.getIsadmin(); + if (role == null) { + role = 1; + } + if (role == 4) { + mv.addObject("display", "inline-block"); + } else { + mv.addObject("display", "none"); + } + return mv; + } + @GetMapping("/material_out") public ModelAndView material_out(HttpServletRequest request) { ModelAndView mv = new ModelAndView(); @@ -493,10 +512,9 @@ public class PageController { // 物料树形菜单页面 @GetMapping("/selectMaterial") - public ModelAndView selectMaterial(String mname, String type) { + public ModelAndView selectMaterial(String mname) { ModelAndView mv = new ModelAndView(); mv.addObject("mname", mname); - mv.addObject("type", type); mv.setViewName("pages/material/selectMaterial"); return mv; } @@ -702,6 +720,13 @@ public class PageController { return mv; } + @GetMapping("/split_add") + public ModelAndView split_add(){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("pages/split/split_add"); + return mv; + } + @GetMapping("/table_user") public ModelAndView table_user(HttpServletRequest request) { UserByPort userToken = (UserByPort) request.getAttribute("userToken"); diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/SplitController.java b/src/main/java/com/dreamchaser/depository_manage/controller/SplitController.java new file mode 100644 index 00000000..79693f10 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/controller/SplitController.java @@ -0,0 +1,48 @@ +package com.dreamchaser.depository_manage.controller; + + +import com.dreamchaser.depository_manage.exception.MyException; +import com.dreamchaser.depository_manage.pojo.RestResponse; +import com.dreamchaser.depository_manage.service.SplitUnitService; +import com.dreamchaser.depository_manage.utils.CrudUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +@RestController +@RequestMapping("/split") +public class SplitController { + + @Autowired + SplitUnitService splitUnitService; + + + /** + * 用于添加一条拆单记录 + * @param map 待添加数据 + * @param request + * @return + */ + @PostMapping("/splitAdd") + public RestResponse splitAdd(@RequestBody Map map, HttpServletRequest request){ + if(map.containsKey("quantity") && map.containsKey("newUnit")){ + return CrudUtil.postHandle(1,splitUnitService.addSplitInfo(map)); + }else{ + throw new MyException("缺少必要参数"); + } + } + + + /** + * 用于根据条件查询拆单记录 + * @param map 待查询条件 + * @param request + * @return + */ + @GetMapping("/split_out") + public RestResponse splitOut(@RequestParam Map map,HttpServletRequest request){ + return null; + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/exceptionHandler/CustomExceptionHandler.java b/src/main/java/com/dreamchaser/depository_manage/exceptionHandler/CustomExceptionHandler.java index 30538f07..f7cb09cd 100644 --- a/src/main/java/com/dreamchaser/depository_manage/exceptionHandler/CustomExceptionHandler.java +++ b/src/main/java/com/dreamchaser/depository_manage/exceptionHandler/CustomExceptionHandler.java @@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.ResponseBody; /** * 全局异常捕捉处理 - * @author 金昊霖 */ @ControllerAdvice @Slf4j @@ -20,7 +19,6 @@ public class CustomExceptionHandler { @ResponseBody @ExceptionHandler(value = Exception.class) public RestResponse errorHandler(MyException e) { - return new RestResponse(null,e.getCode(),new StatusInfo(e.getMsg(),e.getMsg())); } diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java index 078de7ef..de3755c9 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java @@ -304,6 +304,14 @@ public interface MaterialMapper { */ List findMaterialByTypeIds(List list); + + /** + * 批量查询当前类型下包含该名称的物料 + * @param map 待查询数据 + * @return + */ + List findMaterialByTypeIdsAndMname(Map map); + /** * 添加当前批次下的物料与生产日期对应 * @param map diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml index ca03dc6a..9681115d 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml @@ -472,7 +472,7 @@ - SELECT from material m @@ -484,6 +484,21 @@ and state = 1; + + select @@ -162,6 +187,21 @@ + diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/SplitInfoP.java b/src/main/java/com/dreamchaser/depository_manage/pojo/SplitInfoP.java new file mode 100644 index 00000000..dfe0791a --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/SplitInfoP.java @@ -0,0 +1,108 @@ +package com.dreamchaser.depository_manage.pojo; + +import com.dreamchaser.depository_manage.entity.SplitInfo; +import lombok.Data; + +/** + * 用于展示拆单具体信息 + */ +@Data +public class SplitInfoP { + /** + * 拆单id + */ + private Integer id; + /** + * 物料id + */ + private Integer mid; + /** + * 旧计量单位 + */ + private String oldUnit; + /** + * 新计量单位 + */ + private String newUnit; + /** + * 新旧单位映射数 + */ + private Integer quantity; + /** + * 父级id + */ + private Integer sparentId; + + /** + * 状态:1启用2禁用3删除 + */ + private Integer sstate; + + /** + * 物料名称 + */ + private String mname; + + /** + * 物料类型 + */ + private String typeName; + + /** + * 物料规格型号 + */ + private String version; + + /** + * 物料材质 + */ + private String texture; + + /** + * 物料编码 + */ + private String mcode; + + /** + * 物料保质期 + */ + private Integer shelfLife; + + /** + * 用于展示的物料保质期 + */ + private String showShelfLife; + + /** + * 物料生产地 + */ + private String productionPlace; + + /** + * 物料品牌 + */ + private String brand; + + /** + * 物料备注 + */ + private String remark; + + /** + * 物料状态 + */ + private Integer mstate; + + public SplitInfoP(SplitInfo splitInfo) { + this.id = splitInfo.getId(); + this.mid = splitInfo.getId(); + this.oldUnit = splitInfo.getOldUnit(); + this.newUnit = splitInfo.getNewUnit(); + this.sparentId = splitInfo.getParentId(); + this.sstate = splitInfo.getState(); + } + + public SplitInfoP(){ + + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java b/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java index 050d6a2e..3c7d89a3 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java @@ -343,4 +343,11 @@ public interface MaterialService { * @return */ Integer editPlaceMaterial(Map map); + + /** + * 通过物料名称构造树 + * @param mname 物料名称 + * @return + */ + List InitTreeForSelectName(String mname); } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java index fe10bd5e..1986a4e8 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java @@ -2202,5 +2202,211 @@ public class MaterialServiceImpl implements MaterialService { } + /** + * 用于构造物料树结构(通过物料名称搜索) + * @return + */ + public List InitTreeForSelectName(String mname) { + // 获取所有物料类型 + List materialTypeAll = materialTypeMapper.findMaterialTypeAll(); + // 物料总数 + Integer totalVal = materialTypeAll.size(); + + // 定义分页数量 + double size = 100.0; + + // 定义线程数 + Integer threadSize = (int) Math.ceil(totalVal / size); + + // 开启对应数量的线程 + ExecutorService exs = Executors.newFixedThreadPool(threadSize); + // 树结构结果集 + List list = new ArrayList<>(); + // 线程结果集 + List> futureList = new ArrayList>(); + + // 1.定义CompletionService + CompletionService completionService = new ExecutorCompletionService(exs); + // 物料类型id列表 + List 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 future = completionService.submit(new TaskTestForSelectMname(materialTypeList,mname)); + futureList.add(future); // 添加到结果集 + materialTypeList = new ArrayList<>(); // 情况列表 + } else { + // 添加id到列表中 + materialTypeList.add(materialType.getOldId()); + } + } + + if (materialTypeList.size() > 0) { + // 如果有剩余,开启线程进行处理 + Future future = completionService.submit(new TaskTestForSelectMname(materialTypeList,mname)); + futureList.add(future); + } + + // 3.获取结果 + for (int i = 0; i < threadSize; i++) { + Object result = null; + try { + result = completionService.take().get(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + list.addAll((Collection) result); + } + // 进行最终的封装 + return buildTreeForSelectName(list); + } + + // 用于执行测试新算法(通过物料名称搜索) + class TaskTestForSelectMname implements Callable { + + // 待处理的物料类型id列表 + List materialTypeIdList; + String mname; + + public TaskTestForSelectMname(List materialTypeByCondition,String mname) { + this.materialTypeIdList = materialTypeByCondition; + this.mname = mname; + } + + @Override + public Object call() throws Exception { + + // 定义树结构结果集 + List list = new ArrayList<>(); + // 查询当前物料类型id列表中的物料类型 + Map paramForMnameAndMtid = new HashMap<>(); + paramForMnameAndMtid.put("list",materialTypeIdList); + paramForMnameAndMtid.put("mname",mname); + List materialByTypeIds = materialMapper.findMaterialByTypeIdsAndMname(paramForMnameAndMtid); + // 查询当前物料类型所包含的物料 + List materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList); + + // 定义线程集 + ExecutorService exs = Executors.newFixedThreadPool(materialTypeByOldIds.size()); + // 定义线程结果集 + List> futureList = new ArrayList>(); + + // 1.定义CompletionService + CompletionService completionService = new ExecutorCompletionService(exs); + + for (int i = 0; i < materialTypeByOldIds.size(); i++) { + // 获取当前物料类型 + MaterialType mt = materialTypeByOldIds.get(i); + // 开启对应线程 + Future future = completionService.submit(new MtTaskTestForSelectMname(mt, materialByTypeIds,mname)); + // 添加到线程结果列表 + futureList.add(future); + } + // 3.获取结果 + for (int i = 0; i < materialTypeIdList.size(); 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 MtTaskTestForSelectMname implements Callable { + + MaterialType mt; // 物料类型 + List materiaList; // 物料列表 + String mname; + + public MtTaskTestForSelectMname(MaterialType mt, List materiaList,String mname) { + this.mt = mt; + this.materiaList = materiaList; + this.mname = mname; + } + + @Override + public Object call() throws Exception { + + // 开启对应数量的线程 + List materialList = new ArrayList<>(); + for (int i = 0; i < materiaList.size(); i++) { + Material material = materiaList.get(i); + // 如果当前物料是当前物料类型下的物料 + if (Long.compare(material.getMaterialTypeId(), mt.getOldId()) == 0) { + materialList.add(material); + } + } + // 将物料打包成树结构对应结果 + List objectList = AddMaterialByTypeForSelectMname(materialList); + // 封装成对应的结构 + Map objectMap = InitTreeMenusForSelectName(mt, objectList); + return objectMap; + } + } + + // 构造树形组件数据模板(通过物料名称搜索) + public Map InitTreeMenusForSelectName(MaterialType mt, List children) { + if (mt != null) { + Map 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; + } + } + + // 在类别后添加物料名称(通过物料名称搜索) + public List AddMaterialByTypeForSelectMname(List materialList) { + List result = new ArrayList<>(); + for (int i = 0; i < materialList.size(); i++) { + Material material = materialList.get(i); + Map map = new HashMap<>(); + String version = material.getVersion(); + if (version == null) { + version = ""; + } + + String title = material.getMname() + ",规格型号: " + version; + map.put("title", title); + map.put("id", material.getId()); + result.add(map); + } + return result; + } + + /** + * 用于构造树结构(通过物料名称搜索) + * @param list 树列表 + * @return + */ + public List buildTreeForSelectName(List list){ + // 定义树结构 + List result = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + // 构造为jsonObject类 + JSONObject jsonObject = new JSONObject((Map) list.get(i)); + JSONArray children = jsonObject.getJSONArray("children"); + if(children.size() > 0){ + result.add(jsonObject); + } + } + return result; + } } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/SplitUnitServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/SplitUnitServiceImpl.java index 08e1d952..d2423127 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/SplitUnitServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/SplitUnitServiceImpl.java @@ -63,6 +63,7 @@ public class SplitUnitServiceImpl implements SplitUnitService { map.put("parentId",null); } // 插入 + map.put("state",1); return splitUnitMapper.addSplitInfo(map); } diff --git a/src/main/resources/templates/pages/application/application-in.html b/src/main/resources/templates/pages/application/application-in.html index 65853fb4..107abc85 100644 --- a/src/main/resources/templates/pages/application/application-in.html +++ b/src/main/resources/templates/pages/application/application-in.html @@ -444,6 +444,7 @@ params = remove(params, parentId); reparent.removeChild(parent); }; + //删除数组中指定元素 function remove(arr, item) { var result = []; @@ -455,6 +456,7 @@ } return result; } + // 用于选择生产日期 selectDate = function (obj) { var name = obj.id; @@ -500,7 +502,7 @@ materialId.value = ""; priceValue.value = ""; obj.value = ""; - $("#barCode" + idNumber).remove(); + $("#barCode" + idNumber).empty(); form.render(); } else { @@ -509,19 +511,22 @@ priceValue.value = d.price; // 获取物料与条形码的对应关系 var materialAndBarCodeList = d["materialAndBarCodeList"]; + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } if (materialAndBarCodeList.length > 0) { // 如果有对应的条形码 - var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; var id = barCodeInput.id; $("#" + id).remove(); - $("#barCode" + idNumber).empty(); var barCode = $("#barCode" + idNumber); if (barCode.length > 0) { barCode.empty(); } else { var barCodeSelect = ` - `; $("#" + barCodeImg.id).before(barCodeSelect); } @@ -531,11 +536,6 @@ $("#barCode" + idNumber).append(new Option(item.bmcode, item.bmcode));//往下拉菜单里添加元素 }); form.render(); - } else { - var barCode = $("#barCode" + idNumber); - if (barCode.length > 0) { - barCode.empty(); - } } var shelfLife = d.shelfLife; if (shelfLife !== null && shelfLife !== undefined) { @@ -569,7 +569,7 @@ var priceValue = priceItem[1]; // 条形码条码 var barCodeItem = barCodeChildren.childNodes[3]; - + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', @@ -590,7 +590,7 @@ }, end: function () { var mid = materialId.value; - if(mid !== ''){ + if (mid !== '') { $.ajax({ url: "/material/findMatrialById?mid=" + mid, type: "get", @@ -605,14 +605,15 @@ codeValue.value = code; priceValue.value = material.price; var materialAndBarCodeList = material["materialAndBarCodeList"]; + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; + var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; + var idNumber = materialId.name.split("mid")[1]; + if (materialAndBarCodeList.length > 0) { // 如果有对应的条形码 - var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; - var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; var id = barCodeInput.id; $("#" + id).remove(); // barCodeInput.style = "display:none"; - var idNumber = materialId.name.split("mid")[1]; var barCodeSelect = ` `; @@ -623,6 +624,8 @@ $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 }); form.render(); + } else { + console.log(1) } var shelfLife = material.shelfLife; if (shelfLife !== null && shelfLife !== undefined) { diff --git a/src/main/resources/templates/pages/application/application-in_scanQrCode.html b/src/main/resources/templates/pages/application/application-in_scanQrCode.html index 0e90b681..3d9cc589 100644 --- a/src/main/resources/templates/pages/application/application-in_scanQrCode.html +++ b/src/main/resources/templates/pages/application/application-in_scanQrCode.html @@ -667,6 +667,7 @@ var materialName = materialItem[1]; var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/src/main/resources/templates/pages/application/application-out.html b/src/main/resources/templates/pages/application/application-out.html index 4a65341a..7732aa3e 100644 --- a/src/main/resources/templates/pages/application/application-out.html +++ b/src/main/resources/templates/pages/application/application-out.html @@ -882,6 +882,8 @@ var barCodeChildren = parent.childNodes[9]; // 条形码条码 var barCodeItem = barCodeChildren.childNodes[3]; + + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/src/main/resources/templates/pages/application/application-transfer.html b/src/main/resources/templates/pages/application/application-transfer.html index 12c1355d..40deace9 100644 --- a/src/main/resources/templates/pages/application/application-transfer.html +++ b/src/main/resources/templates/pages/application/application-transfer.html @@ -643,6 +643,8 @@ var mname = materialName.value; var barCodeChildren = parent.childNodes[9]; var barCodeItem = barCodeChildren.childNodes[3]; + + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/src/main/resources/templates/pages/application/application-transfer_back.html b/src/main/resources/templates/pages/application/application-transfer_back.html index 3f53eac7..582197ce 100644 --- a/src/main/resources/templates/pages/application/application-transfer_back.html +++ b/src/main/resources/templates/pages/application/application-transfer_back.html @@ -378,6 +378,8 @@ var materialName = materialItem[1]; var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; + + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/src/main/resources/templates/pages/material/selectMaterial.html b/src/main/resources/templates/pages/material/selectMaterial.html index a927d7fd..d1eee8d7 100644 --- a/src/main/resources/templates/pages/material/selectMaterial.html +++ b/src/main/resources/templates/pages/material/selectMaterial.html @@ -12,52 +12,46 @@
- + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/split/split_add.html b/src/main/resources/templates/pages/split/split_add.html new file mode 100644 index 00000000..e1d60aff --- /dev/null +++ b/src/main/resources/templates/pages/split/split_add.html @@ -0,0 +1,450 @@ + + + + + 拆单 + + + + + + + + + +
+
+
+ 物料拆单 +
+
+
+
+
+
+ + +
+
+ + +
+ +
+
+ + +
+ +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+ +
+ + +
+ +
+
+ + +
+ + +
+ +
+
+ +
+ + +
+ +
+
+ +
+ +
+ +
+
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/src/test/java/com/dreamchaser/depository_manage/TestForSelectMaterialByName.java b/src/test/java/com/dreamchaser/depository_manage/TestForSelectMaterialByName.java new file mode 100644 index 00000000..bbd15e44 --- /dev/null +++ b/src/test/java/com/dreamchaser/depository_manage/TestForSelectMaterialByName.java @@ -0,0 +1,273 @@ +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.MaterialMapper; +import com.dreamchaser.depository_manage.mapper.MaterialTypeMapper; +import com.dreamchaser.depository_manage.service.MaterialService; +import org.apache.poi.ss.formula.functions.T; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.*; +import java.util.concurrent.*; + +@SpringBootTest +@RunWith(SpringRunner.class) +public class TestForSelectMaterialByName { + + @Autowired + MaterialService materialService; + + @Autowired + MaterialMapper materialMapper; + + @Autowired + MaterialTypeMapper materialTypeMapper; + + @Autowired + RedisTemplate redisTemplate; + + @org.junit.Test + public void test1() { + List list = buildTreeForSelectName(InitTreeForSelectName("切四A菇")); + System.out.println(JSONObject.toJSONString(list)); + } + + + /** + * 用于深度拷贝列表 + * + * @param oldList + * @param + * @return + */ + public static List deepCopy(List oldList) { + List newList = (List) Arrays.asList(new Object[oldList.size()]); + Collections.copy(newList, oldList); + return newList; + } + + /** + * 用于构造物料树结构(通过物料名称搜索) + * + * @return + */ + public List InitTreeForSelectName(String mname) { + // 获取所有物料类型 + List materialTypeAll = materialTypeMapper.findMaterialTypeAll(); + // 物料总数 + Integer totalVal = materialTypeAll.size(); + + // 定义分页数量 + double size = 100.0; + + // 定义线程数 + Integer threadSize = (int) Math.ceil(totalVal / size); + + // 开启对应数量的线程 + ExecutorService exs = Executors.newFixedThreadPool(threadSize); + // 树结构结果集 + List list = new ArrayList<>(); + // 线程结果集 + List> futureList = new ArrayList>(); + + // 1.定义CompletionService + CompletionService completionService = new ExecutorCompletionService(exs); + // 物料类型id列表 + List 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 future = completionService.submit(new TaskTestForSelectMname(materialTypeList, mname)); + futureList.add(future); // 添加到结果集 + materialTypeList = new ArrayList<>(); // 情况列表 + } else { + // 添加id到列表中 + materialTypeList.add(materialType.getOldId()); + } + } + + if (materialTypeList.size() > 0) { + // 如果有剩余,开启线程进行处理 + Future future = completionService.submit(new TaskTestForSelectMname(materialTypeList, mname)); + futureList.add(future); + } + + // 3.获取结果 + for (int i = 0; i < threadSize; i++) { + Object result = null; + try { + result = completionService.take().get(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + list.addAll((Collection) result); + } + // 进行最终的封装 + return list; + } + + // 用于执行测试新算法(通过物料名称搜索) + class TaskTestForSelectMname implements Callable { + + // 待处理的物料类型id列表 + List materialTypeIdList; + String mname; + + public TaskTestForSelectMname(List materialTypeByCondition, String mname) { + this.materialTypeIdList = materialTypeByCondition; + this.mname = mname; + } + + @Override + public Object call() throws Exception { + + // 定义树结构结果集 + List list = new ArrayList<>(); + // 查询当前物料类型id列表中的物料类型 + Map paramForMnameAndMtid = new HashMap<>(); + paramForMnameAndMtid.put("list", materialTypeIdList); + paramForMnameAndMtid.put("mname", mname); + List materialByTypeIds = materialMapper.findMaterialByTypeIdsAndMname(paramForMnameAndMtid); + // 查询当前物料类型所包含的物料 + List materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList); + + // 定义线程集 + ExecutorService exs = Executors.newFixedThreadPool(materialTypeByOldIds.size()); + // 定义线程结果集 + List> futureList = new ArrayList>(); + + // 1.定义CompletionService + CompletionService completionService = new ExecutorCompletionService(exs); + + for (int i = 0; i < materialTypeByOldIds.size(); i++) { + // 获取当前物料类型 + MaterialType mt = materialTypeByOldIds.get(i); + // 开启对应线程 + Future future = completionService.submit(new MtTaskTestForSelectMname(mt, materialByTypeIds, mname)); + // 添加到线程结果列表 + futureList.add(future); + } + // 3.获取结果 + for (int i = 0; i < materialTypeIdList.size(); 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 MtTaskTestForSelectMname implements Callable { + + MaterialType mt; // 物料类型 + List materiaList; // 物料列表 + String mname; + + public MtTaskTestForSelectMname(MaterialType mt, List materiaList, String mname) { + this.mt = mt; + this.materiaList = materiaList; + this.mname = mname; + } + + @Override + public Object call() throws Exception { + + // 开启对应数量的线程 + List materialList = new ArrayList<>(); + for (int i = 0; i < materiaList.size(); i++) { + Material material = materiaList.get(i); + // 如果当前物料是当前物料类型下的物料 + if (Long.compare(material.getMaterialTypeId(), mt.getOldId()) == 0) { + materialList.add(material); + } + } + // 将物料打包成树结构对应结果 + List objectList = AddMaterialByTypeForSelectMname(materialList); + // 封装成对应的结构 + Map objectMap = InitTreeMenusForSelectName(mt, objectList); + return objectMap; + } + } + + // 构造树形组件数据模板(通过物料名称搜索) + public Map InitTreeMenusForSelectName(MaterialType mt, List children) { + if (mt != null) { + Map 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; + } + } + + // 在类别后添加物料名称(通过物料名称搜索) + public List AddMaterialByTypeForSelectMname(List materialList) { + List result = new ArrayList<>(); + for (int i = 0; i < materialList.size(); i++) { + Material material = materialList.get(i); + Map map = new HashMap<>(); + String version = material.getVersion(); + if (version == null) { + version = ""; + } + + String title = material.getMname() + ",规格型号: " + version; + map.put("title", title); + map.put("id", material.getId()); + result.add(map); + } + return result; + } + + /** + * 用于构造树结构(通过物料名称搜索) + * + * @param list 树列表 + * @return + */ + public List buildTreeForSelectName(List list) { + // 定义树结构 + List result = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + // 构造为jsonObject类 + JSONObject jsonObject = new JSONObject((Map) list.get(i)); + JSONArray children = jsonObject.getJSONArray("children"); + if(children.size() > 0){ + result.add(jsonObject); + } +// // 获取当前父级id +// Long parentId1 = jsonObject.getLong("parentId"); +// if (Long.compare(parentId, parentId1) == 0) { // 如果当前类型是其父类 +// List objectList = buildTreeForSelectName(list, jsonObject.getLong("id")); // 获取当前类型的子类 +// JSONArray children = jsonObject.getJSONArray("children"); +// children.addAll(objectList); +// result.add(jsonObject); +// } + + } + return result; + } +} diff --git a/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml b/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml index ca03dc6a..9681115d 100644 --- a/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml +++ b/target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml @@ -472,7 +472,7 @@ - SELECT from material m @@ -484,6 +484,21 @@ and state = 1; + + select @@ -162,6 +187,21 @@ + diff --git a/target/classes/templates/pages/application/application-in.html b/target/classes/templates/pages/application/application-in.html index 65853fb4..107abc85 100644 --- a/target/classes/templates/pages/application/application-in.html +++ b/target/classes/templates/pages/application/application-in.html @@ -444,6 +444,7 @@ params = remove(params, parentId); reparent.removeChild(parent); }; + //删除数组中指定元素 function remove(arr, item) { var result = []; @@ -455,6 +456,7 @@ } return result; } + // 用于选择生产日期 selectDate = function (obj) { var name = obj.id; @@ -500,7 +502,7 @@ materialId.value = ""; priceValue.value = ""; obj.value = ""; - $("#barCode" + idNumber).remove(); + $("#barCode" + idNumber).empty(); form.render(); } else { @@ -509,19 +511,22 @@ priceValue.value = d.price; // 获取物料与条形码的对应关系 var materialAndBarCodeList = d["materialAndBarCodeList"]; + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } if (materialAndBarCodeList.length > 0) { // 如果有对应的条形码 - var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; var id = barCodeInput.id; $("#" + id).remove(); - $("#barCode" + idNumber).empty(); var barCode = $("#barCode" + idNumber); if (barCode.length > 0) { barCode.empty(); } else { var barCodeSelect = ` - `; $("#" + barCodeImg.id).before(barCodeSelect); } @@ -531,11 +536,6 @@ $("#barCode" + idNumber).append(new Option(item.bmcode, item.bmcode));//往下拉菜单里添加元素 }); form.render(); - } else { - var barCode = $("#barCode" + idNumber); - if (barCode.length > 0) { - barCode.empty(); - } } var shelfLife = d.shelfLife; if (shelfLife !== null && shelfLife !== undefined) { @@ -569,7 +569,7 @@ var priceValue = priceItem[1]; // 条形码条码 var barCodeItem = barCodeChildren.childNodes[3]; - + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', @@ -590,7 +590,7 @@ }, end: function () { var mid = materialId.value; - if(mid !== ''){ + if (mid !== '') { $.ajax({ url: "/material/findMatrialById?mid=" + mid, type: "get", @@ -605,14 +605,15 @@ codeValue.value = code; priceValue.value = material.price; var materialAndBarCodeList = material["materialAndBarCodeList"]; + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; + var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; + var idNumber = materialId.name.split("mid")[1]; + if (materialAndBarCodeList.length > 0) { // 如果有对应的条形码 - var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; - var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; var id = barCodeInput.id; $("#" + id).remove(); // barCodeInput.style = "display:none"; - var idNumber = materialId.name.split("mid")[1]; var barCodeSelect = ` `; @@ -623,6 +624,8 @@ $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 }); form.render(); + } else { + console.log(1) } var shelfLife = material.shelfLife; if (shelfLife !== null && shelfLife !== undefined) { diff --git a/target/classes/templates/pages/application/application-in_scanQrCode.html b/target/classes/templates/pages/application/application-in_scanQrCode.html index 0e90b681..3d9cc589 100644 --- a/target/classes/templates/pages/application/application-in_scanQrCode.html +++ b/target/classes/templates/pages/application/application-in_scanQrCode.html @@ -667,6 +667,7 @@ var materialName = materialItem[1]; var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/target/classes/templates/pages/application/application-out.html b/target/classes/templates/pages/application/application-out.html index 4a65341a..7732aa3e 100644 --- a/target/classes/templates/pages/application/application-out.html +++ b/target/classes/templates/pages/application/application-out.html @@ -882,6 +882,8 @@ var barCodeChildren = parent.childNodes[9]; // 条形码条码 var barCodeItem = barCodeChildren.childNodes[3]; + + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/target/classes/templates/pages/application/application-transfer.html b/target/classes/templates/pages/application/application-transfer.html index 12c1355d..40deace9 100644 --- a/target/classes/templates/pages/application/application-transfer.html +++ b/target/classes/templates/pages/application/application-transfer.html @@ -643,6 +643,8 @@ var mname = materialName.value; var barCodeChildren = parent.childNodes[9]; var barCodeItem = barCodeChildren.childNodes[3]; + + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/target/classes/templates/pages/application/application-transfer_back.html b/target/classes/templates/pages/application/application-transfer_back.html index 3f53eac7..582197ce 100644 --- a/target/classes/templates/pages/application/application-transfer_back.html +++ b/target/classes/templates/pages/application/application-transfer_back.html @@ -378,6 +378,8 @@ var materialName = materialItem[1]; var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; + + mname = mname.split(",")[0]; layer.open({ type: 2, title: '弹窗内容', diff --git a/target/classes/templates/pages/material/selectMaterial.html b/target/classes/templates/pages/material/selectMaterial.html index a927d7fd..d1eee8d7 100644 --- a/target/classes/templates/pages/material/selectMaterial.html +++ b/target/classes/templates/pages/material/selectMaterial.html @@ -12,52 +12,46 @@
-