From b1a0aa8471470ab263916396f133279d0295adfa Mon Sep 17 00:00:00 2001 From: erdanergou Date: Sun, 25 Sep 2022 16:59:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=93=E4=BD=8D=E5=A2=9E=E5=88=A0=E6=94=B9?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 19 + .../depository_manage/config/PortConfig.java | 3 + .../config/RedissionConfig.java | 20 + .../controller/DepositoryController.java | 34 +- .../DepositoryRecordController.java | 9 +- .../controller/ExcelController.java | 30 +- .../controller/MaterialController.java | 28 +- .../controller/MaterialTypeController.java | 24 +- .../controller/PageController.java | 58 +- .../controller/PlaceController.java | 154 ++++++ .../controller/UserController.java | 33 -- .../ExcelDepositoryInfoConverter.java | 9 +- .../converter/ExcelMTParentIdConverter.java | 40 ++ .../converter/ExcelMaterialCodeConverter.java | 59 +++ .../ExcelMaterialTypeInfoConverter.java | 2 +- .../converter/ExcelStateInfoConverter.java | 4 +- .../converter/ExcelValid.java | 53 ++ .../entity/ApplicationOutRecord.java | 2 +- .../depository_manage/entity/ExcelInfo.java | 38 +- .../entity/ExcelInfoByInventory.java | 50 ++ .../entity/ExcelInfoByMT.java | 36 ++ .../depository_manage/entity/Material.java | 8 +- .../depository_manage/entity/Place.java | 57 ++ .../entity/StandingBook.java | 10 +- .../entity/materialOnly.java | 35 ++ .../listener/ExcelListener.java | 4 +- .../mapper/DepositoryMapper.java | 7 + .../mapper/DepositoryMapper.xml | 23 +- .../mapper/DepositoryRecordMapper.java | 6 +- .../mapper/DepositoryRecordMapper.xml | 6 +- .../mapper/MaterialMapper.java | 6 +- .../mapper/MaterialMapper.xml | 38 +- .../mapper/MaterialTypeMapper.java | 34 +- .../depository_manage/mapper/PlaceMapper.java | 88 ++++ .../depository_manage/mapper/PlaceMapper.xml | 204 ++++++++ .../pojo/ApplicationModel.java | 13 +- .../pojo/ApplicationOutRecordP.java | 6 +- .../depository_manage/pojo/MaterialOnlyP.java | 30 ++ .../depository_manage/pojo/MaterialP.java | 10 +- .../depository_manage/pojo/PlaceP.java | 105 ++++ .../depository_manage/pojo/RestResponse.java | 20 + .../service/DepositoryRecordService.java | 16 +- .../service/ExcelService.java | 23 +- .../service/MaterialService.java | 13 +- .../service/MaterialTypeService.java | 16 +- .../service/PlaceService.java | 87 +++ .../impl/DepositoryRecordServiceImpl.java | 87 +-- .../service/impl/DepositoryServiceImpl.java | 18 +- .../service/impl/ExcelServiceImpl.java | 173 +++++- .../service/impl/MaterialServiceImpl.java | 81 ++- .../service/impl/MaterialTypeServiceImpl.java | 14 +- .../service/impl/PlaceServiceImpl.java | 136 +++++ .../utils/CreateQrCodeUtil.java | 6 +- .../depository_manage/utils/ExcelInValid.java | 44 ++ src/main/resources/application-test.yml | 23 +- src/main/resources/redisson-config.yml | 26 + src/main/resources/static/api/init.json | 12 +- .../resources/static/api/init_checker.json | 12 +- .../resources/static/api/init_reviewer.json | 12 +- src/main/resources/static/api/test.json | 12 +- src/main/resources/static/images/sousuo.png | Bin 0 -> 6257 bytes src/main/resources/templates/index.html | 4 +- .../pages/application/application-in.html | 117 +++-- .../application/application-in_back.html | 36 +- .../pages/application/application-out.html | 94 ++-- .../application/application-out_back.html | 25 +- .../pages/application/application-review.html | 2 +- .../application/application-transfer.html | 115 ++-- .../application-transfer_back.html | 10 +- .../application/application_in_multi.html | 13 +- .../pages/application/application_multi.html | 5 +- .../pages/application/form-step-look.html | 2 +- .../application/form-step-look_back.html | 16 +- .../templates/pages/chart/chart-in.html | 8 +- .../templates/pages/chart/chart-in_back.html | 8 +- .../templates/pages/chart/chart-out.html | 8 +- .../templates/pages/chart/chart-out_back.html | 8 +- .../templates/pages/chart/chart-stock.html | 8 +- .../templates/pages/depository/table-in.html | 12 +- .../templates/pages/depository/table-out.html | 10 +- .../pages/depository/table-stock.html | 64 ++- .../pages/material/material-add.html | 52 +- .../pages/material/material-add_back.html | 210 ++++++++ .../pages/material/material-out.html | 98 ++-- .../pages/material/material-out_back.html | 494 ++++++++++++++++++ .../pages/material/material-view.html | 61 +-- .../material/selectDepositoryByCard.html | 21 +- .../pages/material/selectMaterialByCard.html | 8 +- .../materialtype/materialTypeByParentId.html | 2 +- .../pages/materialtype/materialType_add.html | 14 +- .../pages/materialtype/materialType_edit.html | 2 +- .../pages/materialtype/materialType_view.html | 54 +- .../templates/pages/other/welcome.html | 2 +- .../templates/pages/place/place_add.html | 140 +++++ .../templates/pages/place/place_edit.html | 131 +++++ .../templates/pages/post/postRole_add.html | 4 +- .../templates/pages/post/postRole_edit.html | 4 +- .../templates/pages/user/user-add.html | 4 +- .../templates/pages/user/user-email.html | 2 +- .../templates/pages/user/user-role-edit.html | 4 +- .../pages/warehouse/depository-out.html | 4 +- .../pages/warehouse/depository_add.html | 8 +- .../pages/warehouse/warehouseByParentId.html | 127 +++-- .../pages/warehouse/warehouse_view.html | 2 +- .../dreamchaser/depository_manage/Test.java | 3 + target/classes/application-test.yml | 23 +- .../mapper/DepositoryMapper.xml | 23 +- .../mapper/DepositoryRecordMapper.xml | 6 +- .../mapper/MaterialMapper.xml | 38 +- .../depository_manage/mapper/PlaceMapper.xml | 204 ++++++++ target/classes/redisson-config.yml | 26 + target/classes/static/api/init.json | 12 +- target/classes/static/api/init_checker.json | 12 +- target/classes/static/api/init_reviewer.json | 12 +- target/classes/static/api/test.json | 12 +- target/classes/static/images/sousuo.png | Bin 0 -> 6257 bytes target/classes/templates/index.html | 4 +- .../pages/application/application-in.html | 117 +++-- .../application/application-in_back.html | 36 +- .../pages/application/application-out.html | 94 ++-- .../application/application-out_back.html | 25 +- .../pages/application/application-review.html | 2 +- .../application/application-transfer.html | 115 ++-- .../application-transfer_back.html | 10 +- .../application/application_in_multi.html | 13 +- .../pages/application/application_multi.html | 5 +- .../pages/application/form-step-look.html | 2 +- .../application/form-step-look_back.html | 16 +- .../templates/pages/chart/chart-in.html | 8 +- .../templates/pages/chart/chart-in_back.html | 8 +- .../templates/pages/chart/chart-out.html | 8 +- .../templates/pages/chart/chart-out_back.html | 8 +- .../templates/pages/chart/chart-stock.html | 8 +- .../templates/pages/depository/table-in.html | 12 +- .../templates/pages/depository/table-out.html | 10 +- .../pages/depository/table-stock.html | 64 ++- .../pages/material/material-add.html | 52 +- .../pages/material/material-add_back.html | 210 ++++++++ .../pages/material/material-out.html | 98 ++-- .../pages/material/material-out_back.html | 494 ++++++++++++++++++ .../pages/material/material-view.html | 61 +-- .../material/selectDepositoryByCard.html | 21 +- .../pages/material/selectMaterialByCard.html | 8 +- .../materialtype/materialTypeByParentId.html | 2 +- .../pages/materialtype/materialType_add.html | 14 +- .../pages/materialtype/materialType_edit.html | 2 +- .../pages/materialtype/materialType_view.html | 54 +- .../templates/pages/other/welcome.html | 2 +- .../templates/pages/place/place_add.html | 140 +++++ .../templates/pages/place/place_edit.html | 131 +++++ .../templates/pages/post/postRole_add.html | 4 +- .../templates/pages/post/postRole_edit.html | 4 +- .../templates/pages/user/user-add.html | 4 +- .../templates/pages/user/user-email.html | 2 +- .../templates/pages/user/user-role-edit.html | 4 +- .../pages/warehouse/depository-out.html | 4 +- .../pages/warehouse/depository_add.html | 8 +- .../pages/warehouse/warehouseByParentId.html | 127 +++-- .../pages/warehouse/warehouse_view.html | 2 +- target/idm.crx | Bin 0 -> 96156 bytes 160 files changed, 5516 insertions(+), 1107 deletions(-) create mode 100644 src/main/java/com/dreamchaser/depository_manage/config/RedissionConfig.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/converter/ExcelMTParentIdConverter.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialCodeConverter.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/converter/ExcelValid.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByInventory.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMT.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/Place.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/materialOnly.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/MaterialOnlyP.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/pojo/PlaceP.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java create mode 100644 src/main/java/com/dreamchaser/depository_manage/utils/ExcelInValid.java create mode 100644 src/main/resources/redisson-config.yml create mode 100644 src/main/resources/static/images/sousuo.png create mode 100644 src/main/resources/templates/pages/material/material-add_back.html create mode 100644 src/main/resources/templates/pages/material/material-out_back.html create mode 100644 src/main/resources/templates/pages/place/place_add.html create mode 100644 src/main/resources/templates/pages/place/place_edit.html create mode 100644 target/classes/com/dreamchaser/depository_manage/mapper/PlaceMapper.xml create mode 100644 target/classes/redisson-config.yml create mode 100644 target/classes/static/images/sousuo.png create mode 100644 target/classes/templates/pages/material/material-add_back.html create mode 100644 target/classes/templates/pages/material/material-out_back.html create mode 100644 target/classes/templates/pages/place/place_add.html create mode 100644 target/classes/templates/pages/place/place_edit.html create mode 100644 target/idm.crx diff --git a/pom.xml b/pom.xml index 59393199..bf866382 100644 --- a/pom.xml +++ b/pom.xml @@ -175,6 +175,25 @@ 2.6.0 + + + org.redisson + redisson + 3.8.2 + true + + + org.redisson + redisson-spring-boot-starter + 3.8.2 + + + + + com.google.zxing + javase + 3.4.0 + diff --git a/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java index a9b96789..b4d396e4 100644 --- a/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java +++ b/src/main/java/com/dreamchaser/depository_manage/config/PortConfig.java @@ -2,6 +2,9 @@ package com.dreamchaser.depository_manage.config; import lombok.Data; +/** + * 用于 + */ @Data public class PortConfig { // 接口地址 diff --git a/src/main/java/com/dreamchaser/depository_manage/config/RedissionConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/RedissionConfig.java new file mode 100644 index 00000000..333cd206 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/config/RedissionConfig.java @@ -0,0 +1,20 @@ +package com.dreamchaser.depository_manage.config; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; + +@Configuration +public class RedissionConfig { + + @Bean + public RedissonClient redisson() throws IOException { + // 本例子使用的是yaml格式的配置文件,读取使用Config.fromYAML,如果是Json文件,则使用Config.fromJSON + Config config = Config.fromYAML(RedissionConfig.class.getClassLoader().getResource("redisson-config.yml")); + return Redisson.create(config); + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java index 1ab66324..36e043e0 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java @@ -275,10 +275,10 @@ public class DepositoryController { parmOut.put("depository_id",depositoryAll.get(j).getId()); parmOut.put("start", months.get(num + 1)); parmOut.put("end", months.get(num)); - // 获取月份中入库材料的总额 + // 获取月份中入库物料的总额 // 测试 Double wareHouseInCountByMonth1 = depositoryRecordService.findMaterialCountByMonth1(parmIn); - // 获取月份中出库材料的总额 + // 获取月份中出库物料的总额 // 测试 Double wareHouseOutCountByMonth1 = depositoryRecordService.findMaterialCountByMonth1(parmOut); // 获取当前月库存容量 @@ -351,10 +351,10 @@ public class DepositoryController { parmOut.put("start", months.get(j + 1)); parmOut.put("end", months.get(j)); parmOut.put("dname", depositoryAll.get(i).getDname()); - // 获取某个月某材料入库总额 + // 获取某个月某物料入库总额 // 测试 Double wareHouseInCountByMonth1 = depositoryRecordService.findMaterialCountByMonth1(parmIn); - // 获取某个月某材料出库总额 + // 获取某个月某物料出库总额 // 测试 Double wareHouseOutCountByMonth1 = depositoryRecordService.findMaterialCountByMonth1(parmOut); Double wareHouseCount1 = (Double) productData.get(k++) - wareHouseInCountByMonth1 + wareHouseOutCountByMonth1; @@ -392,30 +392,28 @@ public class DepositoryController { /** * 根据父级编号获取所有仓库 - * @param parentId + * @param map * @return */ @GetMapping("/allWarehouseByParent") - public RestResponse findDepositoryByNoParent(@RequestParam(value = "parentId",required = false) String parentId){ - Map param = new HashMap<>(); - if (parentId == null) { - parentId = "0"; + public RestResponse findDepositoryByNoParent(@RequestParam Map map){ + if ("".equals(map.get("parentId")) || map.get("parentId") == null) { + map.put("parentId",0); } - param.put("parentId",parentId); - List list = depositoryService.findDepositoryRecordPByCondition(param); + List list = depositoryService.findDepositoryRecordPByCondition(map); + // 获取所有行政单位 Map administration = findAdministration(); List administrationPList = (List) administration.get("administrationPList"); Integer total = (Integer) administration.get("total"); for (int i = 0; i < list.size(); i++) { for (int j = 0; j < administrationPList.size(); j++) { - if(list.get(i).getCid().compareTo(administrationPList.get(j).getId()) == 0){ list.get(i).setCname(administrationPList.get(j).getName()); break; } } } - return new RestResponse(list,total,200); + return new RestResponse(list,depositoryService.findCountByCondition(map),200); } @@ -638,7 +636,7 @@ public class DepositoryController { } /** - * 修改当前仓库下的材料状态 + * 修改当前仓库下的物料状态 * @param parentId * @param state */ @@ -799,7 +797,7 @@ public class DepositoryController { parm.put("start", months.get(num + 1)); parm.put("end", months.get(num)); parm.put("tname", materialTypeAll.get(j).getTname()); - //根据条件获取月份中材料的总额 + //根据条件获取月份中物料的总额 Double materialCountByMonth = depositoryRecordService.findMaterialCountByMonth(parm); // 测试 Double materialCountByMonth1 = depositoryRecordService.findMaterialCountByMonth1(parm); @@ -842,7 +840,7 @@ public class DepositoryController { parm.put("start", months1.get(j)); parm.put("end", months1.get(j - 1)); parm.put("tname", materialTypeAll.get(i).getTname()); - //根据条件获取月份中材料的总额 + //根据条件获取月份中物料的总额 // 测试 Double materialCountByMonth1 = depositoryRecordService.findMaterialCountByMonth1(parm); productData.add(materialCountByMonth1); @@ -880,7 +878,7 @@ public class DepositoryController { } /** - * 根据材料编号查询所在仓库 + * 根据物料编号查询所在仓库 * @param mid * @return */ @@ -894,7 +892,7 @@ public class DepositoryController { } /** - * 根据材料名称查询所在仓库 + * 根据物料名称查询所在仓库 * @param mname * @return */ diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java index b9097a2a..db7c65a5 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java @@ -201,7 +201,7 @@ public class DepositoryRecordController { } /** - * 将选中的材料暂存到redis中 + * 将选中的物料暂存到redis中 * @param map * @param request * @return @@ -227,7 +227,7 @@ public class DepositoryRecordController { } /** - * 将选中的材料从redis中删除 + * 将选中的物料从redis中删除 * @param map * @param request * @return @@ -353,6 +353,7 @@ public class DepositoryRecordController { ap.setVersion(materialById.getVersion()); ap.setMname(materialById.getMname()); ap.setCode(materialById.getCode()); + ap.setPrice(materialById.getPrice()); ap.setApplicant(userToken.getId()); ap.setQuantity(1.0); list.add(ap); @@ -371,6 +372,7 @@ public class DepositoryRecordController { UserByPort userToken= (UserByPort) request.getAttribute("userToken"); Integer quantity = ObjectFormatUtil.toInteger(map.get("quantity")); map.put("quantity",quantity.toString()); + map.put("price",map.get("price").toString()); map.put("applicantId",userToken.getId()); String type = (String) map.get("type"); Integer success = 0; @@ -402,10 +404,12 @@ public class DepositoryRecordController { List depositoryIds = (List) map.get("depositoryIds"); List quantitys = (List) map.get("quantitys"); List applyRemarks = (List) map.get("applyRemarks"); + List prices = (List) map.get("prices"); if("in".equals(type)){ for (int i = 0; i < mids.size(); i++) { Integer mid = mids.get(i); Integer depositoryId = depositoryIds.get(i); + String price = prices.get(i).toString(); Integer integer = ObjectFormatUtil.toInteger(quantitys.get(i)); String quantity = integer.toString(); String applyRemark = applyRemarks.get(i); @@ -414,6 +418,7 @@ public class DepositoryRecordController { inRecord.put("mid",mid); inRecord.put("depositoryId",depositoryId); inRecord.put("quantity",quantity); + inRecord.put("price",price); inRecord.put("applyRemark",applyRemark); success += depositoryRecordService.applicationIn(inRecord); } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java b/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java index 7c8b8911..74cac204 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/ExcelController.java @@ -18,8 +18,32 @@ public class ExcelController { @Autowired ExcelService excelService; - @PostMapping("/importExcel") - public ResultVo importExcel(@RequestParam("file") MultipartFile excel) { - return excelService.importExcel(excel); + /** + * 用于物料的导入 + * @param excel + * @return + */ + @PostMapping("/importExcelByMaterial") + public ResultVo importExcelByMaterial(@RequestParam("file") MultipartFile excel) { + return excelService.importExcelMaterial(excel,"material"); + } + + /** + * 用于物料类型的导入 + * @param excel + * @return + */ + @PostMapping("/importExcelByMT") + public ResultVo importExcelByMT(@RequestParam("file") MultipartFile excel){ + return excelService.importExcelMaterialType(excel); + } + + + /** + * 用于库存信息的导入 + */ + @PostMapping("/importInventory") + public ResultVo importInventory(@RequestParam("file") MultipartFile excel){ + return excelService.importExcelInventory(excel); } } 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 bafdfa77..7369de21 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java @@ -8,6 +8,7 @@ import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.pojo.MaterialP; import com.dreamchaser.depository_manage.pojo.RestResponse; import com.dreamchaser.depository_manage.pojo.RoleAndDepository; +import com.dreamchaser.depository_manage.pojo.StatusInfo; import com.dreamchaser.depository_manage.security.bean.UserToken; import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.MaterialService; @@ -19,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.io.IOException; import java.util.*; /** @@ -38,7 +40,7 @@ public class MaterialController { DepositoryService depositoryService; /** - * 根据材料进行查询 + * 根据物料进行查询 * @param map * @return */ @@ -61,11 +63,11 @@ public class MaterialController { } } } - return new RestResponse(list,materialService.findCountByCondition(map),200); + return new RestResponse(list,list.size(),200); } /** - * 添加一条材料记录 + * 添加一条物料记录 * @param map * @return */ @@ -93,7 +95,7 @@ public class MaterialController { } /** - * 修改材料信息 + * 修改物料信息 * @param map * @return */ @@ -134,7 +136,7 @@ public class MaterialController { } /** - * 根据id获取材料 + * 根据id获取物料 * @param mid * @return */ @@ -176,4 +178,20 @@ public class MaterialController { List materialPByCondition = materialService.findMaterialPByCondition(map); return new RestResponse(materialPByCondition,materialService.findCountByCondition(map),200); } + + @GetMapping("/createQrCode") + public RestResponse createQrCode(@RequestParam("mid") Integer mid) { + Material materialById = materialService.findMaterialById(mid); + // 二维码保存信息 + Map code = new HashMap<>(); + code.put("mname",materialById.getMname()); + code.put("mcode",materialById.getCode()); + code.put("verison",materialById.getVersion()); + code.put("quantity",materialById.getQuantity()); + try { + return RestResponse.CreateQrCode(code); + } catch (IOException e) { + return new RestResponse("err: "+e.getMessage(),678,new StatusInfo("失败","请联系开发人员")); + } + } } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialTypeController.java b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialTypeController.java index 510d9e7f..b88c329f 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialTypeController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialTypeController.java @@ -27,7 +27,7 @@ public class MaterialTypeController { MaterialService materialService; /** - * 插入一条新材料类型 + * 插入一条新物料类型 * @param map * @return */ @@ -37,7 +37,7 @@ public class MaterialTypeController { } /** - * 根据条件查询材料类型 + * 根据条件查询物料类型 * @param map * @return */ @@ -49,7 +49,7 @@ public class MaterialTypeController { /** - * 根据父级查询所有材料类型 + * 根据父级查询所有物料类型 * @param parentId * @return */ @@ -66,7 +66,7 @@ public class MaterialTypeController { /** - * 彻底删除材料类别 + * 彻底删除物料类别 * @param map * @return */ @@ -99,7 +99,7 @@ public class MaterialTypeController { } /** - * 删除所有子材料类型信息(硬删除) + * 删除所有子物料类型信息(硬删除) * @param parentId */ public void RealDeleteSonDepository(String parentId){ @@ -108,14 +108,14 @@ public class MaterialTypeController { // 获取当前仓库所有子仓库 List materialTypeByCondition = materialTypeService.findMaterialTypeByCondition(param); for (int i = 0; i < materialTypeByCondition.size(); i++) { - Integer id = materialTypeByCondition.get(i).getId(); // 获取当前材料id - RealDeleteSonDepository(id.toString()); // 递归查询材料类型 - materialTypeService.deleteMaterialTypeById(id); // 删除材料类型 + Integer id = materialTypeByCondition.get(i).getId(); // 获取当前物料id + RealDeleteSonDepository(id.toString()); // 递归查询物料类型 + materialTypeService.deleteMaterialTypeById(id); // 删除物料类型 } } /** - * 根据主键删除材料类型 + * 根据主键删除物料类型 * @param map * @return */ @@ -148,7 +148,7 @@ public class MaterialTypeController { } /** - * 修改材料类型 + * 修改物料类型 * @param map * @return */ @@ -236,7 +236,7 @@ public class MaterialTypeController { } /** - * 修改材料类型状态 + * 修改物料类型状态 * @param map * @return */ @@ -284,7 +284,7 @@ public class MaterialTypeController { } /** - * 修改当前材料类型状态 + * 修改当前物料类型状态 * @param parentId * @param state */ 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 962b94ce..22a64348 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java @@ -61,6 +61,10 @@ public class PageController { private RoleService roleService; + @Autowired + private PlaceService placeService; + + public static JSONObject Captcha(){ @@ -380,7 +384,7 @@ public class PageController { return mv; } - // 材料类型树形菜单页面 + // 物料类型树形菜单页面 @GetMapping("/selectType") public String selectType(){ return "pages/material/selectType"; @@ -415,7 +419,7 @@ public class PageController { return mv; } - // 材料树形菜单页面 + // 物料树形菜单页面 @GetMapping("/selectMaterial") public ModelAndView selectMaterial(String mname,String type){ ModelAndView mv = new ModelAndView(); @@ -425,7 +429,7 @@ public class PageController { return mv; } - // 专用于卡片材料树形菜单页面 + // 专用于卡片物料树形菜单页面 @GetMapping("/selectMaterialByCard") public ModelAndView selectMaterialByCard(String mname,String type,String clickObj){ ModelAndView mv = new ModelAndView(); @@ -631,17 +635,17 @@ public class PageController { */ mv.addObject("depositories", depositoryService.findDepositoryAll()); /** - * 材料总数 + * 物料总数 */ mv.addObject("materials", materialService.findMaterialAll()); - // 转入材料数量 + // 转入物料数量 mv.addObject("InCount", depositoryRecordService.CalculateAllApplicationInCount()); - // 转入材料总额 + // 转入物料总额 mv.addObject("allInCount", depositoryRecordService.CalculateAllApplicationInCount()); - // 购入材料数量 + // 购入物料数量 mv.addObject("InPrice", depositoryRecordService.CalculateAllApplicationInPrice()); - // 购入材料总额 + // 购入物料总额 mv.addObject("allInPrice", depositoryRecordService.CalculateAllApplicationInPrice()); return mv; } @@ -658,13 +662,13 @@ public class PageController { mv.addObject("depositories", depositoryService.findDepositoryAll()); mv.addObject("reviewers", userService.findReviewers()); mv.addObject("materials", materialService.findMaterialAll()); - // 转出材料数量 + // 转出物料数量 mv.addObject("InCount", depositoryRecordService.CalculateAllApplicationOutCount("已出库")); - // 转出材料金额 + // 转出物料金额 mv.addObject("allInCount", depositoryRecordService.CalculateAllApplicationOutCount("")); - // 出售材料数量 + // 出售物料数量 mv.addObject("InPrice", depositoryRecordService.CalculateAllApplicationOutPrice("已出库")); - // 出库材料总额 + // 出库物料总额 mv.addObject("allInPrice", depositoryRecordService.CalculateAllApplicationOutPrice("")); return mv; } @@ -819,7 +823,7 @@ public class PageController { return mv; } - @GetMapping("warehouseByParentId") + @GetMapping("/warehouseByParentId") public ModelAndView warehouseByParentId(Integer parentId) { ModelAndView mv = new ModelAndView(); mv.setViewName("pages/warehouse/warehouseByParentId"); @@ -834,6 +838,32 @@ public class PageController { return mv; } + @GetMapping("/placeView") + public ModelAndView placeView(Integer id) { + ModelAndView mv = new ModelAndView(); + mv.setViewName("pages/place/place_edit"); + if (id != null) { + mv.addObject("id", id); + Place placeById = placeService.findPlaceById(id); + mv.addObject("place", placeById); + } else { + throw new MyException("缺少必要参数!"); + } + return mv; + } + + @GetMapping("/insertPlace") + public ModelAndView insertPlace(Integer depositoryId){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("pages/place/place_add"); + if(depositoryId != null){ + mv.addObject("depositoryId",depositoryId); + }else{ + throw new MyException("缺少必要参数!"); + } + return mv; + } + @GetMapping("findWareHouseByParentId") public ModelAndView findWareHouseByParentId(Integer parentId) { ModelAndView mv = new ModelAndView(); @@ -846,6 +876,8 @@ public class PageController { mv.addObject("depositories", depositoryRecordPByCondition); mv.setViewName("pages/warehouse/depository-out"); } else { + List placeByDid = placeService.findPlaceByDid(parentId); + mv.addObject("placeList",placeByDid); mv.setViewName("pages/warehouse/warehouseByParentId"); } } else { diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java b/src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java new file mode 100644 index 00000000..9f8ed9ff --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PlaceController.java @@ -0,0 +1,154 @@ +package com.dreamchaser.depository_manage.controller; + +import com.dreamchaser.depository_manage.entity.Depository; +import com.dreamchaser.depository_manage.entity.Material; +import com.dreamchaser.depository_manage.entity.Place; +import com.dreamchaser.depository_manage.exception.MyException; +import com.dreamchaser.depository_manage.pojo.MaterialP; +import com.dreamchaser.depository_manage.pojo.PlaceP; +import com.dreamchaser.depository_manage.pojo.RestResponse; +import com.dreamchaser.depository_manage.service.DepositoryService; +import com.dreamchaser.depository_manage.service.MaterialService; +import com.dreamchaser.depository_manage.service.PlaceService; +import com.dreamchaser.depository_manage.utils.CrudUtil; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/place") +public class PlaceController { + @Autowired + PlaceService placeService; + + @Autowired + MaterialService materialService; + + @Autowired + DepositoryService depositoryService; + + /** + * 根据条件查询库位 + * + * @param map + * @return + */ + @GetMapping("/findPlace") + public RestResponse findMaterial(@RequestParam Map map) { + List placeByCondition = placeService.findPlaceByCondition(map); + List placePList = new ArrayList<>(); + for (int i = 0; i < placeByCondition.size(); i++) { + Place place = placeByCondition.get(i); + PlaceP placeP = new PlaceP(place); + Integer depositoryId = place.getDid(); + Integer mid = place.getMid(); + Depository depositoryById = depositoryService.findDepositoryRecordById(depositoryId); + if(mid != null) { + Material materialById = materialService.findMaterialById(mid); + placeP.setMname(materialById.getMname()); + } + placeP.setDepositoryName(depositoryById.getDname()); + placeP.setDepositoryCode(depositoryById.getCode()); + placePList.add(placeP); + } + return new RestResponse(placePList, placeService.findPlaceCountByCondition(map), 200); + } + + @PostMapping("/addPlace") + public RestResponse insertPlace(@RequestBody Map map) { + String type = (String) map.get("type"); + Map insert = new HashMap<>(); + Integer success = 0; + if ("one".equals(type)) { + Integer place_x = ObjectFormatUtil.toInteger(map.get("place_x")); + Integer place_y = ObjectFormatUtil.toInteger(map.get("place_y")); + Integer place_z = ObjectFormatUtil.toInteger(map.get("place_z")); + String min = (String) map.get("min"); + String max = (String) map.get("max"); + String code = String.format("%02d", place_x) + String.format("%02d", place_y) + String.format("%02d", place_z); + insert.put("x", place_x); + insert.put("y", place_y); + insert.put("z", place_z); + insert.put("code", code); + insert.put("did", map.get("depositoryId")); + if (!"".equals(min)) { + insert.put("min", map.get("min")); + } else { + insert.put("min", 0); + } + if (!"".equals(max)) { + insert.put("max", map.get("max")); + } else { + insert.put("max", 0); + } + insert.put("state",1); + success += placeService.InsertPlace(insert); + } else { + + } + if ("one".equals(type)) { + return CrudUtil.postHandle(success, 1); + } else { + return new RestResponse(); + } + } + + /** + * 将库位状态改为删除 + * @param map + * @return + */ + @PostMapping("/deletePlace") + public RestResponse deletePlace(@RequestBody Map map){ + if (map.containsKey("id")){ + Integer id= ObjectFormatUtil.toInteger(map.get("id")); + return CrudUtil.deleteHandle(placeService.changeStateToDeletedById(id),1); + }else if (map.containsKey("ids")){ + List ids=(List) map.get("ids"); + return CrudUtil.deleteHandle(placeService.changeStateToDeletedByIds(ids),ids.size()); + }else { + throw new MyException("所需请求参数缺失!"); + } + } + + /** + * 修改库位信息 + */ + @PostMapping("/place_edit") + public RestResponse placeEdit(@RequestBody Map map){ + if(map.containsKey("state")){ + map.put("state",1); + }else{ + map.put("state",2); + } + Map update = new HashMap<>(); + Integer place_x = ObjectFormatUtil.toInteger(map.get("place_x")); + Integer place_y = ObjectFormatUtil.toInteger(map.get("place_y")); + Integer place_z = ObjectFormatUtil.toInteger(map.get("place_z")); + String min = (String) map.get("min"); + String max = (String) map.get("max"); + String code = String.format("%02d", place_x) + String.format("%02d", place_y) + String.format("%02d", place_z); + update.put("x", place_x); + update.put("y", place_y); + update.put("z", place_z); + update.put("code", code); + update.put("did", map.get("depositoryId")); + if (!"".equals(min)) { + update.put("min", map.get("min")); + } else { + update.put("min", 0); + } + if (!"".equals(max)) { + update.put("max", map.get("max")); + } else { + update.put("max", 0); + } + update.put("id",map.get("id")); + return CrudUtil.postHandle(placeService.UpdatePlace(update),1); + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java b/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java index 26b9e6b2..31d175bd 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java @@ -60,13 +60,8 @@ public class UserController { private UserService userService; @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") @Autowired - private JavaMailSender mailSender; - @Autowired private RoleService roleService; - @Value("${spring.mail.username}") - private String fromEmail; - @Autowired private DepositoryService depositoryService; @@ -134,8 +129,6 @@ public class UserController { VerificationCode v = new VerificationCode(); //将验证码存入验证码等待池 VerificationCodePool.addCode(principal, v); - //发送邮箱验证码 - sendEmail(principal, v.getCode()); return new RestResponse(); } return new RestResponse("", 304, new StatusInfo("发送验证码失败,该账户已存在!", "发送验证码失败,该账户已存在!")); @@ -442,32 +435,6 @@ public class UserController { return false; } - /** - * 发送带有验证码的邮件信息 - */ - private void sendEmail(String email, String code) { - //发送验证邮件 - try { - SimpleMailMessage mailMessage = new SimpleMailMessage(); - - //主题 - mailMessage.setSubject("仓库管理系统的验证码邮件"); - - //内容 - mailMessage.setText("欢迎使用仓库管理系统,您正在注册此账户。" + - "\n您收到的验证码是: " + code + " ,请不要将此验证码透露给别人。"); - - //发送的邮箱地址 - mailMessage.setTo(email); - //默认发送邮箱邮箱 - mailMessage.setFrom(fromEmail); - - //发送 - mailSender.send(mailMessage); - } catch (Exception e) { - throw new MyException(e.toString()); - } - } /** diff --git a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelDepositoryInfoConverter.java b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelDepositoryInfoConverter.java index f4dfed4c..045e5e23 100644 --- a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelDepositoryInfoConverter.java +++ b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelDepositoryInfoConverter.java @@ -17,6 +17,9 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.List; +/** + * 用于将仓库编码转为仓库id + */ @Component public class ExcelDepositoryInfoConverter implements Converter { @@ -40,7 +43,7 @@ public class ExcelDepositoryInfoConverter implements Converter { List depositoryAll = excelDepositoryInfoConverter.depositoryService.findDepositoryAll(); Integer data = 0; for (int i = 0; i < depositoryAll.size(); i++) { - if(cellData.getStringValue().equals(depositoryAll.get(i).getDname())){ + if(cellData.getStringValue().equals(depositoryAll.get(i).getCode())){ data = depositoryAll.get(i).getId(); } } @@ -55,8 +58,8 @@ public class ExcelDepositoryInfoConverter implements Converter { List depositoryAll = excelDepositoryInfoConverter.depositoryService.findDepositoryAll(); String data = ""; for (int i = 0; i < depositoryAll.size(); i++) { - if(value == depositoryAll.get(i).getId()){ - data = depositoryAll.get(i).getDname(); + if(Integer.compare(value,depositoryAll.get(i).getId()) == 0){ + data = depositoryAll.get(i).getCode(); } } return new WriteCellData<>(data); diff --git a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMTParentIdConverter.java b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMTParentIdConverter.java new file mode 100644 index 00000000..e87905ce --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMTParentIdConverter.java @@ -0,0 +1,40 @@ +package com.dreamchaser.depository_manage.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.dreamchaser.depository_manage.entity.MaterialType; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 用于物料分类上级编码 + */ +@Component +public class ExcelMTParentIdConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return Integer.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + + @Override + public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + Integer data = 0; + if(cellData.getStringValue() != null){ + data = ObjectFormatUtil.toInteger(cellData.getStringValue()); + } + return data; + } + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialCodeConverter.java b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialCodeConverter.java new file mode 100644 index 00000000..d17e4b63 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialCodeConverter.java @@ -0,0 +1,59 @@ +package com.dreamchaser.depository_manage.converter; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.converters.ReadConverterContext; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.dreamchaser.depository_manage.entity.Depository; +import com.dreamchaser.depository_manage.entity.Material; +import com.dreamchaser.depository_manage.service.DepositoryService; +import com.dreamchaser.depository_manage.service.MaterialService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * 用于物料分类上级编码 + */ +@Component +public class ExcelMaterialCodeConverter implements Converter { + + @Autowired + private MaterialService materialService; + + private static ExcelMaterialCodeConverter excelMaterialCodeConverter; + @Override + public Class supportJavaTypeKey() { + return Long.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + /** + * 这里读的时候会调用 + * + * @param + * @return + */ + @Override + public Long convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + Material material = excelMaterialCodeConverter.materialService.findMaterialByCode(Long.valueOf(cellData.getStringValue())); + if(material == null) { + throw new RuntimeException("没有该物料"); + } + return Long.valueOf(cellData.getStringValue()); + } + + @PostConstruct + public void init(){ + excelMaterialCodeConverter = this; + excelMaterialCodeConverter.materialService = this.materialService; + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialTypeInfoConverter.java b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialTypeInfoConverter.java index 6edea1fd..f4dbda33 100644 --- a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialTypeInfoConverter.java +++ b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelMaterialTypeInfoConverter.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.List; -// 用于表格数据导入时材料类型部分数据的转换 +// 用于表格数据导入时物料类型部分数据的转换 @Component public class ExcelMaterialTypeInfoConverter implements Converter { diff --git a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelStateInfoConverter.java b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelStateInfoConverter.java index 67a672a1..545d8886 100644 --- a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelStateInfoConverter.java +++ b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelStateInfoConverter.java @@ -22,7 +22,7 @@ public class ExcelStateInfoConverter implements Converter { @Override public Integer convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { switch (cellData.getStringValue()){ - case "启用": + case "核准": return 1; case "禁用": return 2; @@ -35,7 +35,7 @@ public class ExcelStateInfoConverter implements Converter { public WriteCellData convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { switch (value){ case 1: - return new WriteCellData("启用"); + return new WriteCellData("核准"); case 2: return new WriteCellData("禁用"); default: diff --git a/src/main/java/com/dreamchaser/depository_manage/converter/ExcelValid.java b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelValid.java new file mode 100644 index 00000000..1408fafb --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/converter/ExcelValid.java @@ -0,0 +1,53 @@ +package com.dreamchaser.depository_manage.converter; + +import com.alibaba.excel.converters.AutoConverter; +import com.alibaba.excel.converters.Converter; + +import java.lang.annotation.*; + +/** + * Excel导入必填校验注解 + * + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface ExcelValid { + String message() default "非空字段必填"; + /** + * Index of column + * + * Read or write it on the index of column, If it's equal to -1, it's sorted by Java class. + * + * priority: index > order > default sort + * + * @return Index of column + */ + int index() default -1; + + /** + * Defines the sort order for an column. + * + * priority: index > order > default sort + * + * @return Order of column + */ + int order() default Integer.MAX_VALUE; + + /** + * Force the current field to use this converter. + * + * @return Converter + */ + Class> converter() default AutoConverter.class; + + /** + * + * default @see com.alibaba.excel.util.TypeUtil if default is not meet you can set format + * + * @return Format string + * @deprecated please use {@link com.alibaba.excel.annotation.format.DateTimeFormat} + */ + @Deprecated + String format() default ""; +} \ No newline at end of file diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java index a6c9250a..a36863b1 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ApplicationOutRecord.java @@ -10,7 +10,7 @@ public class ApplicationOutRecord { private Integer id; /** - * 材料id + * 物料id */ private Integer mid; diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfo.java b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfo.java index 01d077ec..b89919be 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfo.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfo.java @@ -8,55 +8,41 @@ import com.dreamchaser.depository_manage.converter.ExcelMaterialTypeInfoConverte import com.dreamchaser.depository_manage.converter.ExcelStateInfoConverter; import lombok.Data; import lombok.EqualsAndHashCode; +import org.xmlunit.util.Convert; import java.math.BigInteger; /** - * 用于excel表的导入 + * 用于物料excel表的导入 */ @Data @EqualsAndHashCode(callSuper = false) public class ExcelInfo { - /** 材料编号 */ + /** 物料编号 */ @ExcelProperty("EAS编号") private Integer id; - /** 仓库名称 */ - @ExcelProperty(value = "仓库名称",converter = ExcelDepositoryInfoConverter.class) - private Integer depositoryId; - - /** 材料名称 */ - @ExcelProperty("材料名称") + /** 物料名称 */ + @ExcelProperty(value = "物料名称") private String mname; - /** 数量 */ - @ExcelProperty("数量") - private Double quantity; - - /** 总金额 */ - @ExcelProperty("总金额") - private Double amounts; - - /** 材料种类id */ - @ExcelProperty(value = "材料种类",converter = ExcelMaterialTypeInfoConverter.class) + /** 物料种类id */ + @ExcelProperty(value = "物料种类编码") private Integer typeId; - /** 材料状态 */ + /** 物料状态 */ @ExcelProperty(value = "状态",converter = ExcelStateInfoConverter.class) private Integer state; - /** 存货编码 */ - @ExcelProperty("存货编码") + /** 编码 */ + @ExcelProperty("编码") private Long code; /** 规格型号 */ @ExcelProperty("规格型号") private String version; - /** 单价 */ - @ExcelProperty("单价") - private Double price; /** 计量单位 */ @ExcelProperty("计量单位") @@ -65,8 +51,4 @@ public class ExcelInfo { /** 材质 */ @ExcelProperty("材质") private String texture; - - /** 仓库编码 */ - @ExcelProperty("仓库编码") - private String depositoryCode; } diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByInventory.java b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByInventory.java new file mode 100644 index 00000000..ecfc3ec1 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByInventory.java @@ -0,0 +1,50 @@ +package com.dreamchaser.depository_manage.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.dreamchaser.depository_manage.converter.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 用于库存excel表的导入 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ExcelInfoByInventory { + + /** 物料编号 */ + @ExcelProperty("EAS编号") + private Integer id; + + /** 存货编码 */ + @ExcelProperty(value = "编码",converter = ExcelMaterialCodeConverter.class) + private Long code; + + /** 仓库名称 */ + @ExcelProperty(value = "仓库编码",converter = ExcelDepositoryInfoConverter.class) + @ExcelValid(message = "仓库编码未填写") + private Integer depositoryId; + + /** 物料名称 */ + @ExcelProperty("物料名称") + private String mname; + + /** 数量 */ + @ExcelProperty(value = "数量") + @ExcelValid(message = "数量未填写") + private String quantity; + + /** 总金额 */ + @ExcelProperty("总金额") + private String amounts; + + /** 单价 */ + @ExcelProperty("单价") + @ExcelValid(message = "单价未填写") + private String price; + + /** 仓库编码 */ + @ExcelProperty("库位码") + private String depositoryCode; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMT.java b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMT.java new file mode 100644 index 00000000..57b20770 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/ExcelInfoByMT.java @@ -0,0 +1,36 @@ +package com.dreamchaser.depository_manage.entity; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.dreamchaser.depository_manage.converter.ExcelDepositoryInfoConverter; +import com.dreamchaser.depository_manage.converter.ExcelMTParentIdConverter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用于物料类型excel表的导入 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ExcelInfoByMT { + /** 分类名称 */ + @ExcelProperty(value = "分类名称") + private String tname; + + /** + * 物料编码 + */ + @ExcelProperty(value = "编码") + private Integer id; + + /** + * 物料上级编码 + */ + @ExcelProperty(value = "上级编码") + private Integer parentId; + + /** + * 物料介绍 + */ + @ExcelProperty(value = "介绍") + private String introduce; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/Material.java b/src/main/java/com/dreamchaser/depository_manage/entity/Material.java index 6e082862..5753818a 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/Material.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/Material.java @@ -20,7 +20,7 @@ public class Material { /** 仓库id */ private Integer depositoryId; - /** 材料名称 */ + /** 物料名称 */ private String mname; /** 数量 */ @@ -29,10 +29,10 @@ public class Material { /** 总金额 */ private Double amounts; - /** 材料种类id */ + /** 物料种类id */ private Integer typeId; - /** 材料状态 */ + /** 物料状态 */ private Integer state; /** 存货编码 */ @@ -44,7 +44,7 @@ public class Material { /** 单价 */ private Double price; - /** 材料类型 */ + /** 物料类型 */ private MaterialType materialType; /** 所属仓库 */ diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/Place.java b/src/main/java/com/dreamchaser/depository_manage/entity/Place.java new file mode 100644 index 00000000..79eecedd --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/Place.java @@ -0,0 +1,57 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; + +/** + * 库位 + */ +@Data +public class Place { + /** + * id + */ + private Integer id; + + /** + * 行 + */ + private Integer x; + /** + * 列 + */ + private Integer y; + /** + * 层 + */ + private Integer z; + + /** + * 存放物料id + */ + private Integer mid; + + /** + * 该库位所处仓库 + */ + private Integer did; + + /** + * 库位编码 + */ + private String code; + + /** + * 当前库位最少数目 + */ + private Integer min; + + /** + * 当前库位最多数目 + */ + private Integer max; + + /** + * 当前库位状态 + */ + private Integer state; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/StandingBook.java b/src/main/java/com/dreamchaser/depository_manage/entity/StandingBook.java index 8e62b1e3..15e6b8ed 100644 --- a/src/main/java/com/dreamchaser/depository_manage/entity/StandingBook.java +++ b/src/main/java/com/dreamchaser/depository_manage/entity/StandingBook.java @@ -24,7 +24,7 @@ public class StandingBook { /** 总价 */ private Integer price; - /** 材料名称 */ + /** 物料名称 */ private String materialName; /* This code was generated by TableGo tools, mark 1 end. */ @@ -108,19 +108,19 @@ public class StandingBook { } /** - * 获取材料名称 + * 获取物料名称 * - * @return 材料名称 + * @return 物料名称 */ public String getMaterialName() { return this.materialName; } /** - * 设置材料名称 + * 设置物料名称 * * @param materialName - * 材料名称 + * 物料名称 */ public void setMaterialName(String materialName) { this.materialName = materialName; diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/materialOnly.java b/src/main/java/com/dreamchaser/depository_manage/entity/materialOnly.java new file mode 100644 index 00000000..f1effd05 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/materialOnly.java @@ -0,0 +1,35 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; + +import java.math.BigInteger; + +@Data +public class materialOnly { + /** 存储id */ + private Integer id; + + /** 物料名称 */ + private String mname; + + + /** 物料种类id */ + private Integer typeId; + + /** 物料状态 */ + private Integer state; + + /** 存货编码 */ + private BigInteger code; + + /** 规格型号 */ + private String version; + + /** 计量单位 */ + private String unit; + + /** 材质 */ + private String texture; + + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/listener/ExcelListener.java b/src/main/java/com/dreamchaser/depository_manage/listener/ExcelListener.java index f65f45d1..a9eaa7c8 100644 --- a/src/main/java/com/dreamchaser/depository_manage/listener/ExcelListener.java +++ b/src/main/java/com/dreamchaser/depository_manage/listener/ExcelListener.java @@ -6,6 +6,8 @@ import com.alibaba.excel.exception.ExcelDataConvertException; import com.alibaba.excel.metadata.Cell; import com.alibaba.excel.metadata.data.ReadCellData; import com.alibaba.fastjson.JSON; +import com.dreamchaser.depository_manage.converter.ExcelValid; +import com.dreamchaser.depository_manage.utils.ExcelInValid; import com.dreamchaser.depository_manage.utils.ResultVo; import com.dreamchaser.depository_manage.utils.ResultVoUtil; import lombok.extern.slf4j.Slf4j; @@ -27,6 +29,7 @@ public class ExcelListener extends AnalysisEventListener { // 每一条数据解析都会来调用 @Override public void invoke(T t, AnalysisContext analysisContext) { + ExcelInValid.valid(t,analysisContext); log.info("【Excel文件】解析到一条数据{}:", JSON.toJSONString(t)); dataList.add(t); } @@ -57,7 +60,6 @@ public class ExcelListener extends AnalysisEventListener { Map cellMap = context.readRowHolder().getCellMap(); Collection values = cellMap.values(); Iterator iterator = values.iterator(); - String result = ""; while (iterator.hasNext()){ ReadCellData next = (ReadCellData) iterator.next(); diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java index 80671d08..a2c917c7 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.java @@ -142,4 +142,11 @@ public interface DepositoryMapper { * @return */ List findDepositoryByAdminorg(String adminorg); + + /** + * 根据部门获取当前父级下的子仓库 + * @param map + * @return + */ + List findDepositoryByAdminorgAndParent(Map map); } diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml index 0e77f636..849f29f7 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml @@ -59,9 +59,22 @@ FROM depository d WHERE 1 = 1 - and d.adminorg = #{adminorg} + and d.adminorg = #{adminorg} - or d.adminorg = '' + or d.adminorg = '' and d.state != 3 + + + @@ -104,8 +117,12 @@ and (d.adminorg = #{adminorg} or d.adminorg = '') AND d.state != 3 + + LIMIT #{begin},#{size} + + - + - + - + - + + SELECT + + FROM place p + where p.state != 3 + + + + + + + + + + + + + + + INSERT INTO place ( + id,x,y,z,code, mid,did,min,max,state + ) VALUES ( + #{id}, + #{x}, + #{y}, + #{z}, + #{code}, + #{mid}, + #{did}, + #{min}, + #{max}, + #{state} + ) + + + + + UPDATE place + + + x = #{x}, + + + y = #{y}, + + + z = #{z}, + + + code = #{code}, + + + mid = #{mid}, + + + did = #{did}, + + + min = #{min}, + + + max = #{max}, + + + state = #{state} + + + WHERE id = #{id} + + + + + + + DELETE FROM place WHERE id = #{id} + + + + + + update place + + state = 3 + + where id in + + #{id} + + + + + + UPDATE place + + state = 3 + + WHERE id = #{id} + + + \ No newline at end of file diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationModel.java b/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationModel.java index 51e04267..5a4663ee 100644 --- a/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationModel.java +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationModel.java @@ -15,7 +15,7 @@ public class ApplicationModel { private String depositoryName; /** - * 材料型号 + * 物料型号 */ private String version; /** @@ -23,11 +23,11 @@ public class ApplicationModel { */ private Integer depositoryId; /** - * 材料名称 + * 物料名称 */ private String mname; /** - * 材料编号 + * 物料编号 */ private Integer mid; /** @@ -36,7 +36,7 @@ public class ApplicationModel { private Integer applicant; /** - * 材料编码 + * 物料编码 */ private BigInteger code; @@ -49,4 +49,9 @@ public class ApplicationModel { * 备注说明 */ private String applyRemark; + + /** + * 单价 + */ + private Double price; } diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java b/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java index 3826366f..09b94a4e 100644 --- a/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/ApplicationOutRecordP.java @@ -10,12 +10,12 @@ public class ApplicationOutRecordP { private Integer id; /** - * 材料id + * 物料id */ private Integer mid; /** - * 材料名称 + * 物料名称 */ private String mname; @@ -130,7 +130,7 @@ public class ApplicationOutRecordP { private Integer transferId; /** - * 材料存货编码 + * 物料存货编码 */ private String mcode; } diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/MaterialOnlyP.java b/src/main/java/com/dreamchaser/depository_manage/pojo/MaterialOnlyP.java new file mode 100644 index 00000000..9c3458ce --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/MaterialOnlyP.java @@ -0,0 +1,30 @@ +package com.dreamchaser.depository_manage.pojo; + +import java.math.BigInteger; + +public class MaterialOnlyP { + /** 存储id */ + private Integer id; + + /** 物料名称 */ + private String mname; + + + /** 物料种类id */ + private Integer typeId; + + /** 物料状态 */ + private Integer state; + + /** 存货编码 */ + private BigInteger code; + + /** 规格型号 */ + private String version; + + /** 计量单位 */ + private String unit; + + /** 材质 */ + private String texture; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/MaterialP.java b/src/main/java/com/dreamchaser/depository_manage/pojo/MaterialP.java index d067c2e7..7bd4d5a5 100644 --- a/src/main/java/com/dreamchaser/depository_manage/pojo/MaterialP.java +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/MaterialP.java @@ -28,7 +28,7 @@ public class MaterialP { private Integer depositoryId; /** - * 材料名称 + * 物料名称 */ private String mname; @@ -43,12 +43,12 @@ public class MaterialP { private Double amounts; /** - * 材料种类名称 + * 物料种类名称 */ private String typeName; /** - * 材料状态 + * 物料状态 */ private Integer state; @@ -108,10 +108,10 @@ public class MaterialP { public MaterialP(Material material) { this.id = material.getId(); // 编号 - this.mname = material.getMname(); // 材料名称 + this.mname = material.getMname(); // 物料名称 this.quantity = material.getQuantity(); // 数量 this.price = material.getPrice(); // 单价 - this.state = material.getState(); // 材料状态 + this.state = material.getState(); // 物料状态 this.amounts = material.getAmounts(); // 总额 this.unit = material.getUnit(); // 计量单位 this.texture = material.getTexture(); // 材质 diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/PlaceP.java b/src/main/java/com/dreamchaser/depository_manage/pojo/PlaceP.java new file mode 100644 index 00000000..2e19aeb6 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/PlaceP.java @@ -0,0 +1,105 @@ +package com.dreamchaser.depository_manage.pojo; + +import com.dreamchaser.depository_manage.entity.Place; +import lombok.Data; + +@Data +public class PlaceP { + + /** + * id + */ + private Integer id; + + /** + * 行 + */ + private Integer x; + /** + * 列 + */ + private Integer y; + /** + * 层 + */ + private Integer z; + + /** + * 存放物料id + */ + private Integer mid; + + /** + * 该库位所处仓库 + */ + private Integer did; + + /** + * 库位编码 + */ + private String code; + + /** + * 当前库位最少数目 + */ + private Integer min; + + /** + * 当前库位最多数目 + */ + private Integer max; + + /** + * 当前库位状态 + */ + private Integer state; + + /** + * 物料名称 + */ + private String mname; + + /** + * 物料编码 + */ + private String mcode; + + /** + * 仓库编码 + */ + private String depositoryCode; + /** + * 仓库名称 + */ + private String depositoryName; + + public PlaceP(Integer id, Integer x, Integer y, Integer z, Integer mid, Integer did, String code, Integer min, Integer max, Integer state, String mname, String mcode, String depositoryCode, String depositoryName) { + this.id = id; + this.x = x; + this.y = y; + this.z = z; + this.mid = mid; + this.did = did; + this.code = code; + this.min = min; + this.max = max; + this.state = state; + this.mname = mname; + this.mcode = mcode; + this.depositoryCode = depositoryCode; + this.depositoryName = depositoryName; + } + + public PlaceP(Place p){ + this.id = p.getId(); + this.x = p.getX(); + this.y = p.getY(); + this.z = p.getZ(); + this.mid = p.getMid(); + this.did = p.getDid(); + this.code = p.getCode(); + this.min = p.getMin(); + this.max = p.getMax(); + this.state = p.getState(); + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java b/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java index 196771f5..4abf5f60 100644 --- a/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java @@ -1,10 +1,16 @@ package com.dreamchaser.depository_manage.pojo; +import cn.hutool.core.lang.Snowflake; +import com.alibaba.fastjson.JSONObject; +import com.dreamchaser.depository_manage.utils.CreateQrCodeUtil; +import com.dreamchaser.depository_manage.utils.SnowFlakeUtil; import lombok.Data; import lombok.experimental.Accessors; +import java.io.IOException; import java.io.Serializable; +import java.util.Map; /** * 所有服务统一响应数据格式 @@ -25,6 +31,10 @@ public class RestResponse implements Serializable { * 状态码 */ private int status=200; + + // 通过雪花算法产生随机id + private String SnowId; + /** * 状态信息 */ @@ -48,5 +58,15 @@ public class RestResponse implements Serializable { this.status = status; this.statusInfo = statusInfo; } + + public static RestResponse CreateQrCode(Map params) throws IOException { + // 获取要生产二维码的内容 + String context = JSONObject.toJSONString(params); + // 生成base64类型图片 + String qrCode = CreateQrCodeUtil.createQrCode(context, 200, 200); + return new RestResponse(qrCode,200,new StatusInfo("成功!","二维码生成成功")); + } + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java b/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java index 50e07b98..4327674f 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java @@ -151,23 +151,23 @@ public interface DepositoryRecordService { /** - * 计算材料总数 + * 计算物料总数 * @return */ Double CalculateAllCount(Integer type,String state); /** - * 计算材料总额 + * 计算物料总额 * @return */ Double CalculateAllPrice(Integer type,String state); /** - * 计算入库材料总额 + * 计算入库物料总额 * @return */ Double CalculateAllApplicationInPrice(); /** - * 计算出库材料总额 + * 计算出库物料总额 * @return */ Double CalculateAllApplicationOutPrice(String state); @@ -212,13 +212,13 @@ public interface DepositoryRecordService { */ Double findApplicationOutRecordByDate(Long end,Long start,Integer depositoryId); /** - * 根据条件获取月份中材料的总额 + * 根据条件获取月份中物料的总额 * @param map * @return */ Double findMaterialCountByMonth(Map map); /** - * 根据条件获取月份中材料的总额 + * 根据条件获取月份中物料的总额 * @param map * @return */ @@ -275,12 +275,12 @@ public interface DepositoryRecordService { /** - * 计算入库材料总数 + * 计算入库物料总数 * @return */ Double CalculateAllApplicationInCount(); /** - * 计算出库材料总数 + * 计算出库物料总数 * @return */ Double CalculateAllApplicationOutCount(String state); diff --git a/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java b/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java index a35916b3..0740c9e5 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/ExcelService.java @@ -5,5 +5,26 @@ import com.dreamchaser.depository_manage.utils.ResultVo; import org.springframework.web.multipart.MultipartFile; public interface ExcelService { - public ResultVo importExcel(MultipartFile file); + + /** + * 用于导入物料名称 + * @param file + * @param excelInfo + * @return + */ + ResultVo importExcelMaterial(MultipartFile file,String excelInfo); + + /** + * 用于导入物料分类 + * @param file + * @return + */ + ResultVo importExcelMaterialType(MultipartFile file); + + /** + * 用于导入库存信息 + * @param file + * @return + */ + ResultVo importExcelInventory(MultipartFile file); } 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 200d6c26..294a3b59 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java @@ -9,7 +9,7 @@ import java.util.List; import java.util.Map; /** - * 库存材料service层接口 + * 库存物料service层接口 * @author Dreamchaser */ public interface MaterialService { @@ -51,6 +51,13 @@ public interface MaterialService { */ List findMaterialPByCondition(Map map); + + /** + * 根据编码获取对应物料 + * @return + */ + Material findMaterialByCode(Long code); + /** * 查询所有的库存信息 * @return 所有的库存信息 @@ -92,14 +99,14 @@ public interface MaterialService { /** - * 根据主键Id将材料状态改为删除 + * 根据主键Id将物料状态改为删除 * @param id * @return 受影响条数 */ Integer changeStateToDeletedById(Integer id); /** - * 根据主键id批量将材料状态改为删除 + * 根据主键id批量将物料状态改为删除 * @param ids * @return 受影响条数 */ diff --git a/src/main/java/com/dreamchaser/depository_manage/service/MaterialTypeService.java b/src/main/java/com/dreamchaser/depository_manage/service/MaterialTypeService.java index 4fa251c1..ce58b6a4 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/MaterialTypeService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/MaterialTypeService.java @@ -6,12 +6,12 @@ import java.util.List; import java.util.Map; /** - * 材料的服务层接口 + * 物料的服务层接口 * @author 金昊霖 */ public interface MaterialTypeService { /** - * 插入一条材料类型记录 + * 插入一条物料类型记录 * @param map 参数map * @return 受影响的数量 */ @@ -25,14 +25,14 @@ public interface MaterialTypeService { Integer findMaterialTypeCountByCondition(Map map); /** - * 根据条件查询材料类型 + * 根据条件查询物料类型 * @param map * @return 符合条件的记录 */ List findMaterialTypeByCondition(Map map); /** - * 查询所有材料类型 + * 查询所有物料类型 * @return 所有记录 */ List findMaterialTypeAll(); @@ -57,28 +57,28 @@ public interface MaterialTypeService { Integer deleteMaterialTypeByIds(List ids); /** - * 修改材料类型 + * 修改物料类型 * @param map * @return 受影响条数 */ Integer updateMaterialType(Map map); /** - * 根据主键id查询对应材料类型 + * 根据主键id查询对应物料类型 * @param id * @return 对应记录 */ MaterialType findMaterialTypeById(Integer id); /** - * 根据主键id将材料类型状态修改为删除 + * 根据主键id将物料类型状态修改为删除 * @param id * @return 受影响条数 */ Integer changeStateToDeletedById(Integer id); /** - * 根据多个主键ids将材料类型状态修改为删除 + * 根据多个主键ids将物料类型状态修改为删除 * @param ids * @return 受影响条数 */ diff --git a/src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java b/src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java new file mode 100644 index 00000000..944473f1 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/service/PlaceService.java @@ -0,0 +1,87 @@ +package com.dreamchaser.depository_manage.service; + +import com.dreamchaser.depository_manage.entity.Place; + +import java.util.List; +import java.util.Map; + +public interface PlaceService { + /** + * 查找所有库位 + * @return + */ + List findPlaceAll(); + + /** + * 根据条件查找库位 + * @param map + * @return + */ + List findPlaceByCondition(Map map); + + /** + * 查找符合条件的库位数 + * @param map + * @return + */ + Integer findPlaceCountByCondition(Map map); + + /** + * 根据条件修改库位 + * @param map + * @return + */ + Integer UpdatePlace(Map map); + + /** + * 根据条件修改库位 + * @param place + * @return + */ + Integer UpdatePlace(Place place); + + + /** + * 根据主键删除库位 + * @param pid + * @return + */ + Integer DelPlace(Integer pid); + + /** + * 插入一条库位信息 + * @param map + * @return + */ + Integer InsertPlace(Map map); + + /** + * 根据仓库编号查找库位 + * @param did + * @return + */ + List findPlaceByDid(Integer did); + + + /** + * 根据id查询库位 + * @return + */ + Place findPlaceById(Integer id); + + /** + * 根据id将库位状态改为删除 + * @param id + * @return + */ + Integer changeStateToDeletedById(Integer id); + + /** + * 根据批量id将库位状态改为删除 + * @param ids + * @return + */ + Integer changeStateToDeletedByIds(List ids); + + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java index 71a3db3c..e5e6eca6 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java @@ -12,11 +12,10 @@ import com.dreamchaser.depository_manage.mapper.*; import com.dreamchaser.depository_manage.pojo.*; import com.dreamchaser.depository_manage.service.DepositoryRecordService; import com.dreamchaser.depository_manage.service.RoleService; -import com.dreamchaser.depository_manage.utils.DateUtil; -import com.dreamchaser.depository_manage.utils.HttpUtils; -import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; -import com.dreamchaser.depository_manage.utils.WordUtil; +import com.dreamchaser.depository_manage.utils.*; import org.apache.http.protocol.HTTP; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.Mergeable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -53,6 +52,12 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { @Autowired private RedisTemplate redisTemplate; + @Autowired + private RedissonClient redissonClient; + + + + /** * 提交申请,插入一条仓库调度记录 * @@ -90,7 +95,9 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { Double Inventory = depositoryMapper.getToDayInventoryByDName(temp); String code = createCode(depositoryRecordById.getDname(), "InOrderNumber"); Double quantity = Double.parseDouble((String) map.get("quantity")); + Double price = Double.parseDouble((String)map.get("price")); Integer mid = ObjectFormatUtil.toInteger(map.get("mid")); + Material material = materialMapper.findMaterialById(mid); // 判断剩余容量是否可以存入 if (depositoryRecordById.getMaxNumber() - Inventory < quantity) { @@ -100,23 +107,27 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { param.put("depositoryId", depositoryId); param.put("mname", material.getMname()); List materialByCondition = materialMapper.findMaterialByCondition(param); - // 计算当前入库材料金额 - int amounts = (int) ((material.getPrice() / 100) * quantity * 100); - map.put("price", amounts); + // 获取当前入库金额 + Double amounts = (quantity * price * 100); + // 获取平均价格 + Double avgPrice = (material.getAmounts() + amounts) / (material.getQuantity() + quantity); + map.put("amounts", amounts); + map.put("price",price * 100); String simpleTime = DateUtil.getSimpleTime(new Date()); map.put("applicant_time", DateUtil.DateTimeToTimeStamp(simpleTime)); map.put("code", code); - // 获取当前材料 + // 获取当前物料 if (materialByCondition.size() > 0) { // 如果当前存在 Material mt = materialByCondition.get(0); mt.setAmounts(mt.getAmounts() + amounts); mt.setQuantity((int) (mt.getQuantity() + quantity)); + mt.setPrice(avgPrice); materialMapper.updateMaterial(mt); } else { Map insert = new HashMap<>(); Material materialById = materialMapper.findMaterialById(mid); insert.put("depositoryId", depositoryId); - insert.put("price", materialById.getPrice()); + insert.put("price", avgPrice); insert.put("mname", materialById.getMname()); insert.put("quantity", quantity); insert.put("materialTypeId", materialById.getTypeId()); @@ -124,7 +135,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { insert.put("unit", materialById.getUnit()); insert.put("version", materialById.getVersion()); insert.put("texture", materialById.getTexture()); - insert.put("amounts", quantity * materialById.getPrice()); + insert.put("amounts", amounts); insert.put("depositoryCode", materialById.getDepositoryCode()); materialMapper.insertMaterial(insert); } @@ -143,7 +154,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { Long time = DateUtil.DateTimeToTimeStamp(DateUtil.getSimpleTime(new Date())); map.put("applicantTime", time); Integer mid = ObjectFormatUtil.toInteger(map.get("mid")); - // 获取当前材料 + // 获取当前物料 Material materialById = materialMapper.findMaterialById(mid); int amounts = (int) ((materialById.getPrice() / 100) * quantity * 100); map.put("price", amounts); @@ -153,7 +164,11 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { map.put("istransfer", 2); Map update = new HashMap<>(); update.put("id", materialById.getId()); - update.put("numberOfTemporary", materialById.getNumberOfTemporary() + quantity); + Integer numberOfTemporary = materialById.getNumberOfTemporary(); + if(numberOfTemporary == null){ + numberOfTemporary = 0; + } + update.put("numberOfTemporary", numberOfTemporary + quantity); materialMapper.updateMaterial(update); Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(materialById.getDepositoryId()); String code = createCode(depositoryRecordById.getDname(), "outOrderNumber"); @@ -172,7 +187,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 计算购入材料总数 + * 计算购入物料总数 * * @return */ @@ -187,7 +202,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 计算出库材料总数 + * 计算出库物料总数 * * @param state * @return @@ -586,7 +601,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 计算材料总数 + * 计算物料总数 * * @return */ @@ -614,7 +629,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { /** - * 计算材料总额 + * 计算物料总额 * * @return */ @@ -641,7 +656,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 计算入库材料总额 + * 计算入库物料总额 * * @return */ @@ -659,7 +674,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 计算出库材料总额 + * 计算出库物料总额 * * @param state * @return @@ -771,7 +786,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 根据条件获取月份中材料的总额 + * 根据条件获取月份中物料的总额 * * @param map * @return @@ -782,7 +797,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 根据条件获取月份中材料的总额 + * 根据条件获取月份中物料的总额 * * @param map * @return @@ -939,21 +954,23 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { * @return */ private String createCode(String depositoryName, String key) { - -// 单号(公司简称+仓库简称+年月日+数字(位数设置>=9)) - String code = "GK"; - String nowTime = DateUtil.getNowTime(); - depositoryName = WordUtil.getPinYinHeadChar(depositoryName); - String orderNumber = redisTemplate.opsForValue().get(key); - if (orderNumber == null) { - redisTemplate.opsForValue().set(key, "1", DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); - orderNumber = "1"; - } - int newNumber = ObjectFormatUtil.toInteger(orderNumber) + 1; - redisTemplate.boundValueOps(key).set(String.valueOf(newNumber), DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); - orderNumber = String.format("%09d", ObjectFormatUtil.toInteger(orderNumber)); - code = code + depositoryName + nowTime + orderNumber; - return code; + RLock lock = redissonClient.getLock(key); +// 单号(公司简称+仓库简称+年月日+数字(位数设置>=9)) + String code = "GK"; + String nowTime = DateUtil.getNowTime(); + depositoryName = WordUtil.getPinYinHeadChar(depositoryName); + lock.lock(5,TimeUnit.SECONDS); + String orderNumber = redisTemplate.opsForValue().get(key); + if (orderNumber == null) { + redisTemplate.opsForValue().set(key, "1", DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); + orderNumber = "1"; + } + int newNumber = ObjectFormatUtil.toInteger(orderNumber) + 1; + redisTemplate.boundValueOps(key).set(String.valueOf(newNumber), DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); + lock.unlock(); + orderNumber = String.format("%09d", ObjectFormatUtil.toInteger(orderNumber)); + code = code + depositoryName + nowTime + orderNumber; + return code; } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java index 701b413e..c69e49e1 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryServiceImpl.java @@ -63,14 +63,14 @@ public class DepositoryServiceImpl implements DepositoryService { if(adminorgName.isEmpty()){ code = "GK" + dnamePinYin +"-"+ String.format("%02d", condition.size() + 1); }else { - code = "GK" + adminorgName.substring(0, 2) + dnamePinYin + "-" + String.format("%02d", condition.size() + 1); + code = "GK" + dnamePinYin + "-" + String.format("%02d", condition.size() + 1); } }else{ // 设置编码 if(adminorgName.isEmpty()){ code = "GK" + dnamePinYin + "-01"; }else { - code = "GK" + adminorgName.substring(0,2) + dnamePinYin+"-01"; + code = "GK" + dnamePinYin+"-01"; } } }else { @@ -112,6 +112,15 @@ public class DepositoryServiceImpl implements DepositoryService { */ @Override public List findDepositoryRecordPByCondition(Map map) { + Integer size = 10, page = 1; + if (map.containsKey("size")) { + size = ObjectFormatUtil.toInteger(map.get("size")); + map.put("size", size); + } + if (map.containsKey("page")) { + page = ObjectFormatUtil.toInteger(map.get("page")); + map.put("begin", (page - 1) * size); + } List list = depositoryMapper.findDepositoryRecordPByCondition(map); for (int i = 0; i < list.size(); i++) { Depository depository = list.get(i); @@ -309,7 +318,7 @@ public class DepositoryServiceImpl implements DepositoryService { public List InitTreeMenus(String adminorg) { Map param = new HashMap<>(); param.put("parentId",0); - param.put("adminorg",adminorg); + param.put("adminorg",361); List depositories = depositoryMapper.findDepositoryRecordPByCondition(param); List list = new ArrayList<>(); for (int i = 0; i < depositories.size(); i++) { @@ -351,7 +360,8 @@ public class DepositoryServiceImpl implements DepositoryService { } // 获取当前父类的子类 // List parentByDepository = depositoryMapper.getParentByDepository(id); - List parentByDepository = depositoryMapper.findDepositoryRecordPByCondition(param); +// List parentByDepository = depositoryMapper.findDepositoryRecordPByCondition(param); + List parentByDepository = depositoryMapper.findDepositoryByAdminorgAndParent(param); if(parentByDepository.size() > 0){ for (int i = 0; i < parentByDepository.size(); i++) { Depository d = parentByDepository.get(i); diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java index 4542bba1..1a5c0e6a 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java @@ -2,8 +2,12 @@ package com.dreamchaser.depository_manage.service.impl; import com.alibaba.fastjson.JSON; import com.dreamchaser.depository_manage.entity.ExcelInfo; +import com.dreamchaser.depository_manage.entity.ExcelInfoByInventory; +import com.dreamchaser.depository_manage.entity.ExcelInfoByMT; +import com.dreamchaser.depository_manage.entity.Material; import com.dreamchaser.depository_manage.service.ExcelService; import com.dreamchaser.depository_manage.service.MaterialService; +import com.dreamchaser.depository_manage.service.MaterialTypeService; import com.dreamchaser.depository_manage.utils.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -31,8 +35,16 @@ public class ExcelServiceImpl implements ExcelService { @Autowired MaterialService materialService; + @Autowired + MaterialTypeService materialTypeService; + /** + * 用于导入物料名称 + * @param file + * @param excelInfo + * @return + */ @Override - public ResultVo importExcel(MultipartFile file) { + public ResultVo importExcelMaterial(MultipartFile file,String excelInfo) { // 1.入参校验 ResultVo checkExcelParam = excelutil.checkExcelParam(file); if (!checkExcelParam.checkSuccess()) { @@ -49,10 +61,12 @@ public class ExcelServiceImpl implements ExcelService { return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空"); } // 3.读取excel文件 - Map readResult = excelutil.simpleExcelRead(filePath, ExcelInfo.class); + Map readResult = new HashMap<>(); + if("material".equals(excelInfo)){ + readResult = excelutil.simpleExcelRead(filePath, ExcelInfo.class); + } List excelVos = (List) readResult.get("dataList"); List errMsg =(List) readResult.get("errMsg"); - boolean empty = CollectionUtil.isEmpty(excelVos); if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); @@ -69,14 +83,9 @@ public class ExcelServiceImpl implements ExcelService { Map param = new HashMap<>(); param.put("mname",excelVos.get(i).getMname()); param.put("code",excelVos.get(i).getCode()); - param.put("price",excelVos.get(i).getPrice()); param.put("unit",excelVos.get(i).getUnit()); - param.put("amounts",excelVos.get(i).getAmounts()); - param.put("quantity",excelVos.get(i).getQuantity()); param.put("version",excelVos.get(i).getVersion()); param.put("texture",excelVos.get(i).getTexture()); - param.put("depositoryId",excelVos.get(i).getDepositoryId()); - param.put("depositoryCode",excelVos.get(i).getDepositoryCode()); param.put("materialTypeId",excelVos.get(i).getTypeId()); param.put("id",excelVos.get(i).getId()); materialService.insertMaterial(param); @@ -98,4 +107,152 @@ public class ExcelServiceImpl implements ExcelService { return ResultVoUtil.returnResultVo(200,readResult,"结果"); // return ResultVoUtil.success(excelVos); } + + /** + * 用于导入物料分类 + * @param file + * @return + */ + @Override + public ResultVo importExcelMaterialType(MultipartFile file) { + // 1.入参校验 + ResultVo checkExcelParam = excelutil.checkExcelParam(file); + if (!checkExcelParam.checkSuccess()) { + log.error(checkExcelParam.getMsg()); + return checkExcelParam; + } + // 2.上传至服务器某路径下 + ResultVo resultVo = uploadFile(file); + if (!resultVo.checkSuccess()) { + return resultVo; + } + String filePath = (String)resultVo.getData(); + if (StringUtils.isBlank(filePath)) { + return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空"); + } + // 3.读取excel文件 + Map readResult = excelutil.simpleExcelRead(filePath, ExcelInfoByMT.class); + List excelVos = (List) readResult.get("dataList"); + List errMsg =(List) readResult.get("errMsg"); + boolean empty = CollectionUtil.isEmpty(excelVos); + if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { + log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); + return ResultVoUtil.error("上传Excel文件为空"); + } + if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { + log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); + return ResultVoUtil.error("上传Excel文件为空"); + } + // 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行 + // 4.1开启一个线程 + TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil(); + taskCenterUtil.submitTask(() -> { + List success = new ArrayList<>(); + Map returnResult = new HashMap<>(); + + for (int i = 0; i < excelVos.size(); i++) { + Map insert = new HashMap<>(); + insert.put("id",excelVos.get(i).getId()); + insert.put("tname",excelVos.get(i).getTname()); + insert.put("introduce",excelVos.get(i).getIntroduce()); + if(excelVos.get(i).getParentId() == null){ + insert.put("materialTypeId",0); + }else { + insert.put("materialTypeId", excelVos.get(i).getParentId()); + } + materialTypeService.insertMaterialType(insert); + success.add(excelVos.get(i)); + } + + log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos)); + returnResult.put("success",success); + returnResult.put("errMsg",errMsg); + return ResultVoUtil.returnResultVo(200,returnResult,"结果"); + }); + // 4.2删除临时文件 + boolean deleteFile = FileUtil.deleteFile(new File(filePath)); + if (!deleteFile) { + log.error("【导入Excel文件】删除临时文件失败,临时文件路径为{}", filePath); + return ResultVoUtil.error("删除临时文件失败"); + } + log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath); + return ResultVoUtil.returnResultVo(200,readResult,"结果"); +// return ResultVoUtil.success(excelVos); + + } + + + /** + * 用于导入库存信息 + * @param file + * @return + */ + @Override + public ResultVo importExcelInventory(MultipartFile file) { + // 1.入参校验 + ResultVo checkExcelParam = excelutil.checkExcelParam(file); + if (!checkExcelParam.checkSuccess()) { + log.error(checkExcelParam.getMsg()); + return checkExcelParam; + } + // 2.上传至服务器某路径下 + ResultVo resultVo = uploadFile(file); + if (!resultVo.checkSuccess()) { + return resultVo; + } + String filePath = (String)resultVo.getData(); + if (StringUtils.isBlank(filePath)) { + return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空"); + } + // 3.读取excel文件 + Map readResult = excelutil.simpleExcelRead(filePath, ExcelInfoByInventory.class); + List excelVos = (List) readResult.get("dataList"); + List errMsg =(List) readResult.get("errMsg"); + boolean empty = CollectionUtil.isEmpty(excelVos); + if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { + log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); + return ResultVoUtil.error("上传Excel文件为空"); + } + if ((CollectionUtil.isEmpty(excelVos) && errMsg.size() < 1) || (excelVos.size() < 2 && errMsg.size() < 1) ) { + log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename()); + return ResultVoUtil.error("上传Excel文件为空"); + } + // 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行 + // 4.1开启一个线程 + TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil(); + taskCenterUtil.submitTask(() -> { + List success = new ArrayList<>(); + Map returnResult = new HashMap<>(); + + for (int i = 0; i < excelVos.size(); i++) { + Map update = new HashMap<>(); + update.put("price",excelVos.get(i).getPrice()); + update.put("quantity",excelVos.get(i).getQuantity()); + if(excelVos.get(i).getAmounts() == null || "".equals(excelVos.get(i).getAmounts())){ + update.put("amounts",Double.parseDouble(excelVos.get(i).getPrice())*100 * Double.parseDouble(excelVos.get(i).getQuantity())); + }else { + update.put("amounts", Double.parseDouble(excelVos.get(i).getAmounts()) * 100); + } + update.put("depositoryId",excelVos.get(i).getDepositoryId()); + update.put("depositoryCode",excelVos.get(i).getDepositoryCode()); + Material materialByCode = materialService.findMaterialByCode(excelVos.get(i).getCode()); + update.put("id",materialByCode.getId()); + materialService.updateMaterial(update); + success.add(excelVos.get(i)); + } + + log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos)); + returnResult.put("success",success); + returnResult.put("errMsg",errMsg); + return ResultVoUtil.returnResultVo(200,returnResult,"结果"); + }); + // 4.2删除临时文件 + boolean deleteFile = FileUtil.deleteFile(new File(filePath)); + if (!deleteFile) { + log.error("【导入Excel文件】删除临时文件失败,临时文件路径为{}", filePath); + return ResultVoUtil.error("删除临时文件失败"); + } + log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath); + return ResultVoUtil.returnResultVo(200,readResult,"结果"); + } } 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 47edb55f..2db3d4d9 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 @@ -45,12 +45,16 @@ public class MaterialServiceImpl implements MaterialService { */ @Override public Integer insertMaterial(Map map) { - int quantity = (int) Math.round(Double.parseDouble(map.get("quantity").toString())); - int price = (int) (Double.parseDouble( map.get("price").toString()) * 100); - map.put("price",price); - map.put("amounts",quantity * price); + if(map.containsKey("quantity") && map.containsKey("price")) { + int quantity = (int) Math.round(Double.parseDouble(map.get("quantity").toString())); + int price = (int) (Double.parseDouble(map.get("price").toString()) * 100); + map.put("price",price); + map.put("amounts",quantity * price); + } return materialMapper.insertMaterial(map); } + + /** * 增加一条库存记录 * @@ -73,11 +77,15 @@ public class MaterialServiceImpl implements MaterialService { if(map.containsKey("price")){ Double price = Double.parseDouble((String) map.get("price")) * 100; Integer quantity = Integer.parseInt((String) map.get("quantity")); - map.put("amounts",price * quantity); + if(!map.containsKey("amounts")) { + map.put("amounts", price * quantity); + } map.put("price",price); } - Object materialTypeId = map.get("materialTypeId"); - map.put("typeId",materialTypeId); + if(map.containsKey("materialTypeId")) { + Object materialTypeId = map.get("materialTypeId"); + map.put("typeId", materialTypeId); + } return materialMapper.updateMaterial(map); } @@ -111,14 +119,29 @@ public class MaterialServiceImpl implements MaterialService { for (int i = 0; i < list.size(); i++) { list.get(i).setPrice(list.get(i).getPrice() / 100); list.get(i).setAmounts(list.get(i).getAmounts() / 100); - // 获取当前材料所处仓库 - Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(list.get(i).getDepositoryId()); - String code = depositoryRecordById.getCode() + "-" +list.get(i).getDepositoryCode(); - list.get(i).setDepositoryCode(code); + // 获取当前物料所处仓库 + Integer depositoryId = list.get(i).getDepositoryId(); + if(depositoryId != null){ + Depository depositoryRecordById = depositoryMapper.findDepositoryRecordById(depositoryId); + String code = depositoryRecordById.getCode() + "-" +list.get(i).getDepositoryCode(); + list.get(i).setDepositoryCode(code); + } } return pack(list); } + /** + * 根据编码获取对应物料 + * @return + */ + @Override + public Material findMaterialByCode(Long code) { + Map map = new HashMap<>(); + map.put("code",code); + Material material = materialMapper.findMaterialByCondition(map).get(0); + return material; + } + /** * 查询所有的库存信息 * @return 所有的库存信息 @@ -192,7 +215,7 @@ public class MaterialServiceImpl implements MaterialService { } /** - * 根据主键Id将材料状态改为删除 + * 根据主键Id将物料状态改为删除 * @param id * @return 受影响条数 */ @@ -202,7 +225,7 @@ public class MaterialServiceImpl implements MaterialService { } /** - * 根据主键id批量将材料状态改为删除 + * 根据主键id批量将物料状态改为删除 * @param ids * @return 受影响条数 */ @@ -247,9 +270,12 @@ public class MaterialServiceImpl implements MaterialService { List result=new ArrayList<>(list.size()); for (Material material: list){ MaterialP m=new MaterialP(material); - m.setDepositoryName(depositoryMapper.findDepositoryNameById(material.getDepositoryId())); + Integer depositoryId = material.getDepositoryId(); + if(depositoryId != null){ + m.setDepositoryName(depositoryMapper.findDepositoryNameById(depositoryId)); + m.setWarehouseManager(depositoryMapper.findUserNameByDepositoryId(depositoryId)); + } m.setTypeName(materialTypeMapper.findMaterialTypeNameById(material.getTypeId())); - m.setWarehouseManager(depositoryMapper.findUserNameByDepositoryId(material.getDepositoryId())); result.add(m); } return result; @@ -294,7 +320,13 @@ public class MaterialServiceImpl implements MaterialService { for (int i = 0; i < materialTypeNoParent.size(); i++) { MaterialType mt = materialTypeNoParent.get(i); List childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getId(),mname,adminorg); - Map stringObjectMap = InitTreeMenus(mt,childForMaterialTypeByParent); + Map stringObjectMap = new HashMap<>(); + if(childForMaterialTypeByParent != null) { + stringObjectMap = InitTreeMenus(mt, childForMaterialTypeByParent); + }else{ + List materialByType = AddMaterialByType(mt,mname,""); + stringObjectMap = InitTreeMenus(mt, materialByType); + } list.add(stringObjectMap); } return list; @@ -310,7 +342,13 @@ public class MaterialServiceImpl implements MaterialService { for (int i = 0; i < materialTypeNoParent.size(); i++) { MaterialType mt = materialTypeNoParent.get(i); List childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getId(),mname,""); - Map stringObjectMap = InitTreeMenus(mt,childForMaterialTypeByParent); + Map stringObjectMap = new HashMap<>(); + if(childForMaterialTypeByParent != null) { + stringObjectMap = InitTreeMenus(mt, childForMaterialTypeByParent); + }else{ + List materialByType = AddMaterialByType(mt,mname,""); + stringObjectMap = InitTreeMenus(mt, materialByType); + } list.add(stringObjectMap); } return list; @@ -330,7 +368,7 @@ public class MaterialServiceImpl implements MaterialService { } } - // 在类别后添加材料名称 + // 在类别后添加物料名称 public List AddMaterialByType(MaterialType mt,String mname,String adminorg){ if(mt != null) { Map param = new HashMap<>(); @@ -341,7 +379,12 @@ public class MaterialServiceImpl implements MaterialService { dids.add(depository.getId()); } List materialPByCondition = new ArrayList<>(); - List materialByDepositorys = materialMapper.findMaterialByDepositorys(dids); + List materialByDepositorys = new ArrayList<>(); + if("".equals(adminorg)){ + materialByDepositorys = materialMapper.findMaterialByCondition(new HashMap()); + }else{ + materialByDepositorys = materialMapper.findMaterialByDepositorys(dids); + } for (int i = 0; i < materialByDepositorys.size(); i++) { if (Integer.compare(materialByDepositorys.get(i).getTypeId(), mt.getId()) == 0){ materialPByCondition.add(materialByDepositorys.get(i)); diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialTypeServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialTypeServiceImpl.java index 35afe6b5..0c6f3987 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialTypeServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialTypeServiceImpl.java @@ -20,7 +20,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService { MaterialTypeMapper materialTypeMapper; /** - * 插入一条材料类型记录 + * 插入一条物料类型记录 * @param map 参数map * @return 受影响的数量 */ @@ -46,7 +46,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService { } /** - * 根据条件查询材料类型 + * 根据条件查询物料类型 * @param map * @return 符合条件的记录 */ @@ -56,7 +56,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService { } /** - * 查询所有材料类型 + * 查询所有物料类型 * @return 所有记录 */ @Override @@ -95,7 +95,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService { } /** - * 修改材料类型 + * 修改物料类型 * @param map * @return 受影响条数 */ @@ -111,7 +111,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService { } /** - * 根据主键id查询对应材料类型 + * 根据主键id查询对应物料类型 * @param id * @return 对应记录 */ @@ -121,7 +121,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService { } /** - * 根据主键id将材料类型状态修改为删除 + * 根据主键id将物料类型状态修改为删除 * @param id * @return 受影响条数 */ @@ -131,7 +131,7 @@ public class MaterialTypeServiceImpl implements MaterialTypeService { } /** - * 根据多个主键ids将材料类型状态修改为删除 + * 根据多个主键ids将物料类型状态修改为删除 * @param ids * @return 受影响条数 */ diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java new file mode 100644 index 00000000..0107042e --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/PlaceServiceImpl.java @@ -0,0 +1,136 @@ +package com.dreamchaser.depository_manage.service.impl; + +import com.dreamchaser.depository_manage.entity.Place; +import com.dreamchaser.depository_manage.mapper.PlaceMapper; +import com.dreamchaser.depository_manage.service.PlaceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class PlaceServiceImpl implements PlaceService { + + @Autowired + PlaceMapper placeMapper; + + /** + * 查找所有库位 + * @return + */ + @Override + public List findPlaceAll() { + return placeMapper.findPlaceAll(); + } + /** + * 根据条件查找库位 + * @param map + * @return + */ + @Override + public List findPlaceByCondition(Map map) { + Map condition = new HashMap<>(); + if(map.containsKey("place_x")){ + condition.put("x",map.get("place_x")); + } + if(map.containsKey("place_y")){ + condition.put("y",map.get("place_y")); + } + if(map.containsKey("place_z")){ + condition.put("z",map.get("place_z")); + } + if(map.containsKey("code")){ + condition.put("code",map.get("code")); + } + if(map.containsKey("state")){ + condition.put("state",map.get("state")); + } + return placeMapper.findPlaceByCondition(condition); + } + /** + * 查找符合条件的库位数 + * @param map + * @return + */ + @Override + public Integer findPlaceCountByCondition(Map map) { + return placeMapper.findPlaceCountByCondition(map); + } + + /** + * 根据条件修改库位 + * @param map + * @return + */ + @Override + public Integer UpdatePlace(Map map) { + return placeMapper.UpdatePlace(map); + } + /** + * 根据条件修改库位 + * @param place + * @return + */ + @Override + public Integer UpdatePlace(Place place) { + return placeMapper.UpdatePlace(place); + } + /** + * 根据主键删除库位 + * @param pid + * @return + */ + @Override + public Integer DelPlace(Integer pid) { + return placeMapper.DelPlace(pid); + } + /** + * 插入一条库位信息 + * @param map + * @return + */ + @Override + public Integer InsertPlace(Map map) { + return placeMapper.InsertPlace(map); + } + /** + * 根据仓库编号查找库位 + * @param did + * @return + */ + @Override + public List findPlaceByDid(Integer did) { + return placeMapper.findPlaceByDid(did); + } + + /** + * 根据id查询库位 + * @return + */ + @Override + public Place findPlaceById(Integer id) { + return placeMapper.findPlaceById(id); + } + + /** + * 根据id将库位状态改为删除 + * @param id + * @return + */ + @Override + public Integer changeStateToDeletedById(Integer id) { + return placeMapper.changeStateToDeletedById(id); + } + + /** + * 根据批量id将库位状态改为删除 + * @param ids + * @return + */ + @Override + public Integer changeStateToDeletedByIds(List ids) { + return placeMapper.changeStateToDeletedByIds(ids); + } +} diff --git a/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java b/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java index 431ee954..3ae32420 100644 --- a/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java +++ b/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java @@ -16,18 +16,20 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.HashMap; +import java.util.Hashtable; /* ** 二维码生成 */ public class CreateQrCodeUtil { - public String createQrCode(String content, int width, int height) throws IOException { + public static String createQrCode(String content, int width, int height) throws IOException { String resultImage = ""; if (!StringUtils.isEmpty(content)) { ServletOutputStream stream = null; ByteArrayOutputStream os = new ByteArrayOutputStream(); @SuppressWarnings("rawtypes") - HashMap hints = new HashMap<>(); +// HashMap hints = new HashMap<>(); + Hashtable hints = new Hashtable(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8” hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 指定二维码的纠错等级为中级 hints.put(EncodeHintType.MARGIN, 2); // 设置图片的边距 diff --git a/src/main/java/com/dreamchaser/depository_manage/utils/ExcelInValid.java b/src/main/java/com/dreamchaser/depository_manage/utils/ExcelInValid.java new file mode 100644 index 00000000..f079e9a7 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/utils/ExcelInValid.java @@ -0,0 +1,44 @@ +package com.dreamchaser.depository_manage.utils; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.exception.ExcelDataConvertException; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.read.metadata.holder.ReadSheetHolder; +import com.dreamchaser.depository_manage.converter.ExcelValid; +import com.dreamchaser.depository_manage.exception.MyException; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.Objects; + +public class ExcelInValid { + + /** + * Excel导入字段校验 + * + * @param object 校验的JavaBean 其属性须有自定义注解 + * @author linmaosheng + */ + public static void valid(Object object, AnalysisContext context) { + ReadSheetHolder readSheetHolder = context.readSheetHolder(); + Field[] fields = object.getClass().getDeclaredFields(); + ReadCellData tempCellData = readSheetHolder.getTempCellData(); + for (Field field : fields) { + field.setAccessible(true); + //属性的值 + Object fieldValue = null; + try { + fieldValue = field.get(object); + } catch (IllegalAccessException e) { + throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), tempCellData.getColumnIndex() + 1,null,null,"必填字段为空"); + } + //是否包含必填校验注解 + boolean isExcelValid = field.isAnnotationPresent(ExcelValid.class); + if (isExcelValid && Objects.isNull(fieldValue)) { + throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), tempCellData.getColumnIndex() + 1,null,null,"必填字段为空"); + } + + } + } + +} \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index a5890e7f..5c9b68de 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -11,21 +11,6 @@ spring: max-file-size: 100MB # 单个文件上传的最大上限 max-request-size: 100MB # 一次请求总大小上限 - mail: - #邮箱配置 - #平台地址,这里用的是qq邮箱,使用其他邮箱请更换 - host: smtp.qq.com - #这里是你要发送邮箱的账户 - username: 1789131794@qq.com - #发送短信后它给你的授权码 - password: ###### - properties: - mail: - smtp: - ssl: - enable: true - ##编码格式 - default-encoding: utf-8 ##数据库设置 datasource: username: root @@ -74,10 +59,10 @@ spring: database: 0 jedis: pool: - max-active: 8 - max-wait: 50ms - max-idle: 8 - min-idle: 0 + min-idle: 10 + max-idle: 20 + max-wait: -1ms + max-active: 200 timeout: 2000ms diff --git a/src/main/resources/redisson-config.yml b/src/main/resources/redisson-config.yml new file mode 100644 index 00000000..8bae24c3 --- /dev/null +++ b/src/main/resources/redisson-config.yml @@ -0,0 +1,26 @@ +#Redisson配置 +singleServerConfig: + address: "redis://127.0.0.1:6379" + clientName: null + database: 7 #选择使用哪个数据库0~15 + idleConnectionTimeout: 10000 + pingTimeout: 1000 + connectTimeout: 10000 + timeout: 3000 + retryAttempts: 3 + retryInterval: 1500 + reconnectionTimeout: 3000 + failedAttempts: 3 + subscriptionsPerConnection: 5 + subscriptionConnectionMinimumIdleSize: 1 + subscriptionConnectionPoolSize: 50 + connectionMinimumIdleSize: 32 + connectionPoolSize: 64 + dnsMonitoringInterval: 5000 + #dnsMonitoring: false + +threads: 0 +nettyThreads: 0 +codec: + class: "org.redisson.codec.JsonJacksonCodec" +transportMode: "NIO" diff --git a/src/main/resources/static/api/init.json b/src/main/resources/static/api/init.json index 4bbf4895..8bb8c045 100644 --- a/src/main/resources/static/api/init.json +++ b/src/main/resources/static/api/init.json @@ -137,18 +137,18 @@ ] }, { - "title": "材料种类管理", + "title": "物料种类管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "材料种类添加", + "title": "物料种类添加", "href": "/materialType_add", "icon": "layui-icon layui-icon-list", "target": "_self" }, { - "title": "材料种类查询", + "title": "物料种类查询", "href": "/materialType_view", "icon": "fa fa-th-list", "target": "_self" @@ -156,18 +156,18 @@ ] }, { - "title": "材料管理", + "title": "物料管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "创建材料", + "title": "创建物料", "href": "/material_add", "icon": "layui-icon layui-icon-template-1", "target": "_self" }, { - "title": "材料查询", + "title": "物料查询", "href": "/material_out", "icon": "fa fa-th-list", "target": "_self" diff --git a/src/main/resources/static/api/init_checker.json b/src/main/resources/static/api/init_checker.json index b0254b37..876d1b98 100644 --- a/src/main/resources/static/api/init_checker.json +++ b/src/main/resources/static/api/init_checker.json @@ -137,18 +137,18 @@ ] }, { - "title": "材料种类管理", + "title": "物料种类管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "材料种类添加", + "title": "物料种类添加", "href": "/materialType_add", "icon": "layui-icon layui-icon-list", "target": "_self" }, { - "title": "材料种类查询", + "title": "物料种类查询", "href": "/materialType_view", "icon": "fa fa-th-list", "target": "_self" @@ -156,18 +156,18 @@ ] }, { - "title": "材料管理", + "title": "物料管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "创建材料", + "title": "创建物料", "href": "/material_add", "icon": "layui-icon layui-icon-template-1", "target": "_self" }, { - "title": "材料查询", + "title": "物料查询", "href": "/material_out", "icon": "fa fa-th-list", "target": "_self" diff --git a/src/main/resources/static/api/init_reviewer.json b/src/main/resources/static/api/init_reviewer.json index 71c3c4f2..4a6ebd1d 100644 --- a/src/main/resources/static/api/init_reviewer.json +++ b/src/main/resources/static/api/init_reviewer.json @@ -137,18 +137,18 @@ ] }, { - "title": "材料种类管理", + "title": "物料种类管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "材料种类添加", + "title": "物料种类添加", "href": "/materialType_add", "icon": "layui-icon layui-icon-list", "target": "_self" }, { - "title": "材料种类查询", + "title": "物料种类查询", "href": "/materialType_view", "icon": "fa fa-th-list", "target": "_self" @@ -156,18 +156,18 @@ ] }, { - "title": "材料管理", + "title": "物料管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "创建材料", + "title": "创建物料", "href": "/material_add", "icon": "layui-icon layui-icon-template-1", "target": "_self" }, { - "title": "材料查询", + "title": "物料查询", "href": "/material_out", "icon": "fa fa-th-list", "target": "_self" diff --git a/src/main/resources/static/api/test.json b/src/main/resources/static/api/test.json index d5401ac9..e1cd3d68 100644 --- a/src/main/resources/static/api/test.json +++ b/src/main/resources/static/api/test.json @@ -161,19 +161,19 @@ { "icon": "fa fa-mail-forward", "href": "", - "title": "材料种类管理", + "title": "物料种类管理", "target": "_self", "child": [ { "icon": "fa fa-th-list", "href": "/materialType_add", - "title": "材料种类添加", + "title": "物料种类添加", "target": "_self" }, { "icon": "layui-icon layui-icon-template-1", "href": "/materialType_view", - "title": "材料种类查询", + "title": "物料种类查询", "target": "_self" } ] @@ -181,19 +181,19 @@ { "icon": "fa fa-mail-forward", "href": "", - "title": "材料管理", + "title": "物料管理", "target": "_self", "child": [ { "icon": "layui-icon layui-icon-template-1", "href": "/material_add", - "title": "创建材料", + "title": "创建物料", "target": "_self" }, { "icon": "layui-icon layui-icon-template-1", "href": "/material_out", - "title": "材料查询", + "title": "物料查询", "target": "_self" } ] diff --git a/src/main/resources/static/images/sousuo.png b/src/main/resources/static/images/sousuo.png new file mode 100644 index 0000000000000000000000000000000000000000..98a60c2f9098d1aa04841cde852f3ee5020abe24 GIT binary patch literal 6257 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index f7aba988..66587f60 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -157,9 +157,9 @@ miniAdmin.render(options); - /*$("#scan").on("click",function () { + $("#scan").on("click",function () { alert("扫一扫") - });*/ + }); // 百度统计代码,只统计指定域名 diff --git a/src/main/resources/templates/pages/application/application-in.html b/src/main/resources/templates/pages/application/application-in.html index 9f311727..88b46f9f 100644 --- a/src/main/resources/templates/pages/application/application-in.html +++ b/src/main/resources/templates/pages/application/application-in.html @@ -11,6 +11,22 @@ + + +

@@ -20,31 +36,42 @@
-
+

- -
- 物料名称: + +
+
+ + +
+ style="display: none" lay-verify="required"/> +
-
- +
-
- +
- +
+
+
+ +
+
@@ -70,8 +97,8 @@
-
-
@@ -112,7 +139,7 @@ function selectCode(obj){} // 用于点击搜索按钮 function selectMaterial(obj){} - // 用于材料名称查询 + // 用于物料名称查询 function selectMaterialByName(obj){} // 用于加载仓库菜单 function openDepositoryTree(obj){} @@ -171,7 +198,7 @@ complete: function () { layer.close(this.layerIndex); } - }) + }); return false; }); @@ -194,32 +221,41 @@ // 获取父元素id var parentId = obj.parentNode.id; NewIdNumber = NewIdNumber + 1; - // 材料名称栏目 + // 物料名称栏目 var materialItem = ` -
+

- -
- + +
+
+ + +
-
- +
-
- + +
+ +
+
+
+
-
@@ -277,16 +313,16 @@ } - // 用于实现通过编码查询材料 + // 用于实现通过编码查询物料 selectCode = function(obj){ // 输入code var code = obj.value; // 获取对应元素 var parent = obj.parentNode.parentNode.parentNode; var children = parent.childNodes[5]; - var materialItem = children.childNodes[3].childNodes; + var materialItem = children.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; $.ajax({ url: "/material/findMatrialByCode?code=" + code, type: "get", @@ -309,15 +345,15 @@ // 用于实现点击搜索按钮 selectMaterial = function (obj) { - var parent = obj.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var parentId = parent.id; var codeChildren = parent.childNodes[7]; var materialChildren = parent.childNodes[5]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; layer.open({ type: 2, @@ -325,8 +361,10 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], content: '/selectMaterialByCard?mname='+mname+'&type=1&clickObj='+parentId, + move : '.layui-layer-title', + fixed:false, end: function () { var mid = materialId.value; $.ajax({ @@ -336,6 +374,9 @@ contentType: "application/json;charset=utf-8", success: function (d) { var code = d.data.code; + if(code === undefined){ + code = ""; + } codeValue.value = code; } }); @@ -344,19 +385,19 @@ }); }; - //用于实现材料名称搜索 + //用于实现物料名称搜索 selectMaterialByName = function (obj) { // 输入code var data = obj.value; // 获取对应元素 - var parent = obj.parentNode.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var materialChildren = parent.childNodes[5]; var codeChildren = parent.childNodes[7]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var req = {}; req.mname = data; $.ajax({ @@ -398,7 +439,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepositoryByCard?type=1&clickObj='+parentId, }); } diff --git a/src/main/resources/templates/pages/application/application-in_back.html b/src/main/resources/templates/pages/application/application-in_back.html index 5a479bb6..83f8b1d7 100644 --- a/src/main/resources/templates/pages/application/application-in_back.html +++ b/src/main/resources/templates/pages/application/application-in_back.html @@ -22,9 +22,9 @@
- +
-
- +
-
- +
- +
+
+
+ +
+
@@ -64,8 +71,8 @@
-
-
@@ -170,7 +177,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=1', }); }); @@ -184,7 +193,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectMaterial?mname='+mname+'&type=1', end: function () { var mid = $("#mid").val(); @@ -194,7 +205,10 @@ dataType: 'json', contentType: "application/json;charset=utf-8", success: function (d) { - var code = d.data.code + var code = d.data.code; + if(code === undefined){ + code = ""; + } $("#code").val(code) } diff --git a/src/main/resources/templates/pages/application/application-out.html b/src/main/resources/templates/pages/application/application-out.html index 739e2fdf..5d856ac2 100644 --- a/src/main/resources/templates/pages/application/application-out.html +++ b/src/main/resources/templates/pages/application/application-out.html @@ -11,6 +11,19 @@ +
@@ -24,27 +37,29 @@
- -
- + +
+
+ + +
-
- +
-
- +
-
@@ -61,7 +76,7 @@
-
@@ -106,7 +121,7 @@ function selectCode(obj){} // 用于点击搜索按钮 function selectMaterial(obj){} - // 用于材料名称查询 + // 用于物料名称查询 function selectMaterialByName(obj){} // 用于暂存卡片个数 var params = []; @@ -127,9 +142,7 @@ stepItems: [{ title: '填写信息' }, { - title: '审核中' - }, { - title: '等待出库' + title: '提交成功' }] }); @@ -185,32 +198,34 @@ // 获取父元素id var parentId = obj.parentNode.id; NewIdNumber = NewIdNumber + 1; - // 材料名称栏目 + // 物料名称栏目 var materialItem = `

- -
- 物料名称 +
+
+ + +
-
- +
-
- +
-
@@ -256,16 +271,16 @@ return result; } - // 用于实现通过编码查询材料 + // 用于实现通过编码查询物料 selectCode = function(obj){ // 输入code var code = obj.value; // 获取对应元素 var parent = obj.parentNode.parentNode.parentNode; var children = parent.childNodes[5]; - var materialItem = children.childNodes[3].childNodes; + var materialItem = children.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; $.ajax({ url: "/material/findMatrialByCode?code=" + code, type: "get", @@ -288,15 +303,15 @@ // 用于实现点击搜索按钮 selectMaterial = function (obj) { - var parent = obj.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var parentId = parent.id; var codeChildren = parent.childNodes[7]; var materialChildren = parent.childNodes[5]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; layer.open({ type: 2, @@ -304,8 +319,10 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], - content: '/selectMaterialByCard?mname='+mname+'&type=1&clickObj='+parentId, + area: ['70%', '70%'], + content: '/selectMaterialByCard?mname='+mname+'&type=2&clickObj='+parentId, + move : '.layui-layer-title', + fixed:false, end: function () { var mid = materialId.value; $.ajax({ @@ -315,6 +332,9 @@ contentType: "application/json;charset=utf-8", success: function (d) { var code = d.data.code; + if(code === undefined){ + code = ""; + } codeValue.value = code; } }); @@ -323,19 +343,19 @@ }); }; - //用于实现材料名称搜索 + //用于实现物料名称搜索 selectMaterialByName = function (obj) { // 输入code var data = obj.value; // 获取对应元素 - var parent = obj.parentNode.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var materialChildren = parent.childNodes[5]; var codeChildren = parent.childNodes[7]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var req = {}; req.mname = data; $.ajax({ @@ -368,6 +388,8 @@ }; + + }) diff --git a/src/main/resources/templates/pages/application/application-out_back.html b/src/main/resources/templates/pages/application/application-out_back.html index 8706b7ea..1ef9201a 100644 --- a/src/main/resources/templates/pages/application/application-out_back.html +++ b/src/main/resources/templates/pages/application/application-out_back.html @@ -21,9 +21,9 @@
- +
-
- +
-
- +
- +
@@ -154,7 +154,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -168,7 +170,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectMaterial?mname='+mname+'&type=2', end: function () { var mid = $("#mid").val(); @@ -178,7 +182,10 @@ dataType: 'json', contentType: "application/json;charset=utf-8", success: function (d) { - var code = d.data.code + var code = d.data.code; + if(code === undefined){ + code = ""; + } $("#code").val(code) } diff --git a/src/main/resources/templates/pages/application/application-review.html b/src/main/resources/templates/pages/application/application-review.html index 9681f867..3efaf17c 100644 --- a/src/main/resources/templates/pages/application/application-review.html +++ b/src/main/resources/templates/pages/application/application-review.html @@ -32,7 +32,7 @@ 123456 - 材料名称 + 物料名称 骁龙888芯片 diff --git a/src/main/resources/templates/pages/application/application-transfer.html b/src/main/resources/templates/pages/application/application-transfer.html index 10267d00..56f7e973 100644 --- a/src/main/resources/templates/pages/application/application-transfer.html +++ b/src/main/resources/templates/pages/application/application-transfer.html @@ -11,6 +11,20 @@ +
@@ -25,27 +39,30 @@
- -
- 物料名称: +
+
+ + +
- +
- +
-
- +
- +
@@ -67,7 +84,7 @@
-
@@ -92,20 +109,6 @@
-
-
- -
- 入款成功 -
-
预计两小时到账
-
-
- - -
-
@@ -127,7 +130,7 @@ function selectCode(obj){} // 用于点击搜索按钮 function selectMaterial(obj){} - // 用于材料名称查询 + // 用于物料名称查询 function selectMaterialByName(obj){} // 用于加载仓库菜单 function openDepositoryTree(obj){} @@ -149,11 +152,7 @@ stepItems: [{ title: '填写信息' }, { - title: '审核中' - }, { - title: '等待出库' - },{ - title: '等待入库' + title: '提交成功' }] }); @@ -211,37 +210,39 @@ // 获取父元素id var parentId = obj.parentNode.id; NewIdNumber = NewIdNumber + 1; - // 材料名称栏目 + // 物料名称栏目 var materialItem = ` -
+

