package com.tld.service.impl; import com.tld.mapper.*; import com.tld.model.*; import com.tld.model.Dictionary; import com.tld.service.WarehouseTransferService; import lombok.RequiredArgsConstructor; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.util.*; @Service @RequiredArgsConstructor public class WarehouseTransferServiceImpl implements WarehouseTransferService { //移库 private final WarehouseTransferMapper warehouseTransferMapper; //redis锁 private final RedissonClient redissonClient; //出库 private final AskGoodsMapper askGoodsMapper; //入库 private final WarehousingMapper warehousingMapper; //字典 private final DictionaryMapper dictionaryMapper; //产成品 private final DeliveryMapper deliveryMapper; //用户 private final UserMapper userMapper; @Override public Map getWarehouseTransfer(WarehouseTransfer warehouseTransfer) { Map map = new HashMap<>(); try{ List list = warehouseTransferMapper.getWarehouseTransfer(warehouseTransfer); List scanNum = new LinkedList<>(); Map mapVal = new HashMap<>(); for(WarehouseTransfer warehouseTransfer1 : list){ if(warehouseTransfer1.getAskType().equals("0") || warehouseTransfer1.getAskType().equals("1") || warehouseTransfer1.getAskType().equals("2")){ warehouseTransfer1.setUniqueCode(warehouseTransfer.getUniqueCode()); warehouseTransfer.setMaterialCode(warehouseTransfer.getMaterialCode()); scanNum.add(warehouseTransferMapper.getScanNum(warehouseTransfer1));//扫描总数 mapVal.put(warehouseTransfer1.getWarehouseTransferId(), 0); } else { warehouseTransfer1.setUniqueCode(warehouseTransfer.getUniqueCode()); warehouseTransfer.setMaterialCode(warehouseTransfer.getMaterialCode()); scanNum.add(warehouseTransferMapper.getScanNumWare(warehouseTransfer1));//扫描总数 mapVal.put(warehouseTransfer1.getWarehouseTransferId(), 1); } } map.put("scanNum", scanNum); map.put("type", mapVal); map.put("data", list); map.put("msg", "200"); } catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); } return map; } @Override public Map OutOfLibrary(String uniqueCode, String type, String askGoodsId) { Map map = new HashMap<>(); //redis并发锁 RLock lock = redissonClient.getLock(uniqueCode); lock.lock(); try{ List list = askGoodsMapper.getVirtualUniqueCode(uniqueCode, type, askGoodsId); //入库信息 List warehousing = new LinkedList<>(); String warehouseTransferCode = codeGenerateYK(); //移库单 for(AskGoods askGoods : list){ askGoods.setStorageCode(warehouseTransferCode); //查询物料信息 MaterialClass material = warehousingMapper.getMaterial(new Notice().setMaterialCode(askGoods.getWllbCode())); Inventory inventory = null; askGoods.setCompanyNumber(askGoods.getAccountSleeve()); askGoods.setMaterialId(material.getTldId()); //判断是否是三大仓库(半成品、产成品、原材料)之外的仓库 如果是则不需要查询库存 String warehouseType = warehouseTransferMapper.getStorageLocationWarehouse(askGoods.getStorageLocationCode()); if(!warehouseType.equals("10")) { if(material.getPartType().equals("原材料")) { inventory = askGoodsMapper.getInventory(askGoods); } else if(material.getPartType().equals("产成品")) { inventory = deliveryMapper.getInventoryHalf(askGoods); } else if(material.getPartType().equals("半成品")) { if(askGoodsMapper.getInventoryInfo(askGoods).size() != 0){ inventory = askGoodsMapper.getInventoryInfo(askGoods).get(0); } else { inventory = null; } } else if (material.getPartType().equals("低值易耗品")){ inventory = deliveryMapper.getInventoryHalf(askGoods); } if(inventory == null){ map.put("msg", "500"); map.put("errMsg", "库存不存在"); return map; } //如果出库库存等于虚拟表库存则删除此库存 if(Double.doubleToLongBits(Double.parseDouble(askGoods.getNum())) == Double.doubleToLongBits(Double.parseDouble(inventory.getAmount()))){ askGoodsMapper.deleteInventory(inventory); } else { inventory.setAmount(askGoods.getNum()); askGoodsMapper.updateInventory(inventory); } } String materialId = askGoodsMapper.getMaterialId(askGoods.getWllbCode());//查询物料id WarehouseTransfer warehouseTransfer = warehouseTransferMapper.getWarehouseTransferDetailed(askGoodsId, materialId, askGoods.getEntryNumber());//查询移库申请内容 //入库流水信息 WarehousingVirtual WarehousingVirtual1 = new WarehousingVirtual() .setWllbCode(askGoods.getWllbCode()) //物料code .setSuppId(askGoods.getSupplierId())//供应商id .setSerial(askGoods.getSerial())//连翻号 .setProducDate(askGoods.getProducDate())//批次 .setNum(askGoods.getNum())//入库数量 .setSeq("0") .setType(askGoods.getType())//入库类型 .setUserId(askGoods.getUserId())//用户 .setDepartmentId(askGoods.getDepartment())//部门 .setStorageLocationCode(askGoods.getStorageLocationCodeRk())//库位编号 .setStorageCode(warehouseTransferCode)//移库单号 .setWbs(warehouseTransfer.getWbs())//wbs .setMaterialId(materialId)//物料id .setAccountSleeve(warehouseTransfer.getAccountSleeve())//公司 .setWllbClass(material.getWllbClass()) .setAttribute(askGoods.getAttribute()); warehousing.add(WarehousingVirtual1); askGoods.setStorageLocationCode(askGoods.getStorageLocationCode()); askGoodsMapper.addRemoval(askGoods);//插入出库流水 askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存 Double scanNum = Double.parseDouble(warehouseTransfer.getOutNum()) + Double.parseDouble(askGoods.getNum()); String typeVal = "0"; if(Double.doubleToLongBits(scanNum) == Double.doubleToLongBits(Double.parseDouble(warehouseTransfer.getNum()))){ typeVal = "1"; } warehouseTransferMapper.updateOutNum(askGoods.getNum(), askGoodsId, materialId, typeVal, askGoods.getEntryNumber());//修改出库数量 if(askGoods.getStorageLocationCodeRk().indexOf("XNKW") != -1){ Inventory inventory2 = warehouseTransferMapper.getInventoryVitrual(askGoods); String code = warehouseTransferMapper.getWarehouseTransferCodeType(warehouseTransfer.getAskGoodsWarehouseId()); if(material.getPartType().equals("产成品") && code.equals("2")){ //入库信息 List warehousingVal = new LinkedList<>(); WarehousingVirtual warehousingVirtual = warehousing.get(warehousing.size() - 1); warehousingVirtual.setSuppId(""); warehousingVal.add(warehousingVirtual); warehousingMapper.addInventory(warehousingVal);//库存 } else { if(inventory2 != null ){ Inventory inventory1 = new Inventory() .setNum(askGoods.getNum()) .setMaterialId(materialId) .setStorageLocationCode(askGoods.getStorageLocationCodeRk()); warehousingMapper.updateVitrualNum(inventory1); } else { //入库信息 List warehousingVal = new LinkedList<>(); WarehousingVirtual warehousingVirtual = warehousing.get(warehousing.size() - 1); warehousingVirtual.setSuppId("").setSerial(""); warehousingVal.add(warehousingVirtual); warehousingMapper.addInventory(warehousingVal);//库存 } } } WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer() .setWarehouseTransferId(warehouseTransfer.getWarehouseTransferId()) //移库单id .setEntryNumber(warehouseTransfer.getEntryNumber())//分录号 .setSupplyWarehouseId(warehouseTransfer.getSupplyWarehouseId())//供货仓库id .setMaterialId(materialId)//物料id .setWbs(warehouseTransfer.getWbs())//wbs .setOutNum(askGoods.getNum()); //出库数量 warehouseTransferMapper.addReturnGsWarehouseTransfer(warehouseTransfer1);//新增返回gs数据子表信息 } WarehouseTransfer warehouseTransferF = warehouseTransferMapper.getWarehouseTransferDetailedF(askGoodsId);//查询父表移库单申请 WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer() .setWarehouseTransferId(warehouseTransferF.getWarehouseTransferId()) //移库单id .setWarehouseTransferCode(warehouseTransferCode)//移库单编号 .setAskGoodsWarehouseId(warehouseTransferF.getAskGoodsWarehouseId()) //要货仓库id .setWarehouseTransferType(warehouseTransferF.getWarehouseTransferType()); //移库类型 warehouseTransferMapper.addReturnGsWarehouseTransferF(warehouseTransfer1);//新增返回gs数据父表信息 warehousingMapper.addStorage(warehousing);//入库流水 if(list.get(0).getStorageLocationCodeRk().indexOf("XNKW") > 0){ warehousingMapper.addInventory(warehousing);//库存 } map.put("data", warehouseTransferCode); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } finally { //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有 if (lock.isLocked() && lock.isHeldByCurrentThread()) { //释放锁 lock.unlock(); } } return map; } @Override public Map warehousing(String uniqueCode, String type, String askGoodsId) { Map map = new HashMap<>(); try{ //入库信息 List list = new LinkedList<>(); List warehousingVirtualList = warehousingMapper.getVirtual(uniqueCode, type, askGoodsId); String warehouseTransferCode = codeGenerateYK(); //移库单 //查询入库所需要的信息 for(WarehousingVirtual warehousingVirtual : warehousingVirtualList) { //查询物料信息 Notice notice = new Notice().setMaterialCode(warehousingVirtual.getWllbCode()); MaterialClass material = warehousingMapper.getMaterial(notice); //查询采购单信息 String materialId = askGoodsMapper.getMaterialId(warehousingVirtual.getWllbCode());//查询物料id WarehouseTransfer warehouseTransfer = warehouseTransferMapper.getWarehouseTransferDetailed(warehousingVirtual.getWarehouseTransferId(), materialId, warehousingVirtual.getEntryNumber());//查询移库申请内容 if(warehouseTransfer != null) { //WBS warehousingVirtual.setWbs(warehouseTransfer.getWbs()); //账套 warehousingVirtual.setAccountSleeve(warehouseTransfer.getAccountSleeve()); } //查询部门编号 List listUser = userMapper.getAllUser(new User().setId(warehousingVirtual.getUserId())); warehousingVirtual.setDepartmentId(listUser.get(0).getDepartmentId()); //查询物料分类 WarehousingVirtual warehousingVirtual1 = warehousingMapper.getWlClass(warehousingVirtual); warehousingVirtual.setWllbClass(warehousingVirtual1.getWllbClass()); warehousingVirtual.setMaterialId(warehousingVirtual1.getMaterialId()); warehousingVirtual.setStorageCode(warehouseTransferCode); list.add(warehousingVirtual); Double scanNum = Double.parseDouble(warehouseTransfer.getOutNum()) + Double.parseDouble(warehousingVirtual.getNum()); String typeVal = "0"; if(Double.doubleToLongBits(scanNum) == Double.doubleToLongBits(Double.parseDouble(warehouseTransfer.getNum()))){ typeVal = "1"; } warehouseTransferMapper.updateOutNum(warehousingVirtual.getNum(), warehousingVirtual.getWarehouseTransferId(), materialId, typeVal, warehousingVirtual.getEntryNumber());//修改出库数量 AskGoods askGoods = new AskGoods() .setStorageLocationCode(warehousingVirtual.getStorageLocationCodeCk()) .setSupplierId(warehousingVirtual.getSuppId()) .setSerial(warehousingVirtual.getSerial()) .setNum(warehousingVirtual.getNum()) .setType(warehousingVirtual.getType()) .setUserId(warehousingVirtual.getUserId()) .setWllbCode(warehousingVirtual.getWllbCode()) .setStorageCode(warehouseTransferCode) .setWbs(warehousingVirtual.getWbs()) .setProducDate(warehousingVirtual.getProducDate()) .setDepartment(listUser.get(0).getDepartmentId()) .setAskGoodsId(warehousingVirtual.getWarehouseTransferId()) .setCompanyNumber(warehouseTransfer.getAccountSleeve()); Inventory inventory = new Inventory(); String code = warehouseTransferMapper.getWarehouseTransferCodeType(warehouseTransfer.getAskGoodsWarehouseId()); //判断是否是三大仓库(半成品、产成品、原材料)之外的仓库 如果是则不需要查询库存 String warehouseType = warehouseTransferMapper.getStorageLocationWarehouse(askGoods.getStorageLocationCode()); if(!warehouseType.equals("10")) { if(material.getPartType().equals("原材料")){ inventory = askGoodsMapper.getInventoryWarehousing(askGoods); } else if(material.getPartType().equals("产成品")){ if(code.equals("2")){ askGoods.setSerial(""); } inventory = deliveryMapper.getInventoryHalf(askGoods); } else if(material.getPartType().equals("半成品")){ inventory = askGoodsMapper.getInventoryWarehousing(askGoods); } //如果出库库存等于虚拟表库存则删除此库存 if(Double.doubleToLongBits(Double.parseDouble(askGoods.getNum())) == Double.doubleToLongBits(Double.parseDouble(inventory.getAmount()))){ askGoodsMapper.deleteInventory(inventory); } else { inventory.setAmount(askGoods.getNum()); askGoodsMapper.updateInventory(inventory); } } askGoodsMapper.addRemoval(askGoods);//插入出库流水 WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer() .setWarehouseTransferId(warehouseTransfer.getWarehouseTransferId()) //移库单id .setEntryNumber(warehouseTransfer.getEntryNumber())//分录号 .setSupplyWarehouseId(warehouseTransfer.getSupplyWarehouseId())//供货仓库id .setMaterialId(materialId)//物料id .setWbs(warehouseTransfer.getWbs())//wbs .setOutNum(warehousingVirtual.getNum()); //出库数量 warehouseTransferMapper.addReturnGsWarehouseTransfer(warehouseTransfer1);//新增返回gs数据子表信息 } //入库 warehousingMapper.addStorage(list);//入库流水 warehousingMapper.addInventory(list);//库存 warehousingMapper.delVirtual(uniqueCode);//删除临时表数据 WarehouseTransfer warehouseTransferF = warehouseTransferMapper.getWarehouseTransferDetailedF(warehousingVirtualList.get(0).getWarehouseTransferId());//查询父表移库单申请 WarehouseTransfer warehouseTransfer1 = new WarehouseTransfer() .setWarehouseTransferId(warehouseTransferF.getWarehouseTransferId()) //移库单id .setWarehouseTransferCode(warehouseTransferCode)//移库单编号 .setAskGoodsWarehouseId(warehouseTransferF.getAskGoodsWarehouseId()) //要货仓库id .setWarehouseTransferType(warehouseTransferF.getWarehouseTransferType()); //移库类型 warehouseTransferMapper.addReturnGsWarehouseTransferF(warehouseTransfer1);//新增返回gs数据父表信息 map.put("data", warehouseTransferCode); map.put("msg", "200"); } catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); } return map; } /** * 删除移库单 * @return */ @Override public Map delWarehouseTransfer(String id, HttpServletRequest request) { Map map = new HashMap<>(); try { String userId = request.getHeader("userId"); Map mapVal = warehouseTransferMapper.getWarehouseTransfers(id); if(Double.parseDouble(mapVal.get("out_num").toString()) > 0){ map.put("msg", "500"); map.put("errMsg", "此单据已出库!"); return map; } LogData logData = new LogData() .setUserId(userId) .setData(mapVal.toString()) .setType("0") .setDocumentType("移库单"); dictionaryMapper.addLogdata(logData); warehouseTransferMapper.delWarehouseTransfer(id); map.put("msg", "200"); } catch (Exception e) { e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); } return map; } @Override public Map addAskGoodsVitrual(AskGoods askGoods) { Map map = new HashMap<>(); try{ askGoods.setAccountSleeve(askGoods.getCompanyNumber()); List inventory = askGoodsMapper.getInventoryInfo(askGoods); if(inventory.size() == 0){ map.put("msg", "500"); map.put("errMsg", "库存数量不足"); return map; } askGoodsMapper.addAskGoodsVitrual(askGoods); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } return map; } @Override public Map getMaterialCk(AskGoods askGoods) { Map map = new HashMap<>(); try{ List list = new LinkedList<>(); for(Inventory inventory : warehouseTransferMapper.getMaterialWarehouseTransfer(askGoods)){ AskGoods askGoods1 = warehouseTransferMapper.getAsk(inventory); if(askGoods1 != null){ if( Double.doubleToLongBits(Double.parseDouble(askGoods1.getNum())) != Double.doubleToLongBits( Double.parseDouble(inventory.getAmount())) ){ list.add(inventory); } } else { list.add(inventory); } } map.put("data", list); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } return map; } @Override public Map getWarehouseTransferCode(WarehouseTransfer warehouseTransfer) { Map map = new HashMap<>(); try{ List list = warehouseTransferMapper.getWarehouseTransferCode(warehouseTransfer); map.put("data", list); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } return map; } /** * 移库单生成 * @return */ public String codeGenerateYK(){ StringBuilder stringBuilder = new StringBuilder("YKCZ"); Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); stringBuilder.append(sdf.format(date)); int count = warehouseTransferMapper.getReturnWarehouseTransferCount(); for(int i = 0; i < 4 - (count + "").length(); i++){ stringBuilder.append("0"); } return (stringBuilder.append(count + 1)).toString(); } }