package com.tld.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.tld.excel.ExcelUtils; import com.tld.mapper.AskGoodsMapper; import com.tld.model.AskGoods; import com.tld.model.Inventory; import com.tld.model.ReturRemoval; import com.tld.service.AskGoodsService; 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.HttpServletResponse; import java.text.SimpleDateFormat; import java.util.*; @Service public class AskGoodsServiceImpl implements AskGoodsService { @Autowired private AskGoodsMapper askGoodsMapper; //redis锁 @Autowired private RedissonClient redissonClient; @Override public Map addAskGoods(AskGoods askGoods) { Map map = new HashMap<>(); try{ int count = askGoodsMapper.getAskGoods(askGoods); if(count != 0){ askGoodsMapper.updateAskGoodsNum(askGoods); } else { if(askGoodsMapper.getAskGoodsf(askGoods) == 0){ askGoodsMapper.addAskGoodsf(askGoods); } askGoodsMapper.addAskGoods(askGoods); } askGoodsMapper.addAskGoodsLog(askGoods); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } return map; } @Override public Map getAskGoodsfList(AskGoods askGoods) { Map map = new HashMap<>(); try{ List list = askGoodsMapper.getAskGoodsfList(askGoods); 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 getAskGoodsMaterial(AskGoods askGoods) { Map map = new HashMap<>(); try{ List list = askGoodsMapper.getAskGoodsMaterial(askGoods); List scanNum = new LinkedList<>(); for(AskGoods askGoods1 : list){ askGoods1.setUniqueCode(askGoods.getUniqueCode()); askGoods1.setAskGoodsId(askGoods.getAskGoodsId()); scanNum.add(askGoodsMapper.getScanNum(askGoods1));//扫描总数 } map.put("scanNum", scanNum); 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 getMaterialCk(AskGoods askGoods) { Map map = new HashMap<>(); try{ List list = new LinkedList<>(); for(Inventory inventory : askGoodsMapper.getMaterialCk(askGoods)){ AskGoods askGoods1 = askGoodsMapper.getAsk(inventory); if(askGoods1 != null){ if(Integer.parseInt(askGoods1.getNum()) != Integer.parseInt(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 addAskGoodsVitrual(AskGoods askGoods) { Map map = new HashMap<>(); try{ Map mapVal = askGoodsMapper.getScanIsNot(askGoods); if((Integer.parseInt(mapVal.get("inventoryNum").toString()) - Integer.parseInt(mapVal.get("virtualNum").toString())) == 0){ map.put("msg", "500"); map.put("errMsg", "已全部出库"); return map; } Inventory inventory = askGoodsMapper.getInventory(askGoods); //库存数量 AskGoods askGoods1 = askGoodsMapper.getAsknInfo(askGoods); //要货单数量 int alreadyNum = askGoodsMapper.getAskInfoNumVitrual(askGoods);//已扫描总数 int inventoryAlready = askGoodsMapper.getInventoryAlready(askGoods);//库存已扫描数量 int inventorySurplus = Integer.parseInt(inventory.getAmount()) - inventoryAlready; //库存剩余数量 int surplusNum = Integer.parseInt(askGoods1.getNum()) - alreadyNum; //剩余要扫描数量 if(surplusNum >= inventorySurplus){ askGoods.setNum(String.valueOf(inventorySurplus)); } else { askGoods.setNum(String.valueOf(surplusNum)); } askGoods.setStorageLocationCode(inventory.getStorageLocationCode());//库存编号 askGoodsMapper.addAskGoodsVitrual(askGoods); 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); for(AskGoods askGoods : list){ Inventory inventory = askGoodsMapper.getInventory(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());//查询物料id AskGoods askGoods1 = askGoodsMapper.getAskDetailed(askGoodsId, materialId);//查询要料申请单内容 ReturRemoval returRemoval = new ReturRemoval() .setMaterialId(materialId) .setAskGoodsId(askGoodsId) .setWbs(askGoods1.getWbs()) .setNum(askGoods.getNum()) .setEntryNumber(askGoods1.getEntryNumber()) .setAskId(askGoods1.getId()) .setStorageLocationCode(askGoods.getStorageLocationCode()); askGoodsMapper.addRemoval(askGoods);//插入出库流水 askGoodsMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存 askGoodsMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息 askGoodsMapper.updateOutNum(askGoods.getNum(), askGoodsId, materialId);//修改出库数量 } //查询要货单父级信息 AskGoods askGoods3 = askGoodsMapper.getAskDetailedF(askGoodsId); String removalCode = codeGenerateCk(); ReturRemoval returRemoval1 = new ReturRemoval() .setAskGoodsId(askGoods3.getAskGoodsId()) .setRemovalCode(removalCode) .setSourceType(askGoods3.getSourceType()) .setMoveType(askGoods3.getMoveType()); askGoodsMapper.addReturnGsRemovalF(returRemoval1);//新增返回gs数据父表信息 map.put("data", removalCode); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } finally { //释放锁 lock.unlock(); } return map; } @Override public void plugOutRemoval(String removalCode) { try{ Map map = askGoodsMapper.plugOutRemoval(removalCode); Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DATE) ; map.put("child", askGoodsMapper.getRemovalz(map.get("askGoodsId").toString())); map.put("isNotRed", "0"); map.put("year", year); map.put("month", month); map.put("time", year + "-" + month + "-" + day); }catch (Exception e){ e.printStackTrace(); } } @Override public Map getRemoval(AskGoods askGoods) { Map map = new HashMap<>(); try{ //查询数据 PageHelper.startPage(askGoods.getPage(), askGoods.getLimit()); PageInfo list = new PageInfo<>(askGoodsMapper.getRemoval(askGoods)); map.put("data", list); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } return map; } @Override public void export(AskGoods askGoods, HttpServletResponse response) { try{ //导出数据汇总 List> sheetDataList = new ArrayList<>(); //表头数据 List head = Arrays.asList("物料名称", "供应商名称", "连翻号", "类型", "出库用户", "领用部门", "库位名称", "出库日期", "出库数量"); //查询数据 PageHelper.startPage(askGoods.getPage(), askGoods.getLimit()); PageInfo> list = new PageInfo<>(askGoodsMapper.export(askGoods)); sheetDataList.add(head); for(Map userMap : list.getList()){ List listSheet = new ArrayList<>(); for(String key: userMap.keySet()){ listSheet.add(userMap.get(key)); } sheetDataList.add(listSheet); } //当前时间 Date time = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMddHHmmss"); ExcelUtils.export(response, "出库流水数据导出" + sdf.format(time), sheetDataList); }catch (Exception e){ e.printStackTrace(); } } @Override public Map getAskGoodsVitrual(String uniqueCode, String type) { Map map = new HashMap<>(); try{ List list = askGoodsMapper.getAskGoodsVitrual(uniqueCode, type); 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 delAskGoodsVitrual(String id) { Map map = new HashMap<>(); try{ askGoodsMapper.delAskGoodsVitrual(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("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(); } }