- -
- + +
+
+ + +
-
- +
-
- +
-
- +
- +
- +
- +
- +
diff --git a/src/main/resources/templates/pages/application/application_in_multi.html b/src/main/resources/templates/pages/application/application_in_multi.html index d181256b..fe64fe79 100644 --- a/src/main/resources/templates/pages/application/application_in_multi.html +++ b/src/main/resources/templates/pages/application/application_in_multi.html @@ -100,7 +100,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=1', }); }); @@ -114,7 +116,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectMaterial?mname='+mname+'&type=1', end: function () { var mid = $("#mid").val(); @@ -124,7 +128,10 @@ dataType: 'json', contentType: "application/json;charset=utf-8", success: function (d) { - var code = d.data.code + var code = d.data.code; + if(code === undefined){ + code = ""; + } $("#code").val(code) } diff --git a/src/main/resources/templates/pages/application/application_multi.html b/src/main/resources/templates/pages/application/application_multi.html index abde3f39..397f1135 100644 --- a/src/main/resources/templates/pages/application/application_multi.html +++ b/src/main/resources/templates/pages/application/application_multi.html @@ -64,11 +64,12 @@ cols: [ [ {type: "checkbox", width: 50}, - {field: 'mname', width: '10%', title: '材料名称'}, + {field: 'mname', width: '10%', title: '物料名称'}, {field: 'version', width: '10%', title: '规格型号'}, {field: 'code',width: 200,title: '存货编码',sort: true}, {field: 'depositoryName', width: '12%', title: '仓库名称'}, {field: 'quantity', width: '10%', title: '数量',edit:'quantity'}, + {field: 'price', width: '10%', title: '单价',edit:'price'}, {field: 'depositoryId', width: '10%', title: '仓库编号',edit:'quantity'}, {field: 'applyRemark', width: '10%', title: '备注说明',edit:'applyRemark'}, {title: '操作', minWidth: 250, toolbar: '#currentTableBar', align: "center"} @@ -105,11 +106,13 @@ req.depositoryIds = []; req.quantitys = []; req.applyRemarks = []; + req.prices = []; for (i = 0, len = data.length; i < len; i++) { req.mids[i] = data[i].mid; req.depositoryIds[i] = data[i].depositoryId; req.quantitys[i] = data[i].quantity; req.applyRemarks[i] = data[i].applyRemark; + req.prices[i] = data[i].price; } if(obj.event==='delete'){ if(req.mids > 0) { diff --git a/src/main/resources/templates/pages/application/form-step-look.html b/src/main/resources/templates/pages/application/form-step-look.html index 862a9f30..98736548 100644 --- a/src/main/resources/templates/pages/application/form-step-look.html +++ b/src/main/resources/templates/pages/application/form-step-look.html @@ -31,7 +31,7 @@ 123456 - 材料名称 + 物料名称 骁龙888芯片 diff --git a/src/main/resources/templates/pages/application/form-step-look_back.html b/src/main/resources/templates/pages/application/form-step-look_back.html index 902e071d..1a10557e 100644 --- a/src/main/resources/templates/pages/application/form-step-look_back.html +++ b/src/main/resources/templates/pages/application/form-step-look_back.html @@ -31,7 +31,7 @@ 123456 - 材料名称 + 物料名称 骁龙888芯片 @@ -118,13 +118,22 @@ var state=$("#state").text(); //当前处于的状态 - var position=0,states={}; - if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { + var position=0,states={},number = 1; + /*if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { position = 1; states = [{title: "提交申请"}, {title: state}, {title: "未入库"}]; } else { position = 2; states = [{title: "提交申请"}, {title: "审核通过"}, {title: state}]; + }*/ + if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { + // , {title: "未入库"} + states = [ {title: state}]; + number = 2; + } else { + // {title: "提交申请"}, + states = [ {title: state}]; + number = 3; } step.render({ elem: '#stepForm', @@ -132,6 +141,7 @@ width: '100%', //设置容器宽度 stepWidth: '750px', height: '650px', + number:number, position: position, stepItems: states }); diff --git a/src/main/resources/templates/pages/chart/chart-in.html b/src/main/resources/templates/pages/chart/chart-in.html index 95f1f8ec..79bdef55 100644 --- a/src/main/resources/templates/pages/chart/chart-in.html +++ b/src/main/resources/templates/pages/chart/chart-in.html @@ -37,7 +37,7 @@
-
转入材料数量
+
转入物料数量
@@ -55,7 +55,7 @@
-
转入材料金额
+
转入物料金额
@@ -73,7 +73,7 @@
-
购入材料数量
+
购入物料数量
@@ -91,7 +91,7 @@
-
入库材料金额
+
入库物料金额
diff --git a/src/main/resources/templates/pages/chart/chart-in_back.html b/src/main/resources/templates/pages/chart/chart-in_back.html index 47f6eba6..a7540d46 100644 --- a/src/main/resources/templates/pages/chart/chart-in_back.html +++ b/src/main/resources/templates/pages/chart/chart-in_back.html @@ -37,7 +37,7 @@
-
转入材料数量
+
转入物料数量
@@ -55,7 +55,7 @@
-
转入材料金额
+
转入物料金额
@@ -73,7 +73,7 @@
-
购入材料数量
+
购入物料数量
@@ -91,7 +91,7 @@
-
入库材料金额
+
入库物料金额
diff --git a/src/main/resources/templates/pages/chart/chart-out.html b/src/main/resources/templates/pages/chart/chart-out.html index 3d8f981d..77500945 100644 --- a/src/main/resources/templates/pages/chart/chart-out.html +++ b/src/main/resources/templates/pages/chart/chart-out.html @@ -37,7 +37,7 @@
-
转出材料数量
+
转出物料数量
@@ -55,7 +55,7 @@
-
转出材料金额
+
转出物料金额
@@ -73,7 +73,7 @@
-
购出材料数量
+
购出物料数量
@@ -91,7 +91,7 @@
-
出库材料金额
+
出库物料金额
diff --git a/src/main/resources/templates/pages/chart/chart-out_back.html b/src/main/resources/templates/pages/chart/chart-out_back.html index d273bf37..283d29c5 100644 --- a/src/main/resources/templates/pages/chart/chart-out_back.html +++ b/src/main/resources/templates/pages/chart/chart-out_back.html @@ -37,7 +37,7 @@
-
转出材料数量
+
转出物料数量
@@ -55,7 +55,7 @@
-
转出材料金额
+
转出物料金额
@@ -73,7 +73,7 @@
-
出售材料数量
+
出售物料数量
@@ -91,7 +91,7 @@
-
出库材料金额
+
出库物料金额
diff --git a/src/main/resources/templates/pages/chart/chart-stock.html b/src/main/resources/templates/pages/chart/chart-stock.html index d41c45d6..b8e93f1c 100644 --- a/src/main/resources/templates/pages/chart/chart-stock.html +++ b/src/main/resources/templates/pages/chart/chart-stock.html @@ -37,7 +37,7 @@
-
库存材料数量
+
库存物料数量
@@ -55,7 +55,7 @@
-
库存材料金额
+
库存物料金额
@@ -73,7 +73,7 @@
-
库存材料数量
+
库存物料数量
@@ -91,7 +91,7 @@
-
库存材料金额
+
库存物料金额
diff --git a/src/main/resources/templates/pages/depository/table-in.html b/src/main/resources/templates/pages/depository/table-in.html index a7205e2d..cf14d2dc 100644 --- a/src/main/resources/templates/pages/depository/table-in.html +++ b/src/main/resources/templates/pages/depository/table-in.html @@ -36,11 +36,11 @@
- +
- +
@@ -87,7 +87,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -127,7 +129,7 @@ {type: "checkbox", width: 50}, {field: 'id', width: 100, title: '提交编号', sort: true}, {field: 'aircode', width: 100, title: '提交编码', sort: true}, - {field: 'mname', width: 120, title: '材料名称'}, + {field: 'mname', width: 120, title: '物料名称'}, {field: 'mcode', width: 120, title: '存货编码'}, {field: 'depositoryName', width: 120, title: '仓库名称'}, {field: 'quantity', width: 80, title: '数量', sort: true}, diff --git a/src/main/resources/templates/pages/depository/table-out.html b/src/main/resources/templates/pages/depository/table-out.html index e2815c84..5029ac62 100644 --- a/src/main/resources/templates/pages/depository/table-out.html +++ b/src/main/resources/templates/pages/depository/table-out.html @@ -36,10 +36,10 @@
- +
@@ -87,7 +87,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -127,7 +129,7 @@ {type: "checkbox", width: 50}, {field: 'id', width: 100, title: '申请编号', sort: true}, {field: 'code', width: 100, title: '申请编码', sort: true}, - {field: 'mname', width: 120, title: '材料名称'}, + {field: 'mname', width: 120, title: '物料名称'}, {field: 'mcode', width: 120, title: '存货编码'}, {field: 'depositoryName', width: 120, title: '仓库名称'}, {field: 'quantity', width: 80, title: '数量', sort: true}, diff --git a/src/main/resources/templates/pages/depository/table-stock.html b/src/main/resources/templates/pages/depository/table-stock.html index c0d0346b..b527acaa 100644 --- a/src/main/resources/templates/pages/depository/table-stock.html +++ b/src/main/resources/templates/pages/depository/table-stock.html @@ -29,7 +29,7 @@
- +
@@ -55,6 +55,7 @@
+
@@ -68,9 +69,10 @@ diff --git a/src/main/resources/templates/pages/material/material-add.html b/src/main/resources/templates/pages/material/material-add.html index cb338690..98797603 100644 --- a/src/main/resources/templates/pages/material/material-add.html +++ b/src/main/resources/templates/pages/material/material-add.html @@ -13,7 +13,7 @@
- 材料创建 + 物料创建
@@ -21,9 +21,9 @@
- +
-
@@ -42,28 +42,12 @@
- +
- - -
-
+ -
- -
- - - -
-
-
- -
-
@@ -80,24 +64,10 @@ name="unit" lay-verify="required"/>
-
- -
- -
-
-
- -
- -
-
@@ -131,7 +101,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectType', }); }); @@ -143,7 +115,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/src/main/resources/templates/pages/material/material-add_back.html b/src/main/resources/templates/pages/material/material-add_back.html new file mode 100644 index 00000000..e46289a6 --- /dev/null +++ b/src/main/resources/templates/pages/material/material-add_back.html @@ -0,0 +1,210 @@ + + + + + layui + + + + + + + +
+
+
+ 物料创建 +
+
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+ +
+ +
+ + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/material/material-out.html b/src/main/resources/templates/pages/material/material-out.html index bc05f2b7..e246f01c 100644 --- a/src/main/resources/templates/pages/material/material-out.html +++ b/src/main/resources/templates/pages/material/material-out.html @@ -33,15 +33,15 @@
- - + +
- +
@@ -66,9 +66,17 @@
+
+ +
+ + +
+
+ - - -
@@ -108,7 +111,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectType', }); }); @@ -120,7 +125,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -156,18 +163,12 @@ {type: "checkbox", width: 50}, {field: 'code',width: 150,title: '存货编码',sort: true}, {field: 'id', width: 100, title: 'EAS编号',hidden:true}, - {field: 'mname', width: 120, title: '材料名称', sort: false}, - {field: 'typeName',width: 150,title: '材料种类'}, + {field: 'mname', width: 120, title: '物料名称', sort: false}, + {field: 'typeName',width: 150,title: '物料种类'}, {field: 'version',width: 200,title: '规格型号',sort: false}, {field: 'texture',width: 100,title: '材质'}, {field: 'unit',width: 150,title: '计量单位'}, - {field: 'depositoryCode',width: 250,title: '仓库编码',sort: true}, - {field: "depositoryName",width: 120,title: "仓库名称"}, - {field: 'quantity',width: 120,title:'数量',sort: true}, - {field: 'price',width: 150,title: '单价',sort: true}, - {field: 'amounts',width: 180,title: '总金额',sort: true}, {field: 'state', title:'状态', minWidth: 80, templet: '#switchTpl'}, - {title: '仓管员', minWidth: 80, templet: '#selectManager' ,align: "center"}, {title: '操作', minWidth: 200, toolbar: '#currentTableBar', align: "center"} ]], limits: [10, 15, 20, 25, 50], @@ -274,33 +275,52 @@ return false; } } + else if(obj.event === 'createQrCode'){ + $.ajax({ + url:"/material/createQrCode?mid=3", + dataType: 'json', + type: 'get', + contentType: "application/json;charset=utf-8", + success:function (data) { + if(data.status != 200){ + layer.msg(data.statusInfo.messgae) + }else{ + $("#qrCode").attr("src",data.data); + } + } + }) + } }); + //用于导入数据 var upLoader = upload.render({ elem:"#u_fileUpload", // 绑定元素 - url:'/excel/importExcel', // 上传接口 + url:'/excel/importExcelByMaterial', // 上传接口 accept:'file', // 允许上传的格式, + before: function(obj) { //obj参数包含的信息,跟 choose回调完全一致,可参见上文。 + layer.load(); //上传loading + }, exts:'xls|xlsx|csv', done:function(res){ + layer.closeAll('loading'); //关闭loading //如果上传成功 - console.log(res) + for (let i = 0; i < res.data.errMsg.length; i++) { + var show = "

"+res.data.errMsg[i] + ":错误"+"

" + re += show + } if(res.code == 200){ var re = "" for (let i = 0; i < res.data.dataList.length; i++) { - var mname = res.data.dataList[i]["mname"] - var code = res.data.dataList[i]["code"] - var version = res.data.dataList[i]["version"] - var texture = res.data.dataList[i]["texture"] - var price = res.data.dataList[i]["price"] - var quantity = res.data.dataList[i]["quantity"] - var unit = res.data.dataList[i]["unit"] - var show = "

"+mname + " "+ version+" " +code+" "+texture +" "+price +" "+quantity +" "+unit +":成功" +"

" - re += show - } - for (let i = 0; i < res.data.errMsg.length; i++) { - var show = "

"+res.data.errMsg[i] + ":错误"+"

" + var mname = res.data.dataList[i]["mname"]; + var code = res.data.dataList[i]["code"] == null || res.data.dataList[i]["code"] == undefined ?"":res.data.dataList[i]["code"]; + var version = res.data.dataList[i]["version"] == null || res.data.dataList[i]["version"] == undefined ?"":res.data.dataList[i]["version"]; + var texture = res.data.dataList[i]["texture"] == null || res.data.dataList[i]["texture"] == undefined ?"":res.data.dataList[i]["texture"]; + var unit = res.data.dataList[i]["unit"] == null || res.data.dataList[i]["unit"] == undefined ?"":res.data.dataList[i]["unit"]; + var typeId = res.data.dataList[i]["typeId"] == null || res.data.dataList[i]["typeId"] == undefined ?"":res.data.dataList[i]["typeId"]; + var show = "

"+mname + " "+ version+" " +code+" "+texture +" "+unit +" "+typeId+" :成功" +"

" re += show } + layer.open({ type: 1, skin: 'layui-layer-rim', //加上边框 @@ -313,6 +333,7 @@ }, error:function (){ + layer.closeAll('loading'); //关闭loading var demoText = $('#demoText'); demoText.html('上传失败 重试'); demoText.find('.demo-reload').on('click', function(){ @@ -338,6 +359,15 @@ shadeClose: true, area: ['100%', '100%'], content: '/material_view?id='+data.id, + end:function () { + //执行搜索重载 + table.reload('currentTableId', { + url: '/material/material', + page: { + curr: 1 + } + }, 'data'); + } }); $(window).on("resize", function () { layer.full(index); diff --git a/src/main/resources/templates/pages/material/material-out_back.html b/src/main/resources/templates/pages/material/material-out_back.html new file mode 100644 index 00000000..ae4c67a3 --- /dev/null +++ b/src/main/resources/templates/pages/material/material-out_back.html @@ -0,0 +1,494 @@ + + + + + layui + + + + + + + +
+
+
+ 搜索信息 +
+
+
+ +
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+ + +
+
+ + + + + + +
+ + + + + +
+
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/material/material-view.html b/src/main/resources/templates/pages/material/material-view.html index e39a5e3c..af559572 100644 --- a/src/main/resources/templates/pages/material/material-view.html +++ b/src/main/resources/templates/pages/material/material-view.html @@ -14,13 +14,13 @@
- +
@@ -37,52 +37,32 @@
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- +
- + +
- +
- +
- +
- - - +
+
- +
- +
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/place/place_edit.html b/src/main/resources/templates/pages/place/place_edit.html new file mode 100644 index 00000000..3718bfa0 --- /dev/null +++ b/src/main/resources/templates/pages/place/place_edit.html @@ -0,0 +1,131 @@ + + + + + layui + + + + + + + +
+
+
+ 库位创建 +
+
+
+
+
+
+ + + +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/pages/post/postRole_add.html b/src/main/resources/templates/pages/post/postRole_add.html index 32b452fb..c45db8ac 100644 --- a/src/main/resources/templates/pages/post/postRole_add.html +++ b/src/main/resources/templates/pages/post/postRole_add.html @@ -66,7 +66,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/src/main/resources/templates/pages/post/postRole_edit.html b/src/main/resources/templates/pages/post/postRole_edit.html index 9947a275..86315f0a 100644 --- a/src/main/resources/templates/pages/post/postRole_edit.html +++ b/src/main/resources/templates/pages/post/postRole_edit.html @@ -73,7 +73,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/src/main/resources/templates/pages/user/user-add.html b/src/main/resources/templates/pages/user/user-add.html index bd0ea24e..94a514a8 100644 --- a/src/main/resources/templates/pages/user/user-add.html +++ b/src/main/resources/templates/pages/user/user-add.html @@ -62,7 +62,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/src/main/resources/templates/pages/user/user-email.html b/src/main/resources/templates/pages/user/user-email.html index beebbb9c..6e93c58d 100644 --- a/src/main/resources/templates/pages/user/user-email.html +++ b/src/main/resources/templates/pages/user/user-email.html @@ -21,7 +21,7 @@
-

验证码将发送至767564319@qq.com

+

验证码将发送至1789131794@qq.com

如果长时间未收到验证码,请检查垃圾箱

diff --git a/src/main/resources/templates/pages/user/user-role-edit.html b/src/main/resources/templates/pages/user/user-role-edit.html index 129f35c7..f9ba73ab 100644 --- a/src/main/resources/templates/pages/user/user-role-edit.html +++ b/src/main/resources/templates/pages/user/user-role-edit.html @@ -67,7 +67,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/src/main/resources/templates/pages/warehouse/depository-out.html b/src/main/resources/templates/pages/warehouse/depository-out.html index 465a4761..97b2e55c 100644 --- a/src/main/resources/templates/pages/warehouse/depository-out.html +++ b/src/main/resources/templates/pages/warehouse/depository-out.html @@ -348,8 +348,8 @@ area: ['100%', '100%'], content: '/warehouse_view?id=' + data.id, end:function () { - req = {} - req.parentId = parentId + req = {}; + req.parentId = parentId; //执行搜索重载 table.reload('currentTableId', { url: '/repository/warehouseRecord', diff --git a/src/main/resources/templates/pages/warehouse/depository_add.html b/src/main/resources/templates/pages/warehouse/depository_add.html index 1830fd06..54606a41 100644 --- a/src/main/resources/templates/pages/warehouse/depository_add.html +++ b/src/main/resources/templates/pages/warehouse/depository_add.html @@ -36,11 +36,13 @@
-
+
+
+
@@ -133,7 +135,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/src/main/resources/templates/pages/warehouse/warehouseByParentId.html b/src/main/resources/templates/pages/warehouse/warehouseByParentId.html index d6e04019..fd0af77c 100644 --- a/src/main/resources/templates/pages/warehouse/warehouseByParentId.html +++ b/src/main/resources/templates/pages/warehouse/warehouseByParentId.html @@ -20,18 +20,27 @@
- +
- + +
+
+
+ +
+ +
+
+
+ +
+
- +
- +
@@ -56,8 +65,9 @@ @@ -69,6 +79,11 @@ 删除 + + +
@@ -80,7 +95,7 @@ var parentId = document.getElementById("parentId").value; table.render({ elem: "#currentTableId", - url: '/repository/allWarehouseByParent?parentId='+parentId, + url: '/place/findPlace?did='+parentId, parseData: function (res) { //res 即为原始返回的数据 return { "status": res.status, //解析接口状态 @@ -107,25 +122,20 @@ defaultToolbar: ['filter', 'exports', 'print'], cols: [ [ {type: "checkbox", width: 50}, - {field: 'id', width: 100, title: '仓库编号', sort: true}, - {field: 'dname', width: 120, title: '仓库名称', sort: true}, - {field: 'address',width: 120,title:'仓库地址',sort: true}, - {field: 'introduce',width: 200,title: '仓库介绍',sort: true}, - { - field: 'state', title: '状态', minWidth: 80, sort: true, templet: function (d) { - if (d.state == 1){ - return "启用"; - }else if(d.state == 2){ - return "禁用"; - } - } - }, + {field: 'code', width: 120, title: '库位号', sort: true}, + {field: 'mname',width: 200,title: '物料名称'}, + {field: 'depositoryName',width: 200,title: '仓库名称'}, + {field: 'depositoryCode',width: 200,title: '仓库编码'}, + {field: 'state', title:'状态', minWidth: 80, templet: '#switchTpl'}, {title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"} ]], limits: [10, 15, 20, 25, 50], limit: 10, page: true, - skin: 'line' + skin: 'line', + done: function () { + $("[data-field='id']").css('display','none'); + } }); // 监听搜索操作 @@ -145,7 +155,7 @@ req.parentId = parentId //执行搜索重载 table.reload('currentTableId', { - url: '/repository/warehouseRecord', + url: '/place/findPlace', page: { curr: 1 }, @@ -166,12 +176,13 @@ maxmin: true, shadeClose: true, area: ['100%', '100%'], - content: '/depository_add', + content: '/insertPlace?depositoryId='+parentId, }); $(window).on("resize", function () { layer.full(index); }); - } else if (obj.event === 'delete') { // 监听删除操作 + } + else if (obj.event === 'delete') { // 监听删除操作 var checkStatus = table.checkStatus('currentTableId') , data = checkStatus.data; var req={}; @@ -180,7 +191,7 @@ req.ids[i]=data[i].id; } $.ajax({ - url: '/repository/depository_del', + url: '/place/deletePlace', dataType:'json', type:'POST', contentType: "application/json;charset=utf-8", @@ -200,7 +211,7 @@ }); //执行搜索重载 table.reload('currentTableId', { - url: '/repository/warehouseRecord', + url: '/place/findPlace', page: { curr: 1 } @@ -210,6 +221,9 @@ } }) } + else if(obj.event === 'addList'){ + + } }); //监听表格复选框选择 @@ -222,13 +236,26 @@ if (obj.event === 'detail') { var index = layer.open({ - title: '仓库信息详情', + title: '库位信息详情', type: 2, shade: 0.2, maxmin: true, shadeClose: true, area: ['100%', '100%'], - content: '/warehouse_view?id='+data.id, + content: '/placeView?id='+data.id, + end:function () { + req = {}; + req.parentId = parentId; + //执行搜索重载 + table.reload('currentTableId', { + url: '/place/findPlace', + page: { + curr: 1 + }, + where: req + }, 'data'); + return false; + } }); $(window).on("resize", function () { layer.full(index); @@ -239,7 +266,7 @@ req.id=data.id; layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) { $.ajax({ - url: '/repository/depository_del', + url: '/place/deletePlace', dataType:'json', type:'POST', contentType: "application/json;charset=utf-8", @@ -264,6 +291,42 @@ }); } }); + + + //监听状态操作 + form.on('switch(changeState)', function(obj){ + var req = new Map; + if(obj.elem.checked){ + req["state"] = 1 + } + req["id"] = this.value; + console.log(JSON.stringify(req)) + $.ajax({ + url: "/place/place_edit", + type: 'post', + dataType: 'json', + contentType: "application/json;charset=utf-8", + data: JSON.stringify(req), + beforeSend: function () { + this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); + }, + success: function (data) { + layer.close(this.layerIndex); + if (data.status >= 300) { + layer.msg(data.statusInfo.message);//失败的表情 + return; + } else { + layer.msg("修改成功", { + icon: 6,//成功的表情 + time: 500 //1秒关闭(如果不配置,默认是3秒) + },function(){ + window.location='/warehouseByParentId?parentId='+parentId; + }) + } + } + + }) + }); }); diff --git a/src/main/resources/templates/pages/warehouse/warehouse_view.html b/src/main/resources/templates/pages/warehouse/warehouse_view.html index 9eacce61..55077983 100644 --- a/src/main/resources/templates/pages/warehouse/warehouse_view.html +++ b/src/main/resources/templates/pages/warehouse/warehouse_view.html @@ -140,7 +140,7 @@ layer.msg(data.statusInfo.message);//失败的表情 return; } else { - layer.msg("仓库信息成功", { + layer.msg("修改仓库信息成功", { icon: 6,//成功的表情 time: 500 //1秒关闭(如果不配置,默认是3秒) },function(){ diff --git a/src/test/java/com/dreamchaser/depository_manage/Test.java b/src/test/java/com/dreamchaser/depository_manage/Test.java index b3c1f389..06e9be0f 100644 --- a/src/test/java/com/dreamchaser/depository_manage/Test.java +++ b/src/test/java/com/dreamchaser/depository_manage/Test.java @@ -14,6 +14,8 @@ import com.dreamchaser.depository_manage.service.MaterialTypeService; import com.dreamchaser.depository_manage.utils.*; import lombok.extern.log4j.Log4j2; import org.junit.runner.RunWith; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; @@ -24,6 +26,7 @@ import javax.swing.*; import java.util.*; import java.util.concurrent.TimeUnit; + public class Test { diff --git a/target/classes/application-test.yml b/target/classes/application-test.yml index a5890e7f..5c9b68de 100644 --- a/target/classes/application-test.yml +++ b/target/classes/application-test.yml @@ -11,21 +11,6 @@ spring: max-file-size: 100MB # 单个文件上传的最大上限 max-request-size: 100MB # 一次请求总大小上限 - mail: - #邮箱配置 - #平台地址,这里用的是qq邮箱,使用其他邮箱请更换 - host: smtp.qq.com - #这里是你要发送邮箱的账户 - username: 1789131794@qq.com - #发送短信后它给你的授权码 - password: ###### - properties: - mail: - smtp: - ssl: - enable: true - ##编码格式 - default-encoding: utf-8 ##数据库设置 datasource: username: root @@ -74,10 +59,10 @@ spring: database: 0 jedis: pool: - max-active: 8 - max-wait: 50ms - max-idle: 8 - min-idle: 0 + min-idle: 10 + max-idle: 20 + max-wait: -1ms + max-active: 200 timeout: 2000ms diff --git a/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml b/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml index 0e77f636..849f29f7 100644 --- a/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml +++ b/target/classes/com/dreamchaser/depository_manage/mapper/DepositoryMapper.xml @@ -59,9 +59,22 @@ FROM depository d WHERE 1 = 1 - and d.adminorg = #{adminorg} + and d.adminorg = #{adminorg} - or d.adminorg = '' + or d.adminorg = '' and d.state != 3 + + + @@ -104,8 +117,12 @@ and (d.adminorg = #{adminorg} or d.adminorg = '') AND d.state != 3 + + LIMIT #{begin},#{size} + + - + - + - + - + + SELECT + + FROM place p + where p.state != 3 + + + + + + + + + + + + + + + INSERT INTO place ( + id,x,y,z,code, mid,did,min,max,state + ) VALUES ( + #{id}, + #{x}, + #{y}, + #{z}, + #{code}, + #{mid}, + #{did}, + #{min}, + #{max}, + #{state} + ) + + + + + UPDATE place + + + x = #{x}, + + + y = #{y}, + + + z = #{z}, + + + code = #{code}, + + + mid = #{mid}, + + + did = #{did}, + + + min = #{min}, + + + max = #{max}, + + + state = #{state} + + + WHERE id = #{id} + + + + + + + DELETE FROM place WHERE id = #{id} + + + + + + update place + + state = 3 + + where id in + + #{id} + + + + + + UPDATE place + + state = 3 + + WHERE id = #{id} + + + \ No newline at end of file diff --git a/target/classes/redisson-config.yml b/target/classes/redisson-config.yml new file mode 100644 index 00000000..8bae24c3 --- /dev/null +++ b/target/classes/redisson-config.yml @@ -0,0 +1,26 @@ +#Redisson配置 +singleServerConfig: + address: "redis://127.0.0.1:6379" + clientName: null + database: 7 #选择使用哪个数据库0~15 + idleConnectionTimeout: 10000 + pingTimeout: 1000 + connectTimeout: 10000 + timeout: 3000 + retryAttempts: 3 + retryInterval: 1500 + reconnectionTimeout: 3000 + failedAttempts: 3 + subscriptionsPerConnection: 5 + subscriptionConnectionMinimumIdleSize: 1 + subscriptionConnectionPoolSize: 50 + connectionMinimumIdleSize: 32 + connectionPoolSize: 64 + dnsMonitoringInterval: 5000 + #dnsMonitoring: false + +threads: 0 +nettyThreads: 0 +codec: + class: "org.redisson.codec.JsonJacksonCodec" +transportMode: "NIO" diff --git a/target/classes/static/api/init.json b/target/classes/static/api/init.json index 4bbf4895..8bb8c045 100644 --- a/target/classes/static/api/init.json +++ b/target/classes/static/api/init.json @@ -137,18 +137,18 @@ ] }, { - "title": "材料种类管理", + "title": "物料种类管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "材料种类添加", + "title": "物料种类添加", "href": "/materialType_add", "icon": "layui-icon layui-icon-list", "target": "_self" }, { - "title": "材料种类查询", + "title": "物料种类查询", "href": "/materialType_view", "icon": "fa fa-th-list", "target": "_self" @@ -156,18 +156,18 @@ ] }, { - "title": "材料管理", + "title": "物料管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "创建材料", + "title": "创建物料", "href": "/material_add", "icon": "layui-icon layui-icon-template-1", "target": "_self" }, { - "title": "材料查询", + "title": "物料查询", "href": "/material_out", "icon": "fa fa-th-list", "target": "_self" diff --git a/target/classes/static/api/init_checker.json b/target/classes/static/api/init_checker.json index b0254b37..876d1b98 100644 --- a/target/classes/static/api/init_checker.json +++ b/target/classes/static/api/init_checker.json @@ -137,18 +137,18 @@ ] }, { - "title": "材料种类管理", + "title": "物料种类管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "材料种类添加", + "title": "物料种类添加", "href": "/materialType_add", "icon": "layui-icon layui-icon-list", "target": "_self" }, { - "title": "材料种类查询", + "title": "物料种类查询", "href": "/materialType_view", "icon": "fa fa-th-list", "target": "_self" @@ -156,18 +156,18 @@ ] }, { - "title": "材料管理", + "title": "物料管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "创建材料", + "title": "创建物料", "href": "/material_add", "icon": "layui-icon layui-icon-template-1", "target": "_self" }, { - "title": "材料查询", + "title": "物料查询", "href": "/material_out", "icon": "fa fa-th-list", "target": "_self" diff --git a/target/classes/static/api/init_reviewer.json b/target/classes/static/api/init_reviewer.json index 71c3c4f2..4a6ebd1d 100644 --- a/target/classes/static/api/init_reviewer.json +++ b/target/classes/static/api/init_reviewer.json @@ -137,18 +137,18 @@ ] }, { - "title": "材料种类管理", + "title": "物料种类管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "材料种类添加", + "title": "物料种类添加", "href": "/materialType_add", "icon": "layui-icon layui-icon-list", "target": "_self" }, { - "title": "材料种类查询", + "title": "物料种类查询", "href": "/materialType_view", "icon": "fa fa-th-list", "target": "_self" @@ -156,18 +156,18 @@ ] }, { - "title": "材料管理", + "title": "物料管理", "icon": "fa fa-wrench", "target": "_self", "child": [ { - "title": "创建材料", + "title": "创建物料", "href": "/material_add", "icon": "layui-icon layui-icon-template-1", "target": "_self" }, { - "title": "材料查询", + "title": "物料查询", "href": "/material_out", "icon": "fa fa-th-list", "target": "_self" diff --git a/target/classes/static/api/test.json b/target/classes/static/api/test.json index d5401ac9..e1cd3d68 100644 --- a/target/classes/static/api/test.json +++ b/target/classes/static/api/test.json @@ -161,19 +161,19 @@ { "icon": "fa fa-mail-forward", "href": "", - "title": "材料种类管理", + "title": "物料种类管理", "target": "_self", "child": [ { "icon": "fa fa-th-list", "href": "/materialType_add", - "title": "材料种类添加", + "title": "物料种类添加", "target": "_self" }, { "icon": "layui-icon layui-icon-template-1", "href": "/materialType_view", - "title": "材料种类查询", + "title": "物料种类查询", "target": "_self" } ] @@ -181,19 +181,19 @@ { "icon": "fa fa-mail-forward", "href": "", - "title": "材料管理", + "title": "物料管理", "target": "_self", "child": [ { "icon": "layui-icon layui-icon-template-1", "href": "/material_add", - "title": "创建材料", + "title": "创建物料", "target": "_self" }, { "icon": "layui-icon layui-icon-template-1", "href": "/material_out", - "title": "材料查询", + "title": "物料查询", "target": "_self" } ] diff --git a/target/classes/static/images/sousuo.png b/target/classes/static/images/sousuo.png new file mode 100644 index 0000000000000000000000000000000000000000..98a60c2f9098d1aa04841cde852f3ee5020abe24 GIT binary patch literal 6257 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 literal 0 HcmV?d00001 diff --git a/target/classes/templates/index.html b/target/classes/templates/index.html index f7aba988..66587f60 100644 --- a/target/classes/templates/index.html +++ b/target/classes/templates/index.html @@ -157,9 +157,9 @@ miniAdmin.render(options); - /*$("#scan").on("click",function () { + $("#scan").on("click",function () { alert("扫一扫") - });*/ + }); // 百度统计代码,只统计指定域名 diff --git a/target/classes/templates/pages/application/application-in.html b/target/classes/templates/pages/application/application-in.html index 9f311727..88b46f9f 100644 --- a/target/classes/templates/pages/application/application-in.html +++ b/target/classes/templates/pages/application/application-in.html @@ -11,6 +11,22 @@ + + +

@@ -20,31 +36,42 @@
-
+

- -
- 物料名称: + +
+
+ + +
+ style="display: none" lay-verify="required"/> +
-
- +
-
- +
- +
+
+
+ +
+
@@ -70,8 +97,8 @@
-
-
@@ -112,7 +139,7 @@ function selectCode(obj){} // 用于点击搜索按钮 function selectMaterial(obj){} - // 用于材料名称查询 + // 用于物料名称查询 function selectMaterialByName(obj){} // 用于加载仓库菜单 function openDepositoryTree(obj){} @@ -171,7 +198,7 @@ complete: function () { layer.close(this.layerIndex); } - }) + }); return false; }); @@ -194,32 +221,41 @@ // 获取父元素id var parentId = obj.parentNode.id; NewIdNumber = NewIdNumber + 1; - // 材料名称栏目 + // 物料名称栏目 var materialItem = ` -
+

- -
- + +
+
+ + +
-
- +
-
- + +
+ +
+
+
+
-
@@ -277,16 +313,16 @@ } - // 用于实现通过编码查询材料 + // 用于实现通过编码查询物料 selectCode = function(obj){ // 输入code var code = obj.value; // 获取对应元素 var parent = obj.parentNode.parentNode.parentNode; var children = parent.childNodes[5]; - var materialItem = children.childNodes[3].childNodes; + var materialItem = children.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; $.ajax({ url: "/material/findMatrialByCode?code=" + code, type: "get", @@ -309,15 +345,15 @@ // 用于实现点击搜索按钮 selectMaterial = function (obj) { - var parent = obj.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var parentId = parent.id; var codeChildren = parent.childNodes[7]; var materialChildren = parent.childNodes[5]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; layer.open({ type: 2, @@ -325,8 +361,10 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], content: '/selectMaterialByCard?mname='+mname+'&type=1&clickObj='+parentId, + move : '.layui-layer-title', + fixed:false, end: function () { var mid = materialId.value; $.ajax({ @@ -336,6 +374,9 @@ contentType: "application/json;charset=utf-8", success: function (d) { var code = d.data.code; + if(code === undefined){ + code = ""; + } codeValue.value = code; } }); @@ -344,19 +385,19 @@ }); }; - //用于实现材料名称搜索 + //用于实现物料名称搜索 selectMaterialByName = function (obj) { // 输入code var data = obj.value; // 获取对应元素 - var parent = obj.parentNode.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var materialChildren = parent.childNodes[5]; var codeChildren = parent.childNodes[7]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var req = {}; req.mname = data; $.ajax({ @@ -398,7 +439,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepositoryByCard?type=1&clickObj='+parentId, }); } diff --git a/target/classes/templates/pages/application/application-in_back.html b/target/classes/templates/pages/application/application-in_back.html index 5a479bb6..83f8b1d7 100644 --- a/target/classes/templates/pages/application/application-in_back.html +++ b/target/classes/templates/pages/application/application-in_back.html @@ -22,9 +22,9 @@
- +
-
- +
-
- +
- +
+
+
+ +
+
@@ -64,8 +71,8 @@
-
-
@@ -170,7 +177,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=1', }); }); @@ -184,7 +193,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectMaterial?mname='+mname+'&type=1', end: function () { var mid = $("#mid").val(); @@ -194,7 +205,10 @@ dataType: 'json', contentType: "application/json;charset=utf-8", success: function (d) { - var code = d.data.code + var code = d.data.code; + if(code === undefined){ + code = ""; + } $("#code").val(code) } diff --git a/target/classes/templates/pages/application/application-out.html b/target/classes/templates/pages/application/application-out.html index 739e2fdf..5d856ac2 100644 --- a/target/classes/templates/pages/application/application-out.html +++ b/target/classes/templates/pages/application/application-out.html @@ -11,6 +11,19 @@ +
@@ -24,27 +37,29 @@
- -
- + +
+
+ + +
-
- +
-
- +
-
@@ -61,7 +76,7 @@
-
@@ -106,7 +121,7 @@ function selectCode(obj){} // 用于点击搜索按钮 function selectMaterial(obj){} - // 用于材料名称查询 + // 用于物料名称查询 function selectMaterialByName(obj){} // 用于暂存卡片个数 var params = []; @@ -127,9 +142,7 @@ stepItems: [{ title: '填写信息' }, { - title: '审核中' - }, { - title: '等待出库' + title: '提交成功' }] }); @@ -185,32 +198,34 @@ // 获取父元素id var parentId = obj.parentNode.id; NewIdNumber = NewIdNumber + 1; - // 材料名称栏目 + // 物料名称栏目 var materialItem = `

- -
- 物料名称 +
+
+ + +
-
- +
-
- +
-
@@ -256,16 +271,16 @@ return result; } - // 用于实现通过编码查询材料 + // 用于实现通过编码查询物料 selectCode = function(obj){ // 输入code var code = obj.value; // 获取对应元素 var parent = obj.parentNode.parentNode.parentNode; var children = parent.childNodes[5]; - var materialItem = children.childNodes[3].childNodes; + var materialItem = children.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; $.ajax({ url: "/material/findMatrialByCode?code=" + code, type: "get", @@ -288,15 +303,15 @@ // 用于实现点击搜索按钮 selectMaterial = function (obj) { - var parent = obj.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var parentId = parent.id; var codeChildren = parent.childNodes[7]; var materialChildren = parent.childNodes[5]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var mname = materialName.value; layer.open({ type: 2, @@ -304,8 +319,10 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], - content: '/selectMaterialByCard?mname='+mname+'&type=1&clickObj='+parentId, + area: ['70%', '70%'], + content: '/selectMaterialByCard?mname='+mname+'&type=2&clickObj='+parentId, + move : '.layui-layer-title', + fixed:false, end: function () { var mid = materialId.value; $.ajax({ @@ -315,6 +332,9 @@ contentType: "application/json;charset=utf-8", success: function (d) { var code = d.data.code; + if(code === undefined){ + code = ""; + } codeValue.value = code; } }); @@ -323,19 +343,19 @@ }); }; - //用于实现材料名称搜索 + //用于实现物料名称搜索 selectMaterialByName = function (obj) { // 输入code var data = obj.value; // 获取对应元素 - var parent = obj.parentNode.parentNode.parentNode; + var parent = obj.parentNode.parentNode.parentNode.parentNode; var materialChildren = parent.childNodes[5]; var codeChildren = parent.childNodes[7]; var codeItem = codeChildren.childNodes[3].childNodes; var codeValue = codeItem[1]; - var materialItem = materialChildren.childNodes[3].childNodes; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; var materialName = materialItem[1]; - var materialId = materialItem[3]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; var req = {}; req.mname = data; $.ajax({ @@ -368,6 +388,8 @@ }; + + }) diff --git a/target/classes/templates/pages/application/application-out_back.html b/target/classes/templates/pages/application/application-out_back.html index 8706b7ea..1ef9201a 100644 --- a/target/classes/templates/pages/application/application-out_back.html +++ b/target/classes/templates/pages/application/application-out_back.html @@ -21,9 +21,9 @@
- +
-
- +
-
- +
- +
@@ -154,7 +154,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -168,7 +170,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectMaterial?mname='+mname+'&type=2', end: function () { var mid = $("#mid").val(); @@ -178,7 +182,10 @@ dataType: 'json', contentType: "application/json;charset=utf-8", success: function (d) { - var code = d.data.code + var code = d.data.code; + if(code === undefined){ + code = ""; + } $("#code").val(code) } diff --git a/target/classes/templates/pages/application/application-review.html b/target/classes/templates/pages/application/application-review.html index 9681f867..3efaf17c 100644 --- a/target/classes/templates/pages/application/application-review.html +++ b/target/classes/templates/pages/application/application-review.html @@ -32,7 +32,7 @@ 123456 - 材料名称 + 物料名称 骁龙888芯片 diff --git a/target/classes/templates/pages/application/application-transfer.html b/target/classes/templates/pages/application/application-transfer.html index 10267d00..56f7e973 100644 --- a/target/classes/templates/pages/application/application-transfer.html +++ b/target/classes/templates/pages/application/application-transfer.html @@ -11,6 +11,20 @@ +
@@ -25,27 +39,30 @@
- -
- 物料名称: +
+
+ + +
- +
- +
-
- +
- +
@@ -67,7 +84,7 @@
-
@@ -92,20 +109,6 @@
-
-
- -
- 入款成功 -
-
预计两小时到账
-
-
- - -
-
@@ -127,7 +130,7 @@ function selectCode(obj){} // 用于点击搜索按钮 function selectMaterial(obj){} - // 用于材料名称查询 + // 用于物料名称查询 function selectMaterialByName(obj){} // 用于加载仓库菜单 function openDepositoryTree(obj){} @@ -149,11 +152,7 @@ stepItems: [{ title: '填写信息' }, { - title: '审核中' - }, { - title: '等待出库' - },{ - title: '等待入库' + title: '提交成功' }] }); @@ -211,37 +210,39 @@ // 获取父元素id var parentId = obj.parentNode.id; NewIdNumber = NewIdNumber + 1; - // 材料名称栏目 + // 物料名称栏目 var materialItem = ` -
+

- -
- + +
+
+ + +
-
- +
-
- +
-
- +
- +
- +
- +
- +
diff --git a/target/classes/templates/pages/application/application_in_multi.html b/target/classes/templates/pages/application/application_in_multi.html index d181256b..fe64fe79 100644 --- a/target/classes/templates/pages/application/application_in_multi.html +++ b/target/classes/templates/pages/application/application_in_multi.html @@ -100,7 +100,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=1', }); }); @@ -114,7 +116,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area: ['800px', '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectMaterial?mname='+mname+'&type=1', end: function () { var mid = $("#mid").val(); @@ -124,7 +128,10 @@ dataType: 'json', contentType: "application/json;charset=utf-8", success: function (d) { - var code = d.data.code + var code = d.data.code; + if(code === undefined){ + code = ""; + } $("#code").val(code) } diff --git a/target/classes/templates/pages/application/application_multi.html b/target/classes/templates/pages/application/application_multi.html index abde3f39..397f1135 100644 --- a/target/classes/templates/pages/application/application_multi.html +++ b/target/classes/templates/pages/application/application_multi.html @@ -64,11 +64,12 @@ cols: [ [ {type: "checkbox", width: 50}, - {field: 'mname', width: '10%', title: '材料名称'}, + {field: 'mname', width: '10%', title: '物料名称'}, {field: 'version', width: '10%', title: '规格型号'}, {field: 'code',width: 200,title: '存货编码',sort: true}, {field: 'depositoryName', width: '12%', title: '仓库名称'}, {field: 'quantity', width: '10%', title: '数量',edit:'quantity'}, + {field: 'price', width: '10%', title: '单价',edit:'price'}, {field: 'depositoryId', width: '10%', title: '仓库编号',edit:'quantity'}, {field: 'applyRemark', width: '10%', title: '备注说明',edit:'applyRemark'}, {title: '操作', minWidth: 250, toolbar: '#currentTableBar', align: "center"} @@ -105,11 +106,13 @@ req.depositoryIds = []; req.quantitys = []; req.applyRemarks = []; + req.prices = []; for (i = 0, len = data.length; i < len; i++) { req.mids[i] = data[i].mid; req.depositoryIds[i] = data[i].depositoryId; req.quantitys[i] = data[i].quantity; req.applyRemarks[i] = data[i].applyRemark; + req.prices[i] = data[i].price; } if(obj.event==='delete'){ if(req.mids > 0) { diff --git a/target/classes/templates/pages/application/form-step-look.html b/target/classes/templates/pages/application/form-step-look.html index 862a9f30..98736548 100644 --- a/target/classes/templates/pages/application/form-step-look.html +++ b/target/classes/templates/pages/application/form-step-look.html @@ -31,7 +31,7 @@ 123456 - 材料名称 + 物料名称 骁龙888芯片 diff --git a/target/classes/templates/pages/application/form-step-look_back.html b/target/classes/templates/pages/application/form-step-look_back.html index 902e071d..1a10557e 100644 --- a/target/classes/templates/pages/application/form-step-look_back.html +++ b/target/classes/templates/pages/application/form-step-look_back.html @@ -31,7 +31,7 @@ 123456 - 材料名称 + 物料名称 骁龙888芯片 @@ -118,13 +118,22 @@ var state=$("#state").text(); //当前处于的状态 - var position=0,states={}; - if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { + var position=0,states={},number = 1; + /*if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { position = 1; states = [{title: "提交申请"}, {title: state}, {title: "未入库"}]; } else { position = 2; states = [{title: "提交申请"}, {title: "审核通过"}, {title: state}]; + }*/ + if (state === "待部门负责人审核" || state === "部门负责人审核未通过") { + // , {title: "未入库"} + states = [ {title: state}]; + number = 2; + } else { + // {title: "提交申请"}, + states = [ {title: state}]; + number = 3; } step.render({ elem: '#stepForm', @@ -132,6 +141,7 @@ width: '100%', //设置容器宽度 stepWidth: '750px', height: '650px', + number:number, position: position, stepItems: states }); diff --git a/target/classes/templates/pages/chart/chart-in.html b/target/classes/templates/pages/chart/chart-in.html index 95f1f8ec..79bdef55 100644 --- a/target/classes/templates/pages/chart/chart-in.html +++ b/target/classes/templates/pages/chart/chart-in.html @@ -37,7 +37,7 @@
-
转入材料数量
+
转入物料数量
@@ -55,7 +55,7 @@
-
转入材料金额
+
转入物料金额
@@ -73,7 +73,7 @@
-
购入材料数量
+
购入物料数量
@@ -91,7 +91,7 @@
-
入库材料金额
+
入库物料金额
diff --git a/target/classes/templates/pages/chart/chart-in_back.html b/target/classes/templates/pages/chart/chart-in_back.html index 47f6eba6..a7540d46 100644 --- a/target/classes/templates/pages/chart/chart-in_back.html +++ b/target/classes/templates/pages/chart/chart-in_back.html @@ -37,7 +37,7 @@
-
转入材料数量
+
转入物料数量
@@ -55,7 +55,7 @@
-
转入材料金额
+
转入物料金额
@@ -73,7 +73,7 @@
-
购入材料数量
+
购入物料数量
@@ -91,7 +91,7 @@
-
入库材料金额
+
入库物料金额
diff --git a/target/classes/templates/pages/chart/chart-out.html b/target/classes/templates/pages/chart/chart-out.html index 3d8f981d..77500945 100644 --- a/target/classes/templates/pages/chart/chart-out.html +++ b/target/classes/templates/pages/chart/chart-out.html @@ -37,7 +37,7 @@
-
转出材料数量
+
转出物料数量
@@ -55,7 +55,7 @@
-
转出材料金额
+
转出物料金额
@@ -73,7 +73,7 @@
-
购出材料数量
+
购出物料数量
@@ -91,7 +91,7 @@
-
出库材料金额
+
出库物料金额
diff --git a/target/classes/templates/pages/chart/chart-out_back.html b/target/classes/templates/pages/chart/chart-out_back.html index d273bf37..283d29c5 100644 --- a/target/classes/templates/pages/chart/chart-out_back.html +++ b/target/classes/templates/pages/chart/chart-out_back.html @@ -37,7 +37,7 @@
-
转出材料数量
+
转出物料数量
@@ -55,7 +55,7 @@
-
转出材料金额
+
转出物料金额
@@ -73,7 +73,7 @@
-
出售材料数量
+
出售物料数量
@@ -91,7 +91,7 @@
-
出库材料金额
+
出库物料金额
diff --git a/target/classes/templates/pages/chart/chart-stock.html b/target/classes/templates/pages/chart/chart-stock.html index d41c45d6..b8e93f1c 100644 --- a/target/classes/templates/pages/chart/chart-stock.html +++ b/target/classes/templates/pages/chart/chart-stock.html @@ -37,7 +37,7 @@
-
库存材料数量
+
库存物料数量
@@ -55,7 +55,7 @@
-
库存材料金额
+
库存物料金额
@@ -73,7 +73,7 @@
-
库存材料数量
+
库存物料数量
@@ -91,7 +91,7 @@
-
库存材料金额
+
库存物料金额
diff --git a/target/classes/templates/pages/depository/table-in.html b/target/classes/templates/pages/depository/table-in.html index a7205e2d..cf14d2dc 100644 --- a/target/classes/templates/pages/depository/table-in.html +++ b/target/classes/templates/pages/depository/table-in.html @@ -36,11 +36,11 @@
- +
- +
@@ -87,7 +87,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -127,7 +129,7 @@ {type: "checkbox", width: 50}, {field: 'id', width: 100, title: '提交编号', sort: true}, {field: 'aircode', width: 100, title: '提交编码', sort: true}, - {field: 'mname', width: 120, title: '材料名称'}, + {field: 'mname', width: 120, title: '物料名称'}, {field: 'mcode', width: 120, title: '存货编码'}, {field: 'depositoryName', width: 120, title: '仓库名称'}, {field: 'quantity', width: 80, title: '数量', sort: true}, diff --git a/target/classes/templates/pages/depository/table-out.html b/target/classes/templates/pages/depository/table-out.html index e2815c84..5029ac62 100644 --- a/target/classes/templates/pages/depository/table-out.html +++ b/target/classes/templates/pages/depository/table-out.html @@ -36,10 +36,10 @@
- +
@@ -87,7 +87,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -127,7 +129,7 @@ {type: "checkbox", width: 50}, {field: 'id', width: 100, title: '申请编号', sort: true}, {field: 'code', width: 100, title: '申请编码', sort: true}, - {field: 'mname', width: 120, title: '材料名称'}, + {field: 'mname', width: 120, title: '物料名称'}, {field: 'mcode', width: 120, title: '存货编码'}, {field: 'depositoryName', width: 120, title: '仓库名称'}, {field: 'quantity', width: 80, title: '数量', sort: true}, diff --git a/target/classes/templates/pages/depository/table-stock.html b/target/classes/templates/pages/depository/table-stock.html index c0d0346b..b527acaa 100644 --- a/target/classes/templates/pages/depository/table-stock.html +++ b/target/classes/templates/pages/depository/table-stock.html @@ -29,7 +29,7 @@
- +
@@ -55,6 +55,7 @@
+
@@ -68,9 +69,10 @@ diff --git a/target/classes/templates/pages/material/material-add.html b/target/classes/templates/pages/material/material-add.html index cb338690..98797603 100644 --- a/target/classes/templates/pages/material/material-add.html +++ b/target/classes/templates/pages/material/material-add.html @@ -13,7 +13,7 @@
- 材料创建 + 物料创建
@@ -21,9 +21,9 @@
- +
-
@@ -42,28 +42,12 @@
- +
- - -
-
+ -
- -
- - - -
-
-
- -
-
@@ -80,24 +64,10 @@ name="unit" lay-verify="required"/>
-
- -
- -
-
-
- -
- -
-
@@ -131,7 +101,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectType', }); }); @@ -143,7 +115,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/target/classes/templates/pages/material/material-add_back.html b/target/classes/templates/pages/material/material-add_back.html new file mode 100644 index 00000000..e46289a6 --- /dev/null +++ b/target/classes/templates/pages/material/material-add_back.html @@ -0,0 +1,210 @@ + + + + + layui + + + + + + + +
+
+
+ 物料创建 +
+
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+ +
+ +
+ + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/target/classes/templates/pages/material/material-out.html b/target/classes/templates/pages/material/material-out.html index bc05f2b7..e246f01c 100644 --- a/target/classes/templates/pages/material/material-out.html +++ b/target/classes/templates/pages/material/material-out.html @@ -33,15 +33,15 @@
- - + +
- +
@@ -66,9 +66,17 @@
+
+ +
+ + +
+
+ - - -
@@ -108,7 +111,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectType', }); }); @@ -120,7 +125,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); @@ -156,18 +163,12 @@ {type: "checkbox", width: 50}, {field: 'code',width: 150,title: '存货编码',sort: true}, {field: 'id', width: 100, title: 'EAS编号',hidden:true}, - {field: 'mname', width: 120, title: '材料名称', sort: false}, - {field: 'typeName',width: 150,title: '材料种类'}, + {field: 'mname', width: 120, title: '物料名称', sort: false}, + {field: 'typeName',width: 150,title: '物料种类'}, {field: 'version',width: 200,title: '规格型号',sort: false}, {field: 'texture',width: 100,title: '材质'}, {field: 'unit',width: 150,title: '计量单位'}, - {field: 'depositoryCode',width: 250,title: '仓库编码',sort: true}, - {field: "depositoryName",width: 120,title: "仓库名称"}, - {field: 'quantity',width: 120,title:'数量',sort: true}, - {field: 'price',width: 150,title: '单价',sort: true}, - {field: 'amounts',width: 180,title: '总金额',sort: true}, {field: 'state', title:'状态', minWidth: 80, templet: '#switchTpl'}, - {title: '仓管员', minWidth: 80, templet: '#selectManager' ,align: "center"}, {title: '操作', minWidth: 200, toolbar: '#currentTableBar', align: "center"} ]], limits: [10, 15, 20, 25, 50], @@ -274,33 +275,52 @@ return false; } } + else if(obj.event === 'createQrCode'){ + $.ajax({ + url:"/material/createQrCode?mid=3", + dataType: 'json', + type: 'get', + contentType: "application/json;charset=utf-8", + success:function (data) { + if(data.status != 200){ + layer.msg(data.statusInfo.messgae) + }else{ + $("#qrCode").attr("src",data.data); + } + } + }) + } }); + //用于导入数据 var upLoader = upload.render({ elem:"#u_fileUpload", // 绑定元素 - url:'/excel/importExcel', // 上传接口 + url:'/excel/importExcelByMaterial', // 上传接口 accept:'file', // 允许上传的格式, + before: function(obj) { //obj参数包含的信息,跟 choose回调完全一致,可参见上文。 + layer.load(); //上传loading + }, exts:'xls|xlsx|csv', done:function(res){ + layer.closeAll('loading'); //关闭loading //如果上传成功 - console.log(res) + for (let i = 0; i < res.data.errMsg.length; i++) { + var show = "

"+res.data.errMsg[i] + ":错误"+"

" + re += show + } if(res.code == 200){ var re = "" for (let i = 0; i < res.data.dataList.length; i++) { - var mname = res.data.dataList[i]["mname"] - var code = res.data.dataList[i]["code"] - var version = res.data.dataList[i]["version"] - var texture = res.data.dataList[i]["texture"] - var price = res.data.dataList[i]["price"] - var quantity = res.data.dataList[i]["quantity"] - var unit = res.data.dataList[i]["unit"] - var show = "

"+mname + " "+ version+" " +code+" "+texture +" "+price +" "+quantity +" "+unit +":成功" +"

" - re += show - } - for (let i = 0; i < res.data.errMsg.length; i++) { - var show = "

"+res.data.errMsg[i] + ":错误"+"

" + var mname = res.data.dataList[i]["mname"]; + var code = res.data.dataList[i]["code"] == null || res.data.dataList[i]["code"] == undefined ?"":res.data.dataList[i]["code"]; + var version = res.data.dataList[i]["version"] == null || res.data.dataList[i]["version"] == undefined ?"":res.data.dataList[i]["version"]; + var texture = res.data.dataList[i]["texture"] == null || res.data.dataList[i]["texture"] == undefined ?"":res.data.dataList[i]["texture"]; + var unit = res.data.dataList[i]["unit"] == null || res.data.dataList[i]["unit"] == undefined ?"":res.data.dataList[i]["unit"]; + var typeId = res.data.dataList[i]["typeId"] == null || res.data.dataList[i]["typeId"] == undefined ?"":res.data.dataList[i]["typeId"]; + var show = "

"+mname + " "+ version+" " +code+" "+texture +" "+unit +" "+typeId+" :成功" +"

" re += show } + layer.open({ type: 1, skin: 'layui-layer-rim', //加上边框 @@ -313,6 +333,7 @@ }, error:function (){ + layer.closeAll('loading'); //关闭loading var demoText = $('#demoText'); demoText.html('上传失败 重试'); demoText.find('.demo-reload').on('click', function(){ @@ -338,6 +359,15 @@ shadeClose: true, area: ['100%', '100%'], content: '/material_view?id='+data.id, + end:function () { + //执行搜索重载 + table.reload('currentTableId', { + url: '/material/material', + page: { + curr: 1 + } + }, 'data'); + } }); $(window).on("resize", function () { layer.full(index); diff --git a/target/classes/templates/pages/material/material-out_back.html b/target/classes/templates/pages/material/material-out_back.html new file mode 100644 index 00000000..ae4c67a3 --- /dev/null +++ b/target/classes/templates/pages/material/material-out_back.html @@ -0,0 +1,494 @@ + + + + + layui + + + + + + + +
+
+
+ 搜索信息 +
+
+
+ +
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+ + +
+
+ + + + + + +
+ + + + + +
+
+ + + + + \ No newline at end of file diff --git a/target/classes/templates/pages/material/material-view.html b/target/classes/templates/pages/material/material-view.html index e39a5e3c..af559572 100644 --- a/target/classes/templates/pages/material/material-view.html +++ b/target/classes/templates/pages/material/material-view.html @@ -14,13 +14,13 @@
- +
@@ -37,52 +37,32 @@
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- +
- + +
- +
- +
- +
- - - +
+
- +
- +
+ + + + + \ No newline at end of file diff --git a/target/classes/templates/pages/place/place_edit.html b/target/classes/templates/pages/place/place_edit.html new file mode 100644 index 00000000..3718bfa0 --- /dev/null +++ b/target/classes/templates/pages/place/place_edit.html @@ -0,0 +1,131 @@ + + + + + layui + + + + + + + +
+
+
+ 库位创建 +
+
+
+
+
+
+ + + +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/target/classes/templates/pages/post/postRole_add.html b/target/classes/templates/pages/post/postRole_add.html index 32b452fb..c45db8ac 100644 --- a/target/classes/templates/pages/post/postRole_add.html +++ b/target/classes/templates/pages/post/postRole_add.html @@ -66,7 +66,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/target/classes/templates/pages/post/postRole_edit.html b/target/classes/templates/pages/post/postRole_edit.html index 9947a275..86315f0a 100644 --- a/target/classes/templates/pages/post/postRole_edit.html +++ b/target/classes/templates/pages/post/postRole_edit.html @@ -73,7 +73,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/target/classes/templates/pages/user/user-add.html b/target/classes/templates/pages/user/user-add.html index bd0ea24e..94a514a8 100644 --- a/target/classes/templates/pages/user/user-add.html +++ b/target/classes/templates/pages/user/user-add.html @@ -62,7 +62,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/target/classes/templates/pages/user/user-email.html b/target/classes/templates/pages/user/user-email.html index beebbb9c..6e93c58d 100644 --- a/target/classes/templates/pages/user/user-email.html +++ b/target/classes/templates/pages/user/user-email.html @@ -21,7 +21,7 @@
-

验证码将发送至767564319@qq.com

+

验证码将发送至1789131794@qq.com

如果长时间未收到验证码,请检查垃圾箱

diff --git a/target/classes/templates/pages/user/user-role-edit.html b/target/classes/templates/pages/user/user-role-edit.html index 129f35c7..f9ba73ab 100644 --- a/target/classes/templates/pages/user/user-role-edit.html +++ b/target/classes/templates/pages/user/user-role-edit.html @@ -67,7 +67,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/target/classes/templates/pages/warehouse/depository-out.html b/target/classes/templates/pages/warehouse/depository-out.html index 465a4761..97b2e55c 100644 --- a/target/classes/templates/pages/warehouse/depository-out.html +++ b/target/classes/templates/pages/warehouse/depository-out.html @@ -348,8 +348,8 @@ area: ['100%', '100%'], content: '/warehouse_view?id=' + data.id, end:function () { - req = {} - req.parentId = parentId + req = {}; + req.parentId = parentId; //执行搜索重载 table.reload('currentTableId', { url: '/repository/warehouseRecord', diff --git a/target/classes/templates/pages/warehouse/depository_add.html b/target/classes/templates/pages/warehouse/depository_add.html index 1830fd06..54606a41 100644 --- a/target/classes/templates/pages/warehouse/depository_add.html +++ b/target/classes/templates/pages/warehouse/depository_add.html @@ -36,11 +36,13 @@
-
+
+
+
@@ -133,7 +135,9 @@ skin: 'layui-layer-rim', maxmin: true, shadeClose: true, //点击遮罩关闭层 - area : ['800px' , '500px'], + area: ['70%', '70%'], + move : '.layui-layer-title', + fixed:false, content: '/selectDepository?type=2', }); }); diff --git a/target/classes/templates/pages/warehouse/warehouseByParentId.html b/target/classes/templates/pages/warehouse/warehouseByParentId.html index d6e04019..fd0af77c 100644 --- a/target/classes/templates/pages/warehouse/warehouseByParentId.html +++ b/target/classes/templates/pages/warehouse/warehouseByParentId.html @@ -20,18 +20,27 @@
- +
- + +
+
+
+ +
+ +
+
+
+ +
+
- +
- +
@@ -56,8 +65,9 @@ @@ -69,6 +79,11 @@ 删除 + + +
@@ -80,7 +95,7 @@ var parentId = document.getElementById("parentId").value; table.render({ elem: "#currentTableId", - url: '/repository/allWarehouseByParent?parentId='+parentId, + url: '/place/findPlace?did='+parentId, parseData: function (res) { //res 即为原始返回的数据 return { "status": res.status, //解析接口状态 @@ -107,25 +122,20 @@ defaultToolbar: ['filter', 'exports', 'print'], cols: [ [ {type: "checkbox", width: 50}, - {field: 'id', width: 100, title: '仓库编号', sort: true}, - {field: 'dname', width: 120, title: '仓库名称', sort: true}, - {field: 'address',width: 120,title:'仓库地址',sort: true}, - {field: 'introduce',width: 200,title: '仓库介绍',sort: true}, - { - field: 'state', title: '状态', minWidth: 80, sort: true, templet: function (d) { - if (d.state == 1){ - return "启用"; - }else if(d.state == 2){ - return "禁用"; - } - } - }, + {field: 'code', width: 120, title: '库位号', sort: true}, + {field: 'mname',width: 200,title: '物料名称'}, + {field: 'depositoryName',width: 200,title: '仓库名称'}, + {field: 'depositoryCode',width: 200,title: '仓库编码'}, + {field: 'state', title:'状态', minWidth: 80, templet: '#switchTpl'}, {title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"} ]], limits: [10, 15, 20, 25, 50], limit: 10, page: true, - skin: 'line' + skin: 'line', + done: function () { + $("[data-field='id']").css('display','none'); + } }); // 监听搜索操作 @@ -145,7 +155,7 @@ req.parentId = parentId //执行搜索重载 table.reload('currentTableId', { - url: '/repository/warehouseRecord', + url: '/place/findPlace', page: { curr: 1 }, @@ -166,12 +176,13 @@ maxmin: true, shadeClose: true, area: ['100%', '100%'], - content: '/depository_add', + content: '/insertPlace?depositoryId='+parentId, }); $(window).on("resize", function () { layer.full(index); }); - } else if (obj.event === 'delete') { // 监听删除操作 + } + else if (obj.event === 'delete') { // 监听删除操作 var checkStatus = table.checkStatus('currentTableId') , data = checkStatus.data; var req={}; @@ -180,7 +191,7 @@ req.ids[i]=data[i].id; } $.ajax({ - url: '/repository/depository_del', + url: '/place/deletePlace', dataType:'json', type:'POST', contentType: "application/json;charset=utf-8", @@ -200,7 +211,7 @@ }); //执行搜索重载 table.reload('currentTableId', { - url: '/repository/warehouseRecord', + url: '/place/findPlace', page: { curr: 1 } @@ -210,6 +221,9 @@ } }) } + else if(obj.event === 'addList'){ + + } }); //监听表格复选框选择 @@ -222,13 +236,26 @@ if (obj.event === 'detail') { var index = layer.open({ - title: '仓库信息详情', + title: '库位信息详情', type: 2, shade: 0.2, maxmin: true, shadeClose: true, area: ['100%', '100%'], - content: '/warehouse_view?id='+data.id, + content: '/placeView?id='+data.id, + end:function () { + req = {}; + req.parentId = parentId; + //执行搜索重载 + table.reload('currentTableId', { + url: '/place/findPlace', + page: { + curr: 1 + }, + where: req + }, 'data'); + return false; + } }); $(window).on("resize", function () { layer.full(index); @@ -239,7 +266,7 @@ req.id=data.id; layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) { $.ajax({ - url: '/repository/depository_del', + url: '/place/deletePlace', dataType:'json', type:'POST', contentType: "application/json;charset=utf-8", @@ -264,6 +291,42 @@ }); } }); + + + //监听状态操作 + form.on('switch(changeState)', function(obj){ + var req = new Map; + if(obj.elem.checked){ + req["state"] = 1 + } + req["id"] = this.value; + console.log(JSON.stringify(req)) + $.ajax({ + url: "/place/place_edit", + type: 'post', + dataType: 'json', + contentType: "application/json;charset=utf-8", + data: JSON.stringify(req), + beforeSend: function () { + this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']}); + }, + success: function (data) { + layer.close(this.layerIndex); + if (data.status >= 300) { + layer.msg(data.statusInfo.message);//失败的表情 + return; + } else { + layer.msg("修改成功", { + icon: 6,//成功的表情 + time: 500 //1秒关闭(如果不配置,默认是3秒) + },function(){ + window.location='/warehouseByParentId?parentId='+parentId; + }) + } + } + + }) + }); }); diff --git a/target/classes/templates/pages/warehouse/warehouse_view.html b/target/classes/templates/pages/warehouse/warehouse_view.html index 9eacce61..55077983 100644 --- a/target/classes/templates/pages/warehouse/warehouse_view.html +++ b/target/classes/templates/pages/warehouse/warehouse_view.html @@ -140,7 +140,7 @@ layer.msg(data.statusInfo.message);//失败的表情 return; } else { - layer.msg("仓库信息成功", { + layer.msg("修改仓库信息成功", { icon: 6,//成功的表情 time: 500 //1秒关闭(如果不配置,默认是3秒) },function(){ diff --git a/target/idm.crx b/target/idm.crx new file mode 100644 index 0000000000000000000000000000000000000000..3d8904a46e94f8473f65eb7d37f1d76b89fea8ab GIT binary patch literal 96156 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

a-ZP2g2oqV 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

V-Cs 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 literal 0 HcmV?d00001