package com.tld.service.impl; import com.tld.mapper.AskGoodsMapper; import com.tld.mapper.DeliveryMapper; import com.tld.model.*; import com.tld.service.DeliveryService; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.*; @Service public class DeliveryServiceImpl implements DeliveryService { @Autowired private DeliveryMapper deliveryMapper; @Autowired private AskGoodsMapper askGoodsMapper; //redis锁 @Autowired private RedissonClient redissonClient; @Override public Map getDelivery(Delivery delivery) { Map map = new HashMap<>(); try{ List list = deliveryMapper.getDelivery(delivery); map.put("data", list); map.put("msg", "200"); }catch (Exception e){ map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); e.printStackTrace(); } return map; } @Override public Map getRecommend(Delivery delivery) { Map map = new HashMap<>(); try{ MaterialClass materialClass = deliveryMapper.getMaterialClass(delivery.getMaterialId()); if(materialClass == null){ map.put("msg", "500"); map.put("errMsg", "物料信息未录入,请联系管理员"); return map; } if(materialClass.getPartType().equals("产成品")){ //查询所有产成品库位 String storageLocationCode = deliveryMapper.getStorageLocationCodeList(); List list = new LinkedList<>(); Map occupyMap = new HashMap<>(); for(Inventory inventory : deliveryMapper.getInventory(storageLocationCode, delivery)){ int occupy = deliveryMapper.getVitrual(inventory); if(Integer.parseInt(inventory.getAmount()) == occupy){ list.add(inventory); int num = Integer.parseInt(inventory.getAmount()) - occupy; occupyMap.put(inventory.getStorageLocationCode(), num); } } map.put("data", list); map.put("occupyMap", occupyMap); } else if(materialClass.getPartType().equals("半成品")){ String storageLocationCode = "000000,"; List list = new LinkedList<>(); Map occupyMap = new HashMap<>(); for(Inventory inventory : deliveryMapper.getInventory(storageLocationCode, delivery)){ int occupy = deliveryMapper.getVitrual(inventory); if(Integer.parseInt(inventory.getAmount()) > occupy){ list.add(inventory); int num = Integer.parseInt(inventory.getAmount()) - occupy; occupyMap.put(inventory.getStorageLocationCode(), num); } } map.put("data", list); map.put("occupyMap", occupyMap); } else { } map.put("msg", "200"); }catch (Exception e){ map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); e.printStackTrace(); } return map; } @Override public Map OutOfLibrary(String uniqueCode, String type, String deliveryId) { Map map = new HashMap<>(); //redis并发锁 RLock lock = redissonClient.getLock(uniqueCode); lock.lock(); try{ String removalCode = codeGenerateCk(); for(AskGoods askGoods : askGoodsMapper.getAskGoodsVitrual(uniqueCode, type)){ Inventory inventory = deliveryMapper.getInventoryHalf(askGoods); //如果出库库存等于虚拟表库存则删除此库存 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(), askGoods.getAccountSleeve());//查询物料id deliveryMapper.updateDelivery(materialId, askGoods.getNum(), deliveryId); //修改销售单出库数量 //查询销售单部分信息 Delivery delivery = new Delivery().setDeliveryId(deliveryId).setMaterialId(materialId); List list = deliveryMapper.getDelivery(delivery); //产成品销售流水 Delivery delivery1 = new Delivery() .setMaterialCode(askGoods.getWllbCode()) //物料code .setOutNum(askGoods.getNum()) //出库数量 .setUserId(askGoods.getUserId()) //用户id .setDeliveryId(deliveryId) //销售单id .setCompanyNumber(list.get(0).getCompanyNumber()) //公司编号 .setCustomerCode(list.get(0).getCustomerCode())//客户编号 .setStorageCode(removalCode) //出库流水 .setWbs(list.get(0).getWbs());// wbs deliveryMapper.addRemovalHalf(delivery1); //流水录入 askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存 ReturRemoval returRemoval = new ReturRemoval() .setMaterialId(materialId) .setDocumentId(deliveryId) .setWbs(list.get(0).getWbs()) .setNum(askGoods.getNum()) .setEntryNumber(list.get(0).getEntryNumber()) .setDocumentPointsId(list.get(0).getId()) .setStorageLocationCode(askGoods.getStorageLocationCode()); askGoodsMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息 } //新增销售单出库父表信息 Delivery delivery = deliveryMapper.getDeliveryF(deliveryId); ReturRemoval returRemoval1 = new ReturRemoval() .setDocumentId(delivery.getDeliveryId()) .setRemovalCode(removalCode) .setSourceType(delivery.getSourceType()) .setMoveType(delivery.getMoveType()) .setDeliveryType(delivery.getDeliveryType()); askGoodsMapper.addReturnGsRemovalF(returRemoval1);//新增返回gs数据父表信息 map.put("data", removalCode); map.put("msg", "200"); }catch (Exception e){ map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); e.printStackTrace(); } finally { //释放锁 lock.unlock(); } return map; } @Override public Map getAttribute(Delivery delivery) { Map map = new HashMap<>(); try{ //查询所有产成品库位 String storageLocationCode = deliveryMapper.getStorageLocationCodeList(); List list = deliveryMapper.getAttribute(storageLocationCode, delivery); map.put("data", list); map.put("msg", "200"); }catch (Exception e){ map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); e.printStackTrace(); } return map; } /** * 出库单生成 * @return */ public String codeGenerateCk(){ StringBuilder stringBuilder = new StringBuilder("CK"); Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); stringBuilder.append(sdf.format(date)); int count = askGoodsMapper.getReturnRemovalCount(); for(int i = 0; i < 4 - (count + "").length(); i++){ stringBuilder.append("0"); } return (stringBuilder.append(count + 1)).toString(); } }