金蝶云星空即时库存变动同步到电商OMS系统

1.背景客户,是一家集采购、加工、生产、线上线下销售于一体的客户,客户在收到电商订单后,完成加工生产,产生的成品库存,需要及时同步到电商系统,形成库存数据的闭环处理,也保证了每月盘点时,库存数据的准确性。

2.背景涉及系统及接口:ERP:金蝶云星空 ,OMS:金蝶管易云

涉及金蝶云星空接口:1.组装拆卸 2.直接调拨 3.盘亏 4.生产入库 5.盘盈 6.其他入库 7.其他出库 8.采购入库 9.采购退料 10.销售退货 11.销售出库 12.分布式调入 13.分布式调出

涉及金蝶管易云接口:1.gy.erp.kingdeecloud.stockflow.adjust 库存调整单接口

3.开发思路:采用定时轮询规则,每10分钟,多线程查询金蝶云星空相关进销存库存单据产生的数据,汇总后,通过库存调整单接口同步到金蝶管易云,完成库存数据的对接,保证库存数据的准确性和及时性,也有效防止了库存超卖无法及时发货而导致的电商平台罚款。

4.多线程取金蝶进销存库存数据模块:

	@Override
	public int syncInfo(GyKucunZl gyKucunZl) throws Exception {
		// TODO Auto-generated method stub

		Map<String, Object> bparams = gyKucunZl.getParams();
	    	System.out.println(bparams.get("beginConsignTime"));
	    	String beginDate=bparams.get("beginConsignTime")+"";
	    	String endDate=bparams.get("endConsignTime")+"";	
		final CountDownLatch latch = new CountDownLatch(13);
        System.out.println("增量库存开始执行…… ……");
      
        List<GykisItem> items=kisItemService.getCodes();
        
		Map<String, String> itemMap = items.stream()
				  .collect(Collectors
				  .toMap(GykisItem::getName, GykisItem::getCode, (key1, key2) -> key1));
		
		List<GyWarehouse> wares=gyWarehouseMapper.selectGyWarehouseList(new GyWarehouse());
		
		Map<String, GyWarehouse> wareMap = wares.stream()
				  .collect(Collectors
				  .toMap(GyWarehouse::getNote,   a -> a,(key1, key2) -> key1));
		
        //第一个子线程执行
        ExecutorService es1 = Executors.newSingleThreadExecutor();
        es1.execute(new Runnable() {
            @Override
            public void run() {
                try {
               
                    
                	String keyString="zlkc_zzcx";
                	
                 	assembly(beginDate, endDate,keyString,itemMap,wareMap);
                 	
                    //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    
                    redisUtil.remove(keyString);   
               
                    System.out.println("组装拆卸:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es1.shutdown();
		
        //第二个子线程执行
        ExecutorService es2= Executors.newSingleThreadExecutor();
        es2.execute(new Runnable() {
            @Override
            public void run() {
                try {
          
                	
                    String keyString="zlkc_zjdb";     
                    
                  	directTransfer(beginDate, endDate,keyString,itemMap,wareMap);
                  	
                   //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    
                    redisUtil.remove(keyString);   
                    
                    System.out.println("直接调拨:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es2.shutdown();

        //第3个子线程执行
        ExecutorService es3= Executors.newSingleThreadExecutor();
        es3.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    String keyString="zlkc_pk";
                	inventoryLoss(beginDate, endDate,keyString,itemMap,wareMap);
                                       
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    
                    redisUtil.remove(keyString);   
                 
                    System.out.println("盘亏:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es3.shutdown();
		
        //第4个子线程执行
        ExecutorService es4= Executors.newSingleThreadExecutor();
        es4.execute(new Runnable() {
            @Override
            public void run() {
                try {
           
        
                    
                    String keyString="zlkc_scrk";
                 	prdInstock(beginDate, endDate,keyString,itemMap,wareMap);
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    redisUtil.remove(keyString);   
                  
                    System.out.println("生产入库:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es4.shutdown();
        
        //第4个子线程执行
        ExecutorService es5= Executors.newSingleThreadExecutor();
        es5.execute(new Runnable() {
            @Override
            public void run() {
                try {
                
             
                    
                    String keyString="zlkc_py";
                	inventorySurplus(beginDate, endDate,keyString,itemMap,wareMap);
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    redisUtil.remove(keyString);   
                
                    System.out.println("盘盈:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es5.shutdown();
        
        //第5个子线程执行
        ExecutorService es6= Executors.newSingleThreadExecutor();
        es6.execute(new Runnable() {
            @Override
            public void run() {
                try {
           
 
                    
                    String keyString="zlkc_qtrk";
                 	otherIn(beginDate, endDate,keyString,itemMap,wareMap);
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    redisUtil.remove(keyString);   
               
                    System.out.println("其他入库:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es6.shutdown();

        //第6个子线程执行
        ExecutorService es7= Executors.newSingleThreadExecutor();
        es7.execute(new Runnable() {
            @Override
            public void run() {
                try {
                
                    
                    String keyString="zlkc_qtck";
                	otherOut(beginDate, endDate,keyString,itemMap,wareMap);
                  
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    redisUtil.remove(keyString);   
                   
                    System.out.println("其他出库:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es7.shutdown();	

        //第7个子线程执行
        ExecutorService es8= Executors.newSingleThreadExecutor();
        es8.execute(new Runnable() {
            @Override
            public void run() {
                try {
             
                    
                    String keyString="zlkc_cgrk";
                   	purchaseIn(beginDate, endDate,keyString,itemMap,wareMap);
                    
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);  
                    redisUtil.remove(keyString); 
                    
         
                    
                    System.out.println("采购入库:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es8.shutdown();	

        //第8个子线程执行
        ExecutorService es9= Executors.newSingleThreadExecutor();
        es9.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    String keyString="zlkc_cgtl";
                    
               	purchaseOut(beginDate, endDate,keyString,itemMap,wareMap);
        
                
         
              //取redis里的set集合,存到中间表
                insertIntoByRedis(keyString);
                redisUtil.remove(keyString);  
                
         
                
                    System.out.println("采购退料:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es9.shutdown();
        
        //第9个子线程执行
        ExecutorService es10= Executors.newSingleThreadExecutor();
        es10.execute(new Runnable() {
            @Override
            public void run() {
                try {
   
                    
                    String keyString="zlkc_xsth";
                 	salesIn(beginDate, endDate,keyString,itemMap,wareMap);
                    
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    redisUtil.remove(keyString);   
                    
               
                    
                    System.out.println("销售退货:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es10.shutdown();	
          
        //第10个子线程执行
        ExecutorService es11= Executors.newSingleThreadExecutor();
        es11.execute(new Runnable() {
            @Override
            public void run() {
                try {
      
         
                
                String keyString="zlkc_xsck";
             	salesOut(beginDate, endDate,keyString,itemMap,wareMap);
              //取redis里的set集合,存到中间表
                insertIntoByRedis(keyString);
                redisUtil.remove(keyString);   
                
              
                    System.out.println("销售出库:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es11.shutdown();	

        //第11个子线程执行
        ExecutorService es12= Executors.newSingleThreadExecutor();
        es12.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    String keyString="zlkc_fbsdr";
                	stepIn(beginDate, endDate,keyString,itemMap,wareMap);
          
                    
           
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    redisUtil.remove(keyString);   
                    
              
                    
                    System.out.println("分布式调入:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es12.shutdown();	

        //第12个子线程执行
        ExecutorService es13= Executors.newSingleThreadExecutor();
        es13.execute(new Runnable() {
            @Override
            public void run() {
                try {
     
                  
                    
                    String keyString="zlkc_fbsdc";
                    
                   	stepOut(beginDate, endDate,keyString,itemMap,wareMap);
                   	
                  //取redis里的set集合,存到中间表
                    insertIntoByRedis(keyString);
                    
                    redisUtil.remove(keyString);  
                    
                   
       
                    
                    System.out.println("分布式调出:"+Thread.currentThread().getName()+"执行");
                }catch (Exception e) {
        			e.printStackTrace();
        		}
                latch.countDown();
            }
        });
        es13.shutdown();	
       
        System.out.println("等待13个单据执行完毕…… ……");
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("13个单据都执行完毕,继续执行");
         
        
        //调整单新增       
        kgAdjustAdd();
        
		return 1;
	}

5.接口部分,组装拆卸:

	private void assembly(String beginDate, String endDate,	String key,
			Map<String, String> itemMap,Map<String, GyWarehouse> wareMap ) {
	
 
		List<YxkAssembly> assembly=yxkKucunZlService.assembly(beginDate,endDate); 
		
		for(YxkAssembly yxk:assembly)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("组装拆卸");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLOT()));//批号
	
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(Long.valueOf(yxk.getFQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFEXPIRYDATE());//有效日期
			
			if(!itemMap.containsKey(yxk.getFMaterialID())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());		
				continue;
			}
//			if(kisItemService.getCodeById(yxk.getFMaterialID())==null) {
//				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
//				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());	
//				continue;
//			}		
//			String code=kisItemService.getCodeById(yxk.getFMaterialID());
			
			zl.setItemCode(itemMap.get(yxk.getFMaterialID()));//商品编码 填管易code
			
			
			//GyWarehouse warehouseName=gyWarehouseService.getNameByCode(yxk.getFStockID());//云星空仓库名称
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockID());
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockID());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockID());
				continue;
			}
			
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称	
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
		

	}

6.接口部分,直接调拨:

	
	/**
	 * 调入和调出,要生成2单
	 * @param beginDate
	 * @param endDate
	 */
	private void directTransfer(String beginDate, String endDate,String key,
			Map<String, String> itemMap,Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);
			
		
		List<YxkDirectTransfer> directTransfer=yxkKucunZlService.directTransfer(beginDate, endDate);

		for(YxkDirectTransfer yxk:directTransfer)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("直接调拨");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
		//	zl.setItemCode(yxk.getFMaterialId());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLot()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(Long.valueOf(yxk.getFQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
		//	zl.setWarehouseCode(yxk.getFSrcStockId());//仓库代码
			
			//String warehouseName=yxkStockService.getNameByCode(yxk.getFSrcStockId());//云星空仓库名称
			//zl.setWarehouseName(warehouseName);//仓库名称
			if(!itemMap.containsKey(yxk.getFMaterialId())){
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());		
				continue;
			}
//			if(kisItemService.getCodeById(yxk.getFMaterialId())==null) {
//				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
//				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
//		
//				continue;
//			}
			String code=itemMap.get(yxk.getFMaterialId());
			zl.setItemCode(code);//商品编码 填管易code
			
			GyWarehouse warehouseName=wareMap.get(yxk.getFSrcStockId());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSrcStockId());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSrcStockId());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称
			
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

7.接口部分,盘亏:

private void inventoryLoss(String beginDate, String endDate,	String key,Map<String, String> itemMap,
			Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	    //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
	    //无序集合 set redisUtil.add(key);
			

		List<YxkInventoryLoss> inventoryLoss=yxkKucunZlService.inventoryLoss(beginDate, endDate);
		for(YxkInventoryLoss yxk:inventoryLoss)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("盘亏单");//单据名称
			
			
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			

			
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLot()));//批号
			
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?-Long.valueOf(yxk.getFLossQty()):
				Long.valueOf(yxk.getFLossQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
			zl.setIsSync("是");
		
			if(!itemMap.containsKey(yxk.getFMaterialId() )) {
		//	if(kisItemService.getCodeById(yxk.getFMaterialId())==null) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				continue;
			}
			String code=itemMap.get(yxk.getFMaterialId());
			zl.setItemCode(code);//商品编码 填管易code
			
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockId());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				continue;
			}
			
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据,如果没有设置时间,那缓存就是永不过期
			redisUtil.add(key, zl);
			
		}
	}

8.接口部分,生产入库:

/**
	 * 生产入库
	 * @param beginDate
	 * @param endDate
	 */
	private void prdInstock(String beginDate, String endDate,	
			String key,Map<String, String> itemMap,Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);

		List<YxkPrdInstock> stepOut=yxkKucunZlService.prdInstock(beginDate, endDate);
		
		for(int i=0;i<stepOut.size();i++)	{
	
			YxkPrdInstock yxk=stepOut.get(i);
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("生产入库");//单据名称
			zl.setBillType(yxk.getFBillType());//单据类型
			//zl.setItemCode(yxk.getFMaterialID());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLOT()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?
					Long.valueOf(yxk.getFStockRealQty()):
				-Long.valueOf(yxk.getFStockRealQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
		//	zl.setWarehouseCode(yxk.getFSrcStockID());//仓库代码
			
			//String warehouseName=yxkStockService.getNameByCode(yxk.getFSrcStockID());//云星空仓库名称
			//zl.setWarehouseName(warehouseName);//仓库名称
		
			if(!itemMap.containsKey( yxk.getFMaterialID())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
		
				continue;
			}
			
			String code=itemMap.get(yxk.getFMaterialID());
			
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockId());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				continue;
			}
			
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称	
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

9.接口部分,盘盈:

private void inventorySurplus(String beginDate, String endDate,	
			String key,Map<String, String> itemMap,Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	    //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
	    //无序集合 set redisUtil.add(key);
			
		
		List<YxkInventorySurplus> inventorySurplus=yxkKucunZlService.inventorySurplus(beginDate, endDate);
		for(YxkInventorySurplus yxk:inventorySurplus)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("盘盈单");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLOT()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?Long.valueOf(yxk.getFGainQty()):
				-Long.valueOf(yxk.getFGainQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
		//	zl.setWarehouseCode(yxk.getFStockId());//仓库代码
			
			if(!itemMap.containsKey( yxk.getFMaterialId())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				continue;
			}
			
			String code=itemMap.get(yxk.getFMaterialId());
			zl.setItemCode(code);//商品编码 填管易code
			
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockId());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

10.接口部分,其他入库:

private void otherIn(String beginDate, String endDate,	String key,Map<String, String> itemMap,Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	    //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
		//无序集合 set redisUtil.add(key);
			

		List<YxkOtherIn> otherIn=yxkKucunZlService.otherIn(beginDate, endDate);
		for(YxkOtherIn yxk:otherIn)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("其他入库");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			//zl.setItemCode(yxk.getFMATERIALID());//商品编码
			zl.setItemName(yxk.getFMATERIALNAME());//商品名称
			zl.setLot(String.valueOf(yxk.getFLOT()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFPRODUCEDATE());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?Long.valueOf(yxk.getFQty()):
				-Long.valueOf(yxk.getFQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFEXPIRYDATE());//有效日期
		//	zl.setWarehouseCode(yxk.getFSTOCKID());//仓库代码
			if(!itemMap.containsKey( yxk.getFMATERIALID())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMATERIALID());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMATERIALID());
				continue;
			}
			//String warehouseName=yxkStockService.getNameByCode(yxk.getFSTOCKID());//云星空仓库名称
			//zl.setWarehouseName(warehouseName);//仓库名称
			String code=itemMap.get( yxk.getFMATERIALID());
			zl.setItemCode(code);//商品编码 填管易code
			
			GyWarehouse warehouseName=wareMap.get (yxk.getFSTOCKID());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSTOCKID());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSTOCKID());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称
			
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

11.接口部分,其他出库:

private void otherOut(String beginDate, String endDate,	String key,Map<String, String> itemMap,
			Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);
			

		List<YxkOtherOut> otherOut=yxkKucunZlService.otherOut(beginDate, endDate);
		
		for(YxkOtherOut yxk:otherOut)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("其他出库");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			//zl.setItemCode(yxk.getFMaterialId());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLot()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?-Long.valueOf(yxk.getFQty())
					:Long.valueOf(yxk.getFQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
		//	zl.setWarehouseCode(yxk.getFStockId());//仓库代码
			if(!itemMap.containsKey(yxk.getFMaterialId()) ) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				continue;
			}
		//	String warehouseName=yxkStockService.getNameByCode(yxk.getFStockId());//云星空仓库名称
		//	zl.setWarehouseName(warehouseName);//仓库名称
			String code=itemMap.get(yxk.getFMaterialId());
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockId());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

12.接口部分,采购入库:

private void purchaseIn(String beginDate, String endDate,	String key,Map<String, String> itemMap,
			Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);
			//C 审核
	
		List<YxkPurchaseIn> purchaseIn=yxkKucunZlService.purchaseIn(beginDate, endDate);
		for(YxkPurchaseIn yxk:purchaseIn)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("采购入库");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			//zl.setItemCode(yxk.getFMaterialId());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFRealQty()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?Long.valueOf(yxk.getFRealQty()):
				-Long.valueOf(yxk.getFRealQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
		//	zl.setWarehouseCode(yxk.getFStockId());//仓库代码
			if(!itemMap.containsKey( yxk.getFMaterialId()) ) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				continue;
			}
			//String warehouseName=yxkStockService.getNameByCode(yxk.getFStockId());//云星空仓库名称
		//	zl.setWarehouseName(warehouseName);//仓库名称
			String code=itemMap.get(yxk.getFMaterialId());
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockId());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称	
			zl.setIsSync("是");
			zl.setApproveDate(yxk.getFApproveDate());//审核时间
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}

	}

13.接口部分,采购退料:

private void purchaseOut(String beginDate, String endDate,	String key,Map<String, String> itemMap,
			Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);
			
	
		List<YxkPurchaseOut> purchaseOut=yxkKucunZlService.purchaseOut(beginDate, endDate);
		for(YxkPurchaseOut yxk:purchaseOut)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("采购退料");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			//zl.setItemCode(yxk.getFMATERIALID());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLot()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?-Long.valueOf(yxk.getFRMREALQTY()):
				Long.valueOf(yxk.getFRMREALQTY()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFEXPIRYDATE());//有效日期
		//	zl.setWarehouseCode(yxk.getFSTOCKID());//仓库代码
			if(!itemMap.containsKey( yxk.getFMATERIALID())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMATERIALID());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMATERIALID());
		
				continue;
			}
		//	String warehouseName=yxkStockService.getNameByCode(yxk.getFSTOCKID());//云星空仓库名称
		//	zl.setWarehouseName(warehouseName);//仓库名称
			String code=itemMap.get(yxk.getFMATERIALID());
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFSTOCKID());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSTOCKID());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSTOCKID());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称	
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

14.接口部分,销售退货:

private void salesIn(String beginDate, String endDate,	String key,Map<String, String> itemMap,
			Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);

		List<YxkSalesIn> salesIn=yxkKucunZlService.salesIn(beginDate, endDate);
	for(YxkSalesIn yxk:salesIn)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("销售退货");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
		//	zl.setItemCode(yxk.getFMaterialId());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLot()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?Long.valueOf(yxk.getFRealQty())
				:-Long.valueOf(yxk.getFRealQty()));//数量
			
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
			//zl.setWarehouseCode(yxk.getFStockId());//仓库代码
			
		//	String warehouseName=yxkStockService.getNameByCode(yxk.getFStockId());//云星空仓库名称
		//	zl.setWarehouseName(warehouseName);//仓库名称
			if(!itemMap.containsKey(yxk.getFMaterialId())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialId());
		
				continue;
			}
			String code=itemMap.get(yxk.getFMaterialId());
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockId());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockId());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

15.接口部分,销售出库:

private void salesOut(String beginDate, String endDate,	String key,Map<String, String> itemMap,
			Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	    //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
	    //无序集合 set redisUtil.add(key);

		List<YxkSalesOut> salesOut=yxkKucunZlService.salesOut(beginDate, endDate);
		for(YxkSalesOut yxk:salesOut)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("销售出库");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			//zl.setItemCode(yxk.getFMaterialID());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLot()));//批号

			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?-Long.valueOf(yxk.getFRealQty())
					:Long.valueOf(yxk.getFRealQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFExpiryDate());//有效日期
		//	zl.setWarehouseCode(yxk.getFStockID());//仓库代码
			if(!itemMap.containsKey( yxk.getFMaterialID())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
		
				continue;
			}
		//	String warehouseName=yxkStockService.getNameByCode(yxk.getFStockID());//云星空仓库名称
		//	zl.setWarehouseName(warehouseName);//仓库名称
			String code=itemMap.get(yxk.getFMaterialID());
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFStockID());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockID());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFStockID());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

16.接口部分,分布式调入:

private void stepIn(String beginDate, String endDate,	String key,Map<String, String> itemMap,
			Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);

		List<YxkStepIn> stepIn=yxkKucunZlService.stepIn(beginDate, endDate);
		for(YxkStepIn yxk:stepIn)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("分布式调入");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			//zl.setItemCode(yxk.getFMaterialID());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFDestLot()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?Long.valueOf(yxk.getFQty()):
				-Long.valueOf(yxk.getFQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFEXPIRYDATE());//有效日期
		//	zl.setWarehouseCode(yxk.getFDestStockID());//仓库代码
			
			if(!itemMap.containsKey( yxk.getFMaterialID())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
		
				continue;
			}
			//String warehouseName=yxkStockService.getNameByCode(yxk.getFDestStockID());//云星空仓库名称
			//zl.setWarehouseName(warehouseName);//仓库名称
			String code=itemMap.get(yxk.getFMaterialID());
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFDestStockID());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFDestStockID());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFDestStockID());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称	
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

17.接口部分,分布式调出:

private void stepOut(String beginDate, String endDate,		
			String key,Map<String, String> itemMap,Map<String, GyWarehouse> wareMap) {
		// TODO Auto-generated method stub
	      //  redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES);
			//无序集合 set redisUtil.add(key);
			

		List<YxkStepOut> stepOut=yxkKucunZlService.stepOut(beginDate, endDate);
		for(YxkStepOut yxk:stepOut)	{
			
			GyKucunZl zl=new GyKucunZl();
			zl.setBillCode(yxk.getFBillNo());//单据编码
			zl.setBillName("分布式调出");//单据名称
			zl.setBillType(yxk.getFBillTypeID());//单据类型
			//zl.setItemCode(yxk.getFMaterialID());//商品编码
			zl.setItemName(yxk.getFMaterialName());//商品名称
			zl.setLot(String.valueOf(yxk.getFLOT()));//批号
			zl.setApproveDate(yxk.getFApproveDate());
			zl.setOperationDate(yxk.getFmodifyDate());//操作日期,修改日期
			zl.setOperationType(yxk.getFDocumentStatus().equals("C")?"已审核":"重新审核");//操作类型
			zl.setManufactureDate(yxk.getFProduceDate());//生产日期
			zl.setQty(yxk.getFDocumentStatus().equals("C")?-Long.valueOf(yxk.getFQty()):
				Long.valueOf(yxk.getFQty()));//数量
			zl.setSyncStatus("未同步");//同步状态
			zl.setValidityDate(yxk.getFEXPIRYDATE());//有效日期
		//	zl.setWarehouseCode(yxk.getFSrcStockID());//仓库代码
			
			if(!itemMap.containsKey(yxk.getFMaterialID())) {
				System.out.println(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
				XxlJobLogger.log(yxk.getFBillNo()+"商品不存在:"+yxk.getFMaterialID());
		
				continue;
			}
			
			//String warehouseName=yxkStockService.getNameByCode(yxk.getFSrcStockID());//云星空仓库名称
			//zl.setWarehouseName(warehouseName);//仓库名称
			String code=itemMap.get(yxk.getFMaterialID());
			zl.setItemCode(code);//商品编码 填管易code
			GyWarehouse warehouseName=wareMap.get(yxk.getFSrcStockID());//云星空仓库名称
			if(warehouseName==null) {
				System.out.println(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSrcStockID());
				XxlJobLogger.log(yxk.getFBillNo()+"仓库不存在:"+yxk.getFSrcStockID());
				continue;
			}
			zl.setWarehouseCode(warehouseName.getCode());//仓库代码
			zl.setWarehouseName(warehouseName.getName());//仓库名称	
			zl.setIsSync("是");
			zl.setFentryid(yxk.getFentryid());
			//redis set 存放不重复的数据
			redisUtil.add(key, zl);
			
		}
	}

18.金蝶云星空接口统一调用方式,替换formid及fieldkeys即可:

public List<YxkStepOut> stepOut(String beginDate, String endDate) {
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		K3CloudApi api = new K3CloudApi();
		
		List<YxkStepOut> allDatas = new ArrayList<>();
		
		for(int j=0;j<1000;j++) {
			List<YxkStepOut> datas = new ArrayList<>();

		JSONObject json=new JSONObject();
		json.put("FormId", "STK_TRANSFEROUT");
		json.put("FieldKeys", "FBillNo,FBillTypeID.fname,FModifyDate,FDocumentStatus,FMaterialID,FMaterialName,FSrcStockID,FQty,FProduceDate,FEXPIRYDATE,FLOT ,FApproveDate,FSTKTRSOUTENTRY_fentryid");
		json.put("FilterString", "(FModifyDate  between '"+beginDate+"' and '"+endDate+ "' or FApproveDate  between '"+beginDate+"' and '"+endDate+ "') ");//取100分组的
		json.put("OrderString", "");
		json.put("TopRowCount", (j+1)*2000+"");
		json.put("StartRow", j*2000+"");
		try {
		
			 List<List<Object>> result = api.executeBillQuery(json.toJSONString());
		
		      XxlJobLogger.log("分布调出"+new Gson().toJson(result));

						if(result.isEmpty()) {
							break;
						}			
				
				for(int i=0;i<result.size();i++) {
				 
			//if(String.valueOf(result.get(i).get(3)).equals("C")||String.valueOf(result.get(i).get(3)).equals("D")){
					
				 YxkStepOut meta = new YxkStepOut();
				 meta.setFBillNo(String.valueOf(result.get(i).get(0)));// FBillNo,
				 meta.setFBillTypeID(String.valueOf(result.get(i).get(1)));//FBillTypeID,
				 meta.setFmodifyDate( sdf.parse(StringUtils.dealDateFormat(String.valueOf(result.get(i).get(2)))));//FApproveDate,
				 meta.setFApproveDate(result.get(i).get(11)!=null?
							sdf.parse(StringUtils.dealDateFormat(String.valueOf(result.get(i).get(11)))):null);//审核
				 
				 meta.setFDocumentStatus(String.valueOf(result.get(i).get(3)));//FDocumentStatus,
				 meta.setFMaterialID(String.valueOf( ((Double)result.get(i).get(4)).intValue()));//FMaterialID,
				 meta.setFMaterialName(String.valueOf(result.get(i).get(5)));//FMaterialName,
				 meta.setFSrcStockID(String.valueOf( ((Double)result.get(i).get(6)).intValue()));//FSrcStockID,
				 meta.setFQty(((Double)(result.get(i).get(7))).intValue());//FQty,
				 meta.setFProduceDate(result.get(i).get(8)!=null?
						 sdf.parse(StringUtils.dealDateFormat(String.valueOf(result.get(i).get(8)))):null);//FProduceDate,
				 meta.setFEXPIRYDATE(result.get(i).get(9)!=null?
						 sdf.parse(StringUtils.dealDateFormat(String.valueOf(result.get(i).get(9)))):null);//FEXPIRYDATE,
				 meta.setFLOT(((Double)(result.get(i).get(10))).intValue());//FLOT,FModifyDate 
				 meta.setFApproveDate(result.get(i).get(11)!=null?
						 sdf.parse(StringUtils.dealDateFormat(String.valueOf(result.get(i).get(11))))
						 :null);//
					meta.setFentryid(((Double)(result.get(i).get(12))).longValue());

					datas.add(meta);				 	
				 	}			 	
			//	}
		} catch (Exception e) {
		e.printStackTrace();
		}
		
		if(datas.isEmpty()) {
			break;
		}else {
			allDatas.addAll(datas);
		}
		}
		return allDatas;
	}

19.数据处理过程中,我们使用了redis去除重复数据,以及在多线程调用过程中数据的冲突:

private void 	insertIntoByRedis(String key) {
		// TODO Auto-generated method stub
	 
		SimpleDateFormat sdfDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		List<GyKucunZl> list=new ArrayList<GyKucunZl>();
	    Set<Object> objects = redisUtil.setMembers(key);
	    System.out.println("redis有"+objects.size());
	    for (Object obj: objects) {
	        GyKucunZl zl = (GyKucunZl) obj;

	        GyKucunZl szl=new GyKucunZl();
	        szl.setBillCode(zl.getBillCode());
	       
	        //2022-05-17 bug处,
	        //szl.setOperationDate(zl.getOperationDate());
	        
	        szl.setType("原始单据");	  
	        szl.setItemCode(zl.getItemCode());	
	        szl.setWarehouseCode(zl.getWarehouseCode());	
	        
	        szl.setFentryid(zl.getFentryid());
	        
	        List<GyKucunZl> oldGyKucunZl=gyKucunZlMapper.selectGyKucunZlList(szl);	 
	        
	        if(oldGyKucunZl!=null&&oldGyKucunZl.size()>0) {
	        	
	        	
	        	
		        List<GyKucunZl> ol=gyKucunZlMapper.selectGyKucunZlListByParam(zl.getBillCode(),
		        		zl.getOperationType(),
		        		zl.getQty()
		        	,zl.getLot(),
		        	zl.getItemCode(),
		        	zl.getFentryid(),
		        	zl.getWarehouseCode(),
		        	sdfDateFormat.format(zl.getOperationDate()),
		        	zl.getApproveDate()!=null?sdfDateFormat.format(zl.getApproveDate()):null
		        	,"原始单据","是 ");
		     
		        if(ol!=null&&ol.size()>0) {
		        redisUtil.srem(key, obj);//已经插到中间表了,则在redis中去掉这个值。
		        continue;
		        }	        	
	        	//查当前 单据编号+仓库+商品 在中间表的最新的一条
	        	GyKucunZl zl2=gyKucunZlMapper.getMaxZl(zl.getBillCode(),"原始单据",zl.getItemCode(),zl.getFentryid(),zl.getWarehouseCode());
	        	
	        	
	        	//1.审核-》审核,审核时间改变、修改时间改变
	         
	        	if(zl2.getOperationType().equals("已审核")&&zl.getOperationType().equals("已审核")
	        	 &&!zl2.getApproveDate().equals(zl.getApproveDate())
	        	 &&!zl2.getOperationDate().equals(zl.getOperationDate())	        	 
	        			) {
	        		
	        		        			
	    			//当前旧的删掉,
					gyKucunZlMapper.deleteById(zl2.getId());														
					//把旧数据复制过来,新增一笔一模一样新的,再进行反增量,(推一个之前单子库存相反的增量)
					GyKucunZl newZl=genZl(zl2);				
					gyKucunZlMapper.insertGyKucunZl(newZl);
					
					//反增量,数量自动相反									
					kgAdjustAddBack(newZl);
					
	        		//当前单据进行增量
		        	list.add(zl);
	        	
		        	
	        		
		        	}
	        	
	        	//2.非审核-》审核	,审核时间改变、修改时间未变
	        	if(zl2.getOperationType().equals("重新审核")&&
	        			zl.getOperationType().equals("已审核")&&
	        			zl2.getOperationDate().equals(zl.getOperationDate())) {
	        		//当前单据进行增量
		        	list.add(zl);	        		
	        	}
	        	
	        	//3.审核-》非审核 审核时间改变,修改时间未变
	        	if(zl2.getOperationType().equals("已审核")&&
	        			zl.getOperationType().equals("重新审核")&&
	        			zl2.getOperationDate().equals(zl.getOperationDate())) {
	        		//当前单据进行增量
		        	list.add(zl);	
	        	}
	        	
	        	//4.非审核-》审核	,审核时间改变、修改时间改变
	        	if(zl2.getOperationType().equals("重新审核")&&
	        			zl.getOperationType().equals("已审核")&&
	        			zl.getApproveDate()!=null&&
	        			!zl2.getOperationDate().equals(zl.getOperationDate())) {
	        		//当前单据进行增量
		        	list.add(zl);	        		
	        	}
	        	
	        	//4.非审核-》非审核,审核时间未变、修改时间改变
	        	if(zl2.getOperationType().equals("重新审核")&&
	        			zl.getOperationType().equals("重新审核")&&
	        			!zl2.getOperationDate().equals(zl.getOperationDate())) {
	        	
	        		zl.setIsSync("否");
	        		//当前单据进行增量
		        	list.add(zl);	        		
	        	}
	        	
	          	//5.审核-》非审核 审核时间改变,修改时间改变
	        	if(zl2.getOperationType().equals("已审核")&&
	        			zl.getOperationType().equals("重新审核")&&
	        			!zl2.getOperationDate().equals(zl.getOperationDate())) {
	        		
	        		//当前旧的删掉,
					gyKucunZlMapper.deleteById(zl2.getId());														
					//把旧数据复制过来,新增一笔一模一样新的,再进行反增量,(推一个之前单子库存相反的增量)
					GyKucunZl newZl=genZl(zl2);				
					gyKucunZlMapper.insertGyKucunZl(newZl);
				
					//反增量,数量自动相反									
					kgAdjustAddBack(newZl);
	        	}
	        		        		        
	        }else {
	        	 //原始单据不存在,
	        	//6. 无-已审核,审核时间改变、修改时间改变
		    	if(zl.getOperationType().equals("已审核")) {	  
		    		System.out.println("第一次审核状态,下推");
		    		list.add(zl);	
		    	}
		    	else {
		    		zl.setIsSync("否");//未审核的 第一次 不需要同步到管易
		    		list.add(zl);	
		    	}
	        }	        	        
	   }
	    //如果用jdbc的批量插入,似乎更快 TODO
	    try {
			saveBatchByJdbc(list);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}

因为进销存数据在修改、审核、反审核过程中都会产生数据,我们需要取最终态的数据,同时还需要和已经传递过的库存数据进行比较,是否进行对冲数据处理。

20.金蝶库存数据校验完毕后,调用管易库存接口数据,同步数据到管易云:

/**
	 * 金蝶专用接口调整单新增
	 */
	private void kgAdjustAdd() {
		// TODO Auto-generated method stub
        GyConfiginfo config= gyConfiginfoService.selectGyConfiginfo();
		List<Long> idsList=new ArrayList<>();
		GyKucunZl gyKucunZl=new GyKucunZl();
		gyKucunZl.setSyncStatus("未同步");
		gyKucunZl.setType("原始单据");
		gyKucunZl.setIsSync("是");//为了区分第一次抓过来的 未审核的,不同步
		List<GyKucunZl> zls=gyKucunZlMapper.selectGyKucunZlList(gyKucunZl);		
		
		int a=zls.size()/100;	    
	    if(a==0) {	 
			JSONArray array=new JSONArray();
			for(GyKucunZl zl:zls) {
				
				JSONObject jsonObject=new JSONObject();
				
				System.out.println(zl.getBillCode()+zl.getItemCode());
				XxlJobLogger.log(zl.getBillCode()+zl.getItemCode());
				
				
				String goods_id=getGoodsId(zl.getItemCode(),config);
				
				if(StringUtils.isEmpty(goods_id)) {
					System.out.println(zl.getBillCode()+zl.getItemCode()+"商品映射异常");
					XxlJobLogger.log(zl.getBillCode()+zl.getItemCode()+"商品映射异常");
					
					continue;
				}
				
				jsonObject.put("request_no", zl.getId());
				
				jsonObject.put("order_code", zl.getBillCode());
				jsonObject.put("order_type", zl.getBillType()); 
				
				//jsonObject.put("order_line_code", zl.getFentryid()); //金蝶云单据行号

				jsonObject.put("goods_id", goods_id);
				jsonObject.put("warehouse_code", zl.getWarehouseCode());
				jsonObject.put("qty", zl.getQty());
				
				array.add(jsonObject);
				idsList.add(zl.getId());
			}	    		    	    	
		Map<String, Object> map = new LinkedHashMap<String, Object>();
		map.put("appkey", config.getAppkey());
		map.put("sessionkey",  config.getSessionkey());
		map.put("method", "gy.erp.kingdeecloud.stockflow.adjust");
	
		map.put("type",1);// ck01 
		map.put("datas", array);
 		String sign = SignUtil.sign(gson.toJson(map),  config.getSecret());
		map.put("sign", sign);
		
		String requestContent = gson.toJson(map);
		XxlJobLogger.log("======库存增量管易入参:"+requestContent);
		System.out.println(requestContent);
		
		String response=HttpUtil.sendPagePost(config.getUrl(), requestContent);
     	System.out.println("增量库存返回:"+response);
		XxlJobLogger.log("======库存增量管易出参:"+response);

     	//JSONObject jo= JSONObject.parseObject(response);
        //boolean returnFlag=jo.getBooleanValue("success");//操作成功返回true
	    }
	    else {
	    	for(int x=0;x<a+1;x++) {
	    		JSONArray array=new JSONArray();
	    		int end=(x+1)*100>zls.size()?zls.size():(x+1)*100;	    		
	    		for(int b=x*100;b<end;b++) {
	    			GyKucunZl zl=zls.get(b);
					JSONObject jsonObject=new JSONObject();				
					String goods_id=getGoodsId(zl.getItemCode(),config);
									
					if(StringUtils.isEmpty(goods_id)) {
						System.out.println(zl.getBillCode()+zl.getItemCode()+"商品映射异常");
						XxlJobLogger.log(zl.getBillCode()+zl.getItemCode()+"商品映射异常");
						continue;
					}
					
					jsonObject.put("request_no", zl.getId());					
					jsonObject.put("order_code", zl.getBillCode());
					jsonObject.put("order_type", zl.getBillType());					
					jsonObject.put("goods_id", goods_id);
					jsonObject.put("warehouse_code", zl.getWarehouseCode());
					jsonObject.put("qty", zl.getQty());					
					array.add(jsonObject);	 
					idsList.add(zl.getId());
	    		}			    				    	    	
				Map<String, Object> map = new LinkedHashMap<String, Object>();
				map.put("appkey", config.getAppkey());
				map.put("sessionkey",  config.getSessionkey());
				map.put("method", "gy.erp.kingdeecloud.stockflow.adjust");
			
				map.put("type",1);// ck01 
				map.put("datas", array);
		 		String sign = SignUtil.sign(gson.toJson(map),  config.getSecret());
				map.put("sign", sign);

				String requestContent = gson.toJson(map);
				XxlJobLogger.log("======库存增量管易入参:"+requestContent);
				System.out.println(requestContent);
				
				String response=HttpUtil.sendPagePost(config.getUrl(), requestContent);
		     	System.out.println("增量库存返回:"+response);	    	
				XxlJobLogger.log("======库存增量管易出参:"+response);
	    	}	    	    	
	    }
	    
	    //更新已同步
	    if(!idsList.isEmpty()) {
	    gyKucunZlMapper.updateSync(idsList);
	    }
		
	}

综上,完成了金蝶库存变化流水,实时同步到管易库存数据,保持了不同系统之间库存数据的准确性。

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值