From 0a639781dc0f9d471291db1f243da08ac435876b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Wed, 29 Apr 2026 16:02:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5ERP=E4=BE=9B=E5=BA=94?= =?UTF-8?q?=E5=95=86=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erpdata/feign/IErpMesRbSplyClient.java | 31 +++++++ .../erpdata/pojo/dto/view/MesRbSply.java | 58 ++++++++++++ .../desk/basic/mapper/OemCustomerMapper.java | 5 - .../desk/basic/mapper/OemCustomerMapper.xml | 58 ------------ .../service/impl/OemCustomerServiceImpl.java | 93 ++++++++++++++++++- .../erpdata/feign/ErpMesRbSplyClientImpl.java | 32 +++++++ .../erpdata/mapper/ErpMesRbSplyMapper.java | 23 +++++ .../erpdata/mapper/ErpMesRbSplyMapper.xml | 20 ++++ .../erpdata/service/IErpMesRbSplyService.java | 21 +++++ .../service/impl/ErpMesRbSplyServiceImpl.java | 34 +++++++ 10 files changed, 309 insertions(+), 66 deletions(-) create mode 100644 blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbSplyClient.java create mode 100644 blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/view/MesRbSply.java create mode 100644 blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbSplyClientImpl.java create mode 100644 blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.java create mode 100644 blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.xml create mode 100644 blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbSplyService.java create mode 100644 blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbSplyServiceImpl.java diff --git a/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbSplyClient.java b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbSplyClient.java new file mode 100644 index 00000000..5cd7fc2c --- /dev/null +++ b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbSplyClient.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 getSplyList(); +} diff --git a/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/view/MesRbSply.java b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/view/MesRbSply.java new file mode 100644 index 00000000..6f2ca1fa --- /dev/null +++ b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/view/MesRbSply.java @@ -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; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java index 5113f703..a47940e6 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java @@ -13,9 +13,4 @@ import org.springblade.desk.basic.pojo.entity.OemCustomer; @Mapper public interface OemCustomerMapper extends BaseMapper { - /** - * 同步ERP外协厂家管理数据到本地 - * 从 ERP 数据库视图 V_MES_RB_SPLY 同步数据到 BS_OEM_CUSTOMER 表 - */ - void syncCustomerFromErp(); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml index 3c4df2cd..7e5ff03e 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml @@ -18,62 +18,4 @@ - - - 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 - ) - - diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java index 8dddbc28..a7183481 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java @@ -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 implements IOemCustomerService { + @Resource + IErpMesRbSplyClient erpMesRbSplyClient; /** * 从ERP系统同步供应商/客户数据到本地数据库 */ @@ -27,9 +42,81 @@ public class OemCustomerServiceImpl extends BaseServiceImpl splyList = erpMesRbSplyClient.getSplyList(); + if (CollUtil.isEmpty(splyList)) { + return R.fail("没有获取到供应商数据"); + } + + log.info("从ERP获取到 {} 条供应商数据", splyList.size()); + + List ocCodes = splyList.stream() + .map(MesRbSply::getSplycode) + .filter(code -> code != null && !code.isEmpty()) + .collect(Collectors.toList()); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(OemCustomer::getOcCode, ocCodes); + Map existingCustomerMap = list(Wrappers.lambdaQuery(OemCustomer.class) + .in(OemCustomer::getOcCode, ocCodes)) + .stream() + .collect(Collectors.toMap(OemCustomer::getOcCode, Function.identity())); + + // 新增和更新 + Date now = new Date(); + List toInsert = splyList.stream() + .filter(sply -> !existingCustomerMap.containsKey(sply.getSplycode())) + .map(sply -> convertToCustomer(sply, null, now)) + .collect(Collectors.toList()); + + List 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; } } diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbSplyClientImpl.java b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbSplyClientImpl.java new file mode 100644 index 00000000..b5723676 --- /dev/null +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbSplyClientImpl.java @@ -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 getSplyList() { + return erpMesRbSplyService.getSplyListFromErp(); + } +} diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.java b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.java new file mode 100644 index 00000000..29ab283c --- /dev/null +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.java @@ -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 getSplyListFromErp(); +} diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.xml b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.xml new file mode 100644 index 00000000..f2441a89 --- /dev/null +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbSplyService.java b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbSplyService.java new file mode 100644 index 00000000..f41247e3 --- /dev/null +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbSplyService.java @@ -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 getSplyListFromErp(); +} diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbSplyServiceImpl.java b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbSplyServiceImpl.java new file mode 100644 index 00000000..b10f7700 --- /dev/null +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbSplyServiceImpl.java @@ -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 getSplyListFromErp() { + log.info("开始从ERP视图 V_MES_RB_SPLY 获取供应商数据"); + List splyList = erpMesRbSplyMapper.getSplyListFromErp(); + log.info("从ERP获取到 {} 条供应商数据", splyList != null ? splyList.size() : 0); + return splyList; + } +}