diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/PlateAround.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/PlateAround.java index fdb9a5b7..65f491da 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/PlateAround.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/PlateAround.java @@ -1,5 +1,6 @@ package org.springblade.desk.produce.pojo.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -74,4 +75,12 @@ public class PlateAround extends BaseEntity { @Schema(description = "状态") private Short curStatus = 1; + @TableField(exist = false) + @Schema(description = "0-转工 1-入库") + private Integer hrTypeBool; + + @TableField(exist = false) + @Schema(description = "移交部门") + private String useDept; + } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java index ecbe5de1..217cb231 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/produce/pojo/entity/WorkOrder.java @@ -1,5 +1,6 @@ package org.springblade.desk.produce.pojo.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -424,5 +425,16 @@ public class WorkOrder extends BaseEntity { @Schema(description = "零件号") private String partCode; + /** + * 移交部门 + */ + @TableField(exist = false) + private String useDept; + + /** + * 移交类型:0-转工 1-入库 + */ + @TableField(exist = false) + private Integer hrTypeBool; } diff --git a/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClient.java b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClient.java index 43c3b31c..fc2578c7 100644 --- a/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClient.java +++ b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClient.java @@ -30,6 +30,8 @@ public interface IErpDataProduceClient { String PRODUCT_APP_AREA = API_PREFIX + "/productAppArea"; String VERSION = API_PREFIX + "/version"; String CUSTODIAN = API_PREFIX + "/getCustodian"; + String CHK_SJJD = API_PREFIX + "/chkSjjd"; + String CHK_SHJH = API_PREFIX + "/chkShjh"; /** * 缺件申报-通过零件号获取批次号 @@ -60,4 +62,16 @@ public interface IErpDataProduceClient { */ @GetMapping(CUSTODIAN) R getCustodianByRecDept(@RequestParam("partCode") String partCode, @RequestParam("recDept") String recDept); + + /** + * 验证是订单是否通过首件鉴定 + */ + @GetMapping(CHK_SJJD) + R chkSjjd(@RequestParam("ypCode")String ypCode, @RequestParam("batchNo")String batchNo); + + /** + * 验证是订单是否通过首件审核 + */ + @GetMapping(CHK_SHJH) + R chkShjh(@RequestParam("woCode")String woCode, @RequestParam("ypCode")String ypCode, @RequestParam("partCode")String partCode, @RequestParam("productIdent")String productIdent, @RequestParam("makeQty")Double makeQty, @RequestParam("memo")String memo); } diff --git a/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClientFallback.java b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClientFallback.java index fb472640..9be84656 100644 --- a/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClientFallback.java +++ b/blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataProduceClientFallback.java @@ -42,4 +42,14 @@ public class IErpDataProduceClientFallback implements IErpDataProduceClient { public R getCustodianByRecDept(String partCode, String recDept) { return R.fail("获取数据失败"); } + + @Override + public R chkSjjd(String ypCode, String batchNo) { + return R.fail("获取数据失败"); + } + + @Override + public R chkShjh(String woCode, String ypCode, String partCode, String productIdent, Double makeQty, String memo) { + return R.fail("获取数据失败"); + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PlateAroundController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PlateAroundController.java index a809b841..ea87a793 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PlateAroundController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PlateAroundController.java @@ -98,44 +98,53 @@ public class PlateAroundController extends BladeController { return R.data(plateAroundService.getAfterPlatInCardNo(cardNo, tsIds)); } - @PostMapping(value = "/savePlateAround") - @ApiOperationSupport(order = 5) - @Operation(summary = "镀前镀后保存", description = "") - public R savePlateAround(@RequestBody SavePlateAroundDto plateAroundDto) { - return R.data(plateAroundService.savePlateAround(plateAroundDto)); - } - @PostMapping(value = "/deleteById") - @ApiOperationSupport(order = 6) + @ApiOperationSupport(order = 5) @Operation(summary = "删除镀后入库", description = "") public R deleteById(@RequestParam Long id) { return R.data(plateAroundService.deletePlateAround(id)); } @GetMapping("/queryDelLogRecord") - @ApiOperationSupport(order = 7) + @ApiOperationSupport(order = 6) @Operation(summary = "加载镀后入库记录", description = "传入cardNo") public R queryDelLogRecord(PlateAroundDto plateAroundDto, Query query) { return R.data(plateAroundService.queryDelLogRecord(Condition.getPage(query), plateAroundDto)); } @PostMapping(value = "/savePlateFrontEnter") - @ApiOperationSupport(order = 8) + @ApiOperationSupport(order = 7) @Operation(summary = "保存镀前入库", description = "") public R savePlateFrontEnter(@RequestBody List plateArounds) { plateAroundService.savePlateFrontEnter(plateArounds, PlateAround.BEFORE_PLAT_IN); return R.success(); } - @PostMapping(value = "/getByPartCode") + @PostMapping(value = "/savePlateFrontIssue") + @ApiOperationSupport(order = 8) + @Operation(summary = "保存镀前出库", description = "") + public R savePlateFrontIssue(@RequestBody List plateArounds) { + plateAroundService.savePlateFrontEnter(plateArounds, PlateAround.BEFORE_PLAN_OUT); + return R.success(); + } + + @PostMapping(value = "/savePlateAfterEnter") @ApiOperationSupport(order = 9) + @Operation(summary = "保存镀后入库", description = "") + public R savePlateAfterEnter(@RequestBody List plateArounds) { + plateAroundService.savePlateFrontEnter(plateArounds, PlateAround.AFTER_PLAN_IN); + return R.success(); + } + + @PostMapping(value = "/getByPartCode") + @ApiOperationSupport(order = 101) @Operation(summary = "获取零件信息", description = "") public R getByPartCode(@RequestParam String partCode) { return R.data(plateAroundService.getByPartCode(partCode)); } @GetMapping("/queryNewRecord") - @ApiOperationSupport(order = 10) + @ApiOperationSupport(order = 11) @Operation(summary = "入库单列表", description = "") public R> queryNewRecord(HandoverRecord handoverRecord, Query query) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(handoverRecord); @@ -148,7 +157,7 @@ public class PlateAroundController extends BladeController { } @PostMapping(value = "/handoverRecordPrint") - @ApiOperationSupport(order = 11) + @ApiOperationSupport(order = 12) @Operation(summary = "入库单打印", description = "") public R> handoverRecordPrint(@RequestParam String hrIds) { return R.data(handoverRecordService.handoverRecordPrint(Func.toLongList(hrIds))); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PrMakeRecController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PrMakeRecController.java index b6f81be3..95e8288c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PrMakeRecController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/controller/PrMakeRecController.java @@ -47,7 +47,7 @@ public class PrMakeRecController extends BladeController { @Operation(summary = "报工提交") @PostMapping("/saveMakeRec") public R saveMakeRec(@RequestBody MakeRecDTO makeRecDTO) { - return R.status(makeRecService.saveMakeRec(makeRecDTO)); + return R.status(workOrderService.saveMakeRec(makeRecDTO)); } @GetMapping("/queryMakeRec") diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IHandoverRecordService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IHandoverRecordService.java index e83d6404..1398f441 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IHandoverRecordService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IHandoverRecordService.java @@ -2,6 +2,7 @@ package org.springblade.desk.produce.service; import org.springblade.core.mp.base.BaseService; import org.springblade.desk.produce.pojo.entity.HandoverRecord; +import org.springblade.desk.produce.pojo.entity.WorkOrder; import org.springblade.desk.produce.pojo.vo.PrintWarehousingVO; import java.util.List; @@ -14,4 +15,11 @@ import java.util.List; public interface IHandoverRecordService extends BaseService { List handoverRecordPrint(List longList); + + /** + * 保存移交记录 + */ + void saveHandoverRecord(List woList); + + String nextCode(String codePattern); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMakeRecService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMakeRecService.java index ce6dd4b2..ca66d16d 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMakeRecService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IMakeRecService.java @@ -22,11 +22,8 @@ public interface IMakeRecService extends BaseService { WorkPlanDto loadCurrentWp(String cardNo); - /** - * 增加工序记录 - * @param makeRecDTO - */ - boolean saveMakeRec(MakeRecDTO makeRecDTO); + + boolean chkRfpDetail(Long wpId); IPage selectMesMakeRecPage(IPage page, MesMakeRecVO mesMakeRec); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java index 77455e1a..e5a4a111 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderService.java @@ -194,4 +194,19 @@ public interface IWorkOrderService extends BaseService { void dataValidation(Long wpId); R inOemBatches(Long oldWoId, InBatchesDTO inBatchesDTO, Long userId); + + /** + *

方法名: oemHandle

+ *

方法描述: OEM处理

+ * + * @param nextWpId 下一个工序id(如果不是第一个工序,传下工序ID) + * @param type 类型:1-工序报工 2-第一个工序为外协 3-转外协审批通过 + */ + void oemHandle(Long nextWpId, int type); + + /** + * 增加工序记录 + * @param makeRecDTO + */ + boolean saveMakeRec(MakeRecDTO makeRecDTO); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/HandoverRecordServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/HandoverRecordServiceImpl.java index d4038646..1cb5e377 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/HandoverRecordServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/HandoverRecordServiceImpl.java @@ -1,33 +1,35 @@ package org.springblade.desk.produce.service.impl; +import cn.hutool.core.util.StrUtil; +import com.alibaba.nacos.common.utils.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; +import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.StringUtil; import org.springblade.desk.order.pojo.entity.YieldOrder; import org.springblade.desk.order.service.IYieldOrderService; import org.springblade.desk.produce.mapper.HandoverRecordMapper; import org.springblade.desk.produce.pojo.entity.HandoverRecord; import org.springblade.desk.produce.pojo.entity.WorkOrder; +import org.springblade.desk.produce.pojo.entity.WorkOrderRun; import org.springblade.desk.produce.pojo.vo.PrintWarehousingVO; import org.springblade.desk.produce.service.IHandoverRecordService; +import org.springblade.desk.produce.service.IWorkOrderRunService; import org.springblade.desk.produce.service.IWorkOrderService; import org.springblade.desk.produce.service.IWorkPlanService; import org.springblade.erpdata.feign.IErpDataProduceClient; import org.springblade.system.cache.UserCache; -import org.springblade.system.feign.IUserClient; import org.springblade.system.pojo.entity.User; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 移交记录 服务实现类 @@ -48,6 +50,8 @@ public class HandoverRecordServiceImpl extends BaseServiceImpl handoverRecordPrint(List longList) { @@ -127,6 +131,97 @@ public class HandoverRecordServiceImpl extends BaseServiceImpl woList) { + if (CollectionUtils.isEmpty(woList)) { + return; + } + YieldOrder yo; + HandoverRecord hr; + String woCode; + String excflag = "1"; + String shjhflag = "1"; + // 获取当前时间YYMM格式字符串 + String now = DateFormatUtils.format(new Date(), "yyMM"); + List yieldOrders = yieldOrderService.list(Wrappers.lambdaQuery(YieldOrder.class).in(YieldOrder::getId, woList.stream().map(WorkOrder::getYoId).distinct().collect(Collectors.toList()))); + // yieldOrders转map + Map yieldOrderMap = yieldOrders.stream().collect(Collectors.toMap(YieldOrder::getId, v -> v)); + for (WorkOrder workOrder : woList) { + yo = yieldOrderMap.get(workOrder.getYoId()); + hr = new HandoverRecord(); + + hr.setHandoverUnit("3400"); + hr.setProdIdent(yo.getProductIdent()); + hr.setPartCode(yo.getPartCode()); + hr.setWoId(workOrder.getId()); + + woCode = workOrder.getWoCode(); + if ("1".equals(workOrder.getOem())) { + WorkOrderRun workOrderRun = workOrderRunService.getById(workOrder.getWorId()); + if (workOrderRun != null) { + woCode = workOrderRun.getWoCode(); + hr.setDeliverKey(workOrderRun.getDeliverKey()); + } + } + + hr.setHrType(workOrder.getHrTypeBool() == 1 ? HandoverRecord.HR_TYPE_TRANSFER : HandoverRecord.HR_TYPE_IN_WAREHOUSE); + + //如果是返工描述类则需要判定责任部门 + if (StringUtils.isNotBlank(workOrder.getReworkMemo()) && "1".equals(workOrder.getReInStore()) && workOrder.getHrTypeBool() == 1) { + hr.setRoamNo("3400"); + } else { + hr.setRoamNo(yo.getRoamNo()); + } + + String prefix = "ZG"; + if (HandoverRecord.HR_TYPE_IN_WAREHOUSE.equals(hr.getHrType())) { + // 入库单 + prefix = "RB"; + } + + String codePattern = prefix + now + AuthUtil.getUserAccount(); + + hr.setHrCode(this.nextCode(codePattern)); + hr.setWoCode(woCode); + hr.setCardNo(workOrder.getCardNo()); + hr.setBatchNo(workOrder.getBatchNo()); + hr.setHandoverQty(workOrder.getMakeQty()); + hr.setMemo(woCode); + hr.setRecDept(workOrder.getUseDept()); + + hr.setStatus(HandoverRecord.RUN_STATUS_WAIT); + excflag = erpDataProduceClient.chkSjjd(yo.getYpCode(), yo.getBatchNo()).getData(); + if ("3500".equals(yo.getUseDeptCode()) || "3502".equals(yo.getUseDeptCode()) || "3507".equals(yo.getUseDeptCode()) || "3512".equals(yo.getUseDeptCode())) { + shjhflag = erpDataProduceClient.chkShjh(woCode, yo.getYpCode(), yo.getPartCode(), yo.getProductIdent(), workOrder.getMakeQty(), woCode).getData(); + } + //zxh 20250721 首件鉴定仅限制入库单 + if ("0".equals(excflag) && hr.getHrType().equals(HandoverRecord.HR_TYPE_IN_WAREHOUSE)) { + throw new ServiceException("订单存在首件鉴定未审核,不允许入库"); + } else if ("0".equals(shjhflag) && hr.getHrType().equals(HandoverRecord.HR_TYPE_IN_WAREHOUSE)) { + throw new ServiceException("订单不满足入库制造一部送货计划校验,不允许入库"); + } else { + this.save(hr); + } + } + } + + @Override + public String nextCode(String codePattern) { + // 自增总长度 + int len = 5; + // 自增值 + int num = 0; + // 编码模式 + + // 当前模式下最大编码 + List list = this.list(Wrappers.lambdaQuery(HandoverRecord.class).eq(HandoverRecord::getHrCode, codePattern + "%").orderByDesc(HandoverRecord::getHrCode)); + if (CollectionUtils.isNotEmpty(list)) { + num = Integer.parseInt(list.get(0).getHrCode().substring(codePattern.length())); + } + num++; + return codePattern + StrUtil.padPre(String.valueOf(num), len, '0'); + } + private String getCustodianByRecDept(String partCode, String recDept) { R byPartCode = erpDataProduceClient.getCustodianByRecDept(partCode, recDept); return byPartCode.getData(); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MakeRecServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MakeRecServiceImpl.java index 038c85eb..8f71605c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MakeRecServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/MakeRecServiceImpl.java @@ -11,14 +11,11 @@ import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.desk.basic.pojo.entity.RelTeamSetUser; -import org.springblade.desk.basic.pojo.entity.UserRight; import org.springblade.desk.basic.service.IRelTeamSetUserService; -import org.springblade.desk.basic.service.IUserRightService; import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity; import org.springblade.desk.dashboard.pojo.entity.BsTeamSetEntity; import org.springblade.desk.dashboard.service.IBsProcessSetService; import org.springblade.desk.dashboard.service.IBsTeamSetService; -import org.springblade.desk.dashboard.service.IDsPartService; import org.springblade.desk.order.pojo.entity.YieldOrder; import org.springblade.desk.order.service.IYieldOrderService; import org.springblade.desk.produce.mapper.MakeRecMapper; @@ -32,7 +29,6 @@ import org.springblade.desk.produce.pojo.enums.WorkOrderEnum; import org.springblade.desk.produce.pojo.vo.MesMakeRecVO; import org.springblade.desk.produce.pojo.vo.WorkPlanLoadVO; import org.springblade.desk.produce.service.*; -import org.springblade.desk.quality.service.IAuditFileService; import org.springblade.system.cache.UserCache; import org.springblade.system.pojo.entity.User; import org.springframework.beans.BeanUtils; @@ -71,8 +67,6 @@ public class MakeRecServiceImpl extends BaseServiceImpl private final IMesEquipmentCardService mesEquipmentCardService; - private final IUserRightService userRightService; - private final IMesRbFilePreserveSlotService mesRbFilePreserveSlotService; private final IMesRbFilePreserveDetailService mesRbFilePreserveDetailService; @@ -128,132 +122,7 @@ public class MakeRecServiceImpl extends BaseServiceImpl } } - @Override - @Transactional(rollbackFor = Exception.class) - public boolean saveMakeRec(MakeRecDTO makeRecDTO) { - WorkPlan wp = workPlanMapper.selectById(makeRecDTO.getWpId()); - if (!WorkPlan.STATUS_START.equals(wp.getStatus())) { - throw new ServiceException("当前工序已报工完成!"); - } - MacToolUse mtu; - BsProcessSetEntity dsProcess = bsProcessSetService.getById(wp.getPpsId()); - WorkPlan frontWp = workPlanMapper.selectById(wp.getFrontWpId()); - BsProcessSetEntity frontProcess = null; - if (frontWp != null) { - frontProcess = bsProcessSetService.getById(wp.getFrontWpId()); - } - //如果是上挂工序,需判定是否绑定挂具 - if ("上挂".equals(dsProcess.getName())) { - mtu = macToolUseService.queryByParams(wp.getId(), 1, 0, 0); - if (mtu == null) { - throw new ServiceException("上挂工序未绑定挂具!"); - } - // 如果上序是上挂工序、并且本序是主工序,则代表本序是 需要绑定飞靶及设备的工序 或者手动维护生产追溯信息 - } else if (frontProcess != null && "上挂".equals(frontProcess.getName()) && "1".equals(wp.getCruxProcess())) { - mtu = macToolUseService.queryByParams(wp.getId(), 1, 1, 1); - if (mtu == null) { - // 验证是否维护了生产追溯信息 - List qcProduceRunList = mesQcProduceRunService.listPrByWpId(wp.getId()); - if (!(qcProduceRunList != null && !qcProduceRunList.isEmpty())) { - throw new ServiceException("此工序卡未绑定飞靶或设备!"); - } - } - } else if (dsProcess.getName().contains("镀金")) { - mtu = macToolUseService.queryByParams(wp.getId(), 0, 1, 0); - if (mtu == null) { - throw new ServiceException("此工序未绑定飞跋,请绑定飞跋!!!"); - } - //验证是否绑定设备 - mtu = macToolUseService.queryByParams(wp.getId(), 1, 1, 1); - if (mtu == null) { - List produceRunList = null; - produceRunList = mesQcProduceRunService.listPrByWpIdIndex(wp.getId(), 1, Boolean.FALSE); - if (produceRunList == null || produceRunList.isEmpty()) { - produceRunList = mesQcProduceRunService.listPrByWpIdIndex(wp.getId(), 2, Boolean.FALSE); - } - if (!(produceRunList != null && !produceRunList.isEmpty())) { - throw new ServiceException("未绑定飞跋和设备或未维护生产追溯信息!!!"); - } - } - } else if ("玻璃封接清洗".equals(dsProcess.getName()) || "玻璃封接退火".equals(dsProcess.getName()) || - "玻璃封接预氧化(箱式炉)".equals(dsProcess.getName()) || "玻璃封接预氧化(链式炉)".equals(dsProcess.getName()) || - "玻璃封接(链式炉)".equals(dsProcess.getName()) || "玻璃封接(真空炉)".equals(dsProcess.getName()) || - "玻璃封接灌胶".equals(dsProcess.getName()) || "玻璃饼压制".equals(dsProcess.getName()) || - "玻璃饼排蜡玻化".equals(dsProcess.getName()) || "玻璃饼振光".equals(dsProcess.getName()) || - "石墨模烘干".equals(dsProcess.getName()) || "石墨模焙烧".equals(dsProcess.getName()) || - "真空炉灌胶".equals(dsProcess.getName()) || "玻璃封接电镀去氧化皮".equals(dsProcess.getName()) || - "玻璃封接电化学抛光".equals(dsProcess.getName()) || "玻璃封接湿喷砂".equals(dsProcess.getName()) || - "玻璃封接电镀".equals(dsProcess.getName()) || "玻璃封接插针电镀".equals(dsProcess.getName()) || - "玻璃封接壳体电镀".equals(dsProcess.getName()) || "玻璃封接电镀下挂".equals(dsProcess.getName()) || - "烧结浸保护剂".equals(dsProcess.getName())) { - mtu = macToolUseService.queryByParams(wp.getId(), 1, 1, 1); - if (mtu == null) { - // 验证是否维护了生产追溯信息 - List qcProduceRunList = mesQcProduceRunService.listPrByWpId(wp.getId()); - if (!(qcProduceRunList != null && !qcProduceRunList.isEmpty())) { - throw new ServiceException("此工序卡未绑定飞靶或设备!"); - } - } - } - boolean aBoolean = this.chkRfpDetail(wp.getId()); - if (!aBoolean) { - throw new ServiceException("生产记录未填写完整,不允许报工!!!!"); - } - MakeRec mr = new MakeRec(); - BeanUtils.copyProperties(makeRecDTO, mr); - mr.setWorker(AuthUtil.getUserId()); - mr.setMakeTime(new Date()); - this.save(mr); - if (mr.getScrapQty() > 0) { - wp.setScrapQty(wp.getScrapQty() + mr.getScrapQty()); - WorkOrder wo = workOrderMapper.selectById(wp.getWoId()); - wo.setMakeQty(wo.getMakeQty() - mr.getScrapQty()); - workOrderMapper.updateById(wo); - } - wp.setWorkQty(wp.getWorkQty() + mr.getWorkQty()); - if (wp.getQualifiedQty().equals(wp.getScrapQty() + wp.getWorkQty())) { - wp.setStatus(WorkPlan.STATUS_WORK_OK); - } - if ("热处理".equals(dsProcess.getName())) { - wp.setPrintType((short) 1); - String code = macToolUseService.nextCode(2); - MacToolUse prMacToolUse = new MacToolUse(); - prMacToolUse.setWpId(wp.getId()); - prMacToolUse.setFinished(1); - prMacToolUse.setCreateTime(new Date()); - prMacToolUse.setCreateMan(makeRecDTO.getWorker()); - prMacToolUse.setMtnCode(code); - prMacToolUse.setMtuIndex(String.valueOf(0)); - macToolUseService.save(prMacToolUse); - String deviceCode = prMacToolUse.getEquipmentCard() != null ? prMacToolUse.getMtnCode() : ""; - log.info("修改设备绑定状态:设备编号:{},批次号:{},槽号:{},方法名:addMakeRec(),{}", deviceCode, prMacToolUse.getHangNum(), prMacToolUse.getMtnCode(), prMacToolUse.getFinished()); - - MesQcProduceRunEntity qcProduceRun = new MesQcProduceRunEntity(); - qcProduceRun.setMtnCode(code); - qcProduceRun.setWorkSlot("热处理自检"); - qcProduceRun.setInDate(DateUtil.now()); - qcProduceRun.setDataOne(makeRecDTO.getResource()); - qcProduceRun.setDataTwo(makeRecDTO.getNum()); - qcProduceRun.setDataThree(makeRecDTO.getThickness()); - qcProduceRun.setDataFour(makeRecDTO.getCode()); - qcProduceRun.setDataFive(makeRecDTO.getInspectCode()); - qcProduceRun.setDataSix(String.valueOf(makeRecDTO.getStatus())); - qcProduceRun.setDataSeven(makeRecDTO.getShape()); - mesQcProduceRunService.save(qcProduceRun); - } - workPlanMapper.updateById(wp); - // 2025-07-23 线上迁移修改 - MacToolUse macToolUse = macToolUseService.getDataByWpIdAndIndex(wp.getId(), "2"); - if (macToolUse != null && macToolUse.getRfpId() != null && macToolUse.getFinished() != 1) { - macToolUse.setFinished(1); - String deviceCode = macToolUse.getEquipmentCard() != null ? macToolUse.getMtnCode() : ""; - log.info("修改设备绑定状态:设备编号:{},批次号:{},槽号:{},方法名:addMakeRec(),{}", deviceCode, macToolUse.getHangNum(), macToolUse.getMtnCode(), macToolUse.getFinished()); - macToolUseService.updateById(macToolUse); - } - return true; - } - - private boolean chkRfpDetail(Long wpId) { + public boolean chkRfpDetail(Long wpId) { List macToolUses = macToolUseService.list(Wrappers.lambdaQuery(MacToolUse.class).isNotNull(MacToolUse::getRfpId).ne(MacToolUse::getMtuIndex, "2").eq(MacToolUse::getWpId, wpId)); if (CollectionUtils.isNotEmpty(macToolUses)) { for (MacToolUse macToolUs : macToolUses) { diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PlateAroundServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PlateAroundServiceImpl.java index 3c0d02bd..5193d8ae 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PlateAroundServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/PlateAroundServiceImpl.java @@ -19,6 +19,7 @@ import org.springblade.desk.basic.service.ITeamSetService; import org.springblade.desk.dashboard.pojo.entity.BsTeamSetEntity; import org.springblade.desk.dashboard.pojo.entity.DsPartEntity; import org.springblade.desk.dashboard.service.IDsPartService; +import org.springblade.desk.oem.service.IOemStatementService; import org.springblade.desk.order.pojo.entity.YieldOrder; import org.springblade.desk.order.service.IYieldOrderService; import org.springblade.desk.produce.mapper.PlateAroundMapper; @@ -34,6 +35,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; @@ -55,10 +57,6 @@ public class PlateAroundServiceImpl extends BaseServiceImpl queryByReadStatus(IPage page, PlateAroundDto plateAroundDto) { return page.setRecords(baseMapper.queryByReadStatus(page, plateAroundDto)); @@ -78,7 +80,12 @@ public class PlateAroundServiceImpl extends BaseServiceImpl 0) { + throw new ServiceException("此订单已存在镀前入库记录!"); + } + return beforePlatInCardNo; } @Override @@ -87,7 +94,12 @@ public class PlateAroundServiceImpl extends BaseServiceImpl 0) { + throw new ServiceException("此订单已存在镀前出库记录!"); + } + return plateAround; } @Override @@ -127,6 +139,10 @@ public class PlateAroundServiceImpl extends BaseServiceImpl 0) { + throw new ServiceException("此订单已存在镀后入库记录!"); + } return afterPlateInVO; } @@ -191,20 +207,24 @@ public class PlateAroundServiceImpl extends BaseServiceImpl woList = new ArrayList<>(list.size()); WorkOrder wo; - Date date = new Date(); + LocalDate now = LocalDate.now(); for (PlateAround plateAround : list) { this.savePlateAround(AuthUtil.getUser(), plateAround, paType, next, Boolean.FALSE); if (paType.equals(PlateAround.AFTER_PLAN_IN)) { WorkPlan prWorkPlan = workPlanMapper.selectById(plateAround.getWpId()); wo = workOrderService.getById(prWorkPlan.getWoId()); - wo.setHandoverTime(date); + wo.setUseDept(plateAround.getUseDept()); + wo.setHrTypeBool(plateAround.getHrTypeBool()); woList.add(wo); - // 计算主工序对应的金额 - //bsTeamWagesLevelService.countTeamSalary(wo.getWoId()); + // todo 计算主工序对应的金额 +// bsTeamWagesLevelService.countTeamSalary(wo.getWoId()); + // 调用外协结算 + oemStatementService.autoSettlement(wo.getWoCode(), now); } } if (paType.equals(PlateAround.AFTER_PLAN_IN)) { - // prHandoverRecordService.saveHandoverRecord(woList, AuthUtil.getUser()); + // 保存移交记录 + handoverRecordService.saveHandoverRecord(woList); } } @@ -238,136 +258,47 @@ public class PlateAroundServiceImpl extends BaseServiceImpl qcProduceRunList = qcProduceRunService.listPrByWpId(wp.getId()); + if (!(qcProduceRunList != null && !qcProduceRunList.isEmpty())) { + throw new ServiceException("此工序卡未绑定飞靶或设备!"); + } + } + } else if (dsProcess.getName().contains("镀金")) { + mtu = macToolUseService.queryByParams(wp.getId(), 0, 1, 0); + if (mtu == null) { + throw new ServiceException("此工序未绑定飞跋,请绑定飞跋!!!"); + } + //验证是否绑定设备 + mtu = macToolUseService.queryByParams(wp.getId(), 1, 1, 1); + if (mtu == null) { + List produceRunList = null; + produceRunList = qcProduceRunService.listPrByWpIdIndex(wp.getId(), 1, Boolean.FALSE); + if (produceRunList == null || produceRunList.isEmpty()) { + produceRunList = qcProduceRunService.listPrByWpIdIndex(wp.getId(), 2, Boolean.FALSE); + } + if (!(produceRunList != null && !produceRunList.isEmpty())) { + throw new ServiceException("未绑定飞跋和设备或未维护生产追溯信息!!!"); + } + } + } else if ("玻璃封接清洗".equals(dsProcess.getName()) || "玻璃封接退火".equals(dsProcess.getName()) || + "玻璃封接预氧化(箱式炉)".equals(dsProcess.getName()) || "玻璃封接预氧化(链式炉)".equals(dsProcess.getName()) || + "玻璃封接(链式炉)".equals(dsProcess.getName()) || "玻璃封接(真空炉)".equals(dsProcess.getName()) || + "玻璃封接灌胶".equals(dsProcess.getName()) || "玻璃饼压制".equals(dsProcess.getName()) || + "玻璃饼排蜡玻化".equals(dsProcess.getName()) || "玻璃饼振光".equals(dsProcess.getName()) || + "石墨模烘干".equals(dsProcess.getName()) || "石墨模焙烧".equals(dsProcess.getName()) || + "真空炉灌胶".equals(dsProcess.getName()) || "玻璃封接电镀去氧化皮".equals(dsProcess.getName()) || + "玻璃封接电化学抛光".equals(dsProcess.getName()) || "玻璃封接湿喷砂".equals(dsProcess.getName()) || + "玻璃封接电镀".equals(dsProcess.getName()) || "玻璃封接插针电镀".equals(dsProcess.getName()) || + "玻璃封接壳体电镀".equals(dsProcess.getName()) || "玻璃封接电镀下挂".equals(dsProcess.getName()) || + "烧结浸保护剂".equals(dsProcess.getName())) { + mtu = macToolUseService.queryByParams(wp.getId(), 1, 1, 1); + if (mtu == null) { + // 验证是否维护了生产追溯信息 + List qcProduceRunList = qcProduceRunService.listPrByWpId(wp.getId()); + if (!(qcProduceRunList != null && !qcProduceRunList.isEmpty())) { + throw new ServiceException("此工序卡未绑定飞靶或设备!"); + } + } + } + boolean aBoolean = makeRecService.chkRfpDetail(wp.getId()); + if (!aBoolean) { + throw new ServiceException("生产记录未填写完整,不允许报工!!!!"); + } + MakeRec mr = new MakeRec(); + BeanUtils.copyProperties(makeRecDTO, mr); + mr.setWorker(AuthUtil.getUserId()); + mr.setMakeTime(new Date()); + makeRecService.save(mr); + if (mr.getScrapQty() > 0) { + wp.setScrapQty(wp.getScrapQty() + mr.getScrapQty()); + WorkOrder wo = this.getById(wp.getWoId()); + wo.setMakeQty(wo.getMakeQty() - mr.getScrapQty()); + this.updateById(wo); + } + wp.setWorkQty(wp.getWorkQty() + mr.getWorkQty()); + if (wp.getQualifiedQty().equals(wp.getScrapQty() + wp.getWorkQty())) { + wp.setStatus(WorkPlan.STATUS_WORK_OK); + } + if ("热处理".equals(dsProcess.getName())) { + wp.setPrintType((short) 1); + String code = macToolUseService.nextCode(2); + MacToolUse prMacToolUse = new MacToolUse(); + prMacToolUse.setWpId(wp.getId()); + prMacToolUse.setFinished(1); + prMacToolUse.setCreateTime(new Date()); + prMacToolUse.setCreateMan(makeRecDTO.getWorker()); + prMacToolUse.setMtnCode(code); + prMacToolUse.setMtuIndex(String.valueOf(0)); + macToolUseService.save(prMacToolUse); + String deviceCode = prMacToolUse.getEquipmentCard() != null ? prMacToolUse.getMtnCode() : ""; + log.info("修改设备绑定状态:设备编号:{},批次号:{},槽号:{},方法名:addMakeRec(),{}", deviceCode, prMacToolUse.getHangNum(), prMacToolUse.getMtnCode(), prMacToolUse.getFinished()); + + MesQcProduceRunEntity qcProduceRun = new MesQcProduceRunEntity(); + qcProduceRun.setMtnCode(code); + qcProduceRun.setWorkSlot("热处理自检"); + qcProduceRun.setInDate(cn.hutool.core.date.DateUtil.now()); + qcProduceRun.setDataOne(makeRecDTO.getResource()); + qcProduceRun.setDataTwo(makeRecDTO.getNum()); + qcProduceRun.setDataThree(makeRecDTO.getThickness()); + qcProduceRun.setDataFour(makeRecDTO.getCode()); + qcProduceRun.setDataFive(makeRecDTO.getInspectCode()); + qcProduceRun.setDataSix(String.valueOf(makeRecDTO.getStatus())); + qcProduceRun.setDataSeven(makeRecDTO.getShape()); + qcProduceRunService.save(qcProduceRun); + } + wp.setFactEndTime(new Date()); + workPlanService.updateById(wp); + // 线上迁移修改 + MacToolUse macToolUse = macToolUseService.getDataByWpIdAndIndex(wp.getId(), "2"); + if (macToolUse != null && macToolUse.getRfpId() != null && macToolUse.getFinished() != 1) { + macToolUse.setFinished(1); + String deviceCode = macToolUse.getEquipmentCard() != null ? macToolUse.getMtnCode() : ""; + log.info("修改设备绑定状态:设备编号:{},批次号:{},槽号:{},方法名:addMakeRec(),{}", deviceCode, macToolUse.getHangNum(), macToolUse.getMtnCode(), macToolUse.getFinished()); + macToolUseService.updateById(macToolUse); + } + + // 如果下工序是外协:生成外协订单,完成本序,接收下序 + this.oemHandle(wp.getNextWpId(), 1); + return true; + } + private void workPlanEnd(WorkPlan workPlan, Date newDate, Double makeQty) { if (workPlan == null) { return; diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java index 1b7568a6..39a6fc0c 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkPlanServiceImpl.java @@ -44,8 +44,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static com.fasterxml.jackson.databind.type.LogicalType.DateTime; - /** * 车间作业计划 服务实现类 * diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataProduceClient.java b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataProduceClient.java index 0d084e8c..c49dc3a4 100644 --- a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataProduceClient.java +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataProduceClient.java @@ -56,4 +56,14 @@ public class ErpDataProduceClient implements IErpDataProduceClient { return R.data(erpDataProduceService.getCustodianByRecDept(partCode, recDept)); } + @Override + public R chkSjjd(String ypCode, String batchNo) { + return R.data(erpDataProduceService.chkSjjd(ypCode, batchNo)); + } + + @Override + public R chkShjh(String woCode, String ypCode, String partCode, String productIdent, Double makeQty, String memo) { + return R.data(erpDataProduceService.chkShjh(woCode, ypCode, partCode, productIdent, makeQty, memo)); + } + } diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataProduceService.java b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataProduceService.java index 24d7c8f6..f0e5fbf6 100644 --- a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataProduceService.java +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataProduceService.java @@ -24,4 +24,8 @@ public interface IErpDataProduceService { String getVersionByPartCode(String partCode); String getCustodianByRecDept(String partCode, String recDept); + + String chkSjjd(String ypCode, String batchNo); + + String chkShjh(String woCode, String ypCode, String partCode, String productIdent, Double makeQty, String memo); } diff --git a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataProduceServiceImpl.java b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataProduceServiceImpl.java index c7b28bbc..9483fcfc 100644 --- a/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataProduceServiceImpl.java +++ b/blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataProduceServiceImpl.java @@ -8,8 +8,14 @@ import org.springblade.erpdata.pojo.dto.ReworkProcessDTO; import org.springblade.erpdata.pojo.vo.QueryBatchVO; import org.springblade.erpdata.pojo.vo.ReworkProcessVO; import org.springblade.erpdata.service.IErpDataProduceService; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.SqlOutParameter; +import org.springframework.jdbc.core.SqlParameter; +import org.springframework.jdbc.core.simple.SimpleJdbcCall; import org.springframework.stereotype.Service; +import java.sql.Types; +import java.util.HashMap; import java.util.Map; /** @@ -21,29 +27,104 @@ import java.util.Map; @Service public class ErpDataProduceServiceImpl implements IErpDataProduceService { - private final ErpDataProduceMapper erpDataProduceMapper; - @Override - public QueryBatchVO queryBatch(String partCode) { - return erpDataProduceMapper.queryBatch(partCode); - } - - @Override - public IPage loadReworkOrder(IPage page, ReworkProcessDTO query) { - return page.setRecords(erpDataProduceMapper.loadReworkOrder(page, query)); - } - - @Override - public Map getProductAppareaByPartCode(String partCode) { - return erpDataProduceMapper.getProductAppareaByPartCode(partCode); - } - - @Override - public String getVersionByPartCode(String partCode) { - return erpDataProduceMapper.getVersionByPartCode(partCode); - } - - @Override - public String getCustodianByRecDept(String partCode, String recDept) { - return erpDataProduceMapper.getCustodianByRecDept(partCode, recDept); - } + private final ErpDataProduceMapper erpDataProduceMapper; + + private final JdbcTemplate jdbcTemplate; + + @Override + public QueryBatchVO queryBatch(String partCode) { + return erpDataProduceMapper.queryBatch(partCode); + } + + @Override + public IPage loadReworkOrder(IPage page, ReworkProcessDTO query) { + return page.setRecords(erpDataProduceMapper.loadReworkOrder(page, query)); + } + + @Override + public Map getProductAppareaByPartCode(String partCode) { + return erpDataProduceMapper.getProductAppareaByPartCode(partCode); + } + + @Override + public String getVersionByPartCode(String partCode) { + return erpDataProduceMapper.getVersionByPartCode(partCode); + } + + @Override + public String getCustodianByRecDept(String partCode, String recDept) { + return erpDataProduceMapper.getCustodianByRecDept(partCode, recDept); + } + + @Override + public String chkSjjd(String ypCode, String batchNo) { + SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate) + // 指定存储过程名(包含 DB Link) + .withProcedureName("pro_rbchksjjd") + // 建议关闭元数据访问(通过 DB Link 访问时可避免权限/性能问题) + .withoutProcedureColumnMetaDataAccess() + // 显式声明参数 + .declareParameters( + new SqlParameter("v_wono", Types.VARCHAR), // IN + new SqlParameter("v_splcode", Types.VARCHAR), // IN + new SqlOutParameter("v_excnote", Types.VARCHAR),// OUT + new SqlOutParameter("v_excflag", Types.VARCHAR) // OUT + ); + // 2. 封装输入参数 + Map inParams = new HashMap<>(); + inParams.put("v_wono", ypCode); + inParams.put("v_splcode", batchNo); + + // 3. 执行并获取结果 Map + Map resultMap = jdbcCall.execute(inParams); + + // 4. 提取输出参数 + String excflag = (String) resultMap.get("v_excflag"); + String excnote = (String) resultMap.get("v_excnote"); + return excflag; + } + + @Override + public String chkShjh(String woCode, String ypCode, String partCode, String productIdent, Double makeQty, String memo) { + // 1. 配置 SimpleJdbcCall + SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate) + // 指定存储过程名称 (包含 DB Link) + .withProcedureName("pro_inchk") + // 【关键】关闭元数据自动获取 + // 通过 DB Link 调用时,这能避免权限不足或性能问题,必须手动 declareParameters + .withoutProcedureColumnMetaDataAccess() + // 2. 显式声明所有参数 (顺序建议与存储过程定义一致) + .declareParameters( + // --- 输入参数 (IN) --- + new SqlParameter("v_sono", Types.VARCHAR), // 车间订单号 + new SqlParameter("v_wono", Types.VARCHAR), // 工作订单号 + new SqlParameter("v_prtno", Types.VARCHAR), // 零件号 + new SqlParameter("v_prtlotno", Types.VARCHAR), // 等级 + new SqlParameter("v_invysqty", Types.DOUBLE), // 维护数量 + new SqlParameter("v_prtsdept", Types.VARCHAR), // 维护车间 (固定值 "3400") + new SqlParameter("v_note", Types.VARCHAR), // 备注 + // --- 输出参数 (OUT) --- + new SqlOutParameter("v_excnote", Types.VARCHAR), // 异常信息 + new SqlOutParameter("v_excflag", Types.VARCHAR) // 异常标识 + ); + + // 3. 封装输入参数 Map + Map inParams = new HashMap<>(); + inParams.put("v_sono", woCode); + inParams.put("v_wono", ypCode); + inParams.put("v_prtno", partCode); + inParams.put("v_prtlotno", productIdent); + inParams.put("v_invysqty", makeQty); + inParams.put("v_prtsdept", "3400"); // 硬编码的固定值 + inParams.put("v_note", memo); + + // 4. 执行存储过程 + Map resultMap = jdbcCall.execute(inParams); + + // 5. 获取输出参数 (安全处理:避免 null.toString() 导致空指针异常 NPE) + String excflag = (String) resultMap.get("v_excflag"); + String excnote = (String) resultMap.get("v_excnote"); // 如需记录日志可打开 + + return excflag; + } }