diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java b/src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java new file mode 100644 index 00000000..a3dfae46 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java @@ -0,0 +1,363 @@ +package com.dreamchaser.depository_manage.controller; + +import com.dreamchaser.depository_manage.entity.*; +import com.dreamchaser.depository_manage.exception.MyException; +import com.dreamchaser.depository_manage.pojo.GroupInfoP; +import com.dreamchaser.depository_manage.pojo.RestResponse; +import com.dreamchaser.depository_manage.pojo.StatusInfo; +import com.dreamchaser.depository_manage.service.DepositoryService; +import com.dreamchaser.depository_manage.service.GroupService; +import com.dreamchaser.depository_manage.service.MaterialService; +import com.dreamchaser.depository_manage.utils.CrudUtil; +import com.dreamchaser.depository_manage.utils.DateUtil; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.sql.Time; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/group") +public class GroupController { + + @Autowired + GroupService groupService; + + @Autowired + DepositoryService depositoryService; + + @Autowired + MaterialService materialService; + + + /** + * 用于添加一条套餐记录 + * + * @param map 添加数据 + * @param request + * @return + */ + @PostMapping("/addGroup") + public RestResponse addGroup(@RequestBody Map map, HttpServletRequest request) { + // 获取物料数量 + Integer len = ObjectFormatUtil.toInteger(map.get("len")); + + // 获取添加成功的数量 + Integer integer = groupService.addGroup(map); + return CrudUtil.postHandle(len, integer); + } + + + @PostMapping("/findGroupByCode") + public RestResponse findGroupByCode(@RequestBody Map map, HttpServletRequest request) { + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + // 获取当前部门仓库 + List depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString()); + String code = map.get("code").toString(); + + // 获取套餐编码 + Group groupByCode = groupService.findGroupByCode(code); + + if(groupByCode != null) { + + + Map paramForGetGroup = new HashMap<>(); + paramForGetGroup.put("gid", groupByCode.getId()); + + // 获取当前套餐的所有物料数据 + List groupByGid = groupService.findGroupByCondition(paramForGetGroup); + + // 用于标识当前套餐是否可以正常出库 + boolean flag = true; + for (int i = 0; i < groupByGid.size(); i++) { + + // 获取详细信息 + GroupInfo groupInfo = groupByGid.get(i); + // 获取该物料的库存 + List inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo.getMid(), depositoryByAdminorg); + // 用于标志当前物料库存是否符合要求 + boolean flagForQuantity = false; + for (int j = 0; j < inventoryByMidAndDepository.size(); j++) { + Integer quantity = inventoryByMidAndDepository.get(j); + // 如果库存符合要求 + if (quantity > groupInfo.getQuantity()) { + flagForQuantity = true; + } + } + if (!flagForQuantity) { + // 如果当前不符合 + flag = false; + break; + } + + } + if (flag) { + return new RestResponse(groupByGid); + } else { + return new RestResponse(null,666,new StatusInfo("不能出库","当前套餐中有物料库存不足")); + } + }else{ + return new RestResponse(null,666,new StatusInfo("失败","暂无该套餐,请确认是否正确")); + } + } + + + /** + * 用于给套餐添加物料信息 + * + * @param map 添加物料信息 + * @param request + * @return + */ + @PostMapping("/addMaterialForGroup") + public RestResponse addMaterialForGroup(@RequestBody Map map, HttpServletRequest request) { + if (map.containsKey("gid")) { + // 获取物料数量 + Integer len = ObjectFormatUtil.toInteger(map.get("len")); + + Integer integer = groupService.addMaterialForGroup(map); + return CrudUtil.postHandle(len, integer); + } else { + throw new MyException("缺少必要参数"); + } + } + + /** + * 根据条件获取所有套餐 + * + * @param map 查询条件 + * @return + */ + @GetMapping("/findAllGroup") + public RestResponse findAllGroup(@RequestParam Map map) { + if (map.containsKey("createTime")) { + String createTime = (String) map.get("createTime"); + Long timeStamp = DateUtil.DateTimeToTimeStamp(createTime); + map.put("createTime", timeStamp); + } + if (!map.containsKey("state")) { + map.put("state", 1); + } + List groupPByCondition = groupService.findOnlyGroupByCondition(map); + return new RestResponse(groupPByCondition, groupService.findAllGroupOnlyCount(map), 200); + } + + + /** + * 根据套餐名称获取套餐 + * @param map 套餐名称 + * @return + */ + @PostMapping("/findGroupByGname") + public RestResponse findGroupByGname(@RequestBody Map map){ + if(map.containsKey("gname")){ + List groupOnlyByCondition = groupService.findGroupOnlyByCondition(map); + int size = groupOnlyByCondition.size(); + if(size > 1){ + // 如果当前名称的套餐大于1个 + + return new RestResponse("",-1,444); + }else if(size == 1){ + // 如果刚好只有一个 + // 获取当前套餐的所有物料数据 + List groupByGid = groupService.findGroupByCondition(map); + return new RestResponse(groupByGid,groupByGid.size(),200); + + }else{ + // 如果没有 + return new RestResponse("",0,666); + } + }else{ + throw new MyException("缺少必要参数"); + } + } + + /** + * 查询套餐详情 + * + * @param map + * @return + */ + @GetMapping("findGroupInfo") + public RestResponse findGroupInfo(@RequestParam Map map) { + if (map.containsKey("gid")) { + List groupByCondition = groupService.findGroupByCondition(map); + return new RestResponse(groupByCondition, groupService.findGroupCountByCondition(map), 200); + } else { + throw new MyException("缺失必要参数!"); + } + } + + /** + * 修改套餐中的物料数据 + * + * @param map + * @return + */ + @PostMapping("/materialForGroupEdit") + public RestResponse materialForGroupEdit(@RequestBody Map map) { + if (map.containsKey("id")) { + Integer integer = groupService.updateMaterialForGroup(map); + return CrudUtil.putHandle(1, integer); + } else { + throw new MyException("缺少必要参数!"); + } + } + + /** + * 删除套餐中的物料 + * + * @param map 删除条件 + * @return + */ + @PostMapping("/delMaterialForGroup") + public RestResponse delMaterialForGroup(@RequestBody Map map) { + if (map.containsKey("id")) { + Integer id = ObjectFormatUtil.toInteger(map.get("id")); + Integer integer = groupService.delMaterialForGroupById(id); + return CrudUtil.deleteHandle(1, integer); + + } else if (map.containsKey("ids")) { + List ids = (List) map.get("ids"); + Integer integer = groupService.delMaterialForGroupByIds(ids); + return CrudUtil.deleteHandle(ids.size(), integer); + } else { + throw new MyException("缺少必要参数"); + } + } + + + /** + * 用于修改套餐的状态 + * + * @param map 条件 + * @return + */ + @PostMapping("/changeGroupState") + public RestResponse changeGroupState(@RequestBody Map map) { + if (map.containsKey("id")) { + Integer integer = groupService.updateGroupState(map); + return CrudUtil.putHandle(1, integer); + } else { + throw new MyException("缺少必要参数"); + } + } + + + /** + * 用于修改套餐信息 + * @param map 修改条件 + * @return + */ + @PostMapping("/editGroupInfo") + public RestResponse editGroupInfo(@RequestBody Map map){ + if(map.containsKey("id")){ + Integer integer = groupService.updateGroupInfo(map); + return CrudUtil.putHandle(1,integer); + }else{ + throw new MyException("缺少必要参数"); + } + } + + + /** + * 删除套餐(软删除) + * + * @param map 删除条件 + * @return + */ + @PostMapping("/delGroup") + public RestResponse delGroup(@RequestBody Map map) { + if (map.containsKey("id")) { + map.put("state", 3); + Integer integer = groupService.updateGroupState(map); + return CrudUtil.putHandle(1, integer); + } else if (map.containsKey("ids")) { + List ids = (List) map.get("ids"); + Integer integer = 0; + for (int i = 0; i < ids.size(); i++) { + map.put("id", ids.get(i)); + map.put("state", 3); + integer += groupService.updateGroupState(map); + } + return CrudUtil.putHandle(ids.size(), integer); + } else { + throw new MyException("缺少必要参数"); + } + } + + + /** + * 删除套餐及其明细(硬删除) + * + * @param map 删除条件 + * @return + */ + @PostMapping("/realDelGroup") + public RestResponse realDelGroup(@RequestBody Map map) { + if (map.containsKey("id")) { + Integer id = ObjectFormatUtil.toInteger(map.get("id")); + Integer integer = groupService.delGroupById(id); + return CrudUtil.deleteHandle(1, integer); + } else { + throw new MyException("缺少必要参数"); + } + } + + @PostMapping("/findGroupInfoByGid") + public RestResponse findGroupInfoByGid(@RequestBody Map map,HttpServletRequest request){ + + + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + // 获取当前部门仓库 + List depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString()); + + // 获取当前套餐的所有物料数据 + List groupByGid = groupService.findGroupByCondition(map); + + // 用于标识当前套餐是否可以正常出库 + boolean flag = true; + for (int i = 0; i < groupByGid.size(); i++) { + + // 获取详细信息 + GroupInfo groupInfo = groupByGid.get(i); + // 获取该物料的库存 + List inventoryByMidAndDepository = materialService.findInventoryByMidAndDepository(groupInfo.getMid(), depositoryByAdminorg); + // 用于标志当前物料库存是否符合要求 + boolean flagForQuantity = false; + for (int j = 0; j < inventoryByMidAndDepository.size(); j++) { + Integer quantity = inventoryByMidAndDepository.get(j); + // 如果库存符合要求 + if (quantity > groupInfo.getQuantity()) { + flagForQuantity = true; + } + } + if (!flagForQuantity) { + // 如果当前不符合 + flag = false; + break; + } + + } + if (flag) { + return new RestResponse(groupByGid); + } else { + return new RestResponse(null,666,new StatusInfo("不能出库","当前套餐中有物料库存不足")); + } + } + + + @PostMapping("/treeMenus") + public RestResponse treeMenus(@RequestBody Map map){ + String gname = ""; + if(map.containsKey("gname")){ + gname = (String) map.get("gname"); + } + List list = groupService.InitTreeMenus(gname); + return new RestResponse(list); + } +} 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 48ac4817..51f8f0b8 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java @@ -39,13 +39,12 @@ public class MaterialController { PlaceService placeService; @Autowired - private RedisTemplate redisTemplate; + RedisTemplate redisTemplate; - @Autowired - private RedisTemplate redisTemplateForString; @Autowired - private MaterialTypeService materialTypeService; + GroupService groupService; + /** * 根据物料进行查询 @@ -59,6 +58,44 @@ public class MaterialController { return new RestResponse(materialPByCondition, materialService.findCountByCondition(map), 200); } + + @GetMapping("/findInventoryForGroup") + public RestResponse findInventoryForGroup(@RequestParam Map map, HttpServletRequest request) { + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + // 查询当前用户部门拥有的仓库 + List depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString()); + // 定义仓库编号列表 + List didList = new ArrayList<>(); + + List list = new ArrayList<>(); + Integer total = 0; + Integer size = 10, page = 1; // 定义每页展示数量 + if (map.containsKey("size")) { + size = ObjectFormatUtil.toInteger(map.get("size")); + } + if (!(map.containsKey("depositoryId") || map.containsKey("code") || map.containsKey("mname"))) { + for (int i = 0; i < depositoryByAdminorg.size(); i++) { + Integer did = depositoryByAdminorg.get(i).getId(); + didList.add(did); + map.put("depositoryId", did); + List inventory = materialService.findInventory(map); + list.addAll(inventory); + total += materialService.findInventoryCount(map); + if (list.size() >= size) { + break; + } + } + } else { + List inventory = materialService.findInventory(map); + list.addAll(inventory); + total += materialService.findInventoryCount(map); + } + for (int i = 0; i < list.size(); i++) { + list.get(i).setQuantity(1); + } + return new RestResponse(list, total, 200); + } + /** * 根据条件查询库存 * @@ -324,6 +361,7 @@ public class MaterialController { return new RestResponse(null, 1, 200); } + // 如果是普通物料编码 List materialPByCondition = new ArrayList<>(); List inventoryPByCondition = new ArrayList<>(); param.put("mcode", code); @@ -353,10 +391,10 @@ public class MaterialController { List materialByBarCodeByCondition = materialService.findMaterialByBarCodeByCondition(paramByPrice); ip.setMaterialAndBarCodeList(materialByBarCodeByCondition); return new RestResponse(ip, 1, 200); - } else if("in".equals(type)) { + } else if ("in".equals(type)) { param.put("code", code); materialPByCondition = materialService.findMaterialPByCondition(param); - if(materialPByCondition.size()>0) { + if (materialPByCondition.size() > 0) { mp = materialPByCondition.get(0); mp.setPrice(0.0); mp.setMid(mp.getId()); @@ -368,7 +406,7 @@ public class MaterialController { } return new RestResponse(mp, 1, 200); } - return new RestResponse(ip,1,200); + return new RestResponse(ip, 1, 200); } @@ -603,13 +641,13 @@ public class MaterialController { placePList.addAll(place); } } - if(ip!=null){ + if (ip != null) { // 设置当前物料在相关仓库下的所有库位 ip.setPlacePList(placePList); // 设置物料与条形码的对应关系 ip.setMaterialAndBarCodeList(materialByBarCodeByCondition); return new RestResponse(ip); - }else{ + } else { MaterialP mp = new MaterialP(material); // 设置物料与条形码的对应关系 mp.setMaterialAndBarCodeList(materialByBarCodeByCondition); @@ -1534,18 +1572,19 @@ public class MaterialController { /** * 用于修改当前物料所在库位 + * * @param map * @param request * @return */ @PostMapping("/editPlaceMaterial") - public RestResponse editPlaceMaterial(@RequestBody Map map,HttpServletRequest request){ + public RestResponse editPlaceMaterial(@RequestBody Map map, HttpServletRequest request) { Integer integer = materialService.editPlaceMaterial(map); - if(Integer.compare(-1,integer) == 0){ - return new RestResponse("",-1,new StatusInfo("转移失败","转入位置无法存放当前数量的库存")); - }else{ - return CrudUtil.putHandle(1,integer); + if (Integer.compare(-1, integer) == 0) { + return new RestResponse("", -1, new StatusInfo("转移失败", "转入位置无法存放当前数量的库存")); + } else { + return CrudUtil.putHandle(1, integer); } } } 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 f7adac48..5dc5c719 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java @@ -68,6 +68,10 @@ public class PageController { private StockTakingService stockTakingService; + @Autowired + private GroupService groupService; + + @GetMapping("/") public ModelAndView Init(HttpServletRequest request) { ModelAndView mv = new ModelAndView(); @@ -497,6 +501,19 @@ public class PageController { return mv; } + // 套餐树形菜单页面 + @GetMapping("/selectGroup") + public ModelAndView selectGroup(String gname,String clickObj){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("pages/group/selectGroup"); + if(gname == null){ + gname = ""; + } + mv.addObject("gname",gname); + mv.addObject("clickObj",clickObj); + return mv; + } + // 负责人树形菜单页面 @GetMapping("/selectManager") public ModelAndView selectManager() { @@ -716,12 +733,79 @@ public class PageController { return mv; } + /** + * 跳转到套餐添加页面 + * @return + */ + @GetMapping("/group_add") + public ModelAndView group_add(@RequestParam(required = false) Integer gid){ + ModelAndView mv = new ModelAndView(); + if(gid != null){ + mv.addObject("gid",gid); + }else{ + mv.addObject("gid",-1); + } + mv.setViewName("pages/group/group-add"); + return mv; + } + + /** + * 跳转到套餐查询页面 + * @return + */ + @GetMapping("/group_out") + public ModelAndView group_out(HttpServletRequest request) { + ModelAndView mv = new ModelAndView(); + mv.setViewName( "pages/group/group-out"); + UserByPort userToken = (UserByPort) request.getAttribute("userToken"); + Integer isadmin = userToken.getIsadmin(); + if (isadmin == null) { + isadmin = 1; + } + if (isadmin == 4) { + mv.addObject("display", "inline-block"); + } else { + mv.addObject("display", "none"); + } + return mv; + } + + + /** + * 跳转到套餐中物料明细中 + * @param mid 物料id + * @param gid 套餐id + * @return + */ + @GetMapping("/materialForGroup") + public ModelAndView materialForGroup(Integer mid,Integer gid){ + ModelAndView mv = new ModelAndView(); + // 根据物料id与套餐id查询对应明细 + GroupInfo groupInfoByMidAndGid = groupService.findGroupInfoByMidAndGid(mid, gid); + if(groupInfoByMidAndGid != null){ + mv.addObject("record",groupInfoByMidAndGid); + } + else { + throw new MyException("缺少必要参数!"); + } + mv.setViewName("pages/group/group_material_edit"); + return mv; + } + + @GetMapping("/group_edit") + public ModelAndView groupEdit(Integer id){ + ModelAndView mv = new ModelAndView(); + mv.setViewName("pages/group/group_edit"); + mv.addObject("id",id); + return mv; + } + /** * 入库可视化 * * @return */ - @GetMapping("chart_in_back") + @GetMapping("/chart_in_back") public ModelAndView chart_in_back() { ModelAndView mv = new ModelAndView(); mv.setViewName("pages/chart/chart-in_back"); diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/Group.java b/src/main/java/com/dreamchaser/depository_manage/entity/Group.java new file mode 100644 index 00000000..cc022065 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/Group.java @@ -0,0 +1,29 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; + +@Data +public class Group { + /** + * id + */ + private Integer id; + /** + * 套餐编码 + */ + private String code; + /** + * 套餐创建时间 + */ + private Long createTime; + + /** + * 套餐状态 + */ + private Integer state; + + /** + * 套餐名称 + */ + private String gname; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/GroupInfo.java b/src/main/java/com/dreamchaser/depository_manage/entity/GroupInfo.java new file mode 100644 index 00000000..3951dd38 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/GroupInfo.java @@ -0,0 +1,89 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; + +/** + * 用于套餐信息的封装 + */ +@Data +public class GroupInfo { + /** + * id + */ + private Integer id; + /** + * 物料id + */ + private Integer mid; + /** + * 套餐id + */ + private Integer gid; + /** + * 数量 + */ + private Integer quantity; + /** + * 套餐对应编码 + */ + private String gcode; + /** + * 物料名称 + */ + private String mname; + /** + * 物料类型id + */ + private Integer mtid; + /** + * 类型名称 + */ + private String tname; + /** + * 物料编码 + */ + private String mcode; + /** + * 物料型号 + */ + private String version; + /** + * 物料计量单位 + */ + private String unit; + /** + * 物料材质 + */ + private String texture; + /** + * 物料保质期 + */ + private Integer shelfLife; + /** + * 物料产地 + */ + private String productionPlace; + /** + * 物料品牌 + */ + private String brand; + /** + * 物料备注 + */ + private String remark; + /** + * 套餐创建时间 + */ + private Long createTime; + + /** + * 套餐状态(1启用2禁用3删除) + */ + private Integer gstate; + + + /** + * 套餐名称 + */ + private String gname; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/MaterialForGroup.java b/src/main/java/com/dreamchaser/depository_manage/entity/MaterialForGroup.java new file mode 100644 index 00000000..8369e9f7 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/MaterialForGroup.java @@ -0,0 +1,23 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; + +@Data +public class MaterialForGroup { + /** + * id + */ + private Integer id; + /** + * 物料id + */ + private Integer mid; + /** + * 套餐id + */ + private Integer gid; + /** + * 数量 + */ + private Integer quantity; +} diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.java new file mode 100644 index 00000000..516d8368 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.java @@ -0,0 +1,163 @@ +package com.dreamchaser.depository_manage.mapper; + +import com.dreamchaser.depository_manage.entity.Group; +import com.dreamchaser.depository_manage.entity.GroupInfo; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +@Mapper +public interface GroupMapper { + + + /** + * 用于查找所有套餐(不包含其他) + * @return + */ + List findAllGroupOnly(String gname); + + + /** + * 用于查找所有套餐 + * @return + */ + List findAllGroup(); + + /** + * 根据套餐id查询对应套餐 + * @param id 套餐id + * @return + */ + GroupInfo findGroupById(Integer id); + + /** + * 根据主键查询套餐(不包含其他数据) + * @param id 主键 + * @return + */ + Group findGroupOnlyById(Integer id); + + + /** + * 根据条件查询套餐(不包含其他数据) + * @param map 查询条件 + * @return + */ + List findGroupOnlyByCondition(Map map); + + /** + * 根据条件查询对应套餐信息(视图) + * @param map 查询条件 + * @return + */ + List findGroupByCondition(Map map); + + /** + * 根据套餐id批量获取套餐信息(不包含其他数据) + * @param list 套餐id列表 + * @return + */ + List findGroupByGids(List list); + + /** + * 修改套餐中物料的数据 + * @param map 修改数据及条件 + * @return + */ + Integer updateMaterialForGroup(Map map); + /** + * 修改套餐中物料的数据 + * @param groupInfo 修改数据及条件 + * @return + */ + Integer updateMaterialForGroup(GroupInfo groupInfo); + + + /** + * 根据条件查询对应套餐数目 + * @param map 查询条件 + * @return + */ + Integer findGroupCountByCondition(Map map); + + /** + * 获取当前套餐数量 + * @return + */ + Integer findAllGroupOnlyCount(Map map); + + + /** + * 添加一条套餐 + * @param map 具体数据 + * @return + */ + Integer addGroup(Map map); + + /** + * 添加一条套餐 + * @param groupInfo 具体数据 + * @return + */ + Integer addGroup(GroupInfo groupInfo); + + + /** + * 添加套餐中的物料记录 + * @param map 对应物料数据 + * @return + */ + Integer addGroupForMaterial(Map map); + + + /** + * 通过编码获取对应的套餐 + * @param code 套餐编码 + * @return + */ + Group findGroupByCode(String code); + + + /** + * 修改套餐基本信息 + * @param group 待修改套餐 + * @return + */ + Integer updateGroupOnly(Group group); + + + /** + * 修改套餐基本信息 + * @param map 待修改套餐 + * @return + */ + Integer updateGroupOnly(Map map); + + + + /** + * 根据主键删除一条套餐中的物料明细 + * @param id 待删除主键 + * @return + */ + Integer delMaterialForGroupById(Integer id); + + /** + * 根据主键批量删除套餐中的物料明细 + * @param list 待删除主键 + * @return + */ + Integer delMaterialForGroupByIds(List list); + + + /** + * 根据主键删除套餐 + * @param id 待删除套餐主键 + * @return + */ + Integer delGroup(Integer id); + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.xml new file mode 100644 index 00000000..e813f5fd --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.xml @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,mid,gid,quantity,mtid,shelfLife,gcode,mname,tname,mcode,version,unit,texture,productionPlace,brand,remark,createTime,gstate,gname + + + + + id,code,createTime,state,gname + + + + + id,mid,gid,quantity + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO `group` ( + id, code, createTime, state + ) VALUES ( + #{id}, + #{code}, + #{createTime}, + #{state} + ) + + + + INSERT INTO groupformaterial ( + id, mid, gid, quantity + ) VALUES ( + #{id}, + #{mid}, + #{gid}, + #{quantity} + ) + + + + + + + + + + + + update + groupformaterial + + + gid = #{gid}, + + + mid = #{mid}, + + + quantity = #{quantity} + + + where id = #{id} + + + + + update + `group` + + + code = #{code}, + + + createTime = #{createTime}, + + + state = #{state} + + + gname = #{gname} + + + where id = #{id} + + + + delete from groupformaterial where id = #{id} + + + + + delete from groupformaterial where id in + + #{id} + + + + + delete from `group` where id = #{id} + + + + + \ No newline at end of file diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java index 94175757..6fa2ea1f 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java @@ -136,6 +136,14 @@ public interface MaterialMapper { */ List findInventory(Map map); + + /** + * 根据物料id与仓库id查询库存信息 + * @param map 查询条件 + * @return + */ + Inventory findInventoryByMidAndDid(Map map); + /** * 根据id查询库存信息 * @param id 库存id diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml index b5a44e8f..c2c9c7cb 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml @@ -562,6 +562,15 @@ FROM findInventory WHERE id =#{mid} + + + + + + + +
+ +
+
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + `; + // 获取当前高度 + var height = parseInt(($("#stepForm").css('height')).split("px")[0]); + params.push(NewIdNumber); + $("#stepForm").css("height", height + 422 + 'px'); + $("#" + parentId).after(materialItem); + }; + + // 实现卡片添加(套餐) + addItemForGroup = function (obj) { + var parentId = obj.parentNode.id; + NewIdNumber = NewIdNumber + 1; + var materialItem = ` +
+
+ +
+ +
+
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+ + +
+ `; + // 获取当前高度 + var height = parseInt(($("#stepForm2").css('height')).split("px")[0]); + params2.push(NewIdNumber); + $("#stepForm2").css("height", height + 236 + 'px'); + $("#" + parentId).after(materialItem); + }; + // 用于重新渲染页面(套餐) + CoverpageForGroup = function (num, obj) { + // 获取待添加父类 + NewIdNumber = num; + if (num === 0) { // 如果是第一个 + NewIdNumber = ""; + } + var materialItem = ` +
+
+

${obj.mname}

+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + `; // 最终 + + // 获取当前高度 + var height = parseInt(($("#stepForm2").css('height')).split("px")[0]); + if (NewIdNumber !== "") { + params.push(NewIdNumber) + } + $("#stepForm2").css("height", height + 183 + 'px'); + $("#" + "addItemForGroup" + NewIdNumber).before(materialItem); + + }; + + // 实现卡片删除 + deleteItem = function (obj) { + // 获取父节点 + var parent = obj.parentNode; + var parentId = parent.id; + parentId = parseInt(parentId.split("cardItem")[1]); + // 获取祖父节点 + var reparent = parent.parentNode; + var height = parseInt(($("#stepForm").css('height')).split("px")[0]); + $("#stepForm").css("height", height - 422 + 'px'); + params = remove(params, parentId); + reparent.removeChild(parent); + }; + + // 实现卡片删除 + deleteItemForGroup = function (obj) { + // 获取父节点 + var parent = obj.parentNode; + var parentId = parent.id; + parentId = parseInt(parentId.split("cardItemForGroup")[1]); + // 获取祖父节点 + var reparent = parent.parentNode; + var height = parseInt(($("#stepForm2").css('height')).split("px")[0]); + $("#stepForm2").css("height", height - 236 + 'px'); + params2 = remove(params, parentId); + reparent.removeChild(parent); + }; + + //删除数组中指定元素 + function remove(arr, item) { + var result = []; + for (let i = 0; i < arr.length; i++) { + if (arr[i] === item) { + continue; + } + result.push(arr[i]); + } + return result; + } + + // 用于实现通过编码查询物料 + selectCode = function (obj) { + // 输入code + var code = obj.value; + // 获取对应元素 + var parent = obj.parentNode.parentNode.parentNode.parentNode; + var objId = parent.id.split("cardItem")[1]; + var children = parent.childNodes[5]; + var materialItem = children.childNodes[3].childNodes[1].childNodes; + var barCodeChildren = parent.childNodes[9]; + + var materialName = materialItem[1]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; + // 条形码条码 + var barCodeItem = barCodeChildren.childNodes[3]; + var req = {}; + req.code = code; + req.type = "out"; + $.ajax({ + url: "/material/findMatrialByCode", + type: "get", + dataType: 'json', + data: (req), + contentType: "application/json;charset=utf-8", + success: function (d) { + var d = d.data; + if (d == null) { + layer.msg("仓库中暂无该物料"); + materialName.value = ""; + materialId.value = ""; + obj.value = ""; + $('#place' + objId).empty(); + + } else { + materialName.value = d.mname; + materialId.value = d.id; + var idNumber = materialId.name.split("mid")[1]; + // 获取物料与条形码的对应关系 + var materialAndBarCodeList = d["materialAndBarCodeList"]; + if (materialAndBarCodeList.length > 0) { + // 如果有对应的条形码 + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; + var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; + var id = barCodeInput.id; + $("#" + id).remove(); + $("#barCode" + idNumber).empty(); + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } else { + var barCodeSelect = ` + `; + $("#" + barCodeImg.id).before(barCodeSelect); + } + form.render(); + $.each(materialAndBarCodeList, function (index, item) { + $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 + }); + form.render(); + } else { + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } + } + } + } + }); + }; + + + // 用于实现通过编码查询套餐 + selectCodeForGroup = function (obj) { + // 输入code + var code = obj.value; + // 获取搜索的对应卡片 + var parent = obj.parentNode.parentNode.parentNode.parentNode; + var pid = Number(parent.id.split("cardItemForGroup")[1]); + + // 获取当前卡片中的套餐名称等 + let gnameParent = parent.childNodes[5].childNodes[3]; + + // gid + let gidItem = gnameParent.childNodes[3]; + // gname + let gnameItem = gnameParent.childNodes[1].childNodes[1]; + let req = {}; + req.code = code; + $.ajax({ + url: "/group/findGroupByCode", + type: "post", + dataType: 'json', + data: JSON.stringify(req), + contentType: "application/json;charset=utf-8", + success: function (d) { + var data = d.data; + if (data === null) { + layer.msg(d.statusInfo.detail, { + icon: 0, + time: 1500 + },function () { + obj.value = ''; + gidItem.value = ''; + gnameItem.value = ''; + let childNodes = parent.childNodes; + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + }) + } else { + let childNodes = parent.childNodes; + if (childNodes.length > 9) { + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + } + // 赋值给gname + gnameItem.value = data[0].gname; + gidItem.value = data[0].gid; + for (let i = 0; i < data.length; i++) { + CoverpageForGroup(pid, data[i]); + } + element.init(); + + } + } + }); + }; + + // 用于实现点击搜索按钮 + selectMaterial = function (obj) { + 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[1].childNodes; + var codeValue = codeItem[1]; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; + var materialName = materialItem[1]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; + var mname = materialName.value; + var barCodeChildren = parent.childNodes[9]; + // 条形码条码 + var barCodeItem = barCodeChildren.childNodes[3]; + layer.open({ + type: 2, + title: '弹窗内容', + skin: 'layui-layer-rim', + maxmin: true, + shadeClose: true, //点击遮罩关闭层 + area: ['70%', '70%'], + // content: '/selectMaterialByCard?mname=' + mname + '&type=2&clickObj=' + parentId, + content: '/getMaterialAll?mname=' + mname + '&type=2&clickObj=' + parentId, + move: '.layui-layer-title', + fixed: false, + success: function (layero, index) { + var children = layero.children(); + var content = $(children[1]); + var iframeChildren = $(content.children()); + content.css('height', '100%'); + iframeChildren.css('height', '100%'); + }, + end: function () { + var mid = materialId.value; + $.ajax({ + url: "/material/findMatrialById?mid=" + mid, + type: "get", + dataType: 'json', + contentType: "application/json;charset=utf-8", + success: function (d) { + var material = d.data.materialById; + var code = material.code; + if (code === undefined) { + code = ""; + } + codeValue.value = code; + var materialAndBarCodeList = material["materialAndBarCodeList"]; + var idNumber = materialId.name.split("mid")[1]; + if (materialAndBarCodeList.length > 0) { + // 如果有对应的条形码 + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; + var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; + var id = barCodeInput.id; + $("#" + id).remove(); + $("#barCode" + idNumber).empty(); + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } else { + var barCodeSelect = ` + `; + $("#" + barCodeImg.id).before(barCodeSelect); + } + form.render(); + $.each(materialAndBarCodeList, function (index, item) { + $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 + }); + form.render(); + } else { + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } + } + form.render(); + } + }); + + } + }); + }; + + // 用于实现点击搜索按钮(套餐) + selectGroup = function(obj){ + var parent = obj.parentNode.parentNode.parentNode.parentNode; + var parentId = parent.id; + + // 获取对应元素 + var pid = Number(parent.id.split("cardItemForGroup")[1]); + + // 获取当前卡片中的套餐名称等 + let gnameParent = parent.childNodes[5].childNodes[3]; + + // 套餐编码 + let gcodeItem = parent.childNodes[7].childNodes[3].childNodes[1].childNodes[1]; + + + // gid + let gidItem = gnameParent.childNodes[3]; + + // gname + let gnameItem = gnameParent.childNodes[1].childNodes[1]; + + let gname = gnameItem.value; + layer.open({ + type: 2, + title: '弹窗内容', + skin: 'layui-layer-rim', + maxmin: true, + shadeClose: true, //点击遮罩关闭层 + area: ['70%', '70%'], + content: '/selectGroup?gname=' + gname + '&clickObj=' + parentId, + move: '.layui-layer-title', + fixed: false, + success: function (layero, index) { + var children = layero.children(); + var content = $(children[1]); + var iframeChildren = $(content.children()); + content.css('height', '100%'); + iframeChildren.css('height', '100%'); + }, + end:function () { + let gid = gidItem.value; + if(gid !== ''){ + let req = {}; + req.gid = gid; + $.ajax({ + url: "/group/findGroupInfoByGid", + data: JSON.stringify(req), + type: 'post', + dataType: 'json', + contentType: "application/json;charset=utf-8", + success: function (d) { + var data = d.data; + if (data === null) { + layer.msg(d.statusInfo.detail, { + icon: 0, + time: 1500 + },function () { + obj.value = ''; + gidItem.value = ''; + gnameItem.value = ''; + let childNodes = parent.childNodes; + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + }) + } else { + let childNodes = parent.childNodes; + if (childNodes.length > 9) { + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + } + // 赋值给gname + gcodeItem.value = data[0].gcode; + for (let i = 0; i < data.length; i++) { + CoverpageForGroup(pid, data[i]); + } + element.init(); + + } + } + }) + } + } + }) + }; + + // 用于实现套餐名称搜索 + selectGroupByName = function(obj){ + let gname = obj.value; + var parent = obj.parentNode.parentNode.parentNode.parentNode; + // 获取对应元素 + var pid = Number(parent.id.split("cardItemForGroup")[1]); + + // 获取当前卡片中的套餐名称等 + let gnameParent = parent.childNodes[5].childNodes[3]; + + // 套餐编码 + let gcodeItem = parent.childNodes[7].childNodes[3].childNodes[1].childNodes[1]; + + + // gid + let gidItem = gnameParent.childNodes[3]; + + if(gname !== ''){ + + + var req = {}; + req.gname = gname; + $.ajax({ + url: "/group/findGroupByGname", + type: "post", + dataType: 'json', + data: JSON.stringify(req), + contentType: "application/json;charset=utf-8", + success: function (d) { + if(d.count === -1){ + // 如果当前套餐名称的数量不止一个 + layer.msg("请点击右侧搜索确定物品", { + icon: 0, + time: 1500 + },function () { + obj.value = ''; + gidItem.value = ''; + gcodeItem.value = ''; + let childNodes = parent.childNodes; + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + }); + }else if(d.count === 0){ + // 如果当前套餐名称不存在 + layer.msg("没有该套餐,请确认输入是否正确", { + icon: 0, + time: 1500 + },function () { + obj.value = ''; + gidItem.value = ''; + gcodeItem.value = ''; + let childNodes = parent.childNodes; + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + }); + }else{ + // 正常 + let data = d.data; + let childNodes = parent.childNodes; + if (childNodes.length > 9) { + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + } + // 赋值给gname + gidItem.value = data[0].gid; + gcodeItem.value = data[0].gcode; + for (let i = 0; i < data.length; i++) { + CoverpageForGroup(pid, data[i]); + } + element.init(); + + } + } + }) + } + else{ + gcodeItem.value = ''; + gidItem.value = ''; + let childNodes = parent.childNodes; + for (let i = 0; i < childNodes.length; i++) { + if (childNodes[i].className === "layui-collapse") { + childNodes[i].remove() + } + } + } + + }; + + //用于实现物料名称搜索 + selectMaterialByName = function (obj) { + var data = obj.value; + // 获取对应元素 + var parent = obj.parentNode.parentNode.parentNode.parentNode; + var materialChildren = parent.childNodes[5]; + var codeChildren = parent.childNodes[7]; + var codeItem = codeChildren.childNodes[3].childNodes[1].childNodes; + var codeValue = codeItem[1]; + var materialItem = materialChildren.childNodes[3].childNodes[1].childNodes; + var materialName = materialItem[1]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; + var req = {}; + req.mname = data; + $.ajax({ + url: "/material/findInventoryByCondition", + type: "post", + dataType: 'json', + data: JSON.stringify(req), + contentType: "application/json;charset=utf-8", + success: function (d) { + if (d.count > 1) { + layer.msg("请点击右侧搜索确定物品"); + materialId.value = ""; + codeValue.value = ""; + return false; + } else if (d.count === 0) { + layer.msg("没有该物品,请确认输入是否正确"); + materialId.value = ""; + codeValue.value = ""; + materialName.value = ""; + return false; + } else { + var material = d.data[0]; + materialName.value = material.mname; + materialId.value = material.id; + codeValue.value = material.code; + } + } + }); + }; + + // 扫描物料条码 + scanBarCode = function (obj) { + parent.wx.scanQRCode({ + desc: 'scanQRCode desc', + needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果, + scanType: ["barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有 + success: function (res) { + // 回调 + var result = res.resultStr;//当needResult为1时返回处理结果 + var req = {}; + req.qrCode = result; + $.ajax({ + url: "/material/qywxApplicationOutScanBarCode", + type: "post", + dataType: 'json', + data: JSON.stringify(req), + contentType: "application/json;charset=utf-8", + success: function (d) { + // 获取对应元素 + var parent = obj.parentNode.parentNode.parentNode.parentNode; + + var MaterialChildren = parent.childNodes[5]; + var materialItem = MaterialChildren.childNodes[3].childNodes[1].childNodes; + + var barCodeChildren = parent.childNodes[9]; + + var materialName = materialItem[1]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; + // 条形码条码 + var barCodeItem = barCodeChildren.childNodes[3]; + // 物料编码 + var materialCodeItem = parent.childNodes[7].childNodes[3].childNodes[1].childNodes; + + + var materialCode = materialCodeItem[1]; + + var data = d.data; + if (data !== null) { + materialName.value = data.mname; + materialId.value = data.id; + materialCode.value = data.mcode; + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; + barCodeInput.value = result; + } else { + // 如果没有对应关系 + layer.msg("对于编码:" + result + ",并未发现对应的物料", { + icon: 0, + time: 1000 //0.5秒关闭(如果不配置,默认是3秒) + }, function () { + }) + } + + } + }) + } + }) + }; + + // 用于扫码功能 + scanCodeByOut = function (obj) { + parent.wx.scanQRCode({ + desc: 'scanQRCode desc', + needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果, + scanType: ["qrCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有 + success: function (res) { + // 回调 + var result = res.resultStr;//当needResult为1时返回处理结果 + var req = {}; + req.qrCode = result; + $.ajax({ + url: "/material/qywxApplicationOutScanQrCode", + type: "post", + dataType: 'json', + data: JSON.stringify(req), + contentType: "application/json;charset=utf-8", + success: function (d) { + var data = d.data; + // 获取对应元素 + var parent = obj.parentNode.parentNode.parentNode.parentNode; + var MaterialChildren = parent.childNodes[5]; + var materialItem = MaterialChildren.childNodes[3].childNodes[1].childNodes; + + var barCodeChildren = parent.childNodes[9]; + + var materialName = materialItem[1]; + var materialId = materialName.parentNode.parentNode.childNodes[3]; + // 条形码条码 + var barCodeItem = barCodeChildren.childNodes[3]; + // 物料编码 + var materialCodeItem = parent.childNodes[7].childNodes[3].childNodes[1].childNodes; + + var materialCode = materialCodeItem[1]; + + var idNumber = materialId.name.split("mid")[1]; + // 获取物料与条形码的对应关系 + var materialAndBarCodeList = data["materialAndBarCodeList"]; + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } + if (materialAndBarCodeList.length > 0) { + // 如果有对应的条形码 + var barCodeInput = barCodeItem.childNodes[1].childNodes[1]; + var barCodeImg = barCodeItem.childNodes[1].childNodes[3]; + var id = barCodeInput.id; + $("#" + id).remove(); + $("#barCode" + idNumber).empty(); + var barCode = $("#barCode" + idNumber); + if (barCode.length > 0) { + barCode.empty(); + } else { + var barCodeSelect = ` + `; + $("#" + barCodeImg.id).before(barCodeSelect); + } + form.render(); + + $.each(materialAndBarCodeList, function (index, item) { + $("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素 + }); + form.render(); + } + $('#place' + idNumber).empty(); + $.each(data.placePList, function (index, item) { + $('#place' + idNumber).append(new Option(item.depositoryName + "-" + item.code, item.id));//往下拉菜单里添加元素 + }); + form.render(); + materialName.value = data.mname; + materialId.value = data.id; + materialCode.value = data.code; + } + }) + } + }) + }; + //用于判断当前物料数量是否合适 + MaterialQuantityIsTrue = function (obj) { + var id = obj.id.split("quantity")[1]; + var mcode = $("#code" + id).val(); // 获取到当前输入的物料编码 + if (mcode === "" || mcode === undefined || mcode === null) { + layer.msg("请输入物料的正确编码!", {icon: 0, time: 500}, function () { + $("#quantity" + id).val("") + }); + } else { + let val = $("#quantity" + id).val(); + if (val !== null && val !== undefined && val !== '') { + var req = {}; + req.mcode = mcode; + req.quantity = val; + $.ajax({ + url: "/material/MaterialQuantityIsTrue", + type: "post", + data: JSON.stringify(req), + dataType: 'json', + contentType: "application/json;charset=utf-8", + success: function (res) { + var flag = res.data; + if (!flag) { // 如果当前数目不合适 + layer.msg("当前物料数量不足", {icon: 0, time: 500}, function () { + $("#quantity" + id).val(""); + }); + + } + } + }); + } + } + } + + +}); diff --git a/src/main/resources/templates/pages/application/application-out.html b/src/main/resources/templates/pages/application/application-out.html index 56a5d021..1d420745 100644 --- a/src/main/resources/templates/pages/application/application-out.html +++ b/src/main/resources/templates/pages/application/application-out.html @@ -42,112 +42,210 @@ display: none; } - .layui-form-select .layui-input{ + .layui-form-select .layui-input { border-style: none; }
- -