package com.tld.service.impl; import com.alibaba.fastjson.JSON; import com.tld.mapper.DictionaryMapper; import com.tld.mapper.InviteMapper; import com.tld.model.*; import com.tld.service.InviteService; 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 public class InviteServiceImpl implements InviteService { @Autowired private InviteMapper inviteMapper; //redis锁 @Autowired private RedissonClient redissonClient; @Autowired private DictionaryMapper dictionaryMapper; @Override public Map getAskGoodsfList(AskGoods askGoods) { Map map = new HashMap<>(); try{ List list = inviteMapper.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 = inviteMapper.getAskGoodsMaterial(askGoods); List scanNum = new LinkedList<>(); for(AskGoods askGoods1 : list){ askGoods1.setUniqueCode(askGoods.getUniqueCode()); askGoods1.setUniqueCode(askGoods.getUniqueCode()); scanNum.add(inviteMapper.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 : inviteMapper.getMaterialCk(askGoods)){ AskGoods askGoods1 = inviteMapper.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; } @Override @Transactional(rollbackFor = Exception.class) public Map addAskGoodsVitrual(AskGoods askGoods) { Map map = new HashMap<>(); try{ Map mapVal = inviteMapper.getScanIsNot(askGoods); if((Double.parseDouble(mapVal.get("inventoryNum").toString()) - Double.parseDouble(mapVal.get("virtualNum").toString())) == 0){ map.put("msg", "500"); map.put("errMsg", "已全部出库"); return map; } Inventory inventory = inviteMapper.getInventory(askGoods); //库存数量 AskGoods askGoods1 = inviteMapper.getAsknInfo(askGoods); //要货单数量 int alreadyNum = inviteMapper.getAskInfoNumVitrual(askGoods);//已扫描总数 int inventoryAlready = inviteMapper.getInventoryAlready(askGoods);//库存已扫描数量 int inventorySurplus = (Integer.parseInt(inventory.getAmount()) - Integer.parseInt(inventory.getAmountLock())) - inventoryAlready; //库存剩余数量 Double surplusNum = Double.parseDouble(askGoods1.getNum()) - Double.parseDouble(askGoods1.getOutNum()) - alreadyNum; //剩余要扫描数量 if(surplusNum >= inventorySurplus){ askGoods.setNum(String.valueOf(inventorySurplus)); } else { askGoods.setNum(String.valueOf(surplusNum)); } askGoods.setStorageLocationCode(inventory.getStorageLocationCode());//库存编号 inviteMapper.addAskGoodsVitrual(askGoods); map.put("msg", "200"); }catch (Exception e){ e.printStackTrace(); map.put("msg", "500"); map.put("errMsg", "失败"); } return map; } @Override @Transactional(rollbackFor = Exception.class) public Map OutOfLibrary(String uniqueCode, String type, String askGoodsId) { Map map = new HashMap<>(); //redis并发锁 RLock lock = redissonClient.getLock(uniqueCode); lock.lock(); try{ String removalCode = codeGenerateCk(); List list = inviteMapper.getVirtualUniqueCode(uniqueCode, type, askGoodsId); for(AskGoods askGoods : list){ askGoods.setStorageCode(removalCode); askGoods.setCompanyNumber(askGoods.getAccountSleeve()); Inventory inventory = inviteMapper.getInventory(askGoods); if(inventory == null){ throw new Exception("库存不存在"); } //如果出库库存等于虚拟表库存则删除此库存 if(Double.parseDouble(askGoods.getNum()) == Double.parseDouble(inventory.getAmount())){ inviteMapper.deleteInventory(inventory); } else { inventory.setAmount(askGoods.getNum()); inviteMapper.updateInventory(inventory); } String materialId = inviteMapper.getMaterialId(askGoods.getWllbCode());//查询物料id AskGoods askGoods1 = inviteMapper.getAskDetailed(askGoodsId, materialId);//查询要料申请单内容 ReturRemoval returRemoval = new ReturRemoval() .setMaterialId(materialId) .setDocumentId(askGoodsId) .setWbs(askGoods1.getWbs()) .setNum(askGoods.getNum()) .setEntryNumber(askGoods1.getEntryNumber()) .setDocumentPointsId(askGoods1.getId()) .setStorageLocationCode(askGoods.getStorageLocationCode()); inviteMapper.addRemoval(askGoods);//插入出库流水 inviteMapper.deleteVirtual(askGoods.getId());//删除已出虚拟表库存 inviteMapper.addReturnGsRemoval(returRemoval);//新增返回gs数据子表信息 inviteMapper.updateOutNum(askGoods.getNum(), askGoodsId, materialId);//修改出库数量 } //查询要货单父级信息 AskGoods askGoods3 = inviteMapper.getAskDetailedF(askGoodsId); ReturRemoval returRemoval1 = new ReturRemoval() .setDocumentId(askGoods3.getAskGoodsId()) .setRemovalCode(removalCode) .setSourceType(askGoods3.getSourceType()) .setMoveType(askGoods3.getMoveType()); inviteMapper.addReturnGsRemovalF(returRemoval1);//新增返回gs数据父表信息 map.put("data", askGoods3.getAskGoodsId()); 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; } /** * 半成品/产成品入库通知 * @return */ @Override public Map prodStockInNotice(List> mapList) { Map map = new HashMap<>(); try { inviteMapper.addNotice(mapList); //新增日志 Access access = new Access().setType("报工单").setData(JSON.toJSONString(mapList)).setAccessType("0"); dictionaryMapper.addAccess(access); map.put("status", "0000"); map.put("msg","成功"); }catch (Exception e){ e.printStackTrace(); map.put("status", "0009"); map.put("msg", "服务器请求异常,请稍后再试"); } return map; } /** * 交货单接口 * @return */ @Override public Map deliveryOrder(List> mapList) { Map map = new HashMap<>(); try { for (Map list : mapList) { if (list.get("operationType").toString().equals("2")){ //查询子表数据根据交货单id int count = inviteMapper.getCountDelivery(list.get("deliveryOrderId").toString()); //是否存在 if (count == 0){ //修改父子表信息 inviteMapper.updDelivery(list.get("deliveryOrderId").toString()); //添加 inviteMapper.addDeliverys(list); } }else { //添加 inviteMapper.addDeliverys(list); } } // inviteMapper.addDelivery(mapList); //新增日志 Access access = new Access().setType("交货单").setData(JSON.toJSONString(mapList)).setAccessType("0"); dictionaryMapper.addAccess(access); map.put("status", "0000"); map.put("msg","成功"); }catch (Exception e){ e.printStackTrace(); map.put("status", "0009"); map.put("msg", "服务器请求异常,请稍后再试"); } return map; } /** * 移库通知单 * @return */ @Override public Map transferNotice(List> mapList) { Map map = new HashMap<>(); try { inviteMapper.addWarehouseTransfer(mapList); //新增日志 Access access = new Access().setType("移库单").setData(JSON.toJSONString(mapList)).setAccessType("0"); dictionaryMapper.addAccess(access); map.put("status", "0000"); map.put("msg","成功"); }catch (Exception e){ e.printStackTrace(); map.put("status", "0009"); map.put("msg", "服务器请求异常,请稍后再试"); } return map; } @Override @Transactional(rollbackFor = Exception.class) public Map delAskGoods(String id, HttpServletRequest request) { Map map = new HashMap<>(); try{ String userId = request.getHeader("userId"); Map mapVal = inviteMapper.getDelAskGoods(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); inviteMapper.delAskGoods(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 = inviteMapper.getReturnRemovalCount(); for(int i = 0; i < 4 - (count + "").length(); i++){ stringBuilder.append("0"); } return (stringBuilder.append(count + 1)).toString(); } @Override @Transactional(rollbackFor = Exception.class) public Map addAskGoodsNoProd(List> mapList) { Map map = new HashMap<>(); try{ List askGoodsList = new LinkedList(); for(Map jsonMap:mapList) { List> list = (List) jsonMap.get("datalist"); for (Map element : list) { AskGoods ag = new AskGoods(); //父表 ag.setAskGoodsId(jsonMap.get("requestOrderId").toString()); ag.setAskGoodsCode(jsonMap.get("requestOrderNo").toString()); ag.setCompanyNumber(jsonMap.get("companyNo").toString()); ag.setSqrq(jsonMap.get("applicationDate").toString());//申请日期 ag.setDepartment(jsonMap.get("useDepartment").toString()); ag.setSourceType(jsonMap.get("sourceType").toString()); ag.setMoveType(jsonMap.get("moveType").toString()); ag.setAskGoodsApplyType(jsonMap.get("requestOrderType").toString()); //子表 ag.setEntryNumber(element.get("entryNumber").toString()); ag.setProductionCode(element.get("prodOrderNo").toString());// ag.setMaterialId(element.get("materialId").toString()); ag.setWbs(element.get("WBS").toString());// ag.setMeasurementId(element.get("measUnitId").toString()); ag.setNum(element.get("orderCount").toString()); ag.setOutNum("0"); ag.setAskGoodsType("0"); askGoodsList.add(ag); } } for(AskGoods askGoods : askGoodsList) { int count = inviteMapper.getAskGoods(askGoods); if (count != 0) { inviteMapper.updateAskGoodsNum(askGoods); } else { if (inviteMapper.getAskGoodsf(askGoods) == 0) { inviteMapper.addAskGoodsf(askGoods); } inviteMapper.addAskGoods(askGoods); } inviteMapper.addAskGoodsLog(askGoods); } //新增日志 Access access = new Access().setType("非生产领料信息").setData(JSON.toJSONString(mapList)).setAccessType("0"); dictionaryMapper.addAccess(access); map.put("status", "0000"); map.put("msg","成功"); }catch (Exception e){ e.printStackTrace(); map.put("status", "0009"); map.put("msg", "服务器请求异常,请稍后再试"); } return map; } }