Browse Source

完成库存盘点页面

lwx_dev
erdanergou 3 years ago
parent
commit
e16bc8524d
  1. 442
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  2. 47
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  3. 10
      src/main/java/com/dreamchaser/depository_manage/entity/Material.java
  4. 5
      src/main/java/com/dreamchaser/depository_manage/pojo/MaterialP.java
  5. 8
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  6. 163
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  7. 29
      src/main/resources/templates/pages/application/application-in.html
  8. 1
      src/main/resources/templates/pages/application/application-out.html
  9. 75
      src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html
  10. 100
      src/main/resources/templates/pages/scanQrCode/ScanCodeByTaking.html
  11. 202
      src/main/resources/templates/pages/scanQrCode/ScanMaterialCodeForTaking.html
  12. 29
      target/classes/templates/pages/application/application-in.html
  13. 1
      target/classes/templates/pages/application/application-out.html

442
src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java

@ -76,11 +76,11 @@ public class MaterialController {
List<MaterialP> list = new ArrayList<>(); List<MaterialP> list = new ArrayList<>();
Integer total = 0; Integer total = 0;
Integer size = 10,page = 1; // 定义每页展示数量 Integer size = 10, page = 1; // 定义每页展示数量
if (map.containsKey("size")) { if (map.containsKey("size")) {
size = ObjectFormatUtil.toInteger(map.get("size")); size = ObjectFormatUtil.toInteger(map.get("size"));
} }
if(!(map.containsKey("depositoryId")||map.containsKey("code")||map.containsKey("mname"))){ if (!(map.containsKey("depositoryId") || map.containsKey("code") || map.containsKey("mname"))) {
for (int i = 0; i < depositoryByAdminorg.size(); i++) { for (int i = 0; i < depositoryByAdminorg.size(); i++) {
Integer did = depositoryByAdminorg.get(i).getId(); Integer did = depositoryByAdminorg.get(i).getId();
didList.add(did); didList.add(did);
@ -88,40 +88,39 @@ public class MaterialController {
List<MaterialP> inventory = materialService.findInventory(map); List<MaterialP> inventory = materialService.findInventory(map);
list.addAll(inventory); list.addAll(inventory);
total += materialService.findInventoryCount(map); total += materialService.findInventoryCount(map);
if(list.size() >= size){ if (list.size() >= size) {
break; break;
} }
} }
for (RoleAndDepository roleAndDepository : depositoryAndRole) { for (RoleAndDepository roleAndDepository : depositoryAndRole) {
Integer depositoryId = roleAndDepository.getDepositoryId(); Integer depositoryId = roleAndDepository.getDepositoryId();
if(didList.contains(depositoryId)){ if (didList.contains(depositoryId)) {
// 如果当前仓库编号存在 // 如果当前仓库编号存在
continue; // 跳过本次循环 continue; // 跳过本次循环
} }
map.put("depositoryId", depositoryId); map.put("depositoryId", depositoryId);
if(list.size() < size){ if (list.size() < size) {
// 如果当前数目不足 // 如果当前数目不足
if (map.containsKey("page")){ if (map.containsKey("page")) {
// 当前页 // 当前页
page=ObjectFormatUtil.toInteger(map.get("page")); page = ObjectFormatUtil.toInteger(map.get("page"));
} }
// 计算所有页数 // 计算所有页数
// 判断当前是在全新一页还是包含上述内容 // 判断当前是在全新一页还是包含上述内容
if(size - list.size() != size){ if (size - list.size() != size) {
// 如果当前不是崭新一页 // 如果当前不是崭新一页
map.put("begin",0); map.put("begin", 0);
}else{ } else {
map.put("begin",(page-1)*size-total); map.put("begin", (page - 1) * size - total);
} }
map.put("size",size - list.size()); map.put("size", size - list.size());
List<MaterialP> materialByDepository = materialService.findMaterialByDepository(map); List<MaterialP> materialByDepository = materialService.findMaterialByDepository(map);
list.addAll(materialByDepository); list.addAll(materialByDepository);
} }
total += materialService.findMaterialByDepositoryCount(map); total += materialService.findMaterialByDepositoryCount(map);
} }
} } else {
else{
List<MaterialP> inventory = materialService.findInventory(map); List<MaterialP> inventory = materialService.findInventory(map);
list.addAll(inventory); list.addAll(inventory);
total += materialService.findInventoryCount(map); total += materialService.findInventoryCount(map);
@ -194,8 +193,12 @@ public class MaterialController {
List<Object> list = new ArrayList<>(); List<Object> list = new ArrayList<>();
if ("1".equals(type)) { if ("1".equals(type)) {
list = materialService.InitTreeMenus(mname); list = materialService.InitTreeMenus(mname);
} else { } else if ("2".equals(type)) {
list = materialService.InitTreeMenus(mname, String.valueOf(maindeparment)); list = materialService.InitTreeMenus(mname, String.valueOf(maindeparment));
} else if ("3".equals(type)) {
String depositoryId = (String) map.get("depositoryId");
String placeId = (String) map.get("placeId");
list = materialService.InitTreeMenus(mname, depositoryId, placeId);
} }
@ -214,6 +217,7 @@ public class MaterialController {
if ("".equals(mid)) { if ("".equals(mid)) {
return new RestResponse("", 0, 200); return new RestResponse("", 0, 200);
} }
Map<String, Object> map = new HashMap<>();
Material materialById = materialService.findMaterialById(ObjectFormatUtil.toInteger(mid)); Material materialById = materialService.findMaterialById(ObjectFormatUtil.toInteger(mid));
List<PlaceP> placePList = new ArrayList<>(); List<PlaceP> placePList = new ArrayList<>();
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString()); List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
@ -221,17 +225,21 @@ public class MaterialController {
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(ObjectFormatUtil.toInteger(mid), depositoryByAdminorg.get(i).getId()); List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(ObjectFormatUtil.toInteger(mid), depositoryByAdminorg.get(i).getId());
placePList.addAll(placeByMidAndDid); placePList.addAll(placeByMidAndDid);
} }
Map<String,Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("code",materialById.getCode()); param.put("code", materialById.getCode());
List<MaterialP> inventory = materialService.findInventory(param); List<MaterialP> inventory = materialService.findInventory(param);
if(inventory.size() > 0){ Map<String, Object> paramByBarcode = new HashMap<>();
materialById.setPrice(inventory.get(0).getPrice()); paramByBarcode.put("mcode", materialById.getCode());
}else{ List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByBarcode);
if (inventory.size() > 0) {
MaterialP materialP = inventory.get(0);
materialP.setMaterialAndBarCodeList(materialByBarCodeByCondition);
map.put("materialById", materialP);
} else {
materialById.setPrice(0.0); materialById.setPrice(0.0);
materialById.setMaterialAndBarCodeList(materialByBarCodeByCondition);
map.put("materialById", materialById);
} }
Map<String, Object> map = new HashMap<>();
map.put("materialById", materialById);
map.put("placeList", placePList); map.put("placeList", placePList);
return new RestResponse(map, 1, 200); return new RestResponse(map, 1, 200);
} }
@ -272,16 +280,16 @@ public class MaterialController {
MaterialP mp = null; MaterialP mp = null;
if (materialPByCondition.size() > 0) { if (materialPByCondition.size() > 0) {
mp = materialPByCondition.get(0); mp = materialPByCondition.get(0);
Map<String,Object> paramByPrice = new HashMap<>(); Map<String, Object> paramByPrice = new HashMap<>();
paramByPrice.put("code",mp.getCode()); paramByPrice.put("code", mp.getCode());
// 获取当前库存中的物料单价 // 获取当前库存中的物料单价
List<MaterialP> inventory = materialService.findInventory(paramByPrice); List<MaterialP> inventory = materialService.findInventory(paramByPrice);
if(inventory.size() > 0){ if (inventory.size() > 0) {
mp.setPrice(inventory.get(0).getPrice()); mp.setPrice(inventory.get(0).getPrice());
}else{ } else {
mp.setPrice(0.0); mp.setPrice(0.0);
} }
paramByPrice.put("mcode",mp.getCode()); paramByPrice.put("mcode", mp.getCode());
paramByPrice.remove("code"); paramByPrice.remove("code");
// 获取条形码与物料对应关系 // 获取条形码与物料对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByPrice); List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByPrice);
@ -369,7 +377,6 @@ public class MaterialController {
for (int i = 0; i < materialList.size(); i++) { for (int i = 0; i < materialList.size(); i++) {
JSONObject obj = (JSONObject) materialList.get(i); JSONObject obj = (JSONObject) materialList.get(i);
;
map.put("code", obj.get("code")); map.put("code", obj.get("code"));
if (depository != null) { if (depository != null) {
map.put("depositoryId", depository.get("did")); map.put("depositoryId", depository.get("did"));
@ -431,11 +438,12 @@ public class MaterialController {
/** /**
* 用于将扫描的结果进行解密操作 * 用于将扫描的结果进行解密操作
*
* @param map * @param map
* @return * @return
*/ */
@PostMapping("/decode3Des") @PostMapping("/decode3Des")
public RestResponse decode3Des(@RequestBody Map<String, Object> map){ public RestResponse decode3Des(@RequestBody Map<String, Object> map) {
String result = (String) map.get("result"); String result = (String) map.get("result");
String s = JM_3DES.decode3Des(JM_3DES.JM_Key, result); String s = JM_3DES.decode3Des(JM_3DES.JM_Key, result);
return new RestResponse(s); return new RestResponse(s);
@ -443,30 +451,30 @@ public class MaterialController {
// 获取扫描结果并跳转到入库 // 获取扫描结果并跳转到入库
@GetMapping("/application_in_scanQrCode") @GetMapping("/application_in_scanQrCode")
public RestResponse applicationInScanQrCode(HttpServletRequest request){ public RestResponse applicationInScanQrCode(HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken"); UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户所在部门拥有的仓库 // 获取当前用户所在部门拥有的仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString()); List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue"+userByPort.getNumber()).toString(); String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue" + userByPort.getNumber()).toString();
redisTemplate.delete("scanQrCodeValue"+userByPort.getNumber()); redisTemplate.delete("scanQrCodeValue" + userByPort.getNumber());
JSONObject jsonObject = JSONObject.parseObject(scanQrCodeValue); JSONObject jsonObject = JSONObject.parseObject(scanQrCodeValue);
JSONArray materialListByJson = jsonObject.getJSONArray("materialList"); JSONArray materialListByJson = jsonObject.getJSONArray("materialList");
Map<String,Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
List<MaterialP> materialPList = new ArrayList<>(); List<MaterialP> materialPList = new ArrayList<>();
for (int i = 0; i < materialListByJson.size(); i++) { for (int i = 0; i < materialListByJson.size(); i++) {
JSONObject material = (JSONObject) materialListByJson.get(i); JSONObject material = (JSONObject) materialListByJson.get(i);
List<PlaceP> placePList = new ArrayList<>(); List<PlaceP> placePList = new ArrayList<>();
param.put("mcode",material.getString("code")); param.put("mcode", material.getString("code"));
MaterialP mp = new MaterialP(materialService.findMaterialById(material.getInteger("mid"))); MaterialP mp = new MaterialP(materialService.findMaterialById(material.getInteger("mid")));
// 获取物料与条形码的对应关系 // 获取物料与条形码的对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param); List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
for (int j = 0; j < depositoryByAdminorg.size(); j++) { for (int j = 0; j < depositoryByAdminorg.size(); j++) {
Depository depository = depositoryByAdminorg.get(j); Depository depository = depositoryByAdminorg.get(j);
param.put("code",material.getString("code")); param.put("code", material.getString("code"));
param.put("depositoryId",depository.getId()); param.put("depositoryId", depository.getId());
List<MaterialP> inventory = materialService.findInventory(param); List<MaterialP> inventory = materialService.findInventory(param);
if(inventory.size() > 0) { if (inventory.size() > 0) {
List<PlaceP> place = placeService.findPlaceByMidAndDid(inventory.get(0).getId(), depository.getId()); List<PlaceP> place = placeService.findPlaceByMidAndDid(inventory.get(0).getId(), depository.getId());
placePList.addAll(place); placePList.addAll(place);
} }
@ -475,53 +483,103 @@ public class MaterialController {
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition); mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
materialPList.add(mp); materialPList.add(mp);
} }
jsonObject.put("materialList",materialPList); jsonObject.put("materialList", materialPList);
return new RestResponse(jsonObject);
}
// 获取扫描结果并跳转到盘点
@PostMapping("/stockTaking_scanQrCode")
public RestResponse stockTakingScanQrCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户所在部门拥有的仓库
String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue" + userByPort.getNumber()).toString();
redisTemplate.delete("scanQrCodeValue" + userByPort.getNumber());
JSONObject jsonObject = JSONObject.parseObject(scanQrCodeValue);
// 获取扫描的物料
JSONArray materialListByJson = jsonObject.getJSONArray("materialList");
Map<String, Object> param = new HashMap<>();
List<MaterialP> materialPList = new ArrayList<>();
String placeId = (String) map.get("placeId");
for (int i = 0; i < materialListByJson.size(); i++) {
Boolean flag = true;
JSONObject material = (JSONObject) materialListByJson.get(i);
param.put("mcode", material.getString("code"));
MaterialP mp = new MaterialP(materialService.findMaterialById(material.getInteger("mid")));
// 获取物料与条形码的对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
param.put("code", material.getString("code"));
param.put("depositoryId", map.get("depositoryId"));
List<MaterialP> inventory = materialService.findInventory(param);
if (inventory.size() > 0) {
MaterialP materialP = inventory.get(0);
if (!"0".equals(placeId)) {
// 如果不是默认库位
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前物料不在该库位
flag = false;
}
}
mp = materialP;
} else {
flag = false;
}
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
if (flag) {
// 如果可以添加
materialPList.add(mp);
}
}
jsonObject.put("materialList", materialPList);
return new RestResponse(jsonObject); return new RestResponse(jsonObject);
} }
// 获取条形码扫描结果 // 获取条形码扫描结果
@GetMapping("/application_in_scanBarCode") @GetMapping("/application_in_scanBarCode")
public RestResponse applicationInScanBarCode(HttpServletRequest request){ public RestResponse applicationInScanBarCode(HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken"); UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial"+userByPort.getNumber()).toString(); String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial" + userByPort.getNumber()).toString();
redisTemplate.delete("temporaryBarCodeValueForMaterial"+userByPort.getNumber()); redisTemplate.delete("temporaryBarCodeValueForMaterial" + userByPort.getNumber());
JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue); JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue);
JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList"); JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList");
// 获取标志位,用于判断是否扫描二维码 // 获取标志位,用于判断是否扫描二维码
Boolean flag = jsonObject.getBoolean("flag"); Boolean flag = jsonObject.getBoolean("flag");
Map<String,Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
List<Object> materialList = new ArrayList<>(); List<Object> materialList = new ArrayList<>();
// 获取当前用户所在部门拥有的仓库 // 获取当前用户所在部门拥有的仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString()); List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
Map<String,Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
for (int i = 0; i < barCodeList.size(); i++) { for (int i = 0; i < barCodeList.size(); i++) {
// 获取具体的条形码 // 获取具体的条形码
String barCode = barCodeList.getString(i); String barCode = barCodeList.getString(i);
// 获取条形码与物料的映射 // 获取条形码与物料的映射
MaterialAndBarCode materialByBarCode = null; MaterialAndBarCode materialByBarCode = null;
for (int j = 0; j < depositoryByAdminorg.size(); j++) { for (int j = 0; j < depositoryByAdminorg.size(); j++) {
param.put("depositoryId",depositoryByAdminorg.get(j).getId()); param.put("depositoryId", depositoryByAdminorg.get(j).getId());
param.put("barCode",barCode); param.put("barCode", barCode);
// 通过仓库与条形码获取对应关系 // 通过仓库与条形码获取对应关系
materialByBarCode = materialService.findMaterialByBarCodeByBarCodeAndDepositoryId(param); materialByBarCode = materialService.findMaterialByBarCodeByBarCodeAndDepositoryId(param);
if(materialByBarCode != null){ if (materialByBarCode != null) {
// 如果获取到对应关系 // 如果获取到对应关系
break; break;
} }
} }
if(materialByBarCode == null) { if (materialByBarCode == null) {
// 如果没有获取到 // 如果没有获取到
materialByBarCode = materialService.findMaterialByBarCode(barCode); materialByBarCode = materialService.findMaterialByBarCode(barCode);
} }
materialList.add(materialByBarCode); materialList.add(materialByBarCode);
} }
result.put("materialList",materialList); result.put("materialList", materialList);
if(flag){ if (flag) {
String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue"+userByPort.getNumber()).toString(); String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue" + userByPort.getNumber()).toString();
redisTemplate.delete("scanQrCodeValue"+userByPort.getNumber()); redisTemplate.delete("scanQrCodeValue" + userByPort.getNumber());
JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue); JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue);
result.put("depository",parseObject.get("depository")); result.put("depository", parseObject.get("depository"));
result.put("place",parseObject.get("place")); result.put("place", parseObject.get("place"));
} }
return new RestResponse(result); return new RestResponse(result);
} }
@ -529,17 +587,17 @@ public class MaterialController {
// 获取条形码扫描结果 // 获取条形码扫描结果
@GetMapping("/application_transfer_scanBarCode") @GetMapping("/application_transfer_scanBarCode")
public RestResponse applicationTransferScanBarCode(HttpServletRequest request){ public RestResponse applicationTransferScanBarCode(HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken"); UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户部门所拥有仓库 // 获取当前用户部门所拥有仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString()); List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial"+userByPort.getNumber()).toString(); String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial" + userByPort.getNumber()).toString();
redisTemplate.delete("temporaryBarCodeValueForMaterial"+userByPort.getNumber()); redisTemplate.delete("temporaryBarCodeValueForMaterial" + userByPort.getNumber());
JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue); JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue);
JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList"); JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList");
// 获取标志位,用于判断是否扫描二维码 // 获取标志位,用于判断是否扫描二维码
Boolean flag = jsonObject.getBoolean("flag"); Boolean flag = jsonObject.getBoolean("flag");
Map<String,Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
List<Object> materialList = new ArrayList<>(); List<Object> materialList = new ArrayList<>();
for (int i = 0; i < barCodeList.size(); i++) { for (int i = 0; i < barCodeList.size(); i++) {
// 获取具体的条形码 // 获取具体的条形码
@ -549,11 +607,11 @@ public class MaterialController {
Boolean isExist = false; Boolean isExist = false;
List<PlaceP> placePList = new ArrayList<>(); List<PlaceP> placePList = new ArrayList<>();
for (int j = 0; j < depositoryByAdminorg.size(); j++) { for (int j = 0; j < depositoryByAdminorg.size(); j++) {
Map<String,Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("depositoryId",depositoryByAdminorg.get(j).getId()); param.put("depositoryId", depositoryByAdminorg.get(j).getId());
param.put("code",materialByBarCode.getMcode()); param.put("code", materialByBarCode.getMcode());
List<MaterialP> inventory = materialService.findInventory(param); List<MaterialP> inventory = materialService.findInventory(param);
if(inventory.size() > 0){ if (inventory.size() > 0) {
// 如果存在该物料 // 如果存在该物料
MaterialP materialP = inventory.get(0); MaterialP materialP = inventory.get(0);
materialByBarCode.setMid(materialP.getId()); materialByBarCode.setMid(materialP.getId());
@ -562,35 +620,35 @@ public class MaterialController {
isExist = true; isExist = true;
} }
} }
if(isExist) { if (isExist) {
materialByBarCode.setPlacePList(placePList); materialByBarCode.setPlacePList(placePList);
materialList.add(materialByBarCode); materialList.add(materialByBarCode);
} }
} }
result.put("materialList",materialList); result.put("materialList", materialList);
if(flag){ if (flag) {
String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue"+userByPort.getNumber()).toString(); String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue" + userByPort.getNumber()).toString();
redisTemplate.delete("scanQrCodeValue"+userByPort.getNumber()); redisTemplate.delete("scanQrCodeValue" + userByPort.getNumber());
JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue); JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue);
result.put("depository",parseObject.get("depository")); result.put("depository", parseObject.get("depository"));
result.put("place",parseObject.get("place")); result.put("place", parseObject.get("place"));
} }
return new RestResponse(result); return new RestResponse(result);
} }
// 获取条形码扫描结果 // 获取条形码扫描结果
@GetMapping("/application_out_scanBarCode") @GetMapping("/application_out_scanBarCode")
public RestResponse applicationOutScanBarCode(HttpServletRequest request){ public RestResponse applicationOutScanBarCode(HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken"); UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户部门所拥有仓库 // 获取当前用户部门所拥有仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString()); List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userByPort.getMaindeparment().toString());
String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial"+userByPort.getNumber()).toString(); String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial" + userByPort.getNumber()).toString();
redisTemplate.delete("temporaryBarCodeValueForMaterial"+userByPort.getNumber()); redisTemplate.delete("temporaryBarCodeValueForMaterial" + userByPort.getNumber());
JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue); JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue);
JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList"); JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList");
// 获取标志位,用于判断是否扫描二维码 // 获取标志位,用于判断是否扫描二维码
Boolean flag = jsonObject.getBoolean("flag"); Boolean flag = jsonObject.getBoolean("flag");
Map<String,Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
List<Object> materialList = new ArrayList<>(); List<Object> materialList = new ArrayList<>();
for (int i = 0; i < barCodeList.size(); i++) { for (int i = 0; i < barCodeList.size(); i++) {
// 获取具体的条形码 // 获取具体的条形码
@ -600,11 +658,11 @@ public class MaterialController {
Boolean isExist = false; Boolean isExist = false;
List<PlaceP> placePList = new ArrayList<>(); List<PlaceP> placePList = new ArrayList<>();
for (int j = 0; j < depositoryByAdminorg.size(); j++) { for (int j = 0; j < depositoryByAdminorg.size(); j++) {
Map<String,Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("depositoryId",depositoryByAdminorg.get(j).getId()); param.put("depositoryId", depositoryByAdminorg.get(j).getId());
param.put("code",materialByBarCode.getMcode()); param.put("code", materialByBarCode.getMcode());
List<MaterialP> inventory = materialService.findInventory(param); List<MaterialP> inventory = materialService.findInventory(param);
if(inventory.size() > 0){ if (inventory.size() > 0) {
// 如果存在该物料 // 如果存在该物料
MaterialP materialP = inventory.get(0); MaterialP materialP = inventory.get(0);
List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(materialP.getId(), depositoryByAdminorg.get(j).getId()); List<PlaceP> placeByMidAndDid = placeService.findPlaceByMidAndDid(materialP.getId(), depositoryByAdminorg.get(j).getId());
@ -613,29 +671,121 @@ public class MaterialController {
isExist = true; isExist = true;
} }
} }
if(isExist) { if (isExist) {
materialByBarCode.setPlacePList(placePList); materialByBarCode.setPlacePList(placePList);
materialList.add(materialByBarCode); materialList.add(materialByBarCode);
} }
} }
result.put("materialList",materialList); result.put("materialList", materialList);
if(flag){ if (flag) {
String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue"+userByPort.getNumber()).toString(); String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue" + userByPort.getNumber()).toString();
redisTemplate.delete("scanQrCodeValue"+userByPort.getNumber()); redisTemplate.delete("scanQrCodeValue" + userByPort.getNumber());
JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue);
result.put("depository", parseObject.get("depository"));
result.put("place", parseObject.get("place"));
}
return new RestResponse(result);
}
// 获取条形码扫描结果
@PostMapping("/stockTaking_scanBarCode")
public RestResponse stockTakingScanBarCode(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
// 获取当前用户部门所拥有仓库
String scanBarCodeValue = redisTemplate.opsForValue().get("temporaryBarCodeValueForMaterial" + userByPort.getNumber()).toString();
redisTemplate.delete("temporaryBarCodeValueForMaterial" + userByPort.getNumber());
JSONObject jsonObject = JSONObject.parseObject(scanBarCodeValue);
JSONArray barCodeList = (JSONArray) jsonObject.get("barCodeList");
// 获取标志位,用于判断是否扫描二维码
Boolean flag = jsonObject.getBoolean("flag");
Map<String, Object> result = new HashMap<>();
List<MaterialP> materialList = new ArrayList<>();
String placeId = (String) map.get("placeId");
for (int i = 0; i < barCodeList.size(); i++) {
// 获取具体的条形码
String barCode = barCodeList.getString(i);
// 获取条形码与物料的映射
MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(barCode);
Boolean isExist = false;
Map<String, Object> param = new HashMap<>();
param.put("depositoryId", map.get("depositoryId"));
param.put("code", materialByBarCode.getMcode());
List<MaterialP> inventory = materialService.findInventory(param);
MaterialP mp = new MaterialP();
if (inventory.size() > 0) {
// 如果存在该物料
MaterialP materialP = inventory.get(0);
Map<String,Object> paramByBarCode = new HashMap<>();
paramByBarCode.put("mcode",materialP.getCode());
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByBarCode);
materialP.setMaterialAndBarCodeList(materialByBarCodeByCondition);
isExist = true;
if(!"0".equals(placeId)) {
// 如果不是默认库位
// 获取物料与库位的对应关系
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(materialP.getId(), ObjectFormatUtil.toInteger(placeId));
if(placeAndMaterialByMidAndPid == null){
isExist = false;
}
}
mp = materialP;
}
if (isExist) {
materialList.add(mp);
}
}
if (flag) {
String scanQrCodeValue = redisTemplate.opsForValue().get("scanQrCodeValue" + userByPort.getNumber()).toString();
redisTemplate.delete("scanQrCodeValue" + userByPort.getNumber());
JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue); JSONObject parseObject = JSONObject.parseObject(scanQrCodeValue);
result.put("depository",parseObject.get("depository")); // 获取扫描的物料
result.put("place",parseObject.get("place")); JSONArray materialListByJson = jsonObject.getJSONArray("materialList");
Map<String, Object> param = new HashMap<>();
for (int i = 0; i < materialListByJson.size(); i++) {
Boolean tempflag = true;
JSONObject material = (JSONObject) materialListByJson.get(i);
param.put("mcode", material.getString("code"));
MaterialP mp = new MaterialP(materialService.findMaterialById(material.getInteger("mid")));
// 获取物料与条形码的对应关系
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
param.put("code", material.getString("code"));
param.put("depositoryId", map.get("depositoryId"));
List<MaterialP> inventory = materialService.findInventory(param);
if (inventory.size() > 0) {
MaterialP materialP = inventory.get(0);
if (!"0".equals(placeId)) {
// 如果不是默认库位
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), materialP.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前物料不在该库位
tempflag = false;
}
}
mp = materialP;
} else {
tempflag = false;
}
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
if (tempflag) {
// 如果可以添加
materialList.add(mp);
}
}
} }
result.put("materialList", materialList);
return new RestResponse(result); return new RestResponse(result);
} }
// 通过条形码获取物料信息 // 通过条形码获取物料信息
@GetMapping("/findMaterialByBarCode") @GetMapping("/findMaterialByBarCode")
public RestResponse findMaterialByBarCode(@RequestParam String barCode,HttpServletRequest request){ public RestResponse findMaterialByBarCode(@RequestParam String barCode, HttpServletRequest request) {
UserByPort userByPort = (UserByPort) request.getAttribute("userToken"); UserByPort userByPort = (UserByPort) request.getAttribute("userToken");
MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(barCode); MaterialAndBarCode materialByBarCode = materialService.findMaterialByBarCode(barCode);
Map<String,Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
if(materialByBarCode != null){ if (materialByBarCode != null) {
// 如果当前条形码有对应物料 // 如果当前条形码有对应物料
Material materialById = materialService.findMaterialById(materialByBarCode.getMid()); Material materialById = materialService.findMaterialById(materialByBarCode.getMid());
return new RestResponse(materialById); return new RestResponse(materialById);
@ -645,35 +795,129 @@ public class MaterialController {
// 用于查看当前物料下的条形码 // 用于查看当前物料下的条形码
@GetMapping("/findMaterialBarCode") @GetMapping("/findMaterialBarCode")
public RestResponse findMaterialBarCode(@RequestParam Map<String,Object> map,HttpServletRequest request){ public RestResponse findMaterialBarCode(@RequestParam Map<String, Object> map, HttpServletRequest request) {
Integer mid = ObjectFormatUtil.toInteger(map.get("mid")); Integer mid = ObjectFormatUtil.toInteger(map.get("mid"));
Material materialById = materialService.findMaterialById(mid); Material materialById = materialService.findMaterialById(mid);
map.put("mcode",materialById.getCode()); map.put("mcode", materialById.getCode());
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(map); List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(map);
Integer codeCountByCondition = materialService.findMaterialByBarCodeCountByCondition(map); Integer codeCountByCondition = materialService.findMaterialByBarCodeCountByCondition(map);
return new RestResponse(materialByBarCodeByCondition,codeCountByCondition , 200); return new RestResponse(materialByBarCodeByCondition, codeCountByCondition, 200);
} }
// 用于添加条形码与物料编码的对应关系 // 用于添加条形码与物料编码的对应关系
@PostMapping("/addBarCodeByMaterial") @PostMapping("/addBarCodeByMaterial")
public RestResponse addBarCodeByMaterial(@RequestBody Map<String,Object> map,HttpServletRequest request){ public RestResponse addBarCodeByMaterial(@RequestBody Map<String, Object> map, HttpServletRequest request) {
return CrudUtil.postHandle(materialService.addBarCodeByMaterial(map), 1); return CrudUtil.postHandle(materialService.addBarCodeByMaterial(map), 1);
} }
// 删除条形码与物料编码的对应关系
@PostMapping("/delBarCodeByMaterial") @PostMapping("/delBarCodeByMaterial")
public RestResponse delBarCodeByMaterial(@RequestBody Map<String,Object> map,HttpServletRequest request){ public RestResponse delBarCodeByMaterial(@RequestBody Map<String, Object> map, HttpServletRequest request) {
Integer res = 0; Integer res = 0;
if(map.containsKey("ids")){ if (map.containsKey("ids")) {
List ids = (List) map.get("ids"); List ids = (List) map.get("ids");
for (int i = 0; i < ids.size(); i++) { for (int i = 0; i < ids.size(); i++) {
map.put("id",ids.get(i)); map.put("id", ids.get(i));
res += materialService.delBarCodeByMaterial(map); res += materialService.delBarCodeByMaterial(map);
} }
return CrudUtil.deleteHandle(res, ids.size()); return CrudUtil.deleteHandle(res, ids.size());
}else if(map.containsKey("id")){ } else if (map.containsKey("id")) {
res += materialService.delBarCodeByMaterial(map); res += materialService.delBarCodeByMaterial(map);
return CrudUtil.deleteHandle(res,1); return CrudUtil.deleteHandle(res, 1);
}else{ } else {
throw new MyException("所需请求参数缺失!"); throw new MyException("所需请求参数缺失!");
} }
} }
// 用于盘点时获取物料
@PostMapping("/findMaterialForTaking")
public RestResponse findMaterialForTaking(@RequestBody Map<String, Object> map, HttpServletRequest request) {
String placeId = (String) map.get("placeId");
// 用于查询物料
Map<String, Object> param = new HashMap<>();
param.put("mname", map.get("mname"));
param.put("depositoryId", map.get("depositoryId"));
List<MaterialP> inventory = materialService.findInventory(param);
if ("0".equals(placeId)) {
// 如果是默认库位
return new RestResponse(inventory, materialService.findInventoryCount(param), 200);
} else {
// 如果不是默认库位
// 获取当前库位
Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(placeId));
if (inventory.size() > 0) {
// 如果当前名称下的物料不唯一
if (inventory.size() > 1) {
return new RestResponse(inventory);
} else {
// 获取当前物料
MaterialP materialP = inventory.get(0);
MaterialAndPlace pm = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeById), materialP.getId());
if (pm != null) {
// 如果成功获取
Map<String, Object> paramForCode = new HashMap<>();
paramForCode.put("mcode", materialP.getCode());
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramForCode);
materialP.setMaterialAndBarCodeList(materialByBarCodeByCondition);
return new RestResponse(materialP, 1, 200);
} else {
return new RestResponse("", 0, 200);
}
}
} else {
// 如果没有获取到物料
return new RestResponse(null, 0, 200);
}
}
}
/**
* 根据物料编码获取物料
*
* @param map
* @param request
* @return
*/
@PostMapping("/findMatrialByCodeForTaking")
public RestResponse findMatrialByCodeForTaking(@RequestBody Map<String, Object> map, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
// 获取当前部门仓库
Map<String, Object> param = new HashMap<>();
String code = map.get("code").toString();
String depositoryId = (String) map.get("depositoryId");
String placeId = map.get("placeId").toString();
if ("".equals(code)) {
return new RestResponse(null, 1, 200);
}
param.put("code", code);
List<MaterialAndBarCode> materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(param);
List<MaterialP> materialPByCondition = new ArrayList<>();
MaterialP mp = null;
if ("0".equals(placeId)) {
// 如果是默认库位
param.put("depositoryId", depositoryId);
materialPByCondition = materialService.findInventory(param);
} else { // 如果不是默认库位
// 获取当前库位
Place placeById = placeService.findPlaceById(ObjectFormatUtil.toInteger(placeId));
param.put("depositoryId", depositoryId);
materialPByCondition = materialService.findInventory(param);
}
if (materialPByCondition.size() > 0) {
// 如果成功获取
mp = materialPByCondition.get(0);
mp.setMaterialAndBarCodeList(materialByBarCodeByCondition);
if (!"0".equals(placeId)) {
// 如果不是获取默认库位
MaterialAndPlace placeAndMaterialByMidAndPid = placeService.findPlaceAndMaterialByMidAndPid(ObjectFormatUtil.toInteger(placeId), mp.getId());
if (placeAndMaterialByMidAndPid == null) {
// 如果当前库位没有该物料
mp = null;
}
}
}
return new RestResponse(mp, 1, 200);
}
} }

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

@ -422,6 +422,19 @@ public class PageController {
return mv; return mv;
} }
// 专用于库存盘点卡片物料树形菜单页面
@GetMapping("/selectMaterialByCardForTaking")
public ModelAndView selectMaterialByCardForTaking(@RequestParam Map<String,Object> map){
ModelAndView mv = new ModelAndView();
mv.addObject("mname",map.get("mname"));
mv.addObject("type",map.get("type"));
mv.addObject("clickObj",map.get("clickObj"));
mv.addObject("placeId",map.get("placeId"));
mv.addObject("depositoryId",map.get("depositoryId"));
mv.setViewName("pages/material/selectMaterialByCardForTaking");
return mv;
}
@GetMapping("material_view") @GetMapping("material_view")
@ -1610,11 +1623,26 @@ public class PageController {
public String scanBarCode(){ public String scanBarCode(){
return "pages/scanQrCode/ScanBarCode"; return "pages/scanQrCode/ScanBarCode";
} }
// 跳转到扫码盘点物料界面
@GetMapping("/scanMaterialCodeForTaking")
public ModelAndView scanMaterialCodeForTaking(Integer depositoryId,Integer placeId){
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/scanQrCode/ScanMaterialCodeForTaking");
mv.addObject("depositoryId",depositoryId);
mv.addObject("placeId",placeId);
return mv;
}
// 用于扫码条形码 // 用于扫码条形码
@GetMapping("/scanBarCodeByNew") @GetMapping("/scanBarCodeByNew")
public String scanBarCodeByNew(){ public String scanBarCodeByNew(){
return "pages/scanQrCode/ScanBarCodeByNew"; return "pages/scanQrCode/ScanBarCodeByNew";
} }
// 用于扫码条形码进行盘点物料
@GetMapping("/scanBarCodeForTaking")
public String scanBarCodeForTaking(){
return "pages/scanQrCode/ScanBarCodeForTaking";
}
// 跳转到扫码出库界面 // 跳转到扫码出库界面
@GetMapping("/scanQrCodeByOut") @GetMapping("/scanQrCodeByOut")
public ModelAndView scanQrCodeByOut(Integer id,HttpServletRequest request){ public ModelAndView scanQrCodeByOut(Integer id,HttpServletRequest request){
@ -1762,8 +1790,25 @@ public class PageController {
@GetMapping("/checkBarCode") @GetMapping("/checkBarCode")
public ModelAndView checkBarCode(Integer mid){ public ModelAndView checkBarCode(Integer mid){
ModelAndView mv = new ModelAndView(); ModelAndView mv = new ModelAndView();
mv.setViewName("/pages/materialBarCode/materialBarCode_out"); mv.setViewName("pages/materialBarCode/materialBarCode_out");
mv.addObject("mid",mid); mv.addObject("mid",mid);
return mv; return mv;
} }
// 跳转至库存盘点页面
@GetMapping("/stockTaking")
public ModelAndView stockTaking(HttpServletRequest request){
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/material/stockTaking");
return mv;
}
@GetMapping("/scanCodeByTaking")
public ModelAndView scanCodeByTaking(){
ModelAndView mv = new ModelAndView();
mv.setViewName("pages/scanQrCode/ScanCodeByTaking");
return mv;
}
} }

10
src/main/java/com/dreamchaser/depository_manage/entity/Material.java

@ -3,6 +3,7 @@ package com.dreamchaser.depository_manage.entity;
import lombok.Data; import lombok.Data;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.List;
/** /**
* 产品信息记录库存(material) * 产品信息记录库存(material)
@ -43,6 +44,15 @@ public class Material {
/** 单价 */ /** 单价 */
private Double price; private Double price;
/**
* 类型名称
*/
private String typeName;
/**
* 物料编码与条形码的对应关系
*/
private List<MaterialAndBarCode> materialAndBarCodeList;
/** 物料类型 */ /** 物料类型 */
private MaterialType materialType; private MaterialType materialType;

5
src/main/java/com/dreamchaser/depository_manage/pojo/MaterialP.java

@ -49,6 +49,11 @@ public class MaterialP {
*/ */
private String typeName; private String typeName;
/**
* 物料种类编码
*/
private Long typeId;
/** /**
* 物料状态 * 物料状态
*/ */

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

@ -140,11 +140,17 @@ public interface MaterialService {
Integer updateStateByParam(Map<String,Object> map); Integer updateStateByParam(Map<String,Object> map);
/** /**
* 构造树形选择框 * 构造树形选择框(部门)
* @return * @return
*/ */
List<Object> InitTreeMenus(String mname,String adminorg); List<Object> InitTreeMenus(String mname,String adminorg);
/**
* 构造树形选择框(盘点)
* @return
*/
List<Object> InitTreeMenus(String mname,String depositoryId,String placeId);
/** /**
* 构造树形选择框 * 构造树形选择框
* @return * @return

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

@ -251,6 +251,8 @@ public class MaterialServiceImpl implements MaterialService {
@Override @Override
public Material findMaterialById(int id) { public Material findMaterialById(int id) {
Material material = materialMapper.findMaterialById(id); Material material = materialMapper.findMaterialById(id);
MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getTypeId());
material.setTypeName(materialTypeByOldId.getTname());
material.setPrice(material.getPrice() / 100); material.setPrice(material.getPrice() / 100);
material.setAmounts(material.getAmounts() / 100); material.setAmounts(material.getAmounts() / 100);
return material; return material;
@ -362,7 +364,9 @@ public class MaterialServiceImpl implements MaterialService {
m.setDepositoryName(depositoryMapper.findDepositoryNameById(depositoryId)); m.setDepositoryName(depositoryMapper.findDepositoryNameById(depositoryId));
m.setWarehouseManager(depositoryMapper.findUserNameByDepositoryId(depositoryId)); m.setWarehouseManager(depositoryMapper.findUserNameByDepositoryId(depositoryId));
} }
m.setTypeName(materialTypeMapper.findMaterialTypeNameByOldId(material.getTypeId())); MaterialType materialTypeByOldId = materialTypeMapper.findMaterialTypeByOldId(material.getTypeId());
m.setTypeName(materialTypeByOldId.getTname());
m.setTypeId(materialTypeByOldId.getOldId());
result.add(m); result.add(m);
} }
return result; return result;
@ -619,7 +623,45 @@ public class MaterialServiceImpl implements MaterialService {
} }
/** /**
* 构造树形选择框 * 构造树形选择框(盘点)
* @return
*/
@Override
public List<Object> InitTreeMenus(String mname, String depositoryId, String placeId) {
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(materialTypeNoParent.size());
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType materialType = materialTypeNoParent.get(i);
Future<Object> future = completionService.submit(new TaskForTaking(materialType,mname,depositoryId,placeId));
futureList.add(future);
}
// 3.获取结果
for(int i=0;i<materialTypeNoParent.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;
}
/**
* 构造树形选择框普通
* @return * @return
*/ */
public List<Object> InitTreeMenus(String mname){ public List<Object> InitTreeMenus(String mname){
@ -654,7 +696,7 @@ public class MaterialServiceImpl implements MaterialService {
return list; return list;
} }
// 用于执行线程任务 // 用于执行线程任务(用于构造物料树形)
class Task implements Callable<Object>{ class Task implements Callable<Object>{
MaterialType mt; MaterialType mt;
@ -680,6 +722,33 @@ public class MaterialServiceImpl implements MaterialService {
} }
} }
class TaskForTaking implements Callable<Object>{
MaterialType mt;
String mname;
String placeId;
String depositoryId;
public TaskForTaking(MaterialType mt,String mname,String depositoryId,String placeId){
this.mt = mt;
this.mname = mname;
this.placeId = placeId;
this.depositoryId = depositoryId;
}
@Override
public Object call() throws Exception {
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId(), mname, depositoryId,placeId);
Map<String, Object> stringObjectMap = new HashMap<>();
if (childForMaterialTypeByParent != null) {
stringObjectMap = InitTreeMenus(mt, childForMaterialTypeByParent);
} else {
List<Object> materialByType = AddMaterialByType(mt, mname, depositoryId,placeId);
stringObjectMap = InitTreeMenus(mt, materialByType);
}
return stringObjectMap;
}
}
// 构造树形组件数据模板 // 构造树形组件数据模板
public Map<String,Object> InitTreeMenus(MaterialType mt,List<Object> children){ public Map<String,Object> InitTreeMenus(MaterialType mt,List<Object> children){
if(mt != null) { if(mt != null) {
@ -762,6 +831,64 @@ public class MaterialServiceImpl implements MaterialService {
} }
} }
// 在类别后添加物料名称
public List<Object> AddMaterialByType(MaterialType mt,String mname,String depositoryId,String placeId){
if(mt != null) {
Map<String, Object> param = new HashMap<>();
param.put("materialTypeId", mt.getOldId());
List<Material> materialPByCondition = new ArrayList<>();
List<Integer> dids = new ArrayList<>();
if("0".equals(placeId)){
// 如果要盘点的位置是默认库位
dids.add(ObjectFormatUtil.toInteger(depositoryId));
param.put("list",dids);
// 获取当前类别下的物料
materialPByCondition = materialMapper.findMaterialByDepositorysAndType(param);
}else{
// 如果要盘点的位置是某个库位
Integer pid = ObjectFormatUtil.toInteger(placeId);
Place placeById = placeService.findPlaceById(pid);
// 获取当前仓库下的所有物料库存
dids.add(placeById.getDid());
param.put("list",dids);
materialPByCondition = materialMapper.findMaterialByDepositorysAndType(param);
}
List<Object> result = new ArrayList<>();
if("".equals(mname)) { // 如果没有输入名称
for (Material material : materialPByCondition) {
Map<String, Object> 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);
}
}else{
for (Material material : materialPByCondition) {
Map<String, Object> map = new HashMap<>();
if(material.getMname().contains(mname)) {
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;
}
else {
return null;
}
}
// 判断是否有子类 // 判断是否有子类
public boolean isChildForMaterialType(Integer id){ public boolean isChildForMaterialType(Integer id){
boolean flag = false; boolean flag = false;
@ -802,4 +929,34 @@ public class MaterialServiceImpl implements MaterialService {
return null; return null;
} }
} }
// 根据类别id获取子类(盘点专用)
public List<Object> findChildForMaterialTypeByParent(Long id,String mname,String depositoryId,String placeId){
Map<String,Object> param = new HashMap<>();
List<Object> result = new ArrayList<>();
param.put("parentId",id);
// 获取当前父类的子类
List<MaterialType> materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(param);
if(materialTypeByCondition.size() > 0){
// 如果当前类别有子类
for (MaterialType mt : materialTypeByCondition) {
// 递归直至到最底层子类
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId(),mname,depositoryId,placeId);
Map<String, Object> stringObjectMap = null;
if(childForMaterialTypeByParent == null) {
// 如果当前类别没有子类
List<Object> list = AddMaterialByType(mt,mname,depositoryId,placeId); // 添加当前类别下的物料
stringObjectMap = InitTreeMenus(mt, list);
}else{
stringObjectMap = InitTreeMenus(mt, childForMaterialTypeByParent);
}
result.add(stringObjectMap);
}
return result;
}else{
// 没有则返回空
return null;
}
}
} }

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

@ -30,6 +30,7 @@
} }
.layui-form-select{ .layui-form-select{
width: 100%; width: 100%;
border-style: none;
} }
</style> </style>
@ -231,7 +232,6 @@
data = data.field; data = data.field;
data.type = 1; data.type = 1;
data.params = params; data.params = params;
console.log(data)
$.ajax({ $.ajax({
url: "/depositoryRecord/applicationIn", url: "/depositoryRecord/applicationIn",
type: 'post', type: 'post',
@ -484,8 +484,10 @@
var parent = obj.parentNode.parentNode.parentNode.parentNode; var parent = obj.parentNode.parentNode.parentNode.parentNode;
var parentId = parent.id; var parentId = parent.id;
var codeChildren = parent.childNodes[7]; var codeChildren = parent.childNodes[7];
var priceChildren = parent.childNodes[9]; var priceChildren = parent.childNodes[11];
var materialChildren = parent.childNodes[5]; var materialChildren = parent.childNodes[5];
// 条形码
var barCodeChildren = parent.childNodes[9];
var codeItem = codeChildren.childNodes[3].childNodes[1]; var codeItem = codeChildren.childNodes[3].childNodes[1];
var codeValue = codeItem.childNodes[1]; var codeValue = codeItem.childNodes[1];
var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes;
@ -495,6 +497,9 @@
// 单价条目 // 单价条目
var priceItem = priceChildren.childNodes[3].childNodes; var priceItem = priceChildren.childNodes[3].childNodes;
var priceValue = priceItem[1]; var priceValue = priceItem[1];
// 条形码条码
var barCodeItem = barCodeChildren.childNodes[3];
layer.open({ layer.open({
type: 2, type: 2,
title: '弹窗内容', title: '弹窗内容',
@ -520,6 +525,26 @@
} }
codeValue.value = code; codeValue.value = code;
priceValue.value = material.price; priceValue.value = material.price;
var materialAndBarCodeList = material["materialAndBarCodeList"];
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 = `
<select id=`+"barCode"+idNumber+` name=`+"barCode"+idNumber+ `>
</select>`;
$("#"+barCodeImg.id).before(barCodeSelect);
form.render();
$.each(materialAndBarCodeList, function (index, item) {
$("#barCode"+idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
}
} }
}); });

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

@ -506,7 +506,6 @@
//用于实现物料名称搜索 //用于实现物料名称搜索
selectMaterialByName = function (obj) { selectMaterialByName = function (obj) {
// 输入code
var data = obj.value; var data = obj.value;
// 获取对应元素 // 获取对应元素
var parent = obj.parentNode.parentNode.parentNode.parentNode; var parent = obj.parentNode.parentNode.parentNode.parentNode;

75
src/main/resources/templates/pages/material/selectMaterialByCardForTaking.html

@ -0,0 +1,75 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<input id="mname" name="mname" th:value="${mname}" style="display: none">
<input id="type" name="type" th:value="${type}" style="display: none">
<input id="clickObj" name="clickObj" th:value="${clickObj}" style="display: none">
<input id="placeId" name="clickObj" th:value="${placeId}" style="display: none">
<input id="depositoryId" name="clickObj" th:value="${depositoryId}" style="display: none">
<div id="test2" class="demo-tree"></div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
var data;
layui.use(['form', 'layer', 'dropdown', 'tree'], function () {
var $ = layui.jquery,
tree = layui.tree;
var mname = $("#mname").val();
var type = $("#type").val();
var clickObj = $("#clickObj").val();
var depositoryId = $("#depositoryId").val();
var placeId = $("#placeId").val();
var req = {};
req.mname = mname;
req.type = type;
req.depositoryId = depositoryId;
req.placeId = placeId;
test = tree.render({
elem: '#test2'
, data: []
, click: function (obj) {
if (obj.data.children !== undefined) {
return false
}
var windowParent = $("#"+clickObj,window.parent.document)[0];
console.log(windowParent)
var children = windowParent.childNodes[5];
var materialItem = children.childNodes[3].childNodes[1].childNodes;
var materialName = materialItem[1];
var materialId = materialName.parentNode.parentNode.childNodes[3];
materialName.value = obj.data.title;
materialId.value = obj.data.id;
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
});
$.ajax({
url: "/material/treeMenus",
data: JSON.stringify(req),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
beforeSend:function () {
this.layerIndex = layer.load(0, { shade: [0.5, '#393D49'] });
},
success: function (d) {
layer.close(this.layerIndex);
var data2 = d.data;
test.reload({
data: data2
});
}
});
})
</script>
</body>
</html>

100
src/main/resources/templates/pages/scanQrCode/ScanCodeByTaking.html

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>扫码</title>
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/layuimini.css?v=2.0.4.2" media="all">
<link rel="stylesheet" href="/static/css/themes/default.css" media="all">
<link rel="stylesheet" href="/static/lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
<!--[if lt IE 9]>
<script src="/static/js/html5.min.js"></script>
<script src="/static/js/respond.min.js"></script>
<![endif]-->
<!-- vue相关-->
<script src="../static/js/vue/vue.js"></script>
<script src="../static/js/vue/vue-router.js"></script>
<script src="../static/lib/http-vue-loader/src/httpVueLoader.js"></script>
<script src="../static/js/VueQrcodeReader.umd.min.js"></script>
<script src="/static/js/scanBarCode/html5-qrcode.min.js"></script>
</head>
<body>
<div style="width: 500px" id="reader">
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 条形码
let barCode;
var depository;
var place;
// 是否扫描二维码标志位
var flag = false;
const html5QrCode = new Html5Qrcode("reader");
const qrCodeSuccessCallback = (decodedText, decodedResult) => {
/* 扫描成功 */
var formatName = decodedResult.result.format.formatName;
html5QrCode.stop().then((ignore) => {
// 暂停扫描
if (formatName.includes("QR_CODE")||formatName.includes("AZTEC")) {
// 如果扫描的位本地二维码
flag = true;
// 先解密
let jmResult = {};
jmResult.result = decodedText;
layui.$.ajax({
url: "/material/decode3Des",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(jmResult),
success:function (d) {
let parse = JSON.parse(d.data);
if (parse.did !== undefined) {
// 如果扫描的是仓库二维码
depository = parse;
layui.$("#openSonByDepository",window.parent.document).val(depository.dname);
layui.$("#depositoryId",window.parent.document).val(depository.did);
layui.$("#placeId",window.parent.document).val(0);
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
else if (parse.pid !== undefined) {
// 如果扫描的是库位二维码
place = parse;
layui.$("#openSonByDepository",window.parent.document).val(place.dname +"-"+ place.code);
layui.$("#depositoryId",window.parent.document).val(place.depositoryId);
layui.$("#placeId",window.parent.document).val(place.pid);
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
else{
layer.msg("请扫描正确的二维码",{
icon:0,
time:500
},function () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
});
}
}
})
}else{
console.log("条形码",decodedText);
// 如果是条形码
}
}).catch((err) => {
console.log(err)
// 停止失败,处理它。
});
};
const config = { fps: 10, qrbox: { width: 250, height: 250 } };
// Select back camera or fail with `OverconstrainedError`.
html5QrCode.start({ facingMode: { exact: "environment"} }, config, qrCodeSuccessCallback);
</script>
</body>
</html>

202
src/main/resources/templates/pages/scanQrCode/ScanMaterialCodeForTaking.html

@ -0,0 +1,202 @@
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>扫码</title>
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/layuimini.css?v=2.0.4.2" media="all">
<link rel="stylesheet" href="/static/css/themes/default.css" media="all">
<link rel="stylesheet" href="/static/lib/font-awesome-4.7.0/css/font-awesome.min.css" media="all">
<!--[if lt IE 9]>
<script src="/static/js/html5.min.js"></script>
<script src="/static/js/respond.min.js"></script>
<![endif]-->
<!-- vue相关-->
<script src="../static/js/vue/vue.js"></script>
<script src="../static/js/vue/vue-router.js"></script>
<script src="../static/lib/http-vue-loader/src/httpVueLoader.js"></script>
<script src="../static/js/VueQrcodeReader.umd.min.js"></script>
<style>
.validation-success,
.validation-failure,
.validation-pending {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, .8);
text-align: center;
font-weight: bold;
font-size: 1.4rem;
padding: 10px;
display: flex;
flex-flow: column nowrap;
justify-content: center;
}
.validation-success {
color: green;
}
.validation-failure {
color: red;
}
</style>
</head>
<body>
<input type="text" id="depositoryId" th:value="${depositoryId}" style="display: none">
<input type="text" id="placeId" th:value="${placeId}" style="display: none">
<div id="app">
<qrcode-stream :camera="camera" @decode="onDecode" @init="onInit" :track="paintBoundingBox">
<div v-if="validationPending" class="validation-pending">
Long validation in progress...
</div>
</qrcode-stream>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
Vue.use(httpVueLoader);
var depositoryId = layui.$("#depositoryId").val();
var placeId = layui.$("#placeId").val();
var vue = new Vue({
data() {
return {
isValid: undefined,
camera: 'auto',
result: '',
error: '',
materialList: []
}
},
computed: {
validationPending() {
return this.isValid === undefined
&& this.camera === 'off'
},
},
methods: {
onDecode(result) {
let params = {}; // 用于暂存扫描结果
this.result = result;
let jmResult = {};
jmResult.result = result;
layui.$.ajax({
url: "/material/decode3Des",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(jmResult),
success:function (d) {
let parse = JSON.parse(d.data);
vue.turnCameraOff(); // 暂停扫描
if (parse.did !== undefined) {
// 如果扫描的是仓库二维码
layer.msg("请扫描物料!",{
icon:0,
time:500
},function () {
vue.turnCameraOn(); // 继续扫描
})
}
else if (parse.pid !== undefined) {
// 如果扫描的是库位二维码
layer.msg("请扫描物料!",{
icon:0,
time:500
},function () {
vue.turnCameraOn(); // 继续扫描
})
}
else if (parse.mid !== undefined) {
// 如果扫描的是物料二维码
vue.materialList.push(parse);
layer.confirm("是否继续扫描",
{
btn: ["继续", "取消"]
},
function () { // 继续扫描物料
vue.turnCameraOn(); // 继续扫描
layer.close(layer.index); // 关闭弹窗
},
function () {
// 不扫描物料
params.materialList = vue.materialList;
vue.temporaryScanValue(params); // 将物料暂存
// 关闭当前页
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
)
}
}
});
},
async onInit(promise) {
try {
await promise.then(this.resetValidationState)
} catch (error) {
if (error.name === 'NotAllowedError') {
this.error = "ERROR: you need to grant camera access permission"
} else if (error.name === 'NotFoundError') {
this.error = "ERROR: no camera on this device"
} else if (error.name === 'NotSupportedError') {
this.error = "ERROR: secure context required (HTTPS, localhost)"
} else if (error.name === 'NotReadableError') {
this.error = "ERROR: is the camera already in use?"
} else if (error.name === 'OverconstrainedError') {
this.error = "ERROR: installed cameras are not suitable"
} else if (error.name === 'StreamApiNotSupportedError') {
this.error = "ERROR: Stream API is not supported in this browser"
} else if (error.name === 'InsecureContextError') {
this.error = 'ERROR: Camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP.';
} else {
this.error = `ERROR: Camera error (${error.name})`
}
console.log(this.error)
}
}
,
resetValidationState() {
this.isValid = undefined
}
,
// 绘制二维码跟踪框
paintBoundingBox(detectedCodes, ctx) {
for (const detectedCode of detectedCodes) {
const {boundingBox: {x, y, width, height}} = detectedCode;
ctx.lineWidth = 2;
ctx.strokeStyle = '#007bff';
ctx.strokeRect(x, y, width, height)
}
}
,
// 打开相机
turnCameraOn() {
this.camera = 'auto'
}
,
// 关闭相机
turnCameraOff() {
this.camera = 'off'
},
// 将扫描到的数据暂存到redis
temporaryScanValue(params) {
layui.$.ajax({
url: "/material/temporaryValue",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(params)
});
}
}
}).$mount('#app')
</script>
</body>
</html>

29
target/classes/templates/pages/application/application-in.html

@ -30,6 +30,7 @@
} }
.layui-form-select{ .layui-form-select{
width: 100%; width: 100%;
border-style: none;
} }
</style> </style>
@ -231,7 +232,6 @@
data = data.field; data = data.field;
data.type = 1; data.type = 1;
data.params = params; data.params = params;
console.log(data)
$.ajax({ $.ajax({
url: "/depositoryRecord/applicationIn", url: "/depositoryRecord/applicationIn",
type: 'post', type: 'post',
@ -484,8 +484,10 @@
var parent = obj.parentNode.parentNode.parentNode.parentNode; var parent = obj.parentNode.parentNode.parentNode.parentNode;
var parentId = parent.id; var parentId = parent.id;
var codeChildren = parent.childNodes[7]; var codeChildren = parent.childNodes[7];
var priceChildren = parent.childNodes[9]; var priceChildren = parent.childNodes[11];
var materialChildren = parent.childNodes[5]; var materialChildren = parent.childNodes[5];
// 条形码
var barCodeChildren = parent.childNodes[9];
var codeItem = codeChildren.childNodes[3].childNodes[1]; var codeItem = codeChildren.childNodes[3].childNodes[1];
var codeValue = codeItem.childNodes[1]; var codeValue = codeItem.childNodes[1];
var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes;
@ -495,6 +497,9 @@
// 单价条目 // 单价条目
var priceItem = priceChildren.childNodes[3].childNodes; var priceItem = priceChildren.childNodes[3].childNodes;
var priceValue = priceItem[1]; var priceValue = priceItem[1];
// 条形码条码
var barCodeItem = barCodeChildren.childNodes[3];
layer.open({ layer.open({
type: 2, type: 2,
title: '弹窗内容', title: '弹窗内容',
@ -520,6 +525,26 @@
} }
codeValue.value = code; codeValue.value = code;
priceValue.value = material.price; priceValue.value = material.price;
var materialAndBarCodeList = material["materialAndBarCodeList"];
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 = `
<select id=`+"barCode"+idNumber+` name=`+"barCode"+idNumber+ `>
</select>`;
$("#"+barCodeImg.id).before(barCodeSelect);
form.render();
$.each(materialAndBarCodeList, function (index, item) {
$("#barCode"+idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
}
} }
}); });

1
target/classes/templates/pages/application/application-out.html

@ -506,7 +506,6 @@
//用于实现物料名称搜索 //用于实现物料名称搜索
selectMaterialByName = function (obj) { selectMaterialByName = function (obj) {
// 输入code
var data = obj.value; var data = obj.value;
// 获取对应元素 // 获取对应元素
var parent = obj.parentNode.parentNode.parentNode.parentNode; var parent = obj.parentNode.parentNode.parentNode.parentNode;

Loading…
Cancel
Save