1.对接背景,ERP:sqlserver版用友畅捷通 ,电商系统:吉克云OMS
2.涉及接口:
吉克云:jackyun.tradenotsensitiveinfos.list.get(吉克云销售单查询)
用友sqlserver数据库表: Sa_Saleorder ,Sa_Saleorder_B 销售出库单主子表
Aa_Unit 单位表,Aa_Inventory 物料表 ,Eap_User 用户表 Aa_Partner 客户对象表
Aa_Warehouse 仓库表,Eap_Operationlog 操作日志表,St_Currentstock 库存信息表
sa_creditoccupancy 客户信贷率对象, sa_creditoccupancyhistory 客户历史信贷率对象
3.开发思路
从上游吉克云接口获取销售出库单后,经过中台进行数据转换,对应物料、仓库、客户信息,拼接后同步到畅捷通销售出库单,并自动审核,库存扣减。
4.核心代码:
public List<Long> insertIntoFahuo(Map<String, GyWarehouse> warsMap, Map<String, GyCustomer> csMap,
List<JkySalesout> list, String purchaseCode, String begincredate, String endcredate, int type) {
// TODO Auto-generated method stub
List<Long> ids=new ArrayList<>();
List<AaUnit> units=unitService.selectAaUnitList(new AaUnit() );
Map<Long,AaUnit> unitMap=units.stream()
.collect(Collectors.toMap(AaUnit::getId, Function.identity(),
(key1 , key2) -> key1 ));
for(JkySalesout fahuo:list) {
//先看是否已存在云星空中,存在则跳过
if(!testQueryFahuo(fahuo.getTradeNo()).equals("")) {
//单据已经存在金蝶数据库了,把中间表数据直接改为已传递,结束当前循环
jkySalesoutService.updateStatusByCode(fahuo.getId(),"","");
continue;
}
//获取该主单明细表,循环插入
JSONObject json=JSONObject.parseObject( fahuo.getJkyRes());
//没有明细,该条主细单全部不插入金蝶
if(!json.containsKey("goodsDetail")) {
jkySalesoutService.UpdateReturnInfo(fahuo.getId(),"发货细单不存在");
continue;
}
// if(json.getString("stockoutNo")==null) {
// jkySalesoutService.UpdateReturnInfo(fahuo.getId(),"出库单号空");
//
// continue;
// }
JSONArray itemList=json.getJSONArray("goodsDetail");
boolean flag=false;
if(flag) {
continue;
}
//JSONObject fahuos=getFahuos(json.getString("orderNo"),fahuo.getConginTime());
Date date=new Date();
SaSaleorder xsddhz=new SaSaleorder();
xsddhz.setCode(json.getString("tradeNo"));
xsddhz.setMakerid(21l);
xsddhz.setRecivetype(7l);
xsddhz.setIscarriedforwardin(0);
xsddhz.setCreatedtime(date );//生单日期
xsddhz.setMadedate(date );//制单日期
xsddhz.setVoucherdate(date );// 单据日期
xsddhz.setAuditor("");
xsddhz.setIdbusinesstype(65l);
xsddhz.setIscarriedforwardout(0);
xsddhz.setMemberaddress("");
xsddhz.setPrintcount(0l);
xsddhz.setIsseparatebywarehouse(0);
xsddhz.setMaker("DEMO");
xsddhz.setOrigearnestmoney(new BigDecimal(0));
xsddhz.setIdmarketingorgan(1l);
xsddhz.setVoucherstate(181l);//数据床头
xsddhz.setIsmodifiedcode( 0);
xsddhz.setIdcustomer(Long.valueOf(csMap.get(json.getString("shopName")).getOfinterid()) );
xsddhz.setIdclerk(18l);
xsddhz.setDiscountrate(new BigDecimal(1) );
xsddhz.setEarnestmoney(new BigDecimal(0) );
xsddhz.setMobilephone(" ");
xsddhz.setExternalvouchercode("");
if(StringUtil.isNotEmpty( json.getString("sellerMemo"))&&json.getString("sellerMemo").length()>200) {
xsddhz.setMemo( json.getString("sellerMemo").substring(0,199));
}else {
xsddhz.setMemo( json.getString("sellerMemo"));
}
xsddhz.setIdcurrency( 4l);
xsddhz.setOrigdiscountamount( null);
xsddhz.setChanger("" );
xsddhz.setIsautogeneratesaleorderbom(0 );
xsddhz.setCustomerphone( "");
xsddhz.setIdsettlecustomer(Long.valueOf(csMap.get(json.getString("shopName")).getOfinterid()) );
xsddhz.setIsautowarehouse( 0);
xsddhz.setDatasource( 1531l);
xsddhz.setContractcode("" );
xsddhz.setIsautogeneraterouting(0 );
xsddhz.setReceiveamount( new BigDecimal(0) );
xsddhz.setAddress( "");
xsddhz.setContactphone( "");
xsddhz.setIdwarehouse(Long.valueOf(warsMap.get(json.getString("warehouseName")).getBeiYonga()) );
xsddhz.setLinkman( "");
xsddhz.setOrigreceiveamount(new BigDecimal(0) );
xsddhz.setDiscountamount( null);
xsddhz.setCollaboratevouchercode("" );
xsddhz.setExchangerate(new BigDecimal(1) );
xsddhz.setReviser("" );
xsddhz.setUpdated(new Date() );
xsddhz.setUpdatedBy("demo");
//发货单明细
/** 销售明细信息 */
List<SaSaleorderB> xsddmxList=new ArrayList<>();
//明细表
for( int i=0;i<itemList.size();i++) {
JSONObject item=itemList.getJSONObject(i);
//根据管易code查出对应的店铺客户映射
AaInventory query=new AaInventory();
query.setCode(item.getString("goodsNo") );
List<AaInventory> items=inventoryService.selectAaInventoryList(query);
Map<String,AaInventory> itemMap=items.stream()
.collect(Collectors.toMap(AaInventory::getCode, Function.identity(),
(key1 , key2) -> key1 ));
BigDecimal tax=itemMap.get(item.getString("goodsNo")).getTax() ;
BigDecimal tax1=tax.add(new BigDecimal(1));
SaSaleorderB Entitys=new SaSaleorderB();
Entitys.setUpdated( new Date());
Entitys.setPricestrategyschemeids("" );
//找不到,先弄新增,再人工审核
// Entitys.setSingleinvgrossprofit(new BigDecimal(59.83));//参考毛利
// Entitys.setGrossprofitrate(new BigDecimal(0.7) );
// Entitys.setGrossprofit( new BigDecimal(59.83));
// Entitys.setLatestcost( new BigDecimal(25.64));//销售单位结存成本
Entitys.setUpdatedby( "demo");
Entitys.setExecutedquantity2( null);
Entitys.setTaxflag(1 );
Entitys.setPromotionvouchercodes( "");
//Entitys.setIdsaleorderdto(13l );//主表id
Entitys.setIdwarehouse(Long.valueOf(warsMap.get(json.getString("warehouseName")).getBeiYonga()) );//仓库
Entitys.setIdinventory( itemMap.get(item.getString("goodsNo")).getId());//产品
Long idunit=itemMap.get(item.getString("goodsNo")).getIdunit();
Entitys.setIdunit(idunit );//单位
Entitys.setIdbaseunit( idunit);//单位id
Entitys.setIdsubunit( idunit);//单位id
String dwmc= unitMap.get(idunit).getName();
Entitys.setCompositionquantity(item.getBigDecimal("sellCount")+dwmc );//计量单位组合
Entitys.setManufacturequantity2(null );
Entitys.setSaleoutquantity2( null);
Entitys.setIspromotionpresent(0 );
Entitys.setPricestrategyschemenames("");
Entitys.setPurchasequantity(null );
if(json.getBigDecimal("receivedPostFee").compareTo(new BigDecimal(0))>0) {
//运费不为0的时候
if(item.containsKey("divideSellTotal")) {
Entitys.setOrigtaxamount(item.getBigDecimal("divideSellTotal") );
Entitys.setBasetaxprice( null);
Entitys.setTaxprice( item.getBigDecimal("divideSellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP) );//含税单价
Entitys.setOrigtaxprice( item.getBigDecimal("divideSellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP) ); //含税单价
Entitys.setTaxamount( item.getBigDecimal("divideSellTotal") );//含税金额
Entitys.setDiscountprice( item.getBigDecimal("divideSellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP)
.divide( tax1,4,BigDecimal.ROUND_HALF_UP));//单价
Entitys.setOrigdiscountprice( item.getBigDecimal("divideSellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP).
divide(tax1,4,BigDecimal.ROUND_HALF_UP));//单价
Entitys.setOrigdiscountamount( item.getBigDecimal("divideSellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP));//金额
Entitys.setDiscountamount( item.getBigDecimal("divideSellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP));//金额
Entitys.setTax( item.getBigDecimal("divideSellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP).multiply(tax) );//税额=金额*税率
Entitys.setOrigtax(item.getBigDecimal("divideSellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP).multiply(tax));//税额=金额*税率
//取辅助单位,再取换算率,没有则不填
Long idunit2=itemMap.get(item.getString("goodsNo")).getIdsubunitbyreport();
if(idunit2!=null) {
AaUnit idunit2Obj= unitMap.get(idunit2);
Entitys.setUnitexchangerate( idunit2Obj.getChangerate());//换算率
Entitys.setQuantity2( item.getBigDecimal("divideSellTotal")
.divide( idunit2Obj.getChangerate(),4,BigDecimal.ROUND_HALF_UP ));//换算后的
Entitys.setIdunit2(idunit2);
}
}else {
//不包含divideSellTotal。则取sellTotal
Entitys.setOrigtaxamount(item.getBigDecimal("sellTotal") );
Entitys.setBasetaxprice( null);
Entitys.setTaxprice( item.getBigDecimal("sellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP) );//含税单价
Entitys.setOrigtaxprice( item.getBigDecimal("sellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP) ); //含税单价
Entitys.setTaxamount( item.getBigDecimal("sellTotal") );//含税金额
Entitys.setDiscountprice( item.getBigDecimal("sellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP)
.divide( tax1,4,BigDecimal.ROUND_HALF_UP));//单价
Entitys.setOrigdiscountprice( item.getBigDecimal("sellTotal")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP).
divide(tax1,4,BigDecimal.ROUND_HALF_UP));//单价
Entitys.setOrigdiscountamount( item.getBigDecimal("sellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP));//金额
Entitys.setDiscountamount( item.getBigDecimal("sellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP));//金额
Entitys.setTax( item.getBigDecimal("sellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP).multiply(tax) );//税额=金额*税率
Entitys.setOrigtax(item.getBigDecimal("sellTotal")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP).multiply(tax));//税额=金额*税率
//取辅助单位,再取换算率,没有则不填
Long idunit2=itemMap.get(item.getString("goodsNo")).getIdsubunitbyreport();
if(idunit2!=null) {
AaUnit idunit2Obj= unitMap.get(idunit2);
Entitys.setUnitexchangerate( idunit2Obj.getChangerate());//换算率
Entitys.setQuantity2( item.getBigDecimal("sellTotal")
.divide( idunit2Obj.getChangerate(),4,BigDecimal.ROUND_HALF_UP ));//换算后的
Entitys.setIdunit2(idunit2);
}
}
}else {
//运费为0的时候,取shareFavourableAfterFee
Entitys.setOrigtaxamount(item.getBigDecimal("shareFavourableAfterFee") );
Entitys.setBasetaxprice( null);
Entitys.setTaxprice( item.getBigDecimal("shareFavourableAfterFee")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP) );//含税单价
Entitys.setOrigtaxprice( item.getBigDecimal("shareFavourableAfterFee")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP) ); //含税单价
Entitys.setTaxamount( item.getBigDecimal("shareFavourableAfterFee") );//含税金额
Entitys.setDiscountprice( item.getBigDecimal("shareFavourableAfterFee")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP)
.divide( tax1,4,BigDecimal.ROUND_HALF_UP));//单价
Entitys.setOrigdiscountprice( item.getBigDecimal("shareFavourableAfterFee")
.divide(item.getBigDecimal("sellCount"),4,BigDecimal.ROUND_HALF_UP).
divide(tax1,4,BigDecimal.ROUND_HALF_UP));//单价
Entitys.setOrigdiscountamount( item.getBigDecimal("shareFavourableAfterFee")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP));//金额
Entitys.setDiscountamount( item.getBigDecimal("shareFavourableAfterFee")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP));//金额
Entitys.setTax( item.getBigDecimal("shareFavourableAfterFee")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP).multiply(tax) );//税额=金额*税率
Entitys.setOrigtax(item.getBigDecimal("shareFavourableAfterFee")
.divide(tax1,2,BigDecimal.ROUND_HALF_UP).multiply(tax));//税额=金额*税率
//取辅助单位,再取换算率,没有则不填
Long idunit2=itemMap.get(item.getString("goodsNo")).getIdsubunitbyreport();
if(idunit2!=null) {
AaUnit idunit2Obj= unitMap.get(idunit2);
Entitys.setUnitexchangerate( idunit2Obj.getChangerate());//换算率
Entitys.setQuantity2( item.getBigDecimal("shareFavourableAfterFee")
.divide( idunit2Obj.getChangerate(),4,BigDecimal.ROUND_HALF_UP ));//换算后的
Entitys.setIdunit2(idunit2);
}
}
Entitys.setDiscount( new BigDecimal(0));
Entitys.setDatasource(1531l );
Entitys.setDiscountrate( new BigDecimal(1));
Entitys.setDeliveryquantity( null);
Entitys.setCode("0000");
Entitys.setManufacturequantity( null );
Entitys.setPricestrategytypename("" );
Entitys.setTaxrate( itemMap.get(item.getString("goodsNo")).getTax() );//税率
Entitys.setBasequantity( item.getBigDecimal("sellCount"));//数量
Entitys.setBasediscountprice(null );
Entitys.setPromotionsinglevouchercode("" );
Entitys.setExecutedquantity(null );
Entitys.setSaleoutquantity( null);
Entitys.setQuantity( item.getBigDecimal("sellCount"));
Entitys.setSubquantity(item.getBigDecimal("sellCount") );
Entitys.setIspresent( item.getInteger("isGift"));//0不是,是否赠品
Entitys.setPrarequiretimes(0l );
Entitys.setOrigprice(null );
Entitys.setIsmemberintegral(0 );
Entitys.setHaspra(0 );
Entitys.setPurchasequantity2(null );
Entitys.setOrigdiscount(null );
Entitys.setIsmodifiedprice(1 );
Entitys.setIsclose(0 );
Entitys.setDeliveryquantity2(null );
Entitys.setBaseprice( null);
Entitys.setPromotionvoucherids( "");
Entitys.setPrice(null );
xsddmxList.add(Entitys);
}
//邮费存在,且大于0
if(json.containsKey("receivedPostFee") &&
json.getBigDecimal("receivedPostFee").compareTo(new BigDecimal(0))>0 ) {
//根据管易code查出对应的店铺客户映射
AaInventory query=new AaInventory();
query.setCode("YF" );
List<AaInventory> items=inventoryService.selectAaInventoryList(query);
Map<String,AaInventory> itemMap=items.stream()
.collect(Collectors.toMap(AaInventory::getCode, Function.identity(),
(key1 , key2) -> key1 ));
BigDecimal tax=itemMap.get("YF" ).getTax() ;
BigDecimal tax1=tax.add(new BigDecimal(1));
SaSaleorderB Entitys=new SaSaleorderB();
Entitys.setUpdated( new Date());
Entitys.setPricestrategyschemeids("" );
Entitys.setUpdatedby( "demo");
Entitys.setExecutedquantity2( null);
Entitys.setTaxflag(1 );
Entitys.setPromotionvouchercodes( "");
//Entitys.setIdsaleorderdto(13l );//主表id
Entitys.setIdwarehouse(Long.valueOf(warsMap.get(json.getString("warehouseName")).getBeiYonga()) );//仓库
Entitys.setIdinventory( itemMap.get("YF").getId());//产品
Long idunit=itemMap.get("YF").getIdunit();
Entitys.setIdunit(idunit );//单位
Entitys.setIdbaseunit( idunit);//单位id
Entitys.setIdsubunit( idunit);//单位id
String dwmc= unitMap.get(idunit).getName();
Entitys.setCompositionquantity(1+dwmc );//计量单位组合
Entitys.setManufacturequantity2(null );
Entitys.setSaleoutquantity2( null);
Entitys.setIspromotionpresent(0 );
Entitys.setPricestrategyschemenames("");
Entitys.setPurchasequantity(null );
Entitys.setOrigtaxamount(json.getBigDecimal("receivedPostFee"));
Entitys.setBasetaxprice( null);
Entitys.setTaxprice( json.getBigDecimal("receivedPostFee")
);//含税单价
Entitys.setOrigtaxprice(json.getBigDecimal("receivedPostFee")
); //含税单价
Entitys.setTaxamount(json.getBigDecimal("receivedPostFee") );//含税金额
Entitys.setDiscountprice( json.getBigDecimal("receivedPostFee"));//单价
Entitys.setOrigdiscountprice( json.getBigDecimal("receivedPostFee"));//单价
Entitys.setOrigdiscountamount(json.getBigDecimal("receivedPostFee"));//金额
Entitys.setDiscountamount( json.getBigDecimal("receivedPostFee"));//金额
Entitys.setDiscount( new BigDecimal(0));
Entitys.setDatasource(1531l );
Entitys.setDiscountrate( new BigDecimal(1));
Entitys.setDeliveryquantity( null);
Entitys.setCode("0000");
Entitys.setManufacturequantity( null );
Entitys.setPricestrategytypename("" );
Entitys.setTaxrate( itemMap.get("YF").getTax() );//税率
Entitys.setBasequantity( new BigDecimal(1));//数量
Entitys.setBasediscountprice(null );
Entitys.setPromotionsinglevouchercode("" );
Entitys.setExecutedquantity(null );
Entitys.setSaleoutquantity( null);
Entitys.setQuantity( new BigDecimal(1));
Entitys.setSubquantity( new BigDecimal(1));
Entitys.setIspresent( 0);//0不是,是否赠品
Entitys.setTax( new BigDecimal(0));//税额=金额*税率
Entitys.setOrigtax( new BigDecimal(0));//税额=金额*税率
Entitys.setPrarequiretimes(0l );
Entitys.setOrigprice(null );
Entitys.setIsmemberintegral(0 );
Entitys.setHaspra(0 );
Entitys.setPurchasequantity2(null );
Entitys.setOrigdiscount(null );
Entitys.setIsmodifiedprice(1 );
Entitys.setIsclose(0 );
Entitys.setDeliveryquantity2(null );
Entitys.setBaseprice( null);
Entitys.setPromotionvoucherids( "");
Entitys.setPrice(null );
xsddmxList.add(Entitys);
}
BigDecimal result2 = xsddmxList.stream().map(SaSaleorderB::getTaxamount).reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal result3 = xsddmxList.stream().map(SaSaleorderB::getDiscountamount).reduce(BigDecimal.ZERO,BigDecimal::add);
xsddhz.setOrigamount(result3 );
xsddhz.setTaxamount(result2 );//含税金额
xsddhz.setOrigtaxamount(result2 );//含税金额
xsddhz.setAmount(result3);
xsddhz.setSaSaleorderBList(xsddmxList);
if(xsddmxList==null||xsddmxList.size()==0) {
jkySalesoutService.UpdateReturnInfo(fahuo.getId(), "明细不符合");
continue;
}
insertSaSaleorder(xsddhz);
Long logid=logService.getMaxId();
//畅捷通插入完之后,插入日志
EapOperationlog log=new EapOperationlog();
log.setOperatetype(0);
log.setAccountid("1");
log.setAccountname("开发测试");
log.setModulecode("SA");
log.setFunctioncode("SA03");
log.setFunctionname("");
log.setOperate("新增");
log.setUserid("18201931851");
log.setUsername("DEMO");
log.setMachinename("157.0.162.182");
log.setTime( new Date());//CONVERT(DateTime, N'2023-06-19 22:53:53',120),
log.setDocno(json.getString("tradeNo"));
log.setStatus(1);
log.setDescription("id="+logid);
log.setFunctiondate(new Date());// CONVERT(DateTime, N'2023-06-19 00:00:00',120) )
logService.insertEapOperationlog(log);
//畅捷通插入完之后,逐条更新明细库存
// for(int x=0;x<xsddmxList.size();x++) {
// //需要先查出库存id, 仓库id+货品id去查 库存id
// Long id= stockService.getId(xsddmxList.get(x).getIdwarehouse(),xsddmxList.get(x).getIdinventory());
// BigDecimal qty=getQtyById(xsddmxList.get(x).getIdwarehouse(),xsddmxList.get(x).getIdinventory());
// StCurrentstock stock=new StCurrentstock();
// stock.setForsaleorderbasequantity(qty );//销售订单占用主数量
// // stock.setPurchaseforreceivebasequantity( );//采购入库待入主数量
// stock.setUpdateBy("18201931851");
// // stock.setBasequantity();//主计量数量
// stock.setUpdated(new Date());
// stock.setId(id );//库存id
// stock.setTs(new Date());
// stockService.updateStCurrentstock(stock);
// }
// 更新客户信用率相关信息:
SaCreditoccupancyhistory his=new SaCreditoccupancyhistory();
his.setIdcustomer(Long.valueOf(csMap.get(json.getString("shopName")).getOfinterid()) );//客户id
// his.setIdclerk( );
his.setOperationtype( "新增");
his.setVouchercode( json.getString("tradeNo"));
his.setUpdated(new Date());//,CONVERT(DateTime, N'2023-06-19 22:53:53',120
his.setOrderunoutamount( result2);//
his.setOutunsettleamount(new BigDecimal(0) );
his.setSalesettleamount( new BigDecimal(0) );
his.setIncomeunsettleamount(new BigDecimal(0) );
his.setReceiveuncancelamount(new BigDecimal(0) );
his.setExpensesettleamount(new BigDecimal(0) );
his.setOrderunoutamountforaudit(new BigDecimal(0) );
his.setOutunsettleamountforaudit(new BigDecimal(0) );
his.setSalesettleamountforaudit( new BigDecimal(0) );
his.setIncomeunsettleamountforaudit(new BigDecimal(0) );
his.setReceiveuncancelamountforaudit(new BigDecimal(0) );
his.setExpensesettleamountforaudit(new BigDecimal(0) );
sacreditService.insertSaCreditoccupancyhistory(his);
jkySalesoutService.updateStatusByCode(fahuo.getId(),"同步成功","同步成功");
ids.add(fahuo.getId());
}
return ids;
}