Browse Source

添加套餐相关功能

lwx_dev
erdanergou 3 years ago
parent
commit
81e98f6ad3
  1. 363
      src/main/java/com/dreamchaser/depository_manage/controller/GroupController.java
  2. 67
      src/main/java/com/dreamchaser/depository_manage/controller/MaterialController.java
  3. 86
      src/main/java/com/dreamchaser/depository_manage/controller/PageController.java
  4. 29
      src/main/java/com/dreamchaser/depository_manage/entity/Group.java
  5. 89
      src/main/java/com/dreamchaser/depository_manage/entity/GroupInfo.java
  6. 23
      src/main/java/com/dreamchaser/depository_manage/entity/MaterialForGroup.java
  7. 163
      src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.java
  8. 352
      src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.xml
  9. 8
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java
  10. 9
      src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  11. 64
      src/main/java/com/dreamchaser/depository_manage/pojo/GroupInfoP.java
  12. 162
      src/main/java/com/dreamchaser/depository_manage/service/GroupService.java
  13. 8
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  14. 12
      src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java
  15. 566
      src/main/java/com/dreamchaser/depository_manage/service/impl/GroupServiceImpl.java
  16. 35
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  17. 16
      src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java
  18. 6
      src/main/resources/application-test.yml
  19. 1029
      src/main/resources/static/js/application-out/application-out.js
  20. 843
      src/main/resources/templates/pages/application/application-out.html
  21. 831
      src/main/resources/templates/pages/application/application-out_black2.html
  22. 2
      src/main/resources/templates/pages/application/application_multi.html
  23. 3
      src/main/resources/templates/pages/depository/table-in.html
  24. 1
      src/main/resources/templates/pages/depository/table-stock.html
  25. 340
      src/main/resources/templates/pages/group/group-add.html
  26. 446
      src/main/resources/templates/pages/group/group-out.html
  27. 192
      src/main/resources/templates/pages/group/group_edit.html
  28. 148
      src/main/resources/templates/pages/group/group_material_edit.html
  29. 85
      src/main/resources/templates/pages/group/selectGroup.html
  30. 29
      src/main/resources/templates/pages/material/material-out.html
  31. 127
      src/main/resources/templates/pages/material/selectMaterial.html
  32. 218
      src/test/java/com/dreamchaser/depository_manage/TestForGroupTree.java
  33. 20
      src/test/java/com/dreamchaser/depository_manage/TestForOther.java
  34. 6
      target/classes/application-test.yml
  35. 9
      target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml
  36. 843
      target/classes/templates/pages/application/application-out.html
  37. 2
      target/classes/templates/pages/application/application_multi.html
  38. 3
      target/classes/templates/pages/depository/table-in.html
  39. 1
      target/classes/templates/pages/depository/table-stock.html
  40. 29
      target/classes/templates/pages/material/material-out.html
  41. 127
      target/classes/templates/pages/material/selectMaterial.html

363
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<String, Object> 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<String, Object> map, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
// 获取当前部门仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
String code = map.get("code").toString();
// 获取套餐编码
Group groupByCode = groupService.findGroupByCode(code);
if(groupByCode != null) {
Map<String, Object> paramForGetGroup = new HashMap<>();
paramForGetGroup.put("gid", groupByCode.getId());
// 获取当前套餐的所有物料数据
List<GroupInfo> groupByGid = groupService.findGroupByCondition(paramForGetGroup);
// 用于标识当前套餐是否可以正常出库
boolean flag = true;
for (int i = 0; i < groupByGid.size(); i++) {
// 获取详细信息
GroupInfo groupInfo = groupByGid.get(i);
// 获取该物料的库存
List<Integer> 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<String, Object> 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<String, Object> 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<GroupInfoP> groupPByCondition = groupService.findOnlyGroupByCondition(map);
return new RestResponse(groupPByCondition, groupService.findAllGroupOnlyCount(map), 200);
}
/**
* 根据套餐名称获取套餐
* @param map 套餐名称
* @return
*/
@PostMapping("/findGroupByGname")
public RestResponse findGroupByGname(@RequestBody Map<String,Object> map){
if(map.containsKey("gname")){
List<Group> groupOnlyByCondition = groupService.findGroupOnlyByCondition(map);
int size = groupOnlyByCondition.size();
if(size > 1){
// 如果当前名称的套餐大于1个
return new RestResponse("",-1,444);
}else if(size == 1){
// 如果刚好只有一个
// 获取当前套餐的所有物料数据
List<GroupInfo> 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<String, Object> map) {
if (map.containsKey("gid")) {
List<GroupInfo> 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<String, Object> 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<String, Object> 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<Integer> ids = (List<Integer>) 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<String, Object> 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<String,Object> 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<String, Object> 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<Integer> ids = (List<Integer>) 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<String, Object> 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<String,Object> map,HttpServletRequest request){
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
// 获取当前部门仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
// 获取当前套餐的所有物料数据
List<GroupInfo> groupByGid = groupService.findGroupByCondition(map);
// 用于标识当前套餐是否可以正常出库
boolean flag = true;
for (int i = 0; i < groupByGid.size(); i++) {
// 获取详细信息
GroupInfo groupInfo = groupByGid.get(i);
// 获取该物料的库存
List<Integer> 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<String,Object> map){
String gname = "";
if(map.containsKey("gname")){
gname = (String) map.get("gname");
}
List<Object> list = groupService.InitTreeMenus(gname);
return new RestResponse(list);
}
}

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

@ -39,13 +39,12 @@ public class MaterialController {
PlaceService placeService;
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
RedisTemplate<Object, Object> redisTemplate;
@Autowired
private RedisTemplate<String, String> 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<String, Object> map, HttpServletRequest request) {
UserByPort userToken = (UserByPort) request.getAttribute("userToken");
// 查询当前用户部门拥有的仓库
List<Depository> depositoryByAdminorg = depositoryService.findDepositoryByAdminorg(userToken.getMaindeparment().toString());
// 定义仓库编号列表
List<Integer> didList = new ArrayList<>();
List<InventoryP> 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<InventoryP> inventory = materialService.findInventory(map);
list.addAll(inventory);
total += materialService.findInventoryCount(map);
if (list.size() >= size) {
break;
}
}
} else {
List<InventoryP> 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<MaterialP> materialPByCondition = new ArrayList<>();
List<InventoryP> inventoryPByCondition = new ArrayList<>();
param.put("mcode", code);
@ -353,10 +391,10 @@ public class MaterialController {
List<MaterialAndBarCode> 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<String,Object> map,HttpServletRequest request){
public RestResponse editPlaceMaterial(@RequestBody Map<String, Object> 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);
}
}
}

86
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");

29
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;
}

89
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;
}

23
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;
}

163
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<Group> findAllGroupOnly(String gname);
/**
* 用于查找所有套餐
* @return
*/
List<GroupInfo> findAllGroup();
/**
* 根据套餐id查询对应套餐
* @param id 套餐id
* @return
*/
GroupInfo findGroupById(Integer id);
/**
* 根据主键查询套餐不包含其他数据
* @param id 主键
* @return
*/
Group findGroupOnlyById(Integer id);
/**
* 根据条件查询套餐不包含其他数据
* @param map 查询条件
* @return
*/
List<Group> findGroupOnlyByCondition(Map<String,Object> map);
/**
* 根据条件查询对应套餐信息视图
* @param map 查询条件
* @return
*/
List<GroupInfo> findGroupByCondition(Map<String,Object> map);
/**
* 根据套餐id批量获取套餐信息(不包含其他数据)
* @param list 套餐id列表
* @return
*/
List<Group> findGroupByGids(List<Integer> list);
/**
* 修改套餐中物料的数据
* @param map 修改数据及条件
* @return
*/
Integer updateMaterialForGroup(Map<String,Object> map);
/**
* 修改套餐中物料的数据
* @param groupInfo 修改数据及条件
* @return
*/
Integer updateMaterialForGroup(GroupInfo groupInfo);
/**
* 根据条件查询对应套餐数目
* @param map 查询条件
* @return
*/
Integer findGroupCountByCondition(Map<String,Object> map);
/**
* 获取当前套餐数量
* @return
*/
Integer findAllGroupOnlyCount(Map<String,Object> map);
/**
* 添加一条套餐
* @param map 具体数据
* @return
*/
Integer addGroup(Map<String,Object> map);
/**
* 添加一条套餐
* @param groupInfo 具体数据
* @return
*/
Integer addGroup(GroupInfo groupInfo);
/**
* 添加套餐中的物料记录
* @param map 对应物料数据
* @return
*/
Integer addGroupForMaterial(Map<String,Object> map);
/**
* 通过编码获取对应的套餐
* @param code 套餐编码
* @return
*/
Group findGroupByCode(String code);
/**
* 修改套餐基本信息
* @param group 待修改套餐
* @return
*/
Integer updateGroupOnly(Group group);
/**
* 修改套餐基本信息
* @param map 待修改套餐
* @return
*/
Integer updateGroupOnly(Map<String,Object> map);
/**
* 根据主键删除一条套餐中的物料明细
* @param id 待删除主键
* @return
*/
Integer delMaterialForGroupById(Integer id);
/**
* 根据主键批量删除套餐中的物料明细
* @param list 待删除主键
* @return
*/
Integer delMaterialForGroupByIds(List<Integer> list);
/**
* 根据主键删除套餐
* @param id 待删除套餐主键
* @return
*/
Integer delGroup(Integer id);
}

352
src/main/java/com/dreamchaser/depository_manage/mapper/GroupMapper.xml

@ -0,0 +1,352 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dreamchaser.depository_manage.mapper.GroupMapper">
<!-- 字段映射 (用于视图)-->
<resultMap id="groupInfoMap" type="com.dreamchaser.depository_manage.entity.GroupInfo">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="mid" property="mid" jdbcType="INTEGER"/>
<result column="gid" property="gid" jdbcType="INTEGER"/>
<result column="quantity" property="quantity" jdbcType="INTEGER"/>
<result column="mtid" property="mtid" jdbcType="INTEGER"/>
<result column="shelfLife" property="shelfLife" jdbcType="INTEGER"/>
<result column="gcode" property="gcode" jdbcType="VARCHAR"/>
<result column="mname" property="mname" jdbcType="VARCHAR"/>
<result column="tname" property="tname" jdbcType="VARCHAR"/>
<result column="mcode" property="mcode" jdbcType="VARCHAR"/>
<result column="version" property="version" jdbcType="VARCHAR"/>
<result column="unit" property="unit" jdbcType="VARCHAR"/>
<result column="texture" property="texture" jdbcType="VARCHAR"/>
<result column="productionPlace" property="productionPlace" jdbcType="VARCHAR"/>
<result column="brand" property="brand" jdbcType="VARCHAR"/>
<result column="remark" property="remark" jdbcType="VARCHAR"/>
<result column="gname" property="gname" jdbcType="VARCHAR"/>
<result column="createTime" property="createTime" jdbcType="INTEGER"/>
<result column="gstate" property="gstate" jdbcType="INTEGER"/>
</resultMap>
<!-- 用于套餐映射-->
<resultMap id="groupMap" type="com.dreamchaser.depository_manage.entity.Group">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="code" property="code" jdbcType="VARCHAR"/>
<result column="gname" property="gname" jdbcType="VARCHAR"/>
<result column="createTime" property="createTime" jdbcType="INTEGER"/>
<result column="state" property="state" jdbcType="INTEGER"/>
</resultMap>
<!-- 用于套餐与物料的映射-->
<resultMap id="materialForGroupMap" type="com.dreamchaser.depository_manage.entity.MaterialForGroup">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="mid" property="mid" jdbcType="INTEGER"/>
<result column="gid" property="gid" jdbcType="INTEGER"/>
<result column="quantity" property="quantity" jdbcType="INTEGER"/>
</resultMap>
<!-- 用于视图-->
<sql id="allColumnsForView">
id,mid,gid,quantity,mtid,shelfLife,gcode,mname,tname,mcode,version,unit,texture,productionPlace,brand,remark,createTime,gstate,gname
</sql>
<!-- 用于套餐-->
<sql id="allColumnsForGroup">
id,code,createTime,state,gname
</sql>
<!-- 用于物料对于套餐的映射-->
<sql id="allColumnsForMaterialForGroup">
id,mid,gid,quantity
</sql>
<select id="findAllGroup" resultMap="groupInfoMap">
select
<include refid="allColumnsForView"/>
from materialforgroup
</select>
<select id="findGroupOnlyByCondition" resultMap="groupMap" parameterType="map">
select
<include refid="allColumnsForGroup"/>
from `group`
where 1 = 1
<if test="code != null and code !=''">
and code = #{code}
</if>
<if test="createTime != null and createTime != ''">
and createTime = #{createTime}
</if>
<if test="state != null and state != ''">
and state = #{state}
</if>
<if test="gname != null and gname != ''">
and gname like concat('%',#{gname},'%')
</if>
<if test="begin != null and size != null">
LIMIT #{begin},#{size}
</if>
</select>
<select id="findGroupOnlyById" resultMap="groupMap" parameterType="int">
select
<include refid="allColumnsForGroup"/>
from `group`
where id = #{id}
</select>
<select id="findAllGroupOnly" resultMap="groupMap" parameterType="string">
select
<include refid="allColumnsForGroup"/>
from `group`
where state = 1
<if test="gname != null and gname != ''">
and gname like concat('%',#{gname},'%')
</if>
</select>
<select id="findAllGroupOnlyCount" resultType="int" parameterType="map">
select
Count(*)
from `group`
where 1 = 1
<if test="code != null and code !=''">
and code = #{code}
</if>
<if test="createTime != null and createTime != ''">
and createTime = #{createTime}
</if>
<if test="state != null and state != ''">
and state = #{state}
</if>
</select>
<select id="findGroupById" resultMap="groupInfoMap" parameterType="int">
select
<include refid="allColumnsForView"/>
from materialforgroup
where id = #{id}
</select>
<insert id="addGroup" useGeneratedKeys="true" keyProperty="id">
INSERT INTO `group` (
id, code, createTime, state
) VALUES (
#{id},
#{code},
#{createTime},
#{state}
)
</insert>
<insert id="addGroupForMaterial">
INSERT INTO groupformaterial (
id, mid, gid, quantity
) VALUES (
#{id},
#{mid},
#{gid},
#{quantity}
)
</insert>
<select id="findGroupByCondition" resultMap="groupInfoMap" parameterType="map">
select
<include refid="allColumnsForView"/>
from materialforgroup
where 1 = 1
<if test="mid != null and mid != ''">
and mid = #{mid}
</if>
<if test="gid != null and gid != ''">
and gid = #{gid}
</if>
<if test="quantity != null">
and quantity = #{quantity}
</if>
<if test="gcode != null and gcode !=''">
and gcode = #{gcode}
</if>
<if test="mname != null and mname != ''">
and mname like CONCAT('%', #{mname}, '%')
</if>
<if test="mtid != null and mtid != ''">
and mtid = #{mtid}
</if>
<if test="tname != null and tname != ''">
and tname like CONCAT('%',#{tname},'%')
</if>
<if test="mcode != null and mcode != ''">
and mcode = #{mcode}
</if>
<if test="version != null and version != ''">
and version like CONCAT('%',#{version},'%')
</if>
<if test="unit != null and unit != ''">
and unit like CONCAT('%',#{unit},'%')
</if>
<if test="texture != null and texture != ''">
and texture like CONCAT('%',#{texture},'%')
</if>
<if test="shelfLife != null and shelfLife != ''">
and shelfLife = #{shelfLife}
</if>
<if test="productionPlace != null and productionPlace!= ''">
and productionPlace like CONCAT('%',#{productionPlace},'%')
</if>
<if test="brand != null and brand != ''">
and brand like CONCAT('%',#{brand},'%')
</if>
<if test="remark != null and remark != ''">
and remark like CONCAT('%',remark,'%')
</if>
<if test="createTime != null and createTime != ''">
and createTime = #{createTime}
</if>
<if test="gstate != null and gstate != ''">
and gstate = #{gstate}
</if>
<if test="gname != null and gname != ''">
and gname = #{gname}
</if>
<if test="begin != null and size != null">
LIMIT #{begin},#{size}
</if>
</select>
<select id="findGroupByGids" resultMap="groupMap" parameterType="list">
select
<include refid="allColumnsForGroup"/>
from `group`
where id in
<foreach collection="list" index="index" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="findGroupCountByCondition" parameterType="map" resultType="int">
select
count(*)
from materialforgroup
where 1 = 1
<if test="mid != null and mid != ''">
and mid = #{mid}
</if>
<if test="gid != null and gid != ''">
and gid = #{gid}
</if>
<if test="quantity != null">
and quantity = #{quantity}
</if>
<if test="gcode != null and gcode !=''">
and gcode = #{gcode}
</if>
<if test="mname != null and mname != ''">
and mname like CONCAT('%', #{mname}, '%')
</if>
<if test="mtid != null and mtid != ''">
and mtid = #{mtid}
</if>
<if test="tname != null and tname != ''">
and tname like CONCAT('%',#{tname},'%')
</if>
<if test="mcode != null and mcode != ''">
and mcode = #{mcode}
</if>
<if test="version != null and version != ''">
and version like CONCAT('%',#{version},'%')
</if>
<if test="unit != null and unit != ''">
and unit like CONCAT('%',#{unit},'%')
</if>
<if test="texture != null and texture != ''">
and texture like CONCAT('%',#{texture},'%')
</if>
<if test="shelfLife != null and shelfLife != ''">
and shelfLife = #{shelfLife}
</if>
<if test="productionPlace != null and productionPlace!= ''">
and productionPlace like CONCAT('%',#{productionPlace},'%')
</if>
<if test="brand != null and brand != ''">
and brand like CONCAT('%',#{brand},'%')
</if>
<if test="remark != null and remark != ''">
and remark like CONCAT('%',remark,'%')
</if>
<if test="createTime != null and createTime != ''">
and createTime = #{createTime}
</if>
<if test="gstate != null and gstate != ''">
and gstate = #{gstate}
</if>
</select>
<update id="updateMaterialForGroup">
update
groupformaterial
<set>
<if test="gid != null and gid != ''">
gid = #{gid},
</if>
<if test="mid != null and mid != ''">
mid = #{mid},
</if>
<if test="quantity != null and quantity != ''">
quantity = #{quantity}
</if>
</set>
where id = #{id}
</update>
<update id="updateGroupOnly">
update
`group`
<set>
<if test="code != null and code != ''">
code = #{code},
</if>
<if test="createTime != null and createTime != ''">
createTime = #{createTime},
</if>
<if test="state != null and state != ''">
state = #{state}
</if>
<if test="gname != null and gname !=''">
gname = #{gname}
</if>
</set>
where id = #{id}
</update>
<delete id="delMaterialForGroupById" parameterType="int">
delete from groupformaterial where id = #{id}
</delete>
<delete id="delMaterialForGroupByIds" parameterType="list">
delete from groupformaterial where id in
<foreach collection="list" index="index" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<delete id="delGroup" parameterType="int">
delete from `group` where id = #{id}
</delete>
<select id="findGroupByCode" parameterType="String" resultMap="groupMap">
select
<include refid="allColumnsForGroup"/>
from `group`
where code = #{code}
</select>
</mapper>

8
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java

@ -136,6 +136,14 @@ public interface MaterialMapper {
*/
List<Inventory> findInventory(Map<String,Object> map);
/**
* 根据物料id与仓库id查询库存信息
* @param map 查询条件
* @return
*/
Inventory findInventoryByMidAndDid(Map<String,Object> map);
/**
* 根据id查询库存信息
* @param id 库存id

9
src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml

@ -562,6 +562,15 @@
FROM findInventory WHERE id =#{mid}
</select>
<select id="findInventoryByMidAndDid" resultMap="InventoryMap" parameterType="map">
select
<include refid="allColumnsAndTypeNameOnViewByInventory" />
from findInventory
where
mid = #{mid}
and depositoryId = #{did}
</select>
<select id="findMaterialAndTypeById" resultMap="materialAndTypeMap" parameterType="integer">
select
<include refid="allColumnsAndTypeName"/>

64
src/main/java/com/dreamchaser/depository_manage/pojo/GroupInfoP.java

@ -0,0 +1,64 @@
package com.dreamchaser.depository_manage.pojo;
import com.dreamchaser.depository_manage.entity.Group;
import com.dreamchaser.depository_manage.utils.DateUtil;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 用于展示套餐信息
*/
@Data
public class GroupInfoP {
/**
* id
*/
private Integer id;
/**
* 套餐创建时间
*/
private String createTime;
/**
* 套餐编码
*/
private String code;
/**
* 物料名称
*/
private Map<String,Integer> materialSimple;
/**
* 套餐中拥有的物料总数
*/
private Integer quantity;
/**
* 套餐状态
*/
private Integer state;
/**
* 套餐名称
*/
private String gname;
public GroupInfoP(Group group) {
this.id = group.getId();
this.createTime = DateUtil.TimeStampToDateTime(group.getCreateTime());
this.code = group.getCode();
this.state = group.getState();
this.gname = group.getGname();
}
public GroupInfoP() {
}
}

162
src/main/java/com/dreamchaser/depository_manage/service/GroupService.java

@ -0,0 +1,162 @@
package com.dreamchaser.depository_manage.service;
import com.dreamchaser.depository_manage.entity.Group;
import com.dreamchaser.depository_manage.entity.GroupInfo;
import com.dreamchaser.depository_manage.pojo.GroupInfoP;
import java.util.List;
import java.util.Map;
/**
* 用于套餐的设置
*/
public interface GroupService {
/**
* 用于查找所有套餐
* @return
*/
List<GroupInfo> findAllGroup();
/**
* 根据套餐id查询对应套餐
* @param id 套餐id
* @return
*/
GroupInfo findGroupById(Integer id);
/**
* 根据条件查询对应套餐
* @param map 查询条件
* @return
*/
List<GroupInfo> findGroupByCondition(Map<String,Object> map);
/**
* 根据条件查询对应套餐(按group分组)
* @param map 查询条件
* @return
*/
List<GroupInfoP> findOnlyGroupByCondition(Map<String,Object> map);
/**
* 获取当前套餐数量
* @return
*/
Integer findAllGroupOnlyCount(Map<String,Object> map);
/**
* 根据条件查询对应套餐数目
* @param map 查询条件
* @return
*/
Integer findGroupCountByCondition(Map<String,Object> map);
/**
* 添加一条套餐
* @param map 具体数据
* @return
*/
Integer addGroup(Map<String,Object> map);
/**
* 通过编码获取对应的套餐
* @param code 套餐编码
* @return
*/
Group findGroupByCode(String code);
/**
* 给套餐添加物料信息
* @param map 待添加信息
* @return
*/
Integer addMaterialForGroup(Map<String,Object> map);
/**
* 添加一条套餐
* @param groupInfo 具体数据
* @return
*/
Integer addGroup(GroupInfo groupInfo);
/**
* 根据主键删除一条套餐记录
* @param id 待删除套餐主键
* @return
*/
Integer delGroupById(Integer id);
/**
* 根据主键批量删除套餐记录
* @param ids 主键列表
* @return
*/
Integer delGroupByIds(List<Integer> ids);
/**
* 修改套餐中对应物料信息
* @param map 修改数据及条件
* @return
*/
Integer updateMaterialForGroup(Map<String,Object> map);
/**
* 通过物料id与套餐id查询对应套餐明细
* @param mid 物料id
* @param gid 套餐id
* @return 套餐明细
*/
GroupInfo findGroupInfoByMidAndGid(Integer mid,Integer gid);
/**
* 根据主键删除一条套餐中的物料明细
* @param id 待删除主键
* @return
*/
Integer delMaterialForGroupById(Integer id);
/**
* 根据主键批量删除套餐中的物料明细
* @param ids 待删除主键
* @return
*/
Integer delMaterialForGroupByIds(List<Integer> ids);
/**
* 根据条件修改套餐状态
* @param map 修改条件
* @return
*/
Integer updateGroupState(Map<String,Object> map);
/**
* 根据条件修改套餐信息
* @param map 修改条件
* @return
*/
Integer updateGroupInfo(Map<String,Object> map);
/**
* 根据条件获取套餐
* @param map 查询条件
* @return
*/
List<Group> findGroupOnlyByCondition(Map<String,Object> map);
/**
* 用于构造套餐树
* @param gname
* @return
*/
List<Object> InitTreeMenus(String gname);
}

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

@ -108,6 +108,14 @@ public interface MaterialService {
*/
Inventory findInventoryByMid(int id);
/**
* 根据物料id获取其在对应仓库中的库存数
* @param mid 物料id
* @param depositoryList 待查询的仓库
* @return
*/
List<Integer> findInventoryByMidAndDepository(Integer mid,List<Depository> depositoryList);
/**
* 根据id查询库存信息
* @param id 库存id

12
src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java

@ -87,7 +87,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return
*/
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public Integer applicationIn(Map<String, Object> map) {
Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId"));
Depository depositoryRecordById = depositoryMapper.findDepositoryById(depositoryId);
@ -514,7 +514,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return
*/
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public Integer applicationInPlace(Map<String, Object> map) {
Integer placeId = ObjectFormatUtil.toInteger(map.get("placeId"));
if (placeId == null) {
@ -722,7 +722,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @param userByPort
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public RestResponse completeApplicationOutMinRecord(Map<String, Object> param, UserByPort userByPort, String userAgent) {
// 最终返回值
@ -1211,7 +1211,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return
*/
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public Integer transferApply(Map<String, Object> map, UserByPort userByPort) {
Integer mid = ObjectFormatUtil.toInteger(map.get("mid"));
Double quantity = Double.parseDouble((String) map.get("quantity"));
@ -1271,7 +1271,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
* @return 受影响的行数
*/
@Override
@Transactional
@Transactional(rollbackFor = Exception.class)
public Integer review(Map<String, Object> map, Integer userid, UserByPort userToken, String userAgent) {
ApplicationOutRecordP record = depositoryRecordMapper.findApplicationOutRecordPById(ObjectFormatUtil.toInteger(map.get("id")));
Object id = map.get("id"); // 主订单编号
@ -1733,7 +1733,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService {
*
* @param map
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
public void transferMaterial(Map<String, Object> map) {
Map<String, Object> param = new HashMap<>();

566
src/main/java/com/dreamchaser/depository_manage/service/impl/GroupServiceImpl.java

@ -0,0 +1,566 @@
package com.dreamchaser.depository_manage.service.impl;
import com.dreamchaser.depository_manage.entity.Group;
import com.dreamchaser.depository_manage.entity.GroupInfo;
import com.dreamchaser.depository_manage.mapper.GroupMapper;
import com.dreamchaser.depository_manage.mapper.MaterialMapper;
import com.dreamchaser.depository_manage.pojo.GroupInfoP;
import com.dreamchaser.depository_manage.service.GroupService;
import com.dreamchaser.depository_manage.utils.ObjectFormatUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.*;
@Service
public class GroupServiceImpl implements GroupService {
@Autowired
GroupMapper groupMapper;
@Autowired
MaterialMapper materialMapper;
/**
* 用于查找所有套餐
* @return
*/
@Override
public List<GroupInfo> findAllGroup() {
return null;
}
/**
* 根据套餐id查询对应套餐
* @param id 套餐id
* @return
*/
@Override
public GroupInfo findGroupById(Integer id) {
return null;
}
/**
* 根据条件查询对应套餐
* @param map 查询条件
* @return
*/
@Override
public List<GroupInfo> findGroupByCondition(Map<String, Object> map) {
List<GroupInfo> groupByCondition = groupMapper.findGroupByCondition(map);
return groupByCondition;
}
/**
* 根据条件查询对应套餐(按group分组)
* @param map 查询条件
* @return
*/
@Override
public List<GroupInfoP> findOnlyGroupByCondition(Map<String, Object> map) {
// 获取当前所有套餐
List<Group> allGroupOnly = groupMapper.findGroupOnlyByCondition(map);
// 用于查询当前套餐中的物料
Map<String,Object> paramForGroup = new HashMap<>();
// 最终结果
List<GroupInfoP> list = new ArrayList<>();
for (int i = 0; i < allGroupOnly.size(); i++) {
// 获取套餐详情
Group group = allGroupOnly.get(i);
paramForGroup.put("gid",group.getId());
// 获取当前套餐对应的详情
List<GroupInfo> groupByCondition = groupMapper.findGroupByCondition(paramForGroup);
// 构造输出结果
GroupInfoP groupInfoP = new GroupInfoP(group);
// 设置当前套餐中的数量
Integer quantity = 0;
// 用于存储物料名称与物料id
Map<String,Integer> materialSimple = new HashMap<>();
for (GroupInfo groupInfo : groupByCondition) {
materialSimple.put(groupInfo.getMname(), groupInfo.getMid());
quantity += groupInfo.getQuantity();
}
groupInfoP.setMaterialSimple(materialSimple);
groupInfoP.setQuantity(quantity);
list.add(groupInfoP);
}
return list;
}
/**
* 获取当前套餐数量
* @return
*/
@Override
public Integer findAllGroupOnlyCount(Map<String, Object> map) {
return groupMapper.findAllGroupOnlyCount(map);
}
/**
* 根据条件查询对应套餐数目
* @param map 查询条件
* @return
*/
@Override
public Integer findGroupCountByCondition(Map<String, Object> map) {
Integer count = groupMapper.findGroupCountByCondition(map);
if(count == null){
count = 0;
}
return count;
}
/**
* 添加一条套餐
* @param map 具体数据
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Integer addGroup(Map<String, Object> map) {
Map<String,Object> insertForGroup = new HashMap<>();
// 设置当前时间
insertForGroup.put("createTime",System.currentTimeMillis());
// 获取当前套餐数量
Integer groupCount = groupMapper.findAllGroupOnlyCount(new HashMap<>());
if(groupCount == null){
groupCount = 0;
}
// 构造套餐编码
String code = createCode(groupCount);
insertForGroup.put("code",code);
insertForGroup.put("state",1);
// 插入到数据库
groupMapper.addGroup(insertForGroup);
//获取插入的套餐id
Integer gid = ObjectFormatUtil.toInteger(insertForGroup.get("id"));
// 获取套餐中的物料id
List<Object> mids = (List<Object>) map.get("mids");
// 获取套餐中物料的数量
List<Object> quantitys = (List<Object>) map.get("quantitys");
// 用于添加套餐中的物料信息
Map<String,Object> materialForGroupMap = new HashMap<>();
materialForGroupMap.put("gid",gid);
Integer result = 0;
for (int i = 0; i < mids.size(); i++) {
// 获取物料id
Object mid = mids.get(i);
// 获取套餐中当前物料对应的数量
Object quantity = quantitys.get(i);
materialForGroupMap.put("mid",mid);
materialForGroupMap.put("quantity",quantity);
// 添加
result += groupMapper.addGroupForMaterial(materialForGroupMap);
}
return result;
}
/**
* 通过编码获取对应的套餐
* @param code 套餐编码
* @return
*/
@Override
public Group findGroupByCode(String code) {
return groupMapper.findGroupByCode(code);
}
/**
* 给套餐添加物料信息
* @param map 待添加信息
* @return
*/
@Override
public Integer addMaterialForGroup(Map<String, Object> map) {
//获取插入的套餐id
Integer gid = ObjectFormatUtil.toInteger(map.get("gid"));
// 获取套餐中的物料id
List<Object> mids = (List<Object>) map.get("mids");
// 获取套餐中物料的数量
List<Object> quantitys = (List<Object>) map.get("quantitys");
// 用于添加套餐中的物料信息
Map<String,Object> materialForGroupMap = new HashMap<>();
materialForGroupMap.put("gid",gid);
Integer result = 0;
for (int i = 0; i < mids.size(); i++) {
// 获取物料id
Object mid = mids.get(i);
// 获取套餐中当前物料对应的数量
Object quantity = quantitys.get(i);
materialForGroupMap.put("mid",mid);
materialForGroupMap.put("quantity",quantity);
// 添加
result += groupMapper.addGroupForMaterial(materialForGroupMap);
}
return result;
}
/**
* 添加一条套餐
* @param groupInfo 具体数据
* @return
*/
@Override
public Integer addGroup(GroupInfo groupInfo) {
return null;
}
/**
* 根据主键删除一条套餐记录
* @param id 待删除套餐主键
* @return
*/
@Transactional
@Override
public Integer delGroupById(Integer id) {
Map<String,Object> param = new HashMap<>();
param.put("gid",id);
List<GroupInfo> groupByCondition = groupMapper.findGroupByCondition(param);
List<Integer> ids = new ArrayList<>();
for (GroupInfo groupInfo : groupByCondition) {
ids.add(groupInfo.getId());
}
groupMapper.delMaterialForGroupByIds(ids);
return groupMapper.delGroup(id);
}
/**
* 根据主键批量删除套餐记录
* @param ids 主键列表
* @return
*/
@Override
public Integer delGroupByIds(List<Integer> ids) {
return null;
}
/**
* 修改套餐中对应物料信息
* @param map 修改数据及条件
* @return
*/
@Override
public Integer updateMaterialForGroup(Map<String, Object> map) {
// 获取当前要修改的套餐明细id
Integer id = ObjectFormatUtil.toInteger(map.get("id"));
// 获取当前要修改的物料明细数量
Integer quantity = ObjectFormatUtil.toInteger(map.get("quantity"));
if(Integer.compare(0,quantity) == 0){
// 如果要修改的数量为0则删除该明细
return groupMapper.delMaterialForGroupById(id);
}else {
// 根据id获取当前套餐明细
GroupInfo groupById = groupMapper.findGroupById(id);
groupById.setQuantity(quantity);
return groupMapper.updateMaterialForGroup(groupById);
}
}
/**
* 通过物料id与套餐id查询对应套餐明细
* @param mid 物料id
* @param gid 套餐id
* @return 套餐明细
*/
@Override
public GroupInfo findGroupInfoByMidAndGid(Integer mid, Integer gid) {
Map<String,Object> map = new HashMap<>();
map.put("mid",mid);
map.put("gid",gid);
List<GroupInfo> groupByCondition = groupMapper.findGroupByCondition(map);
if(groupByCondition.size() > 0){
return groupByCondition.get(0);
}
return null;
}
/**
* 根据主键删除一条套餐中的物料明细
* @param id 待删除主键
* @return
*/
@Override
public Integer delMaterialForGroupById(Integer id) {
return groupMapper.delMaterialForGroupById(id);
}
/**
* 根据主键批量删除套餐中的物料明细
* @param ids 待删除主键
* @return
*/
@Override
public Integer delMaterialForGroupByIds(List<Integer> ids) {
return groupMapper.delMaterialForGroupByIds(ids);
}
/**
* 根据条件修改套餐信息
* @param map 修改条件
* @return
*/
@Override
public Integer updateGroupState(Map<String, Object> map) {
// 获取待修改套餐id
Integer id = ObjectFormatUtil.toInteger(map.get("id"));
// 根据主键获取对应套餐
Group group = groupMapper.findGroupOnlyById(id);
Integer state = 2;
if(map.containsKey("state")){
state = ObjectFormatUtil.toInteger(map.get("state"));
}
group.setState(state);
return groupMapper.updateGroupOnly(group);
}
/**
* 根据条件修改套餐信息
* @param map 修改条件
* @return
*/
@Override
public Integer updateGroupInfo(Map<String, Object> map) {
return groupMapper.updateGroupOnly(map);
}
/**
* 根据条件获取套餐
* @param map 查询条件
* @return
*/
@Override
public List<Group> findGroupOnlyByCondition(Map<String, Object> map) {
return groupMapper.findGroupOnlyByCondition(map);
}
/**
* 用于构造套餐树
* @param gname
* @return
*/
public List<Object> InitTreeMenus(String gname) {
// 定义结果集
List<Object> list = new ArrayList<>();
// 获取所有使用中的套餐
List<Group> allGroupOnly = groupMapper.findAllGroupOnly(gname);
// 获取当前总数
Integer totalVal = allGroupOnly.size();
// 定义分页数量
double size = 10.0;
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数目
Integer openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 定义套餐id列表
List<Integer> groupIdList = new ArrayList<>();
for (int i = 0; i < allGroupOnly.size(); i++) {
Group group = allGroupOnly.get(i);
if (((i + 1) % 10) == 0) { // 如果有10个开启线程进行处理
groupIdList.add(group.getId());
Future<Object> future = completionService.submit(new Task(groupIdList));
openThreadSize++;
futureList.add(future); // 添加到结果集
groupIdList = new ArrayList<>(); // 情况列表
} else {
// 添加id到列表中
groupIdList.add(group.getId());
}
}
if (groupIdList.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<Object> future = completionService.submit(new Task(groupIdList));
futureList.add(future);
openThreadSize++;
}
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
list.addAll((Collection<?>) result);
}
return list;
}
// 用于执行线程任务
class Task implements Callable<Object> {
// 套餐id列表
List<Integer> groupIdList;
public Task(List<Integer> groupIdList){
this.groupIdList = groupIdList;
}
@Override
public Object call() throws Exception {
/**
* 获取当前套餐id对应的套餐
*/
List<Group> groupByGids = groupMapper.findGroupByGids(groupIdList);
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(groupByGids.size());
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 定义结果集
List<Object> list = new ArrayList<>();
for (int i = 0; i < groupByGids.size(); i++) {
// 获取套餐具体信息
Group group = groupByGids.get(i);
// 开启线程
Future<Object> submit = completionService.submit(new TaskForGroupInfo(group));
futureList.add(submit);
}
for (int i = 0; i < groupByGids.size(); i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
}
class TaskForGroupInfo implements Callable<Object>{
Group group;
TaskForGroupInfo(Group group){
this.group = group;
}
@Override
public Object call() throws Exception
{
// 用于获取当前套餐的具体信息
Map<String,Object> paramForGroup = new HashMap<>();
paramForGroup.put("gid",group.getId());
// 获取当前套餐的具体信息
List<GroupInfo> groupByCondition = groupMapper.findGroupByCondition(paramForGroup);
// 定义子类结果集
List<Object> resultForChildren = new ArrayList<>();
for (GroupInfo groupInfo : groupByCondition) {
Map<String, Object> stringObjectMap = InitTreeMenus(groupInfo);
resultForChildren.add(stringObjectMap);
}
Map<String, Object> stringObjectMap = InitTreeMenus(group, resultForChildren);
return stringObjectMap;
}
}
/**
* 构造树形组件数据模板
* @param g 套餐
* @param children 子类
* @return
*/
public Map<String, Object> InitTreeMenus(Group g, List<Object> children) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getGname());
map.put("id", g.getId());
map.put("children", children);
return map;
} else {
return null;
}
}
/**
* 构造树形组件的子组件模板
* @param g 套餐详细信息
* @return
*/
public Map<String, Object> InitTreeMenus(GroupInfo g) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getMname() + ",数量:" + g.getQuantity());
map.put("id", g.getId());
return map;
} else {
return null;
}
}
/**
*
* 用于创建套餐编码
* @param num 第几个套餐
* @return
*/
public String createCode(Integer num){
String code = "g-"+String.format("%05d", num + 1);
return code;
}
}

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

@ -56,7 +56,7 @@ public class MaterialServiceImpl implements MaterialService {
* @return 受影响的行数
*/
// 进行事务操作
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Integer insertMaterial(Map<String, Object> map) {
if (map.containsKey("quantity") && map.containsKey("price")) {
@ -124,7 +124,7 @@ public class MaterialServiceImpl implements MaterialService {
* @param map 参数列表
* @return 受影响的行数
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Integer updateMaterial(Map<String, Object> map) {
if (map.containsKey("price")) {
@ -378,9 +378,35 @@ public class MaterialServiceImpl implements MaterialService {
return material;
}
/**
* 根据物料id获取其在对应仓库中的库存数
* @param mid 物料id
* @param depositoryList 待查询的仓库
* @return
*/
@Override
public List<Integer> findInventoryByMidAndDepository(Integer mid, List<Depository> depositoryList) {
// 用于存储各仓库的库存
List<Integer> result = new ArrayList<>();
//
Map<String,Object> map = new HashMap<>();
map.put("mid",mid);
for (int i = 0; i < depositoryList.size(); i++) {
Depository depository = depositoryList.get(i);
map.put("did",depository.getId());
Inventory inventory = materialMapper.findInventoryByMidAndDid(map);
if(inventory!=null) {
result.add(inventory.getQuantity());
}else{
result.add(0);
}
}
return result;
}
/**
* 根据id查询库存信息
*
* @param id 库存id
* @return 库存信息
*/
@ -618,6 +644,7 @@ public class MaterialServiceImpl implements MaterialService {
m.setTypeName(materialTypeByOldId.getTname());
m.setTypeId(materialTypeByOldId.getOldId());
m.setWarningCount(warningCount);
m.setQuantity(1);
result.add(m);
}
return result;
@ -1132,7 +1159,7 @@ public class MaterialServiceImpl implements MaterialService {
* @param map 修改条件
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Integer editPlaceMaterial(Map<String, Object> map) {
// 获取要转移的库存信息

16
src/main/java/com/dreamchaser/depository_manage/service/impl/StockTakingServiceImpl.java

@ -65,7 +65,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param map
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Integer insertStockTaking(Map<String, Object> map) {
// 设置盘点时间
@ -127,7 +127,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param st
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Integer insertStockTaking(StockTaking st) {
return null;
@ -285,7 +285,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param userToken
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Map<String, Object> review(Map<String, Object> map, UserByPort userToken, String userAgent) {
@ -539,7 +539,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param userToken
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Map<String, Object> completeStockTaking(Map<String, Object> map, UserByPort userToken, String userAgent) {
@ -818,7 +818,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param templateCard
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Integer completeStockTakingByQyWx(TemplateCard templateCard, String userAgent) {
Map<String, Object> result = new HashMap<>();
@ -1126,7 +1126,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param approvalInfo_details 审批详情
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Map<String, Object> reviewByQyWxApproval(String mainId, ApprovalInfo_Details approvalInfo_details, String userAgent, String spStatus, String spNo) {
Map<String, Object> result = new HashMap<>();
@ -1361,7 +1361,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param map
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Integer stockTakingTransfer(Map<String, Object> map, UserByPort userToken, String userAgent) {
List<Integer> minIds = (List<Integer>) map.get("minIds");
@ -1573,7 +1573,7 @@ public class StockTakingServiceImpl implements StockTakingService {
* @param templateCard
* @return
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
@Override
public Map<String, Object> reviewByQyWx(TemplateCard templateCard, String userAgent) {

6
src/main/resources/application-test.yml

@ -79,9 +79,9 @@ mybatis:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
log-prefix: mapper.
#mybatis-plus:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
file:
uploadPath: D:/upLoad

1029
src/main/resources/static/js/application-out/application-out.js

File diff suppressed because it is too large

843
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;
}
</style>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-fluid">
<!-- 出库申请-->
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem">
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input"
style="border-style: none"
id="openSonByMaterial" onblur="selectMaterialByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search" style="display: inline"
id="selectMaterial" onclick="selectMaterial(this)"></i>
<div class="layui-tab">
<ul class="layui-tab-title" style="text-align: center">
<li class="layui-this">物料出库</li>
<li class="layui-this">套餐出库</li>
</ul>
<div class="layui-tab-content">
<!-- 普通物料出库申请-->
<div class="layui-tab-item layui-show">
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem">
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input"
style="border-style: none"
id="openSonByMaterial"
onblur="selectMaterialByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search"
style="display: inline"
id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name="mid" class="layui-input" id="mid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id="code" name="code" type="text"
placeholder="请填写入物料编码" value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="barCode" name="barCode" type="text"
placeholder="请填写入条形编码"
value=""
class="layui-input"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
id="barCodeImg"
style="margin-top: 10px" onclick="scanBarCode(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name="quantity" type="number" placeholder="请填写入物料数量"
value=""
onblur="MaterialQuantityIsTrue(this)" id="quantity"
class="layui-input" lay-verify="number" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
onclick="addItem(this)"></i>
</div>
<input type="text" name="mid" class="layui-input" id="mid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id="code" name="code" type="text" placeholder="请填写入物料编码" value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeByOut(this)">
<!-- 提交按钮-->
<div class="layui-form-item" id="btn_sub">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交&emsp;
</button>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="barCode" name="barCode" type="text" placeholder="请填写入条形编码"
value=""
class="layui-input"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
id="barCodeImg"
style="margin-top: 10px" onclick="scanBarCode(this)">
</form>
</div>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交申请成功
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name="quantity" type="number" placeholder="请填写入物料数量" value=""
onblur="MaterialQuantityIsTrue(this)" id="quantity"
class="layui-input" lay-verify="number" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再申请一次</button>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
onclick="addItem(this)"></i>
</div>
<!-- 提交按钮-->
<div class="layui-form-item" id="btn_sub">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交&emsp;
</button>
</div>
</form>
</div>
</div>
</form>
</div>
</div>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交申请成功
<div class="layui-tab-item">
<div class="layui-carousel" id="stepForm2" lay-filter="stepForm2" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParentForGroup">
<div class="layui-card-body" id="cardItemForGroup">
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItemForGroup(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">套餐名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择套餐" class="layui-input"
style="border-style: none"
id="openGroupList" onblur="selectGroupByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search"
style="display: inline"
id="selectGroup" onclick="selectGroup(this)"></i>
</div>
<input type="text" name="gid" class="layui-input" id="gid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id="gcode" name="code" type="text"
placeholder="请填写入套餐编码"
value=""
onblur="selectCodeForGroup(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px;display: none" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐数量:</label>
<div class="layui-input-block">
<input type="number" name="quantity" class="layui-input" id="quantityForGroup"
required lay-verify="number" placeholder="请填写套餐数量"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
id="addItemForGroup"
onclick="addItemForGroup(this)"></i>
</div>
<!--提交按钮-->
<div class="layui-form-item" id="btn_sub2">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep2"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交&emsp;
</button>
</div>
</div>
</div>
</form>
</div>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交申请成功
</div>
</div>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再申请一次</button>
</div>
</form>
</div>
</div>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再申请一次</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@ -155,6 +253,7 @@
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
<!--<script src="/static/js/application-out/application-out.js" charset="'UTF-8"></script>-->
<script>
// 用于添加标签
function addItem(obj) {
@ -164,18 +263,41 @@
function deleteItem(obj) {
}
// 用于添加标签(用于套餐)
function addItemForGroup(obj) {
}
// 用于删除标签(用于套餐)
function deleteItemForGroup(obj) {
}
// 用于编码查询
function selectCode(obj) {
}
// 用于编码查询(用于套餐)
function selectCodeForGroup(obj) {
}
// 用于点击搜索按钮
function selectMaterial(obj) {
}
// 用于点击搜索按钮(套餐)
function selectGroup(obj) {
}
// 用于物料名称查询
function selectMaterialByName(obj) {
}
// 用于套餐名称查询
function selectGroupByName() {
}
// 用于判断当前物料数量是否合适
function MaterialQuantityIsTrue() {
}
@ -184,8 +306,8 @@
function scanBarCode() {
}
// 用于重新渲染页面
function Coverpage() {
// 用于重新渲染页面(套餐)
function CoverpageForGroup() {
}
@ -195,12 +317,18 @@
// 用于暂存卡片个数
var params = [];
// 用于暂存卡片个数(套餐)
var params2 = [];
// 用于卡片编号
var NewIdNumber = 1;
layui.use(['form', 'step', 'layer', 'jquery'], function () {
layui.use(['form', 'step', 'layer', 'jquery', 'element'], function () {
var $ = layui.$,
form = layui.form,
element = layui.element,
step = layui.step;
// 用于分步表单加载
step.render({
elem: '#stepForm',
@ -214,6 +342,18 @@
}]
});
step.render({
elem: '#stepForm2',
filter: 'stepForm2',
width: '100%', //设置容器宽度
height: '600px',
stepItems: [{
title: '填写信息'
}, {
title: '提交成功'
}]
});
// 提交
form.on('submit(formStep)', function (data) {
data = data.field;
@ -272,17 +412,19 @@
return false;
});
form.on('submit(formStep2)', function (data) {
step.next('#stepForm');
return false;
});
$('.pre').click(function () {
step.pre('#stepForm');
step.pre('#stepForm2');
});
$('.next').click(function () {
step.next('#stepForm');
step.next('#stepForm2');
});
// 实现卡片添加
@ -357,77 +499,128 @@
$("#" + parentId).after(materialItem);
};
// 用于重新渲染页面
Coverpage = function (num, obj) {
var parent = $("#cardParent");
// 实现卡片添加(套餐)
addItemForGroup = function (obj) {
var parentId = obj.parentNode.id;
NewIdNumber = NewIdNumber + 1;
var materialItem = `
<div class="layui-card-body" id=` + "cardItemForGroup" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItemForGroup(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">套餐名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择套餐" class="layui-input"
style="border-style: none"
id=`+"openGroupList"+NewIdNumber+` onblur="selectGroupByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search"
style="display: inline"
id=`+"selectGroup"+NewIdNumber+` onclick="selectGroup(this)"></i>
</div>
<input type="text" name=`+"gid"+NewIdNumber+` class="layui-input" id=`+"gid"+NewIdNumber+`
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id=` + "gcode" + ` name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入套餐编码" value=""
onblur="selectCodeForGroup(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px;display: none" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐数量:</label>
<div class="layui-input-block">
<input type="number" name=`+"quantity"+NewIdNumber+` class="layui-input" id=`+"quantityForGroup"+NewIdNumber+`
required lay-verify="number" placeholder="请填写套餐数量"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" id=` + "addItemForGroup" + NewIdNumber + `
onclick="addItemForGroup(this)"></i>
</div>
`;
// 获取当前高度
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 firstItem =
// 前半部分
` <div class="layui-card-body" style="padding-right: 0px" id=` + "cardItem" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline" onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input" style="border-style: none"
id="openSonByMaterial" lay-verify="required" value="${obj.mname}" onblur="selectMaterialByName(this)"/>
<i class="layui-icon layui-icon-search" style="display: inline" id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name=` + "mid" + NewIdNumber + ` class="layui-input" id="mid" value="${obj.mid}"
style="display: none" lay-verify="required" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="code" name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" onblur="selectCode(this)"
class="layui-input" lay-verify="required" value="${obj.code}" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanCodeByOut(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select id=` + "barCode" + NewIdNumber + ` name=` + "barCode" + NewIdNumber + `></select>
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanBarCode(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name=` + "quantity" + NewIdNumber + ` type="number" placeholder="请填写入物料数量" value=""
class="layui-input" lay-verify="number">
</div>
</div>`;
var materialItem = `
<div class="layui-collapse">
<div class="layui-colla-item">
<h2 class="layui-colla-title"">${obj.mname}</h2>
<div class="layui-colla-content">
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料编码" value="${obj.mcode}"
readonly
class="layui-input" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input type="number" placeholder="请填写入物料数量" value="${obj.quantity}"
readonly
class="layui-input" lay-verify="number" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料型号:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料型号" value="${obj.version === null ? '' : obj.version}"
readonly
class="layui-input" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料类型:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料类型" value="${obj.tname}"
readonly
class="layui-input" lay-verify="text" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计量单位:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料计量单位" value="${obj.unit === null ? '' : obj.unit}"
readonly
class="layui-input" lay-verify="text" required>
</div>
</div>
</div>
</div>
</div>
`; // 最终
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
</div>`;
// 获取当前高度
var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
var height = parseInt(($("#stepForm2").css('height')).split("px")[0]);
if (NewIdNumber !== "") {
params.push(NewIdNumber)
}
$("#stepForm").css("height", height + 532 + 'px');
var materialItem = firstItem + lastItem; // 最终
$("#btn_sub").before(materialItem)
$("#stepForm2").css("height", height + 183 + 'px');
$("#" + "addItemForGroup" + NewIdNumber).before(materialItem);
};
// 实现卡片删除
@ -444,6 +637,20 @@
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 = [];
@ -527,6 +734,68 @@
});
};
// 用于实现通过编码查询套餐
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;
@ -562,53 +831,242 @@
},
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 = `
if(mid != '') {
$.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 = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`;
$("#" + barCodeImg.id).before(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();
$.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();
}
});
}
}
});
};
// 用于实现点击搜索按钮(套餐)
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();
}
}
form.render();
}
});
})
}
}
})
};
// 用于实现套餐名称搜索
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()
}
}
});
}
};
//用于实现物料名称搜索
@ -653,6 +1111,7 @@
});
};
// 扫描物料条码
scanBarCode = function (obj) {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
@ -695,7 +1154,7 @@
materialCode.value = data.mcode;
var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
barCodeInput.value = result;
}else{
} else {
// 如果没有对应关系
layer.msg("对于编码:" + result + ",并未发现对应的物料", {
icon: 0,
@ -710,7 +1169,6 @@
})
};
// 用于扫码功能
scanCodeByOut = function (obj) {
parent.wx.scanQRCode({
@ -789,6 +1247,7 @@
}
})
};
//用于判断当前物料数量是否合适
MaterialQuantityIsTrue = function (obj) {
var id = obj.id.split("quantity")[1];

831
src/main/resources/templates/pages/application/application-out_black2.html

@ -0,0 +1,831 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>分步表单</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
<link rel="stylesheet" href="/static/js/lay-module/step-lay/step.css" media="all">
</head>
<body>
<style>
.inputdiv {
display: flex;
background-color: #fff;
height: 38px;
line-height: 38px;
border: 1px solid rgb(238, 238, 238);
}
.layui-form-label {
padding: 9px 0px;
text-align: left;
}
.layui-input-block {
margin-left: 80px;
}
.layui-form-select {
width: 100%;
border-style: none;
}
.layui-card-body {
padding: 10px 5px;
}
.lay-step {
display: none;
}
.layui-form-select .layui-input{
border-style: none;
}
</style>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-fluid">
<!-- 出库申请-->
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem">
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input"
style="border-style: none"
id="openSonByMaterial" onblur="selectMaterialByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search" style="display: inline"
id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name="mid" class="layui-input" id="mid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id="code" name="code" type="text" placeholder="请填写入物料编码" value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="barCode" name="barCode" type="text" placeholder="请填写入条形编码"
value=""
class="layui-input"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
id="barCodeImg"
style="margin-top: 10px" onclick="scanBarCode(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name="quantity" type="number" placeholder="请填写入物料数量" value=""
onblur="MaterialQuantityIsTrue(this)" id="quantity"
class="layui-input" lay-verify="number" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
onclick="addItem(this)"></i>
</div>
<!-- 提交按钮-->
<div class="layui-form-item" id="btn_sub">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交&emsp;
</button>
</div>
</div>
</div>
</form>
</div>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交申请成功
</div>
</div>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再申请一次</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
<script>
// 用于添加标签
function addItem(obj) {
}
// 用于删除标签
function deleteItem(obj) {
}
// 用于编码查询
function selectCode(obj) {
}
// 用于点击搜索按钮
function selectMaterial(obj) {
}
// 用于物料名称查询
function selectMaterialByName(obj) {
}
// 用于判断当前物料数量是否合适
function MaterialQuantityIsTrue() {
}
// 用于扫描条形码
function scanBarCode() {
}
// 用于重新渲染页面
function Coverpage() {
}
// 用于扫码出库
function scanCodeByOut(obj) {
}
// 用于暂存卡片个数
var params = [];
// 用于卡片编号
var NewIdNumber = 1;
layui.use(['form', 'step', 'layer', 'jquery'], function () {
var $ = layui.$,
form = layui.form,
step = layui.step;
// 用于分步表单加载
step.render({
elem: '#stepForm',
filter: 'stepForm',
width: '100%', //设置容器宽度
height: '600px',
stepItems: [{
title: '填写信息'
}, {
title: '提交成功'
}]
});
// 提交
form.on('submit(formStep)', function (data) {
data = data.field;
data.params = params;
if (data.mid === undefined) {
// 如果没有初始项
var dataKeys = Object.keys(data);
var dataKey;
for (let i = 0; i < dataKeys.length; i++) {
dataKey = dataKeys[i];
if (dataKey.includes("mid")) {
break;
}
}
// 获取当前数字
var keyNumber = dataKey.split("mid")[1];
for (let index = 0; index < dataKeys.length; index++) {
var tempKey = dataKeys[index];
if (tempKey.includes(keyNumber)) {
var key = tempKey.replace(keyNumber, "");
data[key] = data[tempKey];
delete data[tempKey];
}
}
data.params = remove(data.params, Number(keyNumber));
}
$.ajax({
url: "/depositoryRecord/applicationOut",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(data),
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);//失败的表情
} else {
layer.msg("申请提交成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
}, function () {
step.next('#stepForm');
});
}
},
complete: function () {
layer.close(this.layerIndex);
}
});
return false;
});
form.on('submit(formStep2)', function (data) {
step.next('#stepForm');
return false;
});
$('.pre').click(function () {
step.pre('#stepForm');
});
$('.next').click(function () {
step.next('#stepForm');
});
// 实现卡片添加
addItem = function (obj) {
// 获取父元素id
var parentId = obj.parentNode.id;
NewIdNumber = NewIdNumber + 1;
// 物料名称栏目
var materialItem = `
<div class="layui-card-body" id=` + "cardItem" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline" onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input" style="border-style: none"
id="openSonByMaterial" lay-verify="required" onblur="selectMaterialByName(this)"/>
<i class="layui-icon layui-icon-search" style="display: inline" id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name=` + "mid" + NewIdNumber + ` class="layui-input" id="mid"
style="display: none" lay-verify="required" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id=` + "code" + NewIdNumber + ` name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id=` + "barCode" + NewIdNumber + ` name=` + "barCode" + NewIdNumber + ` type="text" placeholder="请填写入条形编码"
value=""
class="layui-input"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" id=` + "barCodeImg" + NewIdNumber + `
style="margin-top: 10px" onclick="scanBarCode(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name=` + "quantity" + NewIdNumber + ` type="number" placeholder="请填写入物料数量" value="" onblur="MaterialQuantityIsTrue(this)"
id=` + "quantity" + NewIdNumber + ` class="layui-input" lay-verify="number">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
</div>`;
// 获取当前高度
var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
params.push(NewIdNumber);
$("#stepForm").css("height", height + 422 + 'px');
$("#" + parentId).after(materialItem);
};
// 用于重新渲染页面
Coverpage = function (num, obj) {
var parent = $("#cardParent");
// 获取待添加父类
NewIdNumber = num;
if (num === 0) { // 如果是第一个
NewIdNumber = "";
}
var firstItem =
// 前半部分
` <div class="layui-card-body" style="padding-right: 0px" id=` + "cardItem" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline" onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input" style="border-style: none"
id="openSonByMaterial" lay-verify="required" value="${obj.mname}" onblur="selectMaterialByName(this)"/>
<i class="layui-icon layui-icon-search" style="display: inline" id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name=` + "mid" + NewIdNumber + ` class="layui-input" id="mid" value="${obj.mid}"
style="display: none" lay-verify="required" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="code" name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" onblur="selectCode(this)"
class="layui-input" lay-verify="required" value="${obj.code}" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanCodeByOut(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select id=` + "barCode" + NewIdNumber + ` name=` + "barCode" + NewIdNumber + `></select>
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanBarCode(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name=` + "quantity" + NewIdNumber + ` type="number" placeholder="请填写入物料数量" value=""
class="layui-input" lay-verify="number">
</div>
</div>`;
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
</div>`;
// 获取当前高度
var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
if (NewIdNumber !== "") {
params.push(NewIdNumber)
}
$("#stepForm").css("height", height + 532 + 'px');
var materialItem = firstItem + lastItem; // 最终
$("#btn_sub").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);
};
//删除数组中指定元素
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 = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`;
$("#" + barCodeImg.id).before(barCodeSelect);
}
form.render();
$.each(materialAndBarCodeList, function (index, item) {
$("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
} else {
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
}
}
}
}
});
};
// 用于实现点击搜索按钮
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 = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`;
$("#" + barCodeImg.id).before(barCodeSelect);
}
form.render();
$.each(materialAndBarCodeList, function (index, item) {
$("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
} else {
var barCode = $("#barCode" + idNumber);
if (barCode.length > 0) {
barCode.empty();
}
}
form.render();
}
});
}
});
};
//用于实现物料名称搜索
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 = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`;
$("#" + barCodeImg.id).before(barCodeSelect);
}
form.render();
$.each(materialAndBarCodeList, function (index, item) {
$("#barCode" + idNumber).append(new Option(item.bmcode, item.id));//往下拉菜单里添加元素
});
form.render();
}
$('#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("");
});
}
}
});
}
}
}
})
</script>
</body>
</html>

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

@ -71,7 +71,7 @@
{field: 'placeCode', width: 150, title: '库位编码'},
{field: 'quantity', width: 150, title: '数量',edit:'quantity'},
{field: 'price', width: 150, title: '单价',edit:'price'},
{field: 'depositoryId', width: 150, title: '仓库编号',edit:'quantity'},
{field: 'depositoryId', width: 150, title: '仓库编号'},
{field: 'applyRemark', width: 150, title: '备注说明',edit:'applyRemark'},
{title: '操作', minWidth: 250, toolbar: '#currentTableBar', align: "center"}
]

3
src/main/resources/templates/pages/depository/table-in.html

@ -270,7 +270,8 @@
layer.full(index);
});
return false;
} else if (obj.event === 'delete') {
}
else if (obj.event === 'delete') {
var req = {};
req.id = data.id;
layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) {

1
src/main/resources/templates/pages/depository/table-stock.html

@ -156,7 +156,6 @@
page: true,
skin: 'line',
done: function (res, curr, count) {
$("[data-field='shelfLifeForCalc']").css('display', 'none');
$.each(res['data'], function (i, j) {
let jElement = j['warningCount'];
let placeCode = j['placeCode'].split(" ");

340
src/main/resources/templates/pages/group/group-add.html

@ -0,0 +1,340 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<input style="display: none" id="gid" th:value="${gid}">
<script id="toolbarDemo" type="text/html">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add">添加</button>
</div>
</script>
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">种类</label>
<div class="layui-input-inline">
<input type="text" placeholder="请选择物料类型" class="layui-input" id="openSonByMateralType"
readonly/>
<input type="text" id="materialTypeId" placeholder="请选择物料类型" name="materialTypeId"
class="layui-input" style="display: none"/>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-inline">
<input type="text" name="mname" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">存货编码</label>
<div class="layui-input-inline">
<input type="text" name="code" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索
</button>
</div>
</div>
</form>
</div>
</fieldset>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
</div>
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'layer', 'dropdown', 'tree', 'laydate'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
// 用于暂存选择的数据
let checkList = [];
let gid = $("#gid").val();
$('#openSonByMateralType').on('click', function () {
layer.open({
type: 2,
title: '弹窗内容',
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['70%', '70%'],
move: '.layui-layer-title',
fixed: false,
content: '/selectType',
success: function (layero, index) {
var children = layero.children();
var content = $(children[1]);
var iframeChildren = $(content.children());
content.css('height', '100%');
iframeChildren.css('height', '100%');
}
});
});
table.render({
elem: "#currentTableId",
url: '/material/material',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
"message": res.statusInfo.message, //解析提示文本
"count": res.count, //解析数据长度
"data": res.data //解析数据列表
};
},
request: {
pageName: 'page', //页码的参数名称,默认:page
limitName: 'size' //每页数据量的参数名,默认:limit
},
response: {
statusName: 'status' //规定数据状态的字段名称,默认:code
, statusCode: 200 //规定成功的状态码,默认:0
, msgName: 'message' //规定状态信息的字段名称,默认:msg
, countName: 'count' //规定数据总数的字段名称,默认:count
, dataName: 'data' //规定数据列表的字段名称,默认:data
},
toolbar: '#toolbarDemo',
cols: [
[
{type: "checkbox", width: 50},
{field: 'quantity', width: 200, title: '数量', edit: 'quantity'},
{field: 'mname', width: 200, title: '物料名称'},
{field: 'version', width: 250, title: '规格型号'},
{field: 'code', width: 200, title: '存货编码'},
{field: 'typeName', width: 200, title: '物料类型'},
{field: 'unit', width: 200, title: '计量单位'},
{field: 'texture', width: 200, title: '材质',},
]
],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line',
done: function (res, curr, count) {
if (checkList.length > 0) {
let count = 0;
$.each(res['data'], function (i, j) {
let id = j["id"];
for (let k = 0; k < checkList.length; k++) {
if(checkList[k].id === id){
let index = j["LAY_TABLE_INDEX"];
$('tr[data-index=' + index + '] input[type="checkbox"]').prop('checked','true');
form.render('checkbox'); //刷新checkbox选择框渲染
count++;
}
}
});
if(count === res.data.length){
// 如果是全选
$('tr input[type="checkbox"]').prop('checked','true');
form.render('checkbox');
}
}
}
});
table.on('toolbar(currentTableFilter)', function (obj) {
if (obj.event === 'add') { // 监听添加操作申请操作
var checkStatus = table.checkStatus('currentTableId')
, data = checkStatus.data;
var req = {};
req.mids = [];
req.quantitys = [];
let len = data.length;
for (let i = 0; i < len; i++) {
req.mids[i] = data[i].id;
req.quantitys[i] = data[i].quantity;
}
req.len = len;
if (req.mids.length > 0) {
// 如果有,则进行下一步
if(gid === "-1") {
$.ajax({
url: '/group/addGroup',
type: 'post',
dataType: "json",
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (res) {
if (res.status >= 300) {
layer.msg(res.statusInfo.message);//失败的表情
return;
} else {
layer.msg("添加成功!", {
icon: 6,//成功的表情
time: 1000
}, //1秒关闭(如果不配置,默认是3秒)
function () {
//do something
table.reload('currentTableId', {
url: '/material/material',
page: {
curr: 1
}
}, 'data')
});
}
}
})
}else{
req.gid = gid;
$.ajax({
url: '/group/addMaterialForGroup',
type: 'post',
dataType: "json",
data: JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (res) {
if (res.status >= 300) {
layer.msg(res.statusInfo.message);//失败的表情
return;
} else {
layer.msg("添加成功!", {
icon: 6,//成功的表情
time: 1000
}, //1秒关闭(如果不配置,默认是3秒)
function () {
//do something
table.reload('currentTableId', {
url: '/material/material',
page: {
curr: 1
}
}, 'data')
});
}
}
})
}
}else{
layer.msg("请选择物料",{
icon:0,
time:500
})
}
}
});
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
var req = {};
data = data.field;
req.type = 1;
if (data.mname !== '') {
req.mname = data.mname;
}
if (data.materialTypeId !== '') {
req.materialTypeId = data.materialTypeId;
}
if (data.code !== '') {
req.code = data.code
}
//执行搜索重载
table.reload('currentTableId', {
url: '/material/material',
page: {
curr: 1
},
where: req
}, 'data');
return false;
});
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
if(obj.type === "one") {
// 如果选择的是一个
if (obj.checked) {
let flag = true;
for (let i = 0; i < checkList.length; i++) {
let data = checkList[i];
if (data.id === obj.data.id) {
flag = false;
break
}
}
if (flag) {
checkList.push(obj.data);
}
} else {
for (let i = 0; i < checkList.length; i++) {
let data = checkList[i];
if (data.id === obj.data.id) {
checkList.splice(i, i + 1);
break
}
}
}
}
else{
// 如果是全选
// 获取选中的数据
let dataList = table.checkStatus('currentTableId').data;
if (obj.checked) {
for (let i = 0; i < dataList.length; i++) {
let dataItem = dataList[i];
let flag = true;
for (let j = 0; j < checkList.length; j++) {
let data = checkList[j];
if (data.id === dataItem.id) {
flag = false;
break
}
}
if (flag) {
checkList.push(dataItem);
}
}
}else{
dataList = table.getData('currentTableId');
for (let i = 0; i < dataList.length; i++) {
let dataItem = dataList[i];
for (let j = 0; j < checkList.length; j++) {
let data = checkList[j];
if (data.id === dataItem.id) {
checkList.splice(j, j + 1);
break
}
}
}
}
}
});
})
</script>
</body>
</html>

446
src/main/resources/templates/pages/group/group-out.html

@ -0,0 +1,446 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<script id="toolbarDemo" type="text/html">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add">添加</button>
<button class="layui-btn layui-btn-danger layui-btn-sm data-delete-btn" lay-event="delete">删除</button>
</div>
</script>
<fieldset class="table-search-fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">创建日期</label>
<div class="layui-input-block">
<input type="text" name="createTime" id="date" placeholder="请选择创建日期"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">套餐名称</label>
<div class="layui-input-inline">
<input type="text" name="name" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">套餐编码</label>
<div class="layui-input-inline">
<input type="text" name="code" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-inline">
<select id="state" name="state">
<option value="" selected>请选择状态</option>
<option value="1">启用</option>
<option value="2">禁用</option>
</select>
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn layui-btn-primary" lay-submit
lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索
</button>
</div>
</div>
</form>
</div>
</fieldset>
<!-- 状态展示-->
<script type="text/html" id="switchTpl">
<input type="checkbox" name="state" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用"
lay-filter="changeState" {{ d.state== 1 ? 'checked' : '' }} >
</script>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
</div>
</div>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="detail">详情</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" th:style="'display:'+${display}"
lay-event="realDelete">彻底删除</a>
</script>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 用于查看并修改套餐中的物料信息
function checkSeeGroup(){};
layui.use(['form', 'table', 'laydate'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table,
laydate = layui.laydate;
//日期
laydate.render({
elem: '#date'
});
// 加载表格
table.render({
elem: "#currentTableId",
url: '/group/findAllGroup',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
"message": res.statusInfo.message, //解析提示文本
"count": res.count, //解析数据长度
"data": res.data //解析数据列表
};
},
request: {
pageName: 'page', //页码的参数名称,默认:page
limitName: 'size' //每页数据量的参数名,默认:limit
},
response: {
statusName: 'status' //规定数据状态的字段名称,默认:code
, statusCode: 200 //规定成功的状态码,默认:0
, msgName: 'message' //规定状态信息的字段名称,默认:msg
, countName: 'count' //规定数据总数的字段名称,默认:count
, dataName: 'data' //规定数据列表的字段名称,默认:data
},
toolbar: '#toolbarDemo',
cols: [
[
{type: "checkbox", width: 50},
{field: 'gname', width: 150, title: '套餐名称',edit:'gname'},
{field: 'code', width: 150, title: '套餐编码'},
{title: '拥有物料', width: 700, align: "center"},
{field: 'quantity', width: 200, title: '数量'},
{field: 'createTime', width: 200, title: '创建时间'},
{field: 'state', title: '状态', minWidth: 80, templet: '#switchTpl'},
{title: '操作', minWidth: 200, toolbar: '#currentTableBar', align: "center"}
]
],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line',
done: function (res, curr, count) {
$.each(res['data'], function (i, j) {
let materialSimple = j["materialSimple"];
let gid = j["id"];
let keys = Object.keys(materialSimple);
var materialItem = $("[lay-id='currentTableId'] tr:eq(" + (i+1) + ")").children()[3];
var aItem = materialItem.childNodes[0];
for (let k = 0; k < keys.length; k++) {
$(aItem).append('<button id='+ gid+' class="layui-btn layui-btn-primary layui-btn-xs" onclick="checkSeeGroup(this)" value='+materialSimple[keys[k]]+'>'+keys[k]+'</button>')
}
})
}
});
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
var req = {};
data = data.field;
if (data.code !== '') {
req.code = data.code;
}
if(data.createTime !== ''){
req.createTime = data.createTime;
}
if(data.state !== ''){
req.state = data.state;
}
if(data.name !== ''){
req.gname = data.name;
}
//执行搜索重载
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
where: req
}, 'data');
return false;
});
// 用于监视表格编辑
table.on('edit(currentTableFilter)', function(obj){ //注:edit是固定事件名,test是table原始容器的属性 lay-filter="对应的值"
let gid = obj.data.id;
let gname = obj.value;
let req = {};
req.id = gid;
req.gname = gname;
$.ajax({
url:'/group/editGroupInfo',
dataType:"json",
type:"post",
data:JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (data) {
if (data.status >= 300) {
layer.msg(data.statusInfo.message);//失败的表情
} else {
//执行搜索重载
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
}, 'data');
return false;
}
}
});
});
// 用于监听操作
table.on('tool(currentTableFilter)', function (obj) {
let data = obj.data;
if (obj.event === 'detail') {
var index = layer.open({
title: '套餐详情',
type: 2,
shade: 0.2,
maxmin: true,
shadeClose: true,
area: ['100%', '100%'],
content: '/group_edit?id='+data.id,
});
$(window).on("resize", function () {
layer.full(index);
});
}
else if (obj.event === 'delete') {
var req = {};
req.id = data.id;
layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) {
$.ajax({
url:"/group/delGroup",
type:"post",
dataType:"json",
data:JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (data) {
layer.close(this.layerIndex);
if (data.status >= 300) {
layer.msg(data.statusInfo.message);//失败的表情
} else {
layer.msg("删除成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
});
//执行搜索重载
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
}, 'data');
return false;
}
}
})
});
}
else if (obj.event === 'realDelete') { //彻底删除
layer.confirm('该操作将无法挽回', {icon: 2, title: '提示'}, function (index) {
var req = {};
req.id = data.id;
$.ajax({
url:"/group/realDelGroup",
type:"post",
dataType:"json",
data:JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (data) {
layer.close(this.layerIndex);
if (data.status >= 300) {
layer.msg(data.statusInfo.message);//失败的表情
} else {
layer.msg("删除成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
});
//执行搜索重载
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
}, 'data');
return false;
}
}
})
})
}
});
//用于查看并修改套餐中的物料信息
checkSeeGroup = function (obj) {
let gid = obj.id;
let mid = obj.value;
layer.open({
type: 2,
title: "套餐明细",
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/materialForGroup?mid='+mid+'&gid='+gid,
end:function () {
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
}, 'data');
}
});
};
//监听状态操作
form.on('switch(changeState)', function (obj) {
var req = new Map;
if (obj.elem.checked) {
req["state"] = 1
}
req["id"] = this.value;
$.ajax({
url: "/group/changeGroupState",
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);//失败的表情
} else {
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
}, 'data');
}
}
})
});
/**
* toolbar监听事件
*/
table.on('toolbar(currentTableFilter)', function (obj) {
if (obj.event === 'add') { // 监听添加操作
layer.open({
type: 2,
title: "创建套餐",
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/group_add',
end:function () {
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
}, 'data');
}
});
}
else if(obj.event === 'delete') {
var checkStatus = table.checkStatus('currentTableId')
, data = checkStatus.data;
var req = {};
req.ids = [];
for (i = 0, len = data.length; i < len; i++) {
req.ids[i] = data[i].id;
}
if (req.ids.length > 0) {
layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) {
$.ajax({
url:"/group/delGroup",
type:"post",
dataType:"json",
data:JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (data) {
layer.close(this.layerIndex);
if (data.status >= 300) {
layer.msg(data.statusInfo.message);//失败的表情
} else {
layer.msg("删除成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
});
//执行搜索重载
table.reload('currentTableId', {
url: '/group/findAllGroup',
page: {
curr: 1
},
}, 'data');
return false;
}
}
})
})
}else{
layer.msg("未选中记录,请确认!");
return false;
}
}
})
})
</script>
</body>
</html>

192
src/main/resources/templates/pages/group/group_edit.html

@ -0,0 +1,192 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<input id="id" th:value="${id}" style="display:none;">
<script id="toolbarDemo" type="text/html">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn" lay-event="add">添加</button>
</div>
</script>
<table class="layui-hide" id="currentTableId" lay-filter="currentTableFilter"></table>
</div>
</div>
<script type="text/html" id="currentTableBar">
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-edit" lay-event="detail">详情</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
</script>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 用于通过编码查询物料
function selectMaterialByCode(obj) {
}
// 用于点击搜索按钮
function selectMaterial(obj) {
}
layui.use(['form', 'table'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
// 加载表格
let id = $("#id").val();
table.render({
elem: "#currentTableId",
url: '/group/findGroupInfo',
parseData: function (res) { //res 即为原始返回的数据
return {
"status": res.status, //解析接口状态
"message": res.statusInfo.message, //解析提示文本
"count": res.count, //解析数据长度
"data": res.data //解析数据列表
};
},
request: {
pageName: 'page', //页码的参数名称,默认:page
limitName: 'size' //每页数据量的参数名,默认:limit
},
where: {gid:id},
response: {
statusName: 'status' //规定数据状态的字段名称,默认:code
, statusCode: 200 //规定成功的状态码,默认:0
, msgName: 'message' //规定状态信息的字段名称,默认:msg
, countName: 'count' //规定数据总数的字段名称,默认:count
, dataName: 'data' //规定数据列表的字段名称,默认:data
},
toolbar: '#toolbarDemo',
cols: [
[
{type: "checkbox", width: 50},
{field: 'mcode', width: 150, title: '存货编码', sort: true},
{field: 'mname', width: 120, title: '物料名称', sort: false},
{field: 'version', width: 200, title: '规格型号', sort: false},
{field: 'quantity', width: 200, title: '数量'},
{field: 'tname', width: 150, title: '物料种类'},
{field: 'texture', width: 100, title: '材质'},
{field: 'unit', width: 150, title: '计量单位'},
{field: 'brand', width: 150, title: '品牌'},
{field: 'shelfLife', width: 150, title: '保质期'},
{field: 'productionPlace', width: 150, title: '产地'},
{title: '操作', minWidth: 150, toolbar: '#currentTableBar', align: "center"}
]
],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: true,
skin: 'line'
});
// 用于监听操作
table.on('tool(currentTableFilter)', function (obj) {
let data = obj.data;
if (obj.event === 'detail') {
layer.open({
type: 2,
title: "物料明细",
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/materialForGroup?mid='+data.mid+'&gid='+id,
end:function () {
table.reload('currentTableId', {
url: '/group/findGroupInfo',
page: {
curr: 1
},
where:{
gid:id
}
}, 'data');
}
});
}
else if (obj.event === 'delete') {
var req = {};
req.id = data.id;
layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) {
$.ajax({
url:"/group/delMaterialForGroup",
type:"post",
dataType:"json",
data:JSON.stringify(req),
contentType: "application/json;charset=utf-8",
success: function (data) {
layer.close(this.layerIndex);
if (data.status >= 300) {
layer.msg(data.statusInfo.message);//失败的表情
} else {
layer.msg("删除成功", {
icon: 6,//成功的表情
time: 500 //1秒关闭(如果不配置,默认是3秒)
});
//执行搜索重载
table.reload('currentTableId', {
url: '/group/findGroupInfo',
page: {
curr: 1
},
where:{
gid:id
}
}, 'data');
return false;
}
}
})
});
}
});
/**
* toolbar监听事件
*/
table.on('toolbar(currentTableFilter)', function (obj) {
if (obj.event === 'add') { // 监听添加操作
layer.open({
type: 2,
title: "物料明细",
skin: 'layui-layer-rim',
maxmin: true,
shadeClose: true, //点击遮罩关闭层
area: ['100%', '100%'],
move: '.layui-layer-title',
fixed: false,
content: '/group_add?gid='+id,
end:function () {
table.reload('currentTableId', {
url: '/group/findGroupInfo',
page: {
curr: 1
},
where:{
gid:id
}
}, 'data');
}
});
}
})
})
</script>
</body>
</html>

148
src/main/resources/templates/pages/group/group_material_edit.html

@ -0,0 +1,148 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<form class="layui-form layui-form-pane" action="">
<input type="text" id="id" name="id" th:value="${record.getId()}" style="display:none;">
<div class="layui-form-item">
<label class="layui-form-label">套餐编码</label>
<div class="layui-input-inline">
<input type="text" th:value="${record.getGcode()}" name="gcode" required lay-verify="required" readonly
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编号</label>
<div class="layui-input-inline">
<input id="mcode" type="text" th:value="${record.getMcode()}" name="mcode" required lay-verify="required" autocomplete="off"
class="layui-input" onblur="selectMaterialByCode(this)" readonly="readonly">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-inline">
<input type="text" th:value="${record.getMname()}" name="mname" required lay-verify="required" readonly
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">规格型号</label>
<div class="layui-input-inline">
<input type="text" th:value="${record.getVersion()}" name="version" autocomplete="off" readonly
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量</label>
<div class="layui-input-inline">
<input type="text" th:value="${record.getQuantity()}" name="quantity" autocomplete="off"
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">品牌:</label>
<div class="layui-input-inline">
<input type="text" placeholder="请填写物料品牌" class="layui-input" th:value="${record.getBrand()}" readonly
name="brand"/>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料类型</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" id="openSonByMateralType" readonly
th:value="${record.getTname()}"
lay-verify="required"/>
<input type="text" id="materialTypeId" th:value="${record.getMtid()}"
name="materialTypeId" class="layui-input" style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">材质</label>
<div class="layui-input-inline">
<input type="text" th:value="${record.getTexture()}" name="texture" autocomplete="off" readonly
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计量单位</label>
<div class="layui-input-inline">
<input type="text" th:value="${record.getUnit()}" name="unit" required autocomplete="off" readonly
class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注:</label>
<div class="layui-input-inline">
<input type="text" placeholder="请填写备注" class="layui-input" th:value="${record.getRemark()}"
name="remark" />
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 用于通过编码查询物料
function selectMaterialByCode(obj) {
}
// 用于点击搜索按钮
function selectMaterial(obj) {
}
layui.use(['form'], function () {
var form = layui.form, $ = layui.$;
let id = $("#id").val();
form.on('submit(formDemo)', function (data) {
data = data.field;
data.id = id;
$.ajax({
url: "/group/materialForGroupEdit",
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
data: JSON.stringify(data),
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 () {
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);//关闭当前页
window.location = '/group_out'
})
}
}
});
return false;
});
})
</script>
</body>
</html>

85
src/main/resources/templates/pages/group/selectGroup.html

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/lib/layui-v2.6.3/css/layui.css" media="all">
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<div id="test2" class="demo-tree"></div>
<input id="gname" name="gname" th:value="${gname}" style="display: none">
<input id="clickObj" name="clickObj" th:value="${clickObj}" style="display: none">
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'layer', 'dropdown', 'tree'], function () {
var $ = layui.jquery,
tree = layui.tree;
var gname = $("#gname").val();
var clickObj = $("#clickObj").val();
// 用于暂存当前查询结果
var tempData = [];
var req = {};
req.gname = gname;
var test = tree.render({
elem: '#test2'
, data: []
, click: function (obj) {
let data = obj.data;
if(data.children === undefined){
return false;
}else{
var windowParent = $("#"+clickObj,window.parent.document)[0];
var parentId = windowParent.id;
// 获取对应元素
var pid = Number(windowParent.id.split("cardItemForGroup")[1]);
// 获取当前卡片中的套餐名称等
let gnameParent = windowParent.childNodes[5].childNodes[3];
// 套餐编码
let gcodeItem = windowParent.childNodes[7].childNodes[3].childNodes[1].childNodes[1];
// gid
let gidItem = gnameParent.childNodes[3];
// gname
let gnameItem = gnameParent.childNodes[1].childNodes[1];
gnameItem.value = data.title;
gidItem.value = data.id;
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
}
});
$.ajax({
url: "/group/treeMenus",
data: JSON.stringify(req),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
success: function (d) {
tempData = d.data;
test.reload({
data: tempData
});
}
});
})
</script>
</body>
</html>

29
src/main/resources/templates/pages/material/material-out.html

@ -22,20 +22,12 @@
<div class="layui-inline">
<label class="layui-form-label">品牌</label>
<div class="layui-input-inline">
<!--<select name="depositoryId" >
<option value="" selected>请选择仓库</option>
<option th:each="depository,iterStar:${depositories}" th:value="${depository?.getId()}" th:text="${depository?.getDname()}" >外芯仓库</option>
</select>-->
<input type="text" class="layui-input" id="brand" name="brand" autocomplete="off"/>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">种类</label>
<div class="layui-input-inline">
<!--<select name="materialTypeId" >
<option value="" selected>请选择物料类型</option>
<option th:each="materialType,iterStar:${materialTypes}" th:value="${materialType?.getId()}" th:text="${materialType?.getTname()}" >芯片类</option>
</select>-->
<input type="text" placeholder="请选择物料类型" class="layui-input" id="openSonByMateralType"
readonly/>
<input type="text" id="materialTypeId" placeholder="请选择物料类型" name="materialTypeId"
@ -105,14 +97,11 @@
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 定义过期警报时间为7天
var warningTime = 604800000;
layui.use(['form', 'table', 'upload'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table,
upload = layui.upload;
var nowDay = $("#nowDay").val();
$('#openSonByMateralType').on('click', function () {
layer.open({
@ -189,22 +178,6 @@
}
});
// 用于给table行上色的方法
function Layui_SetDataTableRowColor(TabDivId, RowIndex, ColorString) {
try {
var div = $("[lay-id='currentTableId'] tr:eq(" + RowIndex + ")");
if (div != null) //找到对象了
{
// console.log(div);
div.css("color", ColorString);
} else {
console.log('没有找到对象');
}
} catch (e) {
console.log(e.message);
}
}
// 监听搜索操作
@ -455,7 +428,7 @@
}
})
});
} else if (obj.event == 'realDelete') { //彻底删除
} else if (obj.event === 'realDelete') { //彻底删除
var req = {};
req.id = data.id;
layer.confirm('该操作会造成不可逆后果,是否继续?', {

127
src/main/resources/templates/pages/material/selectMaterial.html

@ -10,35 +10,60 @@
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<div id="test2" class="demo-tree"></div>
<input id="mname" name="mname" th:value="${mname}" style="display: none">
<input id="type" name="type" th:value="${type}" style="display: none">
<div id="test2" class="demo-tree"></div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
var data;
layui.use(['form', 'layer', 'dropdown', 'tree'], function () {
var $ = layui.jquery,
tree = layui.tree;
var mname = $("#mname").val();
var type = $("#type").val();
// 用于暂存当前查询结果
var tempData = [];
var req = {};
req.mname = mname;
req.type = type;
test = tree.render({
var test = tree.render({
elem: '#test2'
, data: []
, data: []
, click: function (obj) {
var state = obj.state;
if (obj.data.children !== undefined) {
return false
if("open" === state){
var id = obj.data.id;
var param = {};
param.mtId = id;
param.mname = mname;
param.type = type;
if(placeId !== "-1"){
param.placeId = placeId;
param.depositoryId = depositoryId;
}
addTreeChildren(param);
}else{
var param = {};
param.mtId = id;
closeTreeChildren(param);
return false
}
}else{
materialName.value = obj.data.title;
materialId.value = obj.data.id;
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
$("#openSonByMaterial", window.parent.document).val(obj.data.title);
$("#mid", window.parent.document).val(obj.data.id);
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
});
$.ajax({
url: "/material/treeMenus_Test",
url: "/material/treeMenus",
data: JSON.stringify(req),
type: 'post',
dataType: 'json',
@ -49,9 +74,91 @@
success: function (d) {
layer.close(this.layerIndex);
var data2 = d.data;
tempData = data2;
test.reload({
data: tempData
});
}
});
$("#test2").on("click",".layui-tree-entry",function(event){
var target = $(event.target);
var id = this.parentNode.getAttribute("data-id");
var context = target.context.className;
if(context.includes("layui-tree-main")){
var childrenName = this.childNodes[0].childNodes[0].childNodes[0].className;
if(childrenName.includes("layui-icon-addition")){
// console.log("隐藏")
var param = {};
param.mtId = id;
closeTreeChildren(param);
}else if(childrenName.includes("layui-icon-subtraction")){
var param = {};
param.mtId = id;
param.mname = mname;
param.type = type;
if(placeId !== "-1"){
param.placeId = placeId;
param.depositoryId = depositoryId;
}
addTreeChildren(param);
}
}else if(context.includes("layui-icon")){
if(context.includes("layui-icon-addition")){
var param = {};
param.mtId = id;
closeTreeChildren(param);
// console.log("隐藏")
}else if(context.includes("layui-icon-subtraction")){
var param = {};
param.mtId = id;
param.mname = mname;
param.type = type;
if(placeId !== "-1"){
param.placeId = placeId;
param.depositoryId = depositoryId;
}
addTreeChildren(param);
}
}
});
// 用于添加分支
addTreeChildren = function(param) {
$.ajax({
url: "/material/getNewTreeForMtId",
data: JSON.stringify(param),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (d) {
layer.close(this.layerIndex);
var data2 = d.data;
tempData = data2;
test.reload({
data: tempData
});
}
});
};
closeTreeChildren = function (param) {
$.ajax({
url: "/material/closeTreeChildren",
data: JSON.stringify(param),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8"
});
}
})
</script>
</body>

218
src/test/java/com/dreamchaser/depository_manage/TestForGroupTree.java

@ -0,0 +1,218 @@
package com.dreamchaser.depository_manage;
import com.alibaba.fastjson.JSONObject;
import com.dreamchaser.depository_manage.entity.Depository;
import com.dreamchaser.depository_manage.entity.Group;
import com.dreamchaser.depository_manage.entity.GroupInfo;
import com.dreamchaser.depository_manage.entity.UserByPort;
import com.dreamchaser.depository_manage.mapper.GroupMapper;
import com.dreamchaser.depository_manage.pojo.RoleAndDepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.*;
import java.util.concurrent.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestForGroupTree {
@Autowired
GroupMapper groupMapper;
@Test
public void Test(){
List<Object> list = InitTreeMenus("");
System.out.println(JSONObject.toJSONString(list));
}
/**
* 用于构造套餐树
* @param gname
* @return
*/
public List<Object> InitTreeMenus(String gname) {
// 定义结果集
List<Object> list = new ArrayList<>();
// 获取所有使用中的套餐
List<Group> allGroupOnly = groupMapper.findAllGroupOnly(gname);
// 获取当前总数
Integer totalVal = allGroupOnly.size();
// 定义分页数量
double size = 10.0;
// 定义线程数
Integer threadSize = (int) Math.ceil(totalVal / size);
// 定义开启线程数目
Integer openThreadSize = 0;
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(threadSize);
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 定义套餐id列表
List<Integer> groupIdList = new ArrayList<>();
for (int i = 0; i < allGroupOnly.size(); i++) {
Group group = allGroupOnly.get(i);
if (((i + 1) % 10) == 0) { // 如果有10个开启线程进行处理
groupIdList.add(group.getId());
Future<Object> future = completionService.submit(new Task(groupIdList));
openThreadSize++;
futureList.add(future); // 添加到结果集
groupIdList = new ArrayList<>(); // 情况列表
} else {
// 添加id到列表中
groupIdList.add(group.getId());
}
}
if (groupIdList.size() > 0) {
// 如果有剩余,开启线程进行处理
Future<Object> future = completionService.submit(new Task(groupIdList));
futureList.add(future);
openThreadSize++;
}
for (int i = 0; i < openThreadSize; i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
list.addAll((Collection<?>) result);
}
return list;
}
// 用于执行线程任务
class Task implements Callable<Object> {
// 套餐id列表
List<Integer> groupIdList;
public Task(List<Integer> groupIdList){
this.groupIdList = groupIdList;
}
@Override
public Object call() throws Exception {
/**
* 获取当前套餐id对应的套餐
*/
List<Group> groupByGids = groupMapper.findGroupByGids(groupIdList);
// 开启对应数量的线程
ExecutorService exs = Executors.newFixedThreadPool(groupByGids.size());
// 线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
// 定义结果集
List<Object> list = new ArrayList<>();
for (int i = 0; i < groupByGids.size(); i++) {
// 获取套餐具体信息
Group group = groupByGids.get(i);
// 开启线程
Future<Object> submit = completionService.submit(new TaskForGroupInfo(group));
futureList.add(submit);
}
for (int i = 0; i < groupByGids.size(); i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
}
class TaskForGroupInfo implements Callable<Object>{
Group group;
TaskForGroupInfo(Group group){
this.group = group;
}
@Override
public Object call() throws Exception
{
// 用于获取当前套餐的具体信息
Map<String,Object> paramForGroup = new HashMap<>();
paramForGroup.put("gid",group.getId());
// 获取当前套餐的具体信息
List<GroupInfo> groupByCondition = groupMapper.findGroupByCondition(paramForGroup);
// 定义子类结果集
List<Object> resultForChildren = new ArrayList<>();
for (GroupInfo groupInfo : groupByCondition) {
Map<String, Object> stringObjectMap = InitTreeMenus(groupInfo);
resultForChildren.add(stringObjectMap);
}
Map<String, Object> stringObjectMap = InitTreeMenus(group, resultForChildren);
return stringObjectMap;
}
}
/**
* 构造树形组件数据模板
* @param g 套餐
* @param children 子类
* @return
*/
public Map<String, Object> InitTreeMenus(Group g, List<Object> children) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getGname());
map.put("id", g.getId());
map.put("children", children);
return map;
} else {
return null;
}
}
/**
* 构造树形组件的子组件模板
* @param g 套餐详细信息
* @return
*/
public Map<String, Object> InitTreeMenus(GroupInfo g) {
if (g != null) {
Map<String, Object> map = new HashMap<>();
map.put("title", g.getMname());
map.put("id", g.getId());
return map;
} else {
return null;
}
}
}

20
src/test/java/com/dreamchaser/depository_manage/TestForOther.java

@ -0,0 +1,20 @@
package com.dreamchaser.depository_manage;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* 专用于测试琐碎实例
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestForOther {
@Test
public void Test(){
String code = "wms-g-0001";
System.out.println(code.contains("wms-g-"));
}
}

6
target/classes/application-test.yml

@ -79,9 +79,9 @@ mybatis:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
log-prefix: mapper.
#mybatis-plus:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
file:
uploadPath: D:/upLoad

9
target/classes/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml

@ -562,6 +562,15 @@
FROM findInventory WHERE id =#{mid}
</select>
<select id="findInventoryByMidAndDid" resultMap="InventoryMap" parameterType="map">
select
<include refid="allColumnsAndTypeNameOnViewByInventory" />
from findInventory
where
mid = #{mid}
and depositoryId = #{did}
</select>
<select id="findMaterialAndTypeById" resultMap="materialAndTypeMap" parameterType="integer">
select
<include refid="allColumnsAndTypeName"/>

843
target/classes/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;
}
</style>
<div class="layuimini-container">
<div class="layuimini-main">
<div class="layui-fluid">
<!-- 出库申请-->
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem">
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input"
style="border-style: none"
id="openSonByMaterial" onblur="selectMaterialByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search" style="display: inline"
id="selectMaterial" onclick="selectMaterial(this)"></i>
<div class="layui-tab">
<ul class="layui-tab-title" style="text-align: center">
<li class="layui-this">物料出库</li>
<li class="layui-this">套餐出库</li>
</ul>
<div class="layui-tab-content">
<!-- 普通物料出库申请-->
<div class="layui-tab-item layui-show">
<div class="layui-carousel" id="stepForm" lay-filter="stepForm" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParent">
<div class="layui-card-body" id="cardItem">
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input"
style="border-style: none"
id="openSonByMaterial"
onblur="selectMaterialByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search"
style="display: inline"
id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name="mid" class="layui-input" id="mid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id="code" name="code" type="text"
placeholder="请填写入物料编码" value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="barCode" name="barCode" type="text"
placeholder="请填写入条形编码"
value=""
class="layui-input"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
id="barCodeImg"
style="margin-top: 10px" onclick="scanBarCode(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name="quantity" type="number" placeholder="请填写入物料数量"
value=""
onblur="MaterialQuantityIsTrue(this)" id="quantity"
class="layui-input" lay-verify="number" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
onclick="addItem(this)"></i>
</div>
<input type="text" name="mid" class="layui-input" id="mid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id="code" name="code" type="text" placeholder="请填写入物料编码" value=""
onblur="selectCode(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px" onclick="scanCodeByOut(this)">
<!-- 提交按钮-->
<div class="layui-form-item" id="btn_sub">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交&emsp;
</button>
</div>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="barCode" name="barCode" type="text" placeholder="请填写入条形编码"
value=""
class="layui-input"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
id="barCodeImg"
style="margin-top: 10px" onclick="scanBarCode(this)">
</form>
</div>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交申请成功
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name="quantity" type="number" placeholder="请填写入物料数量" value=""
onblur="MaterialQuantityIsTrue(this)" id="quantity"
class="layui-input" lay-verify="number" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name="applyRemark" placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再申请一次</button>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
onclick="addItem(this)"></i>
</div>
<!-- 提交按钮-->
<div class="layui-form-item" id="btn_sub">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交&emsp;
</button>
</div>
</form>
</div>
</div>
</form>
</div>
</div>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交申请成功
<div class="layui-tab-item">
<div class="layui-carousel" id="stepForm2" lay-filter="stepForm2" style="margin: 0 auto;">
<div carousel-item style="overflow: inherit">
<div>
<form class="layui-form layui-form-pane" style="margin: 0 auto;max-width: 460px;">
<div class="layui-card" id="cardParentForGroup">
<div class="layui-card-body" id="cardItemForGroup">
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItemForGroup(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">套餐名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择套餐" class="layui-input"
style="border-style: none"
id="openGroupList" onblur="selectGroupByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search"
style="display: inline"
id="selectGroup" onclick="selectGroup(this)"></i>
</div>
<input type="text" name="gid" class="layui-input" id="gid"
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id="gcode" name="code" type="text"
placeholder="请填写入套餐编码"
value=""
onblur="selectCodeForGroup(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px;display: none" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐数量:</label>
<div class="layui-input-block">
<input type="number" name="quantity" class="layui-input" id="quantityForGroup"
required lay-verify="number" placeholder="请填写套餐数量"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline"
id="addItemForGroup"
onclick="addItemForGroup(this)"></i>
</div>
<!--提交按钮-->
<div class="layui-form-item" id="btn_sub2">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formStep2"
style="margin-bottom: 30px;margin-left: 15%">
&emsp;提交&emsp;
</button>
</div>
</div>
</div>
</form>
</div>
<div>
<form class="layui-form" style="margin: 0 auto;max-width: 460px;padding-top: 40px;">
<div style="text-align: center;margin-top: 90px;">
<i class="layui-icon layui-circle"
style="color: white;font-size:30px;font-weight:bold;background: #52C41A;padding: 20px;line-height: 80px;">&#xe605;</i>
<div style="font-size: 24px;color: #333;font-weight: 500;margin-top: 30px;">
提交申请成功
</div>
</div>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再申请一次</button>
</div>
</form>
</div>
</div>
<div style="text-align: center;margin-top: 50px;">
<button class="layui-btn next">再申请一次</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@ -155,6 +253,7 @@
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script src="/static/js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
<!--<script src="/static/js/application-out/application-out.js" charset="'UTF-8"></script>-->
<script>
// 用于添加标签
function addItem(obj) {
@ -164,18 +263,41 @@
function deleteItem(obj) {
}
// 用于添加标签(用于套餐)
function addItemForGroup(obj) {
}
// 用于删除标签(用于套餐)
function deleteItemForGroup(obj) {
}
// 用于编码查询
function selectCode(obj) {
}
// 用于编码查询(用于套餐)
function selectCodeForGroup(obj) {
}
// 用于点击搜索按钮
function selectMaterial(obj) {
}
// 用于点击搜索按钮(套餐)
function selectGroup(obj) {
}
// 用于物料名称查询
function selectMaterialByName(obj) {
}
// 用于套餐名称查询
function selectGroupByName() {
}
// 用于判断当前物料数量是否合适
function MaterialQuantityIsTrue() {
}
@ -184,8 +306,8 @@
function scanBarCode() {
}
// 用于重新渲染页面
function Coverpage() {
// 用于重新渲染页面(套餐)
function CoverpageForGroup() {
}
@ -195,12 +317,18 @@
// 用于暂存卡片个数
var params = [];
// 用于暂存卡片个数(套餐)
var params2 = [];
// 用于卡片编号
var NewIdNumber = 1;
layui.use(['form', 'step', 'layer', 'jquery'], function () {
layui.use(['form', 'step', 'layer', 'jquery', 'element'], function () {
var $ = layui.$,
form = layui.form,
element = layui.element,
step = layui.step;
// 用于分步表单加载
step.render({
elem: '#stepForm',
@ -214,6 +342,18 @@
}]
});
step.render({
elem: '#stepForm2',
filter: 'stepForm2',
width: '100%', //设置容器宽度
height: '600px',
stepItems: [{
title: '填写信息'
}, {
title: '提交成功'
}]
});
// 提交
form.on('submit(formStep)', function (data) {
data = data.field;
@ -272,17 +412,19 @@
return false;
});
form.on('submit(formStep2)', function (data) {
step.next('#stepForm');
return false;
});
$('.pre').click(function () {
step.pre('#stepForm');
step.pre('#stepForm2');
});
$('.next').click(function () {
step.next('#stepForm');
step.next('#stepForm2');
});
// 实现卡片添加
@ -357,77 +499,128 @@
$("#" + parentId).after(materialItem);
};
// 用于重新渲染页面
Coverpage = function (num, obj) {
var parent = $("#cardParent");
// 实现卡片添加(套餐)
addItemForGroup = function (obj) {
var parentId = obj.parentNode.id;
NewIdNumber = NewIdNumber + 1;
var materialItem = `
<div class="layui-card-body" id=` + "cardItemForGroup" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline"
onclick="deleteItemForGroup(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">套餐名称:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择套餐" class="layui-input"
style="border-style: none"
id=`+"openGroupList"+NewIdNumber+` onblur="selectGroupByName(this)"
lay-verify="required"/>
<i class="layui-icon layui-icon-search"
style="display: inline"
id=`+"selectGroup"+NewIdNumber+` onclick="selectGroup(this)"></i>
</div>
<input type="text" name=`+"gid"+NewIdNumber+` class="layui-input" id=`+"gid"+NewIdNumber+`
style="display: none" lay-verify="required"/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐编码:</label>
<div class="layui-input-block">
<div class="inputdiv">
<input id=` + "gcode" + ` name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入套餐编码" value=""
onblur="selectCodeForGroup(this)"
class="layui-input" lay-verify="required"
style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16"
style="margin-top: 10px;display: none" onclick="scanCodeByOut(this)">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">套餐数量:</label>
<div class="layui-input-block">
<input type="number" name=`+"quantity"+NewIdNumber+` class="layui-input" id=`+"quantityForGroup"+NewIdNumber+`
required lay-verify="number" placeholder="请填写套餐数量"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" id=` + "addItemForGroup" + NewIdNumber + `
onclick="addItemForGroup(this)"></i>
</div>
`;
// 获取当前高度
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 firstItem =
// 前半部分
` <div class="layui-card-body" style="padding-right: 0px" id=` + "cardItem" + NewIdNumber + `>
<hr>
<i class="layui-icon layui-icon-subtraction" style="display: inline" onclick="deleteItem(this)"></i>
<div class="layui-form-item">
<label class="layui-form-label">物料名称</label>
<div class="layui-input-block">
<div class="inputdiv">
<input type="text" placeholder="请选择物料" class="layui-input" style="border-style: none"
id="openSonByMaterial" lay-verify="required" value="${obj.mname}" onblur="selectMaterialByName(this)"/>
<i class="layui-icon layui-icon-search" style="display: inline" id="selectMaterial" onclick="selectMaterial(this)"></i>
</div>
<input type="text" name=` + "mid" + NewIdNumber + ` class="layui-input" id="mid" value="${obj.mid}"
style="display: none" lay-verify="required" />
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<input id="code" name=` + "code" + NewIdNumber + ` type="text" placeholder="请填写入物料编码" onblur="selectCode(this)"
class="layui-input" lay-verify="required" value="${obj.code}" style="border-style: none">
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanCodeByOut(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">条形编码:</label>
<div class="layui-input-block" style="margin: 0px;">
<div class="inputdiv">
<select id=` + "barCode" + NewIdNumber + ` name=` + "barCode" + NewIdNumber + `></select>
<img src="/static/images/search.ico" height="16" width="16" style="margin-top: 10px" onclick="scanBarCode(this)" >
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input name=` + "quantity" + NewIdNumber + ` type="number" placeholder="请填写入物料数量" value=""
class="layui-input" lay-verify="number">
</div>
</div>`;
var materialItem = `
<div class="layui-collapse">
<div class="layui-colla-item">
<h2 class="layui-colla-title"">${obj.mname}</h2>
<div class="layui-colla-content">
<div class="layui-form-item">
<label class="layui-form-label">物料编码:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料编码" value="${obj.mcode}"
readonly
class="layui-input" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料数量:</label>
<div class="layui-input-block">
<input type="number" placeholder="请填写入物料数量" value="${obj.quantity}"
readonly
class="layui-input" lay-verify="number" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料型号:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料型号" value="${obj.version === null ? '' : obj.version}"
readonly
class="layui-input" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">物料类型:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料类型" value="${obj.tname}"
readonly
class="layui-input" lay-verify="text" required>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">计量单位:</label>
<div class="layui-input-block">
<input type="text" placeholder="请填写入物料计量单位" value="${obj.unit === null ? '' : obj.unit}"
readonly
class="layui-input" lay-verify="text" required>
</div>
</div>
</div>
</div>
</div>
`; // 最终
var lastItem = `<div class="layui-form-item">
<label class="layui-form-label">备注说明:</label>
<div class="layui-input-block">
<input name=` + "applyRemark" + NewIdNumber + ` placeholder="请填写相关原因及申请原因" value=""
class="layui-input"/>
</div>
</div>
<i class="layui-icon layui-icon-addition" style="display: inline" onclick="addItem(this)"></i>
</div>`;
// 获取当前高度
var height = parseInt(($("#stepForm").css('height')).split("px")[0]);
var height = parseInt(($("#stepForm2").css('height')).split("px")[0]);
if (NewIdNumber !== "") {
params.push(NewIdNumber)
}
$("#stepForm").css("height", height + 532 + 'px');
var materialItem = firstItem + lastItem; // 最终
$("#btn_sub").before(materialItem)
$("#stepForm2").css("height", height + 183 + 'px');
$("#" + "addItemForGroup" + NewIdNumber).before(materialItem);
};
// 实现卡片删除
@ -444,6 +637,20 @@
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 = [];
@ -527,6 +734,69 @@
});
};
// 用于实现通过编码查询套餐
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;
@ -562,53 +832,242 @@
},
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 = `
if(mid != '') {
$.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 = `
<select id=` + "barCode" + idNumber + ` name=` + "barCode" + idNumber + `>
</select>`;
$("#" + barCodeImg.id).before(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();
$.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();
}
});
}
}
});
};
// 用于实现点击搜索按钮(套餐)
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();
}
}
form.render();
}
});
})
}
}
})
};
// 用于实现套餐名称搜索
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()
}
}
});
}
};
//用于实现物料名称搜索
@ -653,6 +1112,7 @@
});
};
// 扫描物料条码
scanBarCode = function (obj) {
parent.wx.scanQRCode({
desc: 'scanQRCode desc',
@ -695,7 +1155,7 @@
materialCode.value = data.mcode;
var barCodeInput = barCodeItem.childNodes[1].childNodes[1];
barCodeInput.value = result;
}else{
} else {
// 如果没有对应关系
layer.msg("对于编码:" + result + ",并未发现对应的物料", {
icon: 0,
@ -710,7 +1170,6 @@
})
};
// 用于扫码功能
scanCodeByOut = function (obj) {
parent.wx.scanQRCode({

2
target/classes/templates/pages/application/application_multi.html

@ -71,7 +71,7 @@
{field: 'placeCode', width: 150, title: '库位编码'},
{field: 'quantity', width: 150, title: '数量',edit:'quantity'},
{field: 'price', width: 150, title: '单价',edit:'price'},
{field: 'depositoryId', width: 150, title: '仓库编号',edit:'quantity'},
{field: 'depositoryId', width: 150, title: '仓库编号'},
{field: 'applyRemark', width: 150, title: '备注说明',edit:'applyRemark'},
{title: '操作', minWidth: 250, toolbar: '#currentTableBar', align: "center"}
]

3
target/classes/templates/pages/depository/table-in.html

@ -270,7 +270,8 @@
layer.full(index);
});
return false;
} else if (obj.event === 'delete') {
}
else if (obj.event === 'delete') {
var req = {};
req.id = data.id;
layer.confirm('真的删除么', {icon: 2, title: '提示'}, function (index) {

1
target/classes/templates/pages/depository/table-stock.html

@ -156,7 +156,6 @@
page: true,
skin: 'line',
done: function (res, curr, count) {
$("[data-field='shelfLifeForCalc']").css('display', 'none');
$.each(res['data'], function (i, j) {
let jElement = j['warningCount'];
let placeCode = j['placeCode'].split(" ");

29
target/classes/templates/pages/material/material-out.html

@ -22,20 +22,12 @@
<div class="layui-inline">
<label class="layui-form-label">品牌</label>
<div class="layui-input-inline">
<!--<select name="depositoryId" >
<option value="" selected>请选择仓库</option>
<option th:each="depository,iterStar:${depositories}" th:value="${depository?.getId()}" th:text="${depository?.getDname()}" >外芯仓库</option>
</select>-->
<input type="text" class="layui-input" id="brand" name="brand" autocomplete="off"/>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">种类</label>
<div class="layui-input-inline">
<!--<select name="materialTypeId" >
<option value="" selected>请选择物料类型</option>
<option th:each="materialType,iterStar:${materialTypes}" th:value="${materialType?.getId()}" th:text="${materialType?.getTname()}" >芯片类</option>
</select>-->
<input type="text" placeholder="请选择物料类型" class="layui-input" id="openSonByMateralType"
readonly/>
<input type="text" id="materialTypeId" placeholder="请选择物料类型" name="materialTypeId"
@ -105,14 +97,11 @@
</div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
// 定义过期警报时间为7天
var warningTime = 604800000;
layui.use(['form', 'table', 'upload'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table,
upload = layui.upload;
var nowDay = $("#nowDay").val();
$('#openSonByMateralType').on('click', function () {
layer.open({
@ -189,22 +178,6 @@
}
});
// 用于给table行上色的方法
function Layui_SetDataTableRowColor(TabDivId, RowIndex, ColorString) {
try {
var div = $("[lay-id='currentTableId'] tr:eq(" + RowIndex + ")");
if (div != null) //找到对象了
{
// console.log(div);
div.css("color", ColorString);
} else {
console.log('没有找到对象');
}
} catch (e) {
console.log(e.message);
}
}
// 监听搜索操作
@ -455,7 +428,7 @@
}
})
});
} else if (obj.event == 'realDelete') { //彻底删除
} else if (obj.event === 'realDelete') { //彻底删除
var req = {};
req.id = data.id;
layer.confirm('该操作会造成不可逆后果,是否继续?', {

127
target/classes/templates/pages/material/selectMaterial.html

@ -10,35 +10,60 @@
<link rel="stylesheet" href="/static/css/public.css" media="all">
</head>
<body>
<div id="test2" class="demo-tree"></div>
<input id="mname" name="mname" th:value="${mname}" style="display: none">
<input id="type" name="type" th:value="${type}" style="display: none">
<div id="test2" class="demo-tree"></div>
<script src="/static/lib/layui-v2.6.3/layui.js" charset="utf-8"></script>
<script>
var data;
layui.use(['form', 'layer', 'dropdown', 'tree'], function () {
var $ = layui.jquery,
tree = layui.tree;
var mname = $("#mname").val();
var type = $("#type").val();
// 用于暂存当前查询结果
var tempData = [];
var req = {};
req.mname = mname;
req.type = type;
test = tree.render({
var test = tree.render({
elem: '#test2'
, data: []
, data: []
, click: function (obj) {
var state = obj.state;
if (obj.data.children !== undefined) {
return false
if("open" === state){
var id = obj.data.id;
var param = {};
param.mtId = id;
param.mname = mname;
param.type = type;
if(placeId !== "-1"){
param.placeId = placeId;
param.depositoryId = depositoryId;
}
addTreeChildren(param);
}else{
var param = {};
param.mtId = id;
closeTreeChildren(param);
return false
}
}else{
materialName.value = obj.data.title;
materialId.value = obj.data.id;
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
$("#openSonByMaterial", window.parent.document).val(obj.data.title);
$("#mid", window.parent.document).val(obj.data.id);
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
}
});
$.ajax({
url: "/material/treeMenus_Test",
url: "/material/treeMenus",
data: JSON.stringify(req),
type: 'post',
dataType: 'json',
@ -49,9 +74,91 @@
success: function (d) {
layer.close(this.layerIndex);
var data2 = d.data;
tempData = data2;
test.reload({
data: tempData
});
}
});
$("#test2").on("click",".layui-tree-entry",function(event){
var target = $(event.target);
var id = this.parentNode.getAttribute("data-id");
var context = target.context.className;
if(context.includes("layui-tree-main")){
var childrenName = this.childNodes[0].childNodes[0].childNodes[0].className;
if(childrenName.includes("layui-icon-addition")){
// console.log("隐藏")
var param = {};
param.mtId = id;
closeTreeChildren(param);
}else if(childrenName.includes("layui-icon-subtraction")){
var param = {};
param.mtId = id;
param.mname = mname;
param.type = type;
if(placeId !== "-1"){
param.placeId = placeId;
param.depositoryId = depositoryId;
}
addTreeChildren(param);
}
}else if(context.includes("layui-icon")){
if(context.includes("layui-icon-addition")){
var param = {};
param.mtId = id;
closeTreeChildren(param);
// console.log("隐藏")
}else if(context.includes("layui-icon-subtraction")){
var param = {};
param.mtId = id;
param.mname = mname;
param.type = type;
if(placeId !== "-1"){
param.placeId = placeId;
param.depositoryId = depositoryId;
}
addTreeChildren(param);
}
}
});
// 用于添加分支
addTreeChildren = function(param) {
$.ajax({
url: "/material/getNewTreeForMtId",
data: JSON.stringify(param),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8",
beforeSend: function () {
this.layerIndex = layer.load(0, {shade: [0.5, '#393D49']});
},
success: function (d) {
layer.close(this.layerIndex);
var data2 = d.data;
tempData = data2;
test.reload({
data: tempData
});
}
});
};
closeTreeChildren = function (param) {
$.ajax({
url: "/material/closeTreeChildren",
data: JSON.stringify(param),
type: 'post',
dataType: 'json',
contentType: "application/json;charset=utf-8"
});
}
})
</script>
</body>

Loading…
Cancel
Save