From cf8f3dbda44dd79098247cdba68a5224def7fb75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Sat, 25 Apr 2026 10:13:27 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A4=96=E5=8D=8F=E5=8E=82=E5=AE=B6?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=95=B0=E6=8D=AE=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oem/OemCustomerSyncProcessor.java | 53 ++++++++ .../basic/feign/IOemCustomerTaskClient.java | 27 ++++ .../desk/basic/pojo/entity/OemCustomer.java | 127 ++++++++++++++++++ .../controller/OemCustomerController.java | 54 ++++++++ .../feign/OemCustomerTaskClientImpl.java | 22 +++ .../desk/basic/mapper/OemCustomerMapper.java | 21 +++ .../desk/basic/mapper/OemCustomerMapper.xml | 79 +++++++++++ .../basic/service/IOemCustomerService.java | 22 +++ .../service/impl/OemCustomerServiceImpl.java | 35 +++++ 9 files changed, 440 insertions(+) create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/oem/OemCustomerSyncProcessor.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/feign/IOemCustomerTaskClient.java create mode 100644 blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/OemCustomer.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemCustomerController.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/OemCustomerTaskClientImpl.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCustomerService.java create mode 100644 blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/oem/OemCustomerSyncProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/oem/OemCustomerSyncProcessor.java new file mode 100644 index 00000000..12c82ccd --- /dev/null +++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/oem/OemCustomerSyncProcessor.java @@ -0,0 +1,53 @@ +package org.springblade.job.processor.oem; + +import jakarta.annotation.Resource; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springblade.desk.basic.feign.IOemCustomerTaskClient; +import org.springframework.stereotype.Component; +import tech.powerjob.worker.core.processor.ProcessResult; +import tech.powerjob.worker.core.processor.TaskContext; +import tech.powerjob.worker.core.processor.sdk.BasicProcessor; + +import java.util.concurrent.CompletableFuture; + +/** + * OEM客户数据同步定时任务 + * 定期从ERP系统同步客户/供应商数据到本地 + * + * @author BladeX + * @since 2026-04-24 + */ +@Component +@Data +@Slf4j +public class OemCustomerSyncProcessor implements BasicProcessor { + + @Resource + private IOemCustomerTaskClient oemCustomerTaskClient; + + @Override + public ProcessResult process(TaskContext context) throws Exception { + log.info("========== 开始执行外协厂家管理数据同步定时任务 =========="); + log.info("任务参数: {}", context.getJobParams()); + + CompletableFuture runFuture = CompletableFuture.runAsync(() -> { + try { + oemCustomerTaskClient.syncCustomerFromErp(); + log.info("外协厂家管理数据同步成功"); + } catch (Exception e) { + log.error("外协厂家管理数据同步异常", e); + } + }); + + runFuture.whenComplete((result, exception) -> { + if (exception != null) { + log.error("========== 外协厂家管理数据同步定时任务执行失败 ==========", exception); + } else { + log.info("========== 外协厂家管理数据同步定时任务执行完毕 =========="); + } + }); + + return new ProcessResult(true); + } +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/feign/IOemCustomerTaskClient.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/feign/IOemCustomerTaskClient.java new file mode 100644 index 00000000..fac4d5ec --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/feign/IOemCustomerTaskClient.java @@ -0,0 +1,27 @@ +package org.springblade.desk.basic.feign; + +import org.springblade.core.launch.constant.AppConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * OEM客户数据同步Feign客户端 + */ +@FeignClient( + value = AppConstant.APPLICATION_DESK_NAME +) +public interface IOemCustomerTaskClient { + + String API_PREFIX = "/feign/client/oem-customer"; + + /** + * 同步外协厂家管理数据 + */ + String SYNC_CUSTOMER_FROM_ERP = API_PREFIX + "/sync-customer-from-erp"; + + /** + * 同步外协厂家管理数据到本地 + */ + @GetMapping(SYNC_CUSTOMER_FROM_ERP) + void syncCustomerFromErp(); +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/OemCustomer.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/OemCustomer.java new file mode 100644 index 00000000..5ec4dc0c --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/basic/pojo/entity/OemCustomer.java @@ -0,0 +1,127 @@ +package org.springblade.desk.basic.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; + +/** + * [外协厂家-客户] 实体类 + * 对应表: BS_OEM_CUSTOMER + * + * @author BladeX + * @since 2026-04-24 + */ +@Data +@TableName("BS_OEM_CUSTOMER") +@Schema(description = "OemCustomer Entity对象") +@EqualsAndHashCode(callSuper = true) +public class OemCustomer extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 编码 + */ + public static final String COL_OC_CODE = "OC_CODE"; + /** + * 名称 + */ + public static final String COL_OC_NAME = "OC_NAME"; + /** + * 简称 + */ + public static final String COL_ABBREVIATION = "ABBREVIATION"; + /** + * 地区 + */ + public static final String COL_REGION = "REGION"; + /** + * 地址 + */ + public static final String COL_ADDRESS = "ADDRESS"; + /** + * 资质 + */ + public static final String COL_QUALIFICATION = "QUALIFICATION"; + /** + * 当前状态 + */ + public static final String COL_CUR_STATUS = "CUR_STATUS"; + /** + * 联系人 + */ + public static final String COL_CONTACT_MAN = "CONTACT_MAN"; + /** + * 邮箱 + */ + public static final String COL_EMAIL = "EMAIL"; + /** + * 联系电话 + */ + public static final String COL_CONTACT_PHONE = "CONTACT_PHONE"; + + /** + * 编码 + */ + @Schema(description = "编码") + private String ocCode; + + /** + * 名称 + */ + @Schema(description = "名称") + private String ocName; + + /** + * 简称 + */ + @Schema(description = "简称") + private String abbreviation; + + /** + * 地区 + */ + @Schema(description = "地区") + private String region; + + /** + * 地址 + */ + @Schema(description = "地址") + private String address; + + /** + * 资质 + */ + @Schema(description = "资质") + private String qualification; + + /** + * 当前状态 + */ + @Schema(description = "当前状态") + private Integer curStatus; + + /** + * 联系人 + */ + @Schema(description = "联系人") + private String contactMan; + + /** + * 邮箱 + */ + @Schema(description = "邮箱") + private String email; + + /** + * 联系电话 + */ + @Schema(description = "联系电话") + private String contactPhone; +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemCustomerController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemCustomerController.java new file mode 100644 index 00000000..5a98747e --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemCustomerController.java @@ -0,0 +1,54 @@ +package org.springblade.desk.basic.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.log.annotation.ApiLog; +import org.springblade.core.tool.api.R; +import org.springblade.desk.basic.constant.BAModuleConst; +import org.springblade.desk.basic.service.IOemCustomerService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * [外协厂家-客户] 控制器 + * + * @author BladeX + * @since 2026-04-24 + */ +@RestController +@RequestMapping(BAModuleConst.CONTROLLER_PREFIX + "/OemCustomer") +@Data +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Slf4j +@Tag(name = "[BA][外协厂家-客户]", description = "[外协厂家-客户]接口") +public class OemCustomerController extends BladeController { + + @Resource + private IOemCustomerService oemCustomerService; + + /** + * 同步外协厂家管理数据 + */ + @PostMapping("/syncFromErp") + @ApiOperationSupport(order = 1) + @Operation(summary = "同步数据", description = "同步外协厂家管理数据到本地") + @ApiLog("同步外协厂家数据") + public R syncFromErp() { + try { + log.info("手动触发同步外协厂家数据"); + return oemCustomerService.syncCustomerFromErp(); + } catch (Exception e) { + log.error("同步外协厂家数据失败: {}", e.getMessage(), e); + return R.fail("同步失败: " + e.getMessage()); + } + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/OemCustomerTaskClientImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/OemCustomerTaskClientImpl.java new file mode 100644 index 00000000..be367ab7 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/OemCustomerTaskClientImpl.java @@ -0,0 +1,22 @@ +package org.springblade.desk.basic.feign; + +import io.swagger.v3.oas.annotations.Hidden; +import jakarta.annotation.Resource; +import org.springblade.desk.basic.service.IOemCustomerService; +import org.springframework.web.bind.annotation.RestController; + +/** + * OEM客户数据同步Feign客户端实现 + */ +@RestController +@Hidden +public class OemCustomerTaskClientImpl implements IOemCustomerTaskClient { + + @Resource + private IOemCustomerService oemCustomerService; + + @Override + public void syncCustomerFromErp() { + oemCustomerService.syncCustomerFromErp(); + } +} 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 new file mode 100644 index 00000000..5113f703 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java @@ -0,0 +1,21 @@ +package org.springblade.desk.basic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springblade.desk.basic.pojo.entity.OemCustomer; + +/** + * [外协厂家-客户] Mapper 接口 + * + * @author BladeX + * @since 2026-04-24 + */ +@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 new file mode 100644 index 00000000..3c4df2cd --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + 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/IOemCustomerService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCustomerService.java new file mode 100644 index 00000000..c56d3b81 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IOemCustomerService.java @@ -0,0 +1,22 @@ +package org.springblade.desk.basic.service; + +import org.springblade.core.mp.base.BaseService; +import org.springblade.core.tool.api.R; +import org.springblade.desk.basic.pojo.entity.OemCustomer; + +/** + * [外协厂家-客户] 服务类 + * + * @author BladeX + * @since 2026-04-24 + */ +public interface IOemCustomerService extends BaseService { + + /** + * 同步外协厂家管理数据 + * 从ERP系统同步供应商/客户数据到本地数据库 + * + * @return 同步结果 + */ + R syncCustomerFromErp(); +} 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 new file mode 100644 index 00000000..8dddbc28 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java @@ -0,0 +1,35 @@ +package org.springblade.desk.basic.service.impl; + +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.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * [外协厂家-客户] 服务实现类 + * + * @author BladeX + * @since 2026-04-24 + */ +@Slf4j +@Service +public class OemCustomerServiceImpl extends BaseServiceImpl implements IOemCustomerService { + + /** + * 从ERP系统同步供应商/客户数据到本地数据库 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R syncCustomerFromErp() { + log.info("开始同步外协厂家管理数据..."); + + baseMapper.syncCustomerFromErp(); + + log.info("外协厂家管理数据同步完成"); + return R.success("同步成功"); + } +} From 05b4a69972667557d27579a3ed69b5eb7347717b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=B9=BE=E7=BF=94?= Date: Sat, 25 Apr 2026 10:13:50 +0800 Subject: [PATCH 2/3] =?UTF-8?q?PDA=E5=AE=89=E5=85=A8=E5=B7=A1=E6=A3=80?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=8F=90=E4=BA=A4=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PdaSaveServiceImpl.java | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java index 53f6645e..73dd228d 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PdaSaveServiceImpl.java @@ -894,38 +894,47 @@ public class PdaSaveServiceImpl extends BaseServiceImpl 1h,状态为【未准时完成】; + * 再遍历该巡检点的【待检】任务,更新为【缺卡】状态 + * */ + + // 最近一次生成的任务 + spiList.sort((a, b) -> b.getLaunchTime().compareTo(a.getLaunchTime())); + BsSafePatrolInspectionEntity latestTask = spiList.get(0); + + // 计算最新任务的时间差(毫秒) + long timeDiff = date.getTime() - latestTask.getLaunchTime().getTime(); + + // 处理所有任务 for (BsSafePatrolInspectionEntity safePatrolInspection : spiList) { - // 不超过一个小时算正常检验 - if (new Date().getTime() - safePatrolInspection.getLaunchTime().getTime() <= 60 * 60 * 1000) { - safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.CHECKED.toString()); - } else { - // 超过一个小时但是下个任务并没有触发 - int hours = safePatrolInspection.getLaunchTime().getHours(); - int hours1 = new Date().getHours(); - if (hours == 0 && hours1 < 2) { - safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.NOT_ON_TIME.toString()); - } else if (hours == 2 && hours1 < 5) { - safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.NOT_ON_TIME.toString()); - } else if (hours == 5 && hours1 < 7) { - safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.NOT_ON_TIME.toString()); - } else if (hours == 7 && hours1 < 8) { - safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.NOT_ON_TIME.toString()); + if (safePatrolInspection.getId().equals(latestTask.getId())) { + // 最近一次生成的任务:1小时内(含)算已检,超过1小时算未准时完成 + if (timeDiff <= 60 * 60 * 1000) { + safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.CHECKED.toString()); } else { - // 超过一个小时但是下个任务已触发 - safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.NO_CHECK.toString()); + safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.NOT_ON_TIME.toString()); } - + } else { + // 其他任务都改为缺卡 + safePatrolInspection.setTaskStatus(BsSafePatrolInspectionEntity.NO_CHECK.toString()); } + safePatrolInspection.setTestTime(date); safePatrolInspection.setInsMan(user.getUserName()); safePatrolInspection.setParMemo(memo); safePatrolInspection.setPath(pathStr); // // TODO: 区别旧mes 显示修改 inspectionService.updateById(safePatrolInspection);bsSafeInspectionPointService.updateById(safeInspectionPoint); inspectionService.updateById(safePatrolInspection); + BsSafeInspectionPointEntity safeInspectionPoint = bsSafeInspectionPointService.getByKey(safePatrolInspection.getIpId()); safeInspectionPoint.setLastInsCycle(date); bsSafeInspectionPointService.updateById(safeInspectionPoint); From 45f6fdf3214090d7aa905e3a5070b88a6d058bc7 Mon Sep 17 00:00:00 2001 From: liweidong-hj Date: Sat, 25 Apr 2026 10:39:13 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/springblade/desk/dashboard/mapper/TaskingMapper.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml index 1ddd8d6d..66b00250 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/mapper/TaskingMapper.xml @@ -125,10 +125,7 @@ and REWORK_ORDER = #{reworkOrder}