package com.tld.service.impl; import com.tld.mapper.AskGoodsMapper; import com.tld.mapper.DeliveryMapper; import com.tld.mapper.DictionaryMapper; import com.tld.mapper.WarehousingMapper; 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 javax.servlet.http.HttpServletRequest; 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; //删除日志表 @Autowired private DictionaryMapper dictionaryMapper; //入库 @Autowired private WarehousingMapper warehousingMapper; @Override public Map getDelivery(Delivery delivery) { Map map = new HashMap<>(); try{ List list = deliveryMapper.getDelivery(delivery); Map mapVal = new HashMap<>(); for(Delivery delivery1 : list){ int sumScan = deliveryMapper.getScanSum(delivery1); mapVal.put(delivery1.getDeliveryId() + delivery1.getMaterialId(), sumScan); } map.put("data", list); map.put("scan", mapVal); 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<>(); for(Inventory inventory : deliveryMapper.getInventory(storageLocationCode, delivery)){ int occupy = deliveryMapper.getVitrual(inventory); if(occupy == 0){ if(Double.doubleToLongBits(Double.parseDouble(inventory.getAmount())) == Double.doubleToLongBits(Double.parseDouble(delivery.getOutNum()))){ for(Inventory inventorys : deliveryMapper.getInventory(storageLocationCode, delivery)){ if (inventorys.getStorageLocationCode().equals(inventory.getStorageLocationCode())){ list.add(inventorys); map.put("data", list); map.put("msg", "200"); } } return map; } } } map.put("data", list); } else if(materialClass.getPartType().equals("半成品")){ List list = new LinkedList<>(); for(Inventory inventory : deliveryMapper.getInventory(delivery.getStorageLocationCode(), delivery)){ int productNum = deliveryMapper.getProductNumVitrual(inventory); if(Integer.parseInt(inventory.getAmount()) < 0){ map.put("msg", "500"); map.put("errMsg", "库存不足"); return map; } else { list.add(inventory); map.put("data", list); map.put("msg", "200"); return map; } } } else { List list = new LinkedList<>(); AskGoods askGoods = new AskGoods() .setCompanyNumber(delivery.getCompanyNumber()) .setMaterialId(delivery.getMaterialId()) .setWbs(delivery.getWbs()); for(Inventory inventory : deliveryMapper.getMaterialCk(askGoods)){ AskGoods askGoods1 = askGoodsMapper.getAsk(inventory); if(askGoods1 != null){ if( Double.doubleToLongBits(Double.parseDouble(askGoods1.getNum())) != Double.doubleToLongBits(Double.parseDouble(inventory.getAmount())) ){ list.add(inventory); map.put("data", list); map.put("msg", "200"); return map; } } else { list.add(inventory); map.put("data", list); map.put("msg", "200"); return map; } } } 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)){ askGoods.setStorageCode(removalCode); askGoods.setCompanyNumber(askGoods.getAccountSleeve()); Inventory inventory = deliveryMapper.getInventoryHalf(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); } //判断物料是否录入 MaterialClass materialClass = warehousingMapper.getMateriaIsExist(askGoods.getWllbCode()); //查询销售单部分信息 Delivery delivery = new Delivery().setDeliveryId(deliveryId).setMaterialId(materialClass.getTldId()); List list = deliveryMapper.getDelivery(delivery); deliveryMapper.updateDelivery(materialClass.getTldId(), askGoods.getNum(), deliveryId); //修改销售单出库数量 if(materialClass.getPartType().equals("产成品")){ //产成品销售流水 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); //流水录入 } else if(materialClass.getPartType().equals("原材料")){ askGoods.setType("销售出库"); askGoodsMapper.addRemoval(askGoods);//插入出库流水 } else if(materialClass.getPartType().equals("半成品")){ //半成品销售流水 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.addRemovalHalfProduct(delivery1); //流水录入 } askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存 ReturRemoval returRemoval = new ReturRemoval() .setMaterialId(materialClass.getTldId()) .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 { //判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有 if (lock.isLocked() && lock.isHeldByCurrentThread()) { //释放锁 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; } @Override public Map addVitrual(AskGoods askGoods) { Map map = new HashMap<>(); try{ int mapValScan = deliveryMapper.getDeliveryScan(askGoods); if(mapValScan != 0){ map.put("msg", "500"); map.put("errMsg", "已扫描!"); return map; } Map mapVal = deliveryMapper.getScanIsNot(askGoods); if(Double.parseDouble(mapVal.get("amount").toString()) - Double.parseDouble(mapVal.get("vitrualNum").toString()) == 0){ map.put("msg", "500"); map.put("errMsg", "已全部出库"); return map; } askGoodsMapper.addAskGoodsVitrual(askGoods); map.put("msg", "200"); }catch (Exception e){ map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); e.printStackTrace(); } return map; } @Override public Map delDelivery(String id, HttpServletRequest request) { Map map = new HashMap<>(); try { String userId = request.getHeader("userId"); Map mapVal = deliveryMapper.getDeliverys(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); deliveryMapper.delDelivery(id); map.put("msg", "200"); } catch (Exception e) { e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "服务器请求异常,请稍后再试"); } return map; } /** * 出库单生成 * @return */ public String codeGenerateCk(){ StringBuilder stringBuilder = new StringBuilder("XSCK"); 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(); } }