同步ERP供应商数据

liweidong^2
张乾翔 2 days ago
parent ec636469d6
commit 0a639781dc
  1. 31
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbSplyClient.java
  2. 58
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/view/MesRbSply.java
  3. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java
  4. 58
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml
  5. 93
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java
  6. 32
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbSplyClientImpl.java
  7. 23
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.java
  8. 20
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.xml
  9. 21
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbSplyService.java
  10. 34
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbSplyServiceImpl.java

@ -0,0 +1,31 @@
package org.springblade.erpdata.feign;
import org.springblade.common.constant.LauncherConstant;
import org.springblade.erpdata.pojo.dto.view.MesRbSply;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
/**
* ERP供应商数据Feign客户端
*
* @author BladeX
* @since 2026-04-29
*/
@FeignClient(
value = LauncherConstant.APPLICATION_ERP_DATA_NAME
)
public interface IErpMesRbSplyClient {
String API_PREFIX = "/feign/erpdata/supply";
String GET_SPLY_LIST = API_PREFIX + "/getSplyList";
/**
* 从ERP获取供应商列表
*
* @return 供应商列表
*/
@GetMapping(GET_SPLY_LIST)
List<MesRbSply> getSplyList();
}

@ -0,0 +1,58 @@
package org.springblade.erpdata.pojo.dto.view;
import lombok.Data;
/**
* 对应ERP中视图 V_MES_RB_SPLY - 供应商/客户信息
*
* @author BladeX
* @since 2026-04-29
*/
@Data
public class MesRbSply {
/**
* 供应商编码
*/
private String splycode;
/**
* 供应商名称
*/
private String splyname;
/**
* 省份/地区
*/
private String province;
/**
* 供应商地址
*/
private String splyadd;
/**
* 产品类型/资质
*/
private String producttype;
/**
* 供应商状态
*/
private Integer splystat;
/**
* 联系人
*/
private String linkman;
/**
* 邮箱
*/
private String email;
/**
* 联系电话
*/
private String ctactqumd;
}

@ -13,9 +13,4 @@ import org.springblade.desk.basic.pojo.entity.OemCustomer;
@Mapper
public interface OemCustomerMapper extends BaseMapper<OemCustomer> {
/**
* 同步ERP外协厂家管理数据到本地
* ERP 数据库视图 V_MES_RB_SPLY 同步数据到 BS_OEM_CUSTOMER
*/
void syncCustomerFromErp();
}

@ -18,62 +18,4 @@
<result column="UPDATE_TIME" property="updateTime"/>
</resultMap>
<!--
同步ERP外协厂家管理数据到本地
逻辑说明:
1. 从 ERP 数据库链接 dba_mgr.V_MES_RB_SPLY@erp_mes_link 获取供应商数据
2. 根据供应商编码(oc_code)判断是否存在
3. 存在则更新,不存在则插入
-->
<update id="syncCustomerFromErp">
MERGE INTO BS_OEM_CUSTOMER target
USING (
SELECT
a.splycode AS oc_code,
a.splyname AS oc_name,
a.splyname AS abbreviation,
a.province AS region,
a.splyadd AS address,
a.producttype AS qualification,
a.splystat AS cur_status,
a.linkman AS contact_man,
a.email AS email,
a.ctactqumd AS contact_phone,
SYSDATE AS update_time
FROM dba_mgr.V_MES_RB_SPLY@erp_mes_link a
) source
ON (target.OC_CODE = source.oc_code)
WHEN MATCHED THEN
UPDATE SET
target.OC_NAME = source.oc_name,
target.ABBREVIATION = source.abbreviation,
target.REGION = source.region,
target.ADDRESS = source.address,
target.QUALIFICATION = source.qualification,
target.CUR_STATUS = source.cur_status,
target.CONTACT_MAN = source.contact_man,
target.EMAIL = source.email,
target.CONTACT_PHONE = source.contact_phone,
target.UPDATE_TIME = source.update_time
WHEN NOT MATCHED THEN
INSERT (OC_ID, OC_CODE, OC_NAME, ABBREVIATION, REGION, ADDRESS,
QUALIFICATION, CUR_STATUS, CONTACT_MAN, EMAIL, CONTACT_PHONE,
IS_DELETED, UPDATE_TIME)
VALUES (
S_BS_OEM_CUSTOMER.NEXTVAL,
source.oc_code,
source.oc_name,
source.abbreviation,
source.region,
source.address,
source.qualification,
source.cur_status,
source.contact_man,
source.email,
source.contact_phone,
0,
source.update_time
)
</update>
</mapper>

@ -1,14 +1,27 @@
package org.springblade.desk.basic.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.desk.basic.mapper.OemCustomerMapper;
import org.springblade.desk.basic.pojo.entity.OemCustomer;
import org.springblade.desk.basic.service.IOemCustomerService;
import org.springblade.erpdata.feign.IErpMesRbSplyClient;
import org.springblade.erpdata.pojo.dto.view.MesRbSply;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* [外协厂家-客户] 服务实现类
*
@ -19,6 +32,8 @@ import org.springframework.transaction.annotation.Transactional;
@Service
public class OemCustomerServiceImpl extends BaseServiceImpl<OemCustomerMapper, OemCustomer> implements IOemCustomerService {
@Resource
IErpMesRbSplyClient erpMesRbSplyClient;
/**
* 从ERP系统同步供应商/客户数据到本地数据库
*/
@ -27,9 +42,81 @@ public class OemCustomerServiceImpl extends BaseServiceImpl<OemCustomerMapper, O
public R syncCustomerFromErp() {
log.info("开始同步外协厂家管理数据...");
baseMapper.syncCustomerFromErp();
try {
List<MesRbSply> splyList = erpMesRbSplyClient.getSplyList();
if (CollUtil.isEmpty(splyList)) {
return R.fail("没有获取到供应商数据");
}
log.info("从ERP获取到 {} 条供应商数据", splyList.size());
List<String> ocCodes = splyList.stream()
.map(MesRbSply::getSplycode)
.filter(code -> code != null && !code.isEmpty())
.collect(Collectors.toList());
LambdaQueryWrapper<OemCustomer> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(OemCustomer::getOcCode, ocCodes);
Map<String, OemCustomer> existingCustomerMap = list(Wrappers.lambdaQuery(OemCustomer.class)
.in(OemCustomer::getOcCode, ocCodes))
.stream()
.collect(Collectors.toMap(OemCustomer::getOcCode, Function.identity()));
// 新增和更新
Date now = new Date();
List<OemCustomer> toInsert = splyList.stream()
.filter(sply -> !existingCustomerMap.containsKey(sply.getSplycode()))
.map(sply -> convertToCustomer(sply, null, now))
.collect(Collectors.toList());
List<OemCustomer> toUpdate = splyList.stream()
.filter(sply -> existingCustomerMap.containsKey(sply.getSplycode()))
.map(sply -> convertToCustomer(sply, existingCustomerMap.get(sply.getSplycode()), now))
.collect(Collectors.toList());
if (!toInsert.isEmpty()) {
saveBatch(toInsert);
}
if (!toUpdate.isEmpty()) {
updateBatchById(toUpdate);
}
log.info("外协厂家管理数据同步完成 - 新增: {}, 更新: {}", toInsert.size(), toUpdate.size());
return R.success(String.format("同步成功 - 新增: %d, 更新: %d", toInsert.size(), toUpdate.size()));
} catch (Exception e) {
log.error("同步外协厂家管理数据失败", e);
return R.fail("同步失败: " + e.getMessage());
}
}
private OemCustomer convertToCustomer(MesRbSply sply, OemCustomer existing, Date updateTime) {
OemCustomer customer = BeanUtil.isNotEmpty(existing) ? existing : new OemCustomer();
customer.setOcCode(sply.getSplycode());
customer.setOcName(sply.getSplyname());
customer.setAbbreviation(sply.getSplyname());
customer.setRegion(sply.getProvince());
customer.setAddress(sply.getSplyadd());
customer.setQualification(sply.getProducttype());
customer.setContactMan(sply.getLinkman());
customer.setEmail(sply.getEmail());
customer.setContactPhone(sply.getCtactqumd());
customer.setUpdateTime(updateTime);
// 存储过程在INSERT时会设置cur_status,但UPDATE时不更新cur_status ???
// if (sply.getSplystat() != null) {
// customer.setCurStatus(sply.getSplystat());
// }
if (existing == null) {
customer.setIsDeleted(0);
if (sply.getSplystat() != null) {
customer.setCurStatus(sply.getSplystat());
}
}
log.info("外协厂家管理数据同步完成");
return R.success("同步成功");
return customer;
}
}

@ -0,0 +1,32 @@
package org.springblade.erpdata.feign;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.erpdata.pojo.dto.view.MesRbSply;
import org.springblade.erpdata.service.IErpMesRbSplyService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
*
*
* @author BladeX
* @since 2026-04-29
*/
@NonDS
@Hidden
@RestController
@AllArgsConstructor
public class ErpMesRbSplyClientImpl implements IErpMesRbSplyClient {
private final IErpMesRbSplyService erpMesRbSplyService;
@Override
@GetMapping(GET_SPLY_LIST)
public List<MesRbSply> getSplyList() {
return erpMesRbSplyService.getSplyListFromErp();
}
}

@ -0,0 +1,23 @@
package org.springblade.erpdata.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.springblade.erpdata.pojo.dto.view.MesRbSply;
import java.util.List;
/**
* ERP供应商数据Mapper接口
*
* @author BladeX
* @since 2026-04-29
*/
@Mapper
public interface ErpMesRbSplyMapper {
/**
* 从ERP视图 V_MES_RB_SPLY 获取所有供应商数据
*
* @return 供应商列表
*/
List<MesRbSply> getSplyListFromErp();
}

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.erpdata.mapper.ErpMesRbSplyMapper">
<!-- 从ERP视图获取供应商数据 -->
<select id="getSplyListFromErp" resultType="org.springblade.erpdata.pojo.dto.view.MesRbSply">
SELECT
splycode,
splyname,
province,
splyadd,
producttype,
splystat,
linkman,
email,
ctactqumd
FROM dba_mgr.V_MES_RB_SPLY@erp_mes_link
</select>
</mapper>

@ -0,0 +1,21 @@
package org.springblade.erpdata.service;
import org.springblade.erpdata.pojo.dto.view.MesRbSply;
import java.util.List;
/**
* ERP供应商数据服务接口
*
* @author BladeX
* @since 2026-04-29
*/
public interface IErpMesRbSplyService {
/**
* 从ERP视图获取所有供应商数据
*
* @return 供应商列表
*/
List<MesRbSply> getSplyListFromErp();
}

@ -0,0 +1,34 @@
package org.springblade.erpdata.service.impl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.erpdata.mapper.ErpMesRbSplyMapper;
import org.springblade.erpdata.pojo.dto.view.MesRbSply;
import org.springblade.erpdata.service.IErpMesRbSplyService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* ERP供应商数据服务实现类
*
* @author BladeX
* @since 2026-04-29
*/
@NonDS
@Slf4j
@Service
@AllArgsConstructor
public class ErpMesRbSplyServiceImpl implements IErpMesRbSplyService {
private final ErpMesRbSplyMapper erpMesRbSplyMapper;
@Override
public List<MesRbSply> getSplyListFromErp() {
log.info("开始从ERP视图 V_MES_RB_SPLY 获取供应商数据");
List<MesRbSply> splyList = erpMesRbSplyMapper.getSplyListFromErp();
log.info("从ERP获取到 {} 条供应商数据", splyList != null ? splyList.size() : 0);
return splyList;
}
}
Loading…
Cancel
Save