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 = new Inventory(); askGoods.setCompanyNumber(askGoods.getAccountSleeve()); if(material.getPartType().equals("原材料")){ inventory = askGoodsMapper.getInventory(askGoods); } else if(material.getPartType().equals("产成品")){ inventory = deliveryMapper.getInventoryHalf(askGoods); } else if(material.getPartType().equals("半成品")){ inventory = askGoodsMapper.getInventoryInfo(askGoods).get(0); } if(inventory == null){ map.put("msg", "500"); map.put("errMsg", "库存不存在"); return map; } //如果出库库存等于虚拟表库存则删除此库存 if(Integer.parseInt(askGoods.getNum()) == Integer.parseInt(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);//查询移库申请内容 //入库流水信息 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()); warehousing.add(WarehousingVirtual1); askGoods.setStorageLocationCode(askGoods.getStorageLocationCode()); askGoodsMapper.addRemoval(askGoods);//插入出库流水 askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存 warehouseTransferMapper.updateOutNum(askGoods.getNum(), askGoodsId, materialId);//修改出库数量 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);//入库流水 warehousingMapper.addInventory(warehousing);//库存 map.put("data", warehouseTransferCode); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } finally { //释放锁 lock.unlock(); } return map; } @Override public Map warehousing(String uniqueCode, String type) { Map map = new HashMap<>(); try{ //入库信息 List list = new LinkedList<>(); List warehousingVirtualList = warehousingMapper.getVirtual(uniqueCode, type); 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);//查询移库申请内容 if(warehouseTransfer != null) { //WBS warehousingVirtual.setWbs(warehouseTransfer.getWbs()); //账套 warehousingVirtual.setAccountSleeve(warehouseTransfer.getAccountSleeve()); } //查询部门编号 List listUser = userMapper.getAllUser(new User().setId(Integer.parseInt(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); warehouseTransferMapper.updateOutNum(warehousingVirtual.getNum(), warehousingVirtual.getWarehouseTransferId(), materialId);//修改出库数量 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(); if(material.getPartType().equals("原材料")){ inventory = askGoodsMapper.getInventory(askGoods); } else if(material.getPartType().equals("产成品")){ inventory = deliveryMapper.getInventoryHalf(askGoods); } else if(material.getPartType().equals("半成品")){ inventory = askGoodsMapper.getInventoryInfo(askGoods).get(0); } //如果出库库存等于虚拟表库存则删除此库存 if(Integer.parseInt(askGoods.getNum()) == Integer.parseInt(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{ 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.parseDouble(askGoods1.getNum()) != 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; } /** * 移库单生成 * @return */ public String codeGenerateYK(){ StringBuilder stringBuilder = new StringBuilder("YK"); 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(); } }