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);
}
}
综上,完成了金蝶库存变化流水,实时同步到管易库存数据,保持了不同系统之间库存数据的准确性。