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 index 12c82ccd..dd8ca920 100644 --- 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 @@ -31,23 +31,13 @@ public class OemCustomerSyncProcessor implements BasicProcessor { 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); + try { + oemCustomerTaskClient.syncCustomerFromErp(); + log.info("========== 外协厂家管理数据同步定时任务执行成功 =========="); + return new ProcessResult(true, "同步成功"); + } catch (Exception e) { + log.error("========== 外协厂家管理数据同步定时任务执行失败 ==========", e); + throw new RuntimeException("外协厂家管理数据同步定时任务执行失败 :" + e.getMessage()); + } } } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/ehs/feign/IAcidMistTowerClient.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/ehs/feign/IAcidMistTowerClient.java index e378bea3..c365f32a 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/ehs/feign/IAcidMistTowerClient.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/ehs/feign/IAcidMistTowerClient.java @@ -3,6 +3,7 @@ package org.springblade.desk.ehs.feign; import org.springblade.core.launch.constant.AppConstant; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; /** * 酸雾塔报警记录查询Feign客户端接口 @@ -16,5 +17,5 @@ public interface IAcidMistTowerClient { String RP_ACID_MIST_TOWER = API_PREFIX + "/rp-acid-mist-tower"; @GetMapping(RP_ACID_MIST_TOWER) - void rpAcidMistTower(String str); + void rpAcidMistTower(@RequestParam("str") String str); } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/entity/OemStandardProcessEntity.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/entity/OemStandardProcessEntity.java new file mode 100644 index 00000000..57117a6b --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/entity/OemStandardProcessEntity.java @@ -0,0 +1,53 @@ +package org.springblade.desk.oem.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; + +/** + * 外协标准工序代码 实体类 + * + * @author maxg + * @since 2026-04-29 + */ +@Data +@TableName("MES_OEM_STANDARD_PROCESS") +@Schema(description = "OemStandardProcess对象") +@EqualsAndHashCode(callSuper = true) +public class OemStandardProcessEntity extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 工序ID + */ + @Schema(description = "工序ID") + private Long processId; + /** + * 镀种 + */ + @Schema(description = "镀种") + private String plate; + /** + * 镀层厚度 + */ + @Schema(description = "镀层厚度") + private String plateThickness; + /** + * 零件名称 + */ + @Schema(description = "零件名称") + private String partName; + /** + * 标准工序代码 + */ + @Schema(description = "标准工序代码") + private String standardProcessCode; + + +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/excel/OemStandardProcessExcel.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/excel/OemStandardProcessExcel.java new file mode 100644 index 00000000..7c6b62d4 --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/excel/OemStandardProcessExcel.java @@ -0,0 +1,47 @@ +package org.springblade.desk.oem.pojo.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 外协标准工序代码模板导入 + * + * @author maxg + * @since 2026-04-29 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class OemStandardProcessExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ColumnWidth(20) + @ExcelProperty("工序") + private String processName; + + @ColumnWidth(20) + @ExcelProperty("镀种") + private String plate; + + @ColumnWidth(20) + @ExcelProperty("镀层厚度") + private String plateThickness; + + @ColumnWidth(20) + @ExcelProperty("零件名称") + private String partName; + + @ColumnWidth(20) + @ExcelProperty("标准工序代码") + private String standardProcessCode; +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/vo/OemStandardProcessVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/vo/OemStandardProcessVO.java new file mode 100644 index 00000000..1638eb4f --- /dev/null +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/vo/OemStandardProcessVO.java @@ -0,0 +1,38 @@ +package org.springblade.desk.oem.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.desk.oem.pojo.entity.OemStandardProcessEntity; + +import java.io.Serial; + +/** + * 外协标准工序代码 视图实体类 + * + * @author maxg + * @since 2026-04-29 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OemStandardProcessVO extends OemStandardProcessEntity { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "工序名称") + private String processName; + + @Schema(description = "维护人") + private String updateUserName; + + /** + * 排序字段 + */ + private String orderByField; + /** + * true: 升序,false: 降序 + */ + private boolean isAsc; + +} diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java index b295238e..318f08a5 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java @@ -5,12 +5,15 @@ package org.springblade.desk.quality.pojo.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; import org.springblade.core.mp.base.BaseEntity; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; +import java.util.Date; @TableName("QA_WORK_RAISE_HAND_RECORD") @@ -53,5 +56,12 @@ public class RaiseHandRecord extends BaseEntity { @TableField(exist = false) @Schema(description = "节点名称") private String pointName; - + @Schema(description = "审批时间") + @JsonFormat (pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + private Date reviewTime; + @Schema(description = "下一节点审批人ID") + private String nextUserId; + @Schema(description = "下一节点审批人名称") + private String nextUserName; } diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java index 42ab5d03..1d647cff 100644 --- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java +++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java @@ -3,6 +3,7 @@ */ package org.springblade.desk.quality.pojo.vo; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -40,4 +41,10 @@ public class RaiseHandVO extends RaiseHand { private List all = new ArrayList<>(); + @TableField(exist = false) + @Schema(description = "下一节点审批人ID") + private String nextUserId; + @TableField(exist = false) + @Schema(description = "下一节点审批人名称") + private String nextUserName; } 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/pom.xml b/blade-service/blade-desk/pom.xml index b2ec9998..1b9675c3 100644 --- a/blade-service/blade-desk/pom.xml +++ b/blade-service/blade-desk/pom.xml @@ -77,39 +77,39 @@ - - org.codehaus.groovy - groovy - 3.0.9 - + + + + + - - com.itextpdf - itext7-core - 7.1.16 - pom - - - com.lowagie - itext - 2.1.7 - - - org.springblade - blade-resource-api - + + + + + + + + + + + + + + + org.springblade blade-system-api - - org.springblade - blade-scheduling-api - + + + + @@ -145,12 +145,6 @@ com.qcloud cos_api - - - org.springblade - blade-auth - 4.6.0.RELEASE - diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BasicClazzController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BasicClazzController.java index 2eee8bb1..344a7c87 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BasicClazzController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BasicClazzController.java @@ -37,6 +37,7 @@ import org.springblade.desk.basic.pojo.entity.TeamSet; import org.springblade.desk.basic.pojo.vo.BasicClazzVO; import org.springblade.desk.basic.service.IBasicClazzService; import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.basic.util.QueryUtils; import org.springblade.desk.basic.wrapper.BasicClazzWrapper; import org.springblade.system.feign.IUserClient; import org.springblade.system.pojo.entity.User; @@ -115,6 +116,9 @@ public class BasicClazzController extends BladeController { @ApiOperationSupport(order = 21) @Operation(summary = "page分页", description = "传入BasicClazz Obj") public R> page(BasicClazzVO basicClazz, Query query) { + // 处理排序字段转换:将前端虚拟字段转换为实际数据库字段(如 MEMO -> CREATE_TIME) + QueryUtils.convertSortField(query); + IPage pagesVO = service.selectBasicClazzPage( Condition.getPage(query), basicClazz ); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BatConfigController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BatConfigController.java index 4fce8693..8fc055fe 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BatConfigController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BatConfigController.java @@ -31,6 +31,7 @@ import org.springblade.desk.basic.pojo.entity.BatConfig; import org.springblade.desk.basic.pojo.vo.BatConfigVO; import org.springblade.desk.basic.service.IBatConfigService; import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.basic.util.QueryUtils; import org.springblade.desk.basic.wrapper.BatConfigWrapper; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -99,6 +100,7 @@ public class BatConfigController extends BladeController { @ApiOperationSupport(order = 21) @Operation(summary = "page分页", description = "传入BatConfig Obj") public R> page(BatConfigVO batConfig, Query query) { + QueryUtils.convertSortField( query); IPage pagesVO = service.selectBatConfigPage( Condition.getPage(query), batConfig ); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java index c7fcc3e1..0552d3c3 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java @@ -57,6 +57,7 @@ import org.springblade.desk.basic.service.ICraftAbilityService; import org.springblade.desk.basic.service.IOemService; import org.springblade.desk.basic.service.IWorkCenterService; import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.basic.util.QueryUtils; import org.springblade.desk.basic.wrapper.BsAssignWrapper; import org.springblade.scheduling.pojo.entity.CraftAbilityEntity; import org.springblade.system.cache.DictCache; @@ -123,9 +124,7 @@ public class BsAssignController extends BladeController { @ApiOperationSupport(order = 3) @Operation(summary = "分页", description = "传入bsAssign") public R> page(BsAssignVO bsAssign, Query query) { - query.setDescs(null); - query.setAscs(null); - + QueryUtils.convertSortField(query); IPage pages = bsAssignService.selectBsAssignPage(Condition.getPage(query), bsAssign); List list = pages.getRecords(); for(BsAssignVO vo:list){ diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/CraftAbilityController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/CraftAbilityController.java index a4da8226..a25fd4cb 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/CraftAbilityController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/CraftAbilityController.java @@ -50,6 +50,7 @@ import org.springblade.desk.basic.excel.CraftAbilityExcel; import org.springblade.desk.basic.pojo.vo.CraftAbilityVO; import org.springblade.desk.basic.service.ICraftAbilityService; import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.basic.util.QueryUtils; import org.springblade.desk.basic.wrapper.CraftAbilityWrapper; import org.springblade.scheduling.pojo.entity.CraftAbilityEntity; @@ -121,10 +122,7 @@ public class CraftAbilityController extends BladeController { @ApiOperationSupport(order = 2) @Operation(summary = "分页", description = "传入CraftAbility") public R> list(@Parameter(hidden = true) @RequestParam Map craftAbility, Query query) { - craftAbility.remove("descs"); - craftAbility.remove("ascs"); - query.setDescs(null); - query.setAscs(null); + QueryUtils.convertSortField(query); Date startTime = null; Date endTime = null; diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/LocallyPlatedPartController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/LocallyPlatedPartController.java index c31a69aa..0ff38343 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/LocallyPlatedPartController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/LocallyPlatedPartController.java @@ -84,12 +84,9 @@ public class LocallyPlatedPartController extends BladeController { @Operation(summary = "list分页", description = "传入LocallyPlatedPart Obj") public R> list(@Parameter(hidden = true) @RequestParam Map locallyPlatedPart, Query query) { - locallyPlatedPart.remove("descs"); - locallyPlatedPart.remove("ascs"); - query.setDescs(null); - query.setAscs(null); + QueryWrapper qw = Condition.getQueryWrapper(locallyPlatedPart, LocallyPlatedPart.class); - qw.last("ORDER BY UPDATE_TIME DESC "); + IPage pages = service.page(Condition.getPage(query), qw); IPage pagesVO = LocallyPlatedPartWrapper.build().pageVO(pages); pagesVO.getRecords() diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemController.java index ae1e97e8..95f6b4dd 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemController.java @@ -37,6 +37,7 @@ import org.springblade.desk.basic.service.ICraftAbilityService; import org.springblade.desk.basic.service.IOemCraftAbilityService; import org.springblade.desk.basic.service.IOemService; import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.basic.util.QueryUtils; import org.springblade.desk.basic.wrapper.OemWrapper; import org.springblade.scheduling.pojo.entity.CraftAbilityEntity; import org.springblade.system.feign.IUserClient; @@ -210,6 +211,7 @@ public class OemController extends BladeController { @Operation(summary = "list分页", description = "传入Oem Obj") public R> list(@Parameter(hidden = true) @RequestParam Map map, Query query) { + QueryUtils.convertSortField(query); // build QueryWrapper QueryWrapper qw = Condition.getQueryWrapper(map, Oem.class); qw.eq(map.containsKey(Oem.COL_CODE), Oem.COL_CODE, (Func.toStr(map.get(OemSearch.COL_CODE)))); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/PlatingController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/PlatingController.java index 7c25a48b..054867d1 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/PlatingController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/PlatingController.java @@ -3,6 +3,8 @@ */ package org.springblade.desk.basic.controller; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -45,10 +47,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -97,17 +96,26 @@ public class PlatingController extends BladeController { @Operation(summary = "list分页", description = "传入Plating Obj") public R> list(@Parameter(hidden = true) @RequestParam Map plating, Query query) { - QueryWrapper qw = Condition.getQueryWrapper(plating, Plating.class); - qw.like(plating.containsKey("configNo"), Plating.COL_CONFIG_NO, Func.toStr(plating.get("configNo"))); - qw.eq(plating.containsKey("bcId"), Plating.COL_BC_ID, Func.toInt(plating.get("bcId"))); - qw.like(plating.containsKey("plating"), Plating.COL_PLATING, Func.toStr(plating.get("plating"))); + String configNo = Func.toStr(plating.getOrDefault("configNo", null)); + Object bcId = plating.getOrDefault("bcId", null); + String platingStr = Func.toStr(plating.getOrDefault("plating", null)); + plating.remove("configNo"); + plating.remove("plating"); + plating.remove("bcId"); + QueryWrapper qw = Condition.getQueryWrapper(plating,Plating.class); + qw.like(StrUtil.isNotEmpty(configNo), Plating.COL_CONFIG_NO, configNo); + qw.eq(Objects.nonNull(bcId), Plating.COL_BC_ID, Func.toLong(bcId)); + qw.like(StrUtil.isNotEmpty(platingStr), Plating.COL_PLATING, platingStr); + - qw.orderByAsc(BaseCol.ID); IPage pages = service.page(Condition.getPage(query), qw); IPage pagesVO = PlatingWrapper.build().pageVO(pages); //bcId //镀种ID , 镀种名称 Set bcIds = pagesVO.getRecords().stream().map(PlatingVO::getBcId).collect(Collectors.toSet()); + if (CollUtil.isEmpty(bcIds)){ + return R.data(pagesVO); + } Map bcIdAndName = basicClazzService .listByIds(bcIds) .stream() diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/TeamSetController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/TeamSetController.java index e3e85705..00fe6598 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/TeamSetController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/TeamSetController.java @@ -247,10 +247,10 @@ public class TeamSetController extends BladeController { @Operation(summary = "list分页", description = "传入TeamSet Obj") public R> list(@Parameter(hidden = true) @RequestParam Map map, Query query) { - map.remove("descs"); - map.remove("ascs"); - query.setDescs(null); - query.setAscs(null); + //map.remove("descs"); + //map.remove("ascs"); + //query.setDescs(null); + //query.setAscs(null); // List ids = new ArrayList<>(); // if(map.containsKey("dispatcherRealName")){ // List users = iUserClient.userListByName(Func.toStr(map.get("dispatcherRealName"))); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkCenterController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkCenterController.java index 8cf29bd3..090da012 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkCenterController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkCenterController.java @@ -33,6 +33,7 @@ import org.springblade.desk.basic.pojo.entity.WorkCenter; import org.springblade.desk.basic.pojo.vo.WorkCenterVO; import org.springblade.desk.basic.service.*; import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.basic.util.QueryUtils; import org.springblade.desk.basic.wrapper.WorkCenterWrapper; import org.springblade.scheduling.pojo.entity.CraftAbilityEntity; import org.springblade.system.feign.IUserClient; @@ -95,10 +96,10 @@ public class WorkCenterController extends BladeController { @Operation(summary = "list分页", description = "传入WorkCenter Obj") public R> list(@Parameter(hidden = true) @RequestParam Map workCenter, Query query) { - query.setDescs(null); - query.setAscs(null); - workCenter.remove("descs"); - workCenter.remove("ascs"); + //query.setDescs(null); + //query.setAscs(null); + //workCenter.remove("descs"); + //workCenter.remove("ascs"); QueryWrapper qw = Condition.getQueryWrapper(workCenter, WorkCenter.class); @@ -109,8 +110,8 @@ public class WorkCenterController extends BladeController { qw.eq(workCenter.containsKey("leaderUser"), WorkCenter.COL_LEADER_USER, Func.toLong(workCenter.get("leaderUser"))); qw.like(workCenter.containsKey("team"), WorkCenter.COL_TEAM, Func.toStr(workCenter.get("team"))); qw.like(workCenter.containsKey("teamId"), WorkCenter.COL_TEAM_ID, Func.toStr(workCenter.get("teamId"))); - - qw.last("ORDER BY UPDATE_TIME DESC "); + QueryUtils.convertSortField( query); + //qw.last("ORDER BY UPDATE_TIME DESC "); IPage pages = service.page(Condition.getPage(query), qw); IPage pagesVO = WorkCenterWrapper.build().pageVO(pages); List vos = pagesVO.getRecords(); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkTankController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkTankController.java index 827c9374..1cbd358d 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkTankController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkTankController.java @@ -37,6 +37,7 @@ import org.springblade.desk.basic.pojo.vo.WorkTankVO; import org.springblade.desk.basic.service.IWorkCenterService; import org.springblade.desk.basic.service.IWorkTankService; import org.springblade.desk.basic.util.ExcelExtUtil; +import org.springblade.desk.basic.util.QueryUtils; import org.springblade.desk.basic.wrapper.WorkTankWrapper; import org.springblade.system.feign.IUserClient; import org.springblade.system.pojo.entity.User; @@ -90,8 +91,14 @@ public class WorkTankController extends BladeController { @Operation(summary = "list分页", description = "传入WorkTank Obj") public R> list(@Parameter(hidden = true) @RequestParam Map workTank, Query query) { + // QueryWrapper qw = Condition.getQueryWrapper(workTank, WorkTank.class); - IPage pages = service.page(Condition.getPage(query), qw); + + QueryUtils.convertSortField(query); + + IPage page = Condition.getPage(query); + + IPage pages = service.page(page, qw); IPage pagesVO = WorkTankWrapper.build().pageVO(pages); List listVO = pagesVO.getRecords(); for(WorkTankVO one : listVO){ @@ -123,6 +130,9 @@ public class WorkTankController extends BladeController { @ApiOperationSupport(order = 21) @Operation(summary = "page分页", description = "传入WorkTank Obj") public R> page(WorkTankVO workTank, Query query) { + // 处理排序字段转换:将前端传来的虚拟字段转换为实际数据库字段 + convertSortField(query); + IPage pagesVO = service.selectWorkTankPage( Condition.getPage(query), workTank ); @@ -309,4 +319,60 @@ public class WorkTankController extends BladeController { }); return R.data(service.saveBatch(noticeList)); } + + /** + * 转换排序字段:将前端虚拟字段名转换为数据库实际字段名 + * 例如:OP_USER_REAL_NAME -> UPDATE_TIME + */ + private void convertSortField(Query query) { + if (query == null) { + return; + } + + // 处理降序排序字段 + if (Func.isNotEmpty(query.getDescs())) { + String descs = query.getDescs(); + descs = convertSingleSortField(descs); + query.setDescs(descs); + } + + // 处理升序排序字段 + if (Func.isNotEmpty(query.getAscs())) { + String ascs = query.getAscs(); + ascs = convertSingleSortField(ascs); + query.setAscs(ascs); + } + } + + /** + * 转换单个排序字段 + * @param sortField 排序字段字符串(可能包含多个字段,逗号分隔) + * @return 转换后的排序字段 + */ + private String convertSingleSortField(String sortField) { + if (Func.isEmpty(sortField)) { + return sortField; + } + + // 定义字段映射关系:前端字段名 -> 数据库字段名 + String[] fields = sortField.split(","); + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < fields.length; i++) { + String field = fields[i].trim(); + String convertedField = switch (field.toUpperCase()) { + case "OP_USER_REAL_NAME" -> "UPDATE_TIME"; // 操作人姓名转换为更新时间排序 + // 可以在此添加更多字段映射 + // case "OTHER_FIELD" -> "ACTUAL_COLUMN"; + default -> field; // 其他字段保持不变 + }; + + result.append(convertedField); + if (i < fields.length - 1) { + result.append(","); + } + } + + return result.toString(); + } } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/AcidMistTowerClientImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/AcidMistTowerClientImpl.java index d5d125b1..c51ec6d7 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/AcidMistTowerClientImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/AcidMistTowerClientImpl.java @@ -5,6 +5,7 @@ import jakarta.annotation.Resource; import org.springblade.desk.ehs.feign.IAcidMistTowerClient; import org.springblade.desk.energy.util.HttpRequestService; import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** @@ -21,6 +22,7 @@ public class AcidMistTowerClientImpl implements IAcidMistTowerClient { private String deviceId; @Override + @GetMapping(RP_ACID_MIST_TOWER) public void rpAcidMistTower(String str) { httpRequestService.getWasteWaterAndGas(deviceId, true, str); } 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-desk/src/main/java/org/springblade/desk/basic/util/QueryUtils.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/util/QueryUtils.java new file mode 100644 index 00000000..ccfd1ae6 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/util/QueryUtils.java @@ -0,0 +1,86 @@ +package org.springblade.desk.basic.util;/** + * @date : 2026/4/28 13:27 + */ + +import org.springblade.core.mp.support.Query; +import org.springblade.core.tool.utils.Func; +import org.springblade.desk.basic.controller.BatConfigController; + +/** + * 文件名称 + * @module 归属项目 + * @author *** + * @date 2025/11/26 10:27 + */ +public class QueryUtils { + /** + * 转换排序字段:将前端虚拟字段名转换为数据库实际字段名 + * 例如:OP_USER_REAL_NAME -> UPDATE_TIME + */ + public static void convertSortField(Query query) { + if (query == null) { + return; + } + + // 处理降序排序字段 + if (Func.isNotEmpty(query.getDescs())) { + String descs = query.getDescs(); + descs = convertSingleSortField(descs); + query.setDescs(descs); + } + + // 处理升序排序字段 + if (Func.isNotEmpty(query.getAscs())) { + String ascs = query.getAscs(); + ascs = convertSingleSortField(ascs); + query.setAscs(ascs); + } + } + + /** + * 转换单个排序字段 + * @param sortField 排序字段字符串(可能包含多个字段,逗号分隔) + * @return 转换后的排序字段 + */ + public static String convertSingleSortField(String sortField) { + if (Func.isEmpty(sortField)) { + return sortField; + } + + // 定义字段映射关系:前端字段名 -> 数据库字段名 + String[] fields = sortField.split(","); + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < fields.length; i++) { + String field = fields[i].trim(); + String convertedField = switch (field.toUpperCase()) { + // 操作人姓名转换为更新时间排序 + case "OP_USER_REAL_NAME" -> "UPDATE_USER"; + /** + * {@link org.springblade.desk.basic.controller.OemController.list} + * */ + case "CUR_STATUS_TEXT" -> "status"; + /** + * {@link BatConfigController#page(org.springblade.desk.basic.pojo.vo.BatConfigVO, org.springblade.core.mp.support.Query)} + * */ + case "UPDATE_USER_NAME" -> "UPDATE_USER"; + /** + * {@link org.springblade.desk.basic.controller.WorkCenterController#list(java.util.Map, org.springblade.core.mp.support.Query)} + * */ + case "LEADER_USER_NAME" -> "LEADER_USER"; + /** + * {@link } + * */ + case "CREATE_USER_NAME" -> "CREATE_USER"; + default -> field; + }; + + result.append(convertedField); + if (i < fields.length - 1) { + result.append(","); + } + } + + return result.toString(); + } +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/cost/mapper/CostStatisticsMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/cost/mapper/CostStatisticsMapper.xml index 6514c33b..8c358308 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/cost/mapper/CostStatisticsMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/cost/mapper/CostStatisticsMapper.xml @@ -75,6 +75,7 @@ WHERE a.is_deleted = 0 AND NOT EXISTS ( SELECT 1 FROM BS_REL_TEAM_SET_USER b WHERE b.user_id = a.user_id ) + AND a.IN_OUT_TYPE = 1 AND to_char( IN_OUT_DATE, 'yyyy-MM' ) = #{month} AND a.GOODS_ID NOT IN ( SELECT id FROM ST_GOODS WHERE GOODS_CODE IN ( SELECT GOODS_CODE FROM MES_COST_CALCULATION_GOODS ) ) @@ -180,6 +181,7 @@ WHERE a.is_deleted = 0 AND NOT EXISTS ( SELECT 1 FROM BS_REL_TEAM_SET_USER b WHERE b.user_id = a.user_id ) + AND a.IN_OUT_TYPE = 1 AND to_char( IN_OUT_DATE, 'yyyy-MM' ) = #{month} AND a.GOODS_ID NOT IN ( SELECT id FROM ST_GOODS WHERE GOODS_CODE IN ( SELECT GOODS_CODE FROM MES_COST_CALCULATION_GOODS ) ) diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EpciuPatrolInspectionMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EpciuPatrolInspectionMapper.xml index dea5924a..6a57c857 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EpciuPatrolInspectionMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EpciuPatrolInspectionMapper.xml @@ -8,9 +8,9 @@ - + - + @@ -27,7 +27,11 @@ - select * from BS_INS_TEST n + select n.ID, n.DEVICE, n.DOSING_TIME, n.DOSING_MAN, n.IT_NI, n.IT_CU, + n.IT_CR, n.IT_CN2, n.IT_PH, n.MEMO, n.CREATE_USER, n.CREATE_DEPT, + n.CREATE_TIME, n.UPDATE_USER, n.UPDATE_TIME, n.STATUS, n.IS_DELETED + from BS_INS_TEST n n.is_deleted = 0 diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/TowerReportMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/TowerReportMapper.xml index ca73b5f0..c028be95 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/TowerReportMapper.xml +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/TowerReportMapper.xml @@ -23,7 +23,10 @@ + SELECT * FROM ( + SELECT t.*, + p.NAME as PROCESS_NAME, + bu.REAL_NAME as UPDATE_USER_NAME + FROM MES_OEM_STANDARD_PROCESS t + INNER JOIN BS_PROCESS_SET p ON t.PROCESS_ID = p.ID AND p.IS_DELETED = 0 + LEFT JOIN BLADE_USER bu ON t.update_user = bu.id + + t.IS_DELETED = 0 + + AND p.NAME like concat(concat('%', #{oemStandardProcess.processName}),'%') + + + AND t.PLATE like concat(concat('%', #{oemStandardProcess.plate}),'%') + + + AND t.PLATE_THICKNESS like concat(concat('%', #{oemStandardProcess.plateThickness}),'%') + + + AND t.PART_NAME like concat(concat('%', #{oemStandardProcess.partName}),'%') + + + AND t.STANDARD_PROCESS_CODE like concat(concat('%', #{oemStandardProcess.standardProcessCode}),'%') + + + ) + + + ORDER BY ${oemStandardProcess.orderByField} + ASC + DESC + + + ORDER BY CREATE_TIME DESC + + + + + \ No newline at end of file diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/IOemStandardProcessService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/IOemStandardProcessService.java new file mode 100644 index 00000000..680d55fa --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/IOemStandardProcessService.java @@ -0,0 +1,25 @@ +package org.springblade.desk.oem.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.efficiency.pojo.vo.BsEfficiencyTaskParamVO; +import org.springblade.desk.oem.pojo.entity.OemStandardProcessEntity; +import org.springblade.desk.oem.pojo.vo.OemStandardProcessVO; + +/** + * 外协标准工序代码 服务类 + * + * @author maxg + * @since 2026-04-29 + */ +public interface IOemStandardProcessService extends BaseService { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param oemStandardProcess 查询参数 + * @return IPage + */ + IPage selectOemStandardProcessPage(IPage page, OemStandardProcessVO oemStandardProcess); +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStandardProcessServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStandardProcessServiceImpl.java new file mode 100644 index 00000000..d5774b88 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStandardProcessServiceImpl.java @@ -0,0 +1,25 @@ +package org.springblade.desk.oem.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.oem.mapper.OemStandardProcessMapper; +import org.springblade.desk.oem.pojo.entity.OemStandardProcessEntity; +import org.springblade.desk.oem.pojo.vo.OemStandardProcessVO; +import org.springblade.desk.oem.service.IOemStandardProcessService; +import org.springframework.stereotype.Service; + +/** + * 外协标准工序代码 服务实现类 + * + * @author maxg + * @since 2026-04-29 + */ +@Service +public class OemStandardProcessServiceImpl extends BaseServiceImpl implements IOemStandardProcessService { + + @Override + public IPage selectOemStandardProcessPage(IPage page, OemStandardProcessVO oemStandardProcess) { + return page.setRecords(baseMapper.selectOemStandardProcessPage(page, oemStandardProcess)); + } + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java index 6387aa40..755d6072 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java @@ -46,7 +46,6 @@ import org.springblade.desk.order.pojo.entity.YieldPlan; import org.springblade.desk.order.pojo.enums.MoldDemandEnum; import org.springblade.desk.order.pojo.enums.YieldOrderEnum; import org.springblade.desk.order.pojo.vo.LineMemoVo; -import org.springblade.desk.order.pojo.vo.YieldOrderVo; import org.springblade.desk.order.service.IPlateGoodsRecordService; import org.springblade.desk.order.service.IYieldOrderCraftService; import org.springblade.desk.order.service.IYieldOrderService; @@ -1253,7 +1252,7 @@ public class YieldOrderServiceImpl extends BaseServiceImpl list = yieldOrderCraftService.list(Wrappers.lambdaQuery().eq(YieldOrderCraft::getYoId,yieldOrder.getId())); + List list = yieldOrderCraftService.list(Wrappers.lambdaQuery().eq(YieldOrderCraft::getYoId,yieldOrder.getId()).orderByAsc(YieldOrderCraft::getProcessNo)); list.stream().forEach(craft -> { if(craft.getWorkCenterId() != null){ WorkCenter workCenter = workCenterService.getById(craft.getWorkCenterId()); diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/RaiseHandController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/RaiseHandController.java index 2e43ba69..deefa2e8 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/RaiseHandController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/RaiseHandController.java @@ -3,7 +3,9 @@ */ package org.springblade.desk.quality.controller; -import ch.qos.logback.core.joran.util.beans.BeanUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -19,6 +21,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.log.annotation.ApiLog; @@ -34,6 +37,11 @@ import org.springblade.desk.basic.constant.BaseCol; import org.springblade.desk.basic.constant.BaseRequest; import org.springblade.desk.basic.util.ExcelExtUtil; import org.springblade.desk.basic.util.RequestUtil; +import org.springblade.desk.common.constant.BizTypeConstant; +import org.springblade.desk.common.feign.IMesNotifyMessageClient; +import org.springblade.desk.common.feign.MesNotifyMessageClient; +import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; +import org.springblade.desk.energy.pojo.entity.BsTowerReportEntity; import org.springblade.desk.quality.constant.QAModuleConst; import org.springblade.desk.quality.excel.LiquidTankWaveExcel; import org.springblade.desk.quality.excel.RaiseHandExcel; @@ -55,6 +63,8 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; @@ -86,6 +96,8 @@ public class RaiseHandController extends BladeController { private IUserClient userClient; @Resource IRaiseHandRecordService recordService; + @Resource + IMesNotifyMessageClient mesNotifyMessageClient; /** @@ -268,18 +280,139 @@ public class RaiseHandController extends BladeController { } service.updateById(one); - RaiseHandRecord record = new RaiseHandRecord(); + //创建当前节点记录 + // TODO: 2026/4/28 当前节点已经存在 + RaiseHandRecord record = recordService.getOne(Wrappers.lambdaQuery(RaiseHandRecord.class) + .eq(RaiseHandRecord::getHandId, one.getId()) + .eq(RaiseHandRecord::getCurrentStatus, status) + .eq(RaiseHandRecord::getIsDeleted, 0), false); + // 如果记录不存在,创建新记录 + if (BeanUtil.isEmpty( record)) { + record = new RaiseHandRecord(); + } + Date now = new Date(); record.setHandId(one.getId()); record.setNotes(addOne.getNotes()); record.setIsSuccess(addOne.getIsSuccess()); record.setCurrentStatus(status); - record.setCreateTime(new Date()); + record.setCreateTime(now); + record.setReviewTime(now); record.setReviewUserId(AuthUtil.getUser().getUserId()); record.setReviewUserName(AuthUtil.getUser().getNickName()); - recordService.save(record); + recordService.saveOrUpdate(record); + + // 当下审批节点固定,大于 1 需要手动选择审批人 创建下一节点记录 + if (one.getStatus() > 1 && one.getStatus() < 4) { + createNextNodeRecord(one, addOne.getNextUserId()); + } + return R.status(true); } + private void createNextNodeRecord(RaiseHand raiseHand, String nextUserId) { + // 校验下一节点审批人 + if (StrUtil.isEmpty(nextUserId)) { + throw new RuntimeException("请选择下一节点审批人"); + } + + // 获取下一节点审批人信息 + User nextApprover; + try { + nextApprover = userClient.userInfoById(Long.parseLong(nextUserId)).getData(); + } catch (Exception e) { + log.error("获取下一节点审批人失败", e); + throw new RuntimeException("下一节点审批人获取失败"); + } + + if (BeanUtil.isEmpty(nextApprover)) { + throw new RuntimeException("下一节点审批人获取失败"); + } + + // 创建下一节点记录 + RaiseHandRecord nextNode = new RaiseHandRecord(); + nextNode.setHandId(raiseHand.getId()); + nextNode.setCurrentStatus(raiseHand.getStatus()); + nextNode.setNextUserId(nextApprover.getId().toString()); + nextNode.setNextUserName(nextApprover.getRealName()); + nextNode.setCreateTime(new Date()); + recordService.save(nextNode); + + // 给下一个节点审批人推送消息 + pushNotificationToNextApprover(raiseHand, nextApprover); + } + + private void pushNotificationToNextApprover(RaiseHand raiseHand, User nextApprover) { + try { + // 构建审批节点名称 + String nodeName = getApprovalNodeName(raiseHand.getStatus() + 1); + + // 构建通知标题 + String title = String.format("举手免责审批提醒 - %s", + StringUtils.isNotBlank(raiseHand.getNotes()) ? raiseHand.getNotes() : "待审批"); + + // 构建通知内容 + String content = String.format( + "您有一条新的举手免责审批待处理:\n" + + "- 问题描述:%s\n" + + "- 申请人:%s\n" + + "- 岗位:%s\n" + + "- 当前节点:%s\n" + + "- 申请时间:%s\n" + + "请及时登录系统进行处理。", + StringUtils.defaultIfBlank(raiseHand.getNotes(), "无"), + StringUtils.defaultIfBlank(raiseHand.getReportUserName(), "未知"), + StringUtils.defaultIfBlank(raiseHand.getPostName(), "未知"), + nodeName, + raiseHand.getCreateTime() != null ? DateUtil.format(raiseHand.getCreateTime(), "yyyy-MM-dd HH:mm:ss") : "未知" + ); + + // 创建通知消息实体 + MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() + .title(title) + .content(content) + .receiveUserId(nextApprover.getId()) + .bizType(BizTypeConstant.CRAFT_TASK_REDEPLOY) + .build(); + + // 调用Feign客户端保存通知消息 + R result = mesNotifyMessageClient.save(notifyMessage); + + if (result != null && result.isSuccess()) { + log.info("成功发送举手免责审批提醒,审批人: {}, 审批人姓名: {}, 举手ID: {}", + nextApprover.getId(), nextApprover.getRealName(), raiseHand.getId()); + } else { + log.error("发送举手免责审批提醒失败,审批人: {}, 错误信息: {}", + nextApprover.getId(), result != null ? result.getMsg() : "返回结果为空"); + } + + } catch (Exception e) { + log.error("处理举手免责审批提醒时发生异常,举手ID: {}", raiseHand.getId(), e); + throw new RuntimeException("发送举手免责审批提醒失败"); + } + } + + /** + * 根据状态获取审批节点名称 + * @param status 审批状态 + * @return 节点名称 + */ + private String getApprovalNodeName(Integer status) { + if (status == null) { + return "未知节点"; + } + switch (status) { + case 1: + return "工艺管理员审批"; + case 2: + return "质量管理员审批"; + case 3: + return "主管业务领导审批"; + case 4: + return "审批完成"; + default: + return "未知节点"; + } + } @PostMapping("/save") @ApiOperationSupport(order = 30) @@ -288,20 +421,21 @@ public class RaiseHandController extends BladeController { @Transactional public R save(@Valid @RequestBody RaiseHand addOne) { - addOne.setId(null); + addOne.setId(null); service.save(addOne); - if(1 == addOne.getStatus()){ - RaiseHandRecord record = new RaiseHandRecord(); - record.setHandId(addOne.getId()); - record.setNotes(""); - record.setIsSuccess("1"); - record.setCurrentStatus(0); - record.setCreateTime(new Date()); - record.setReviewUserId(AuthUtil.getUser().getUserId()); - record.setReviewUserName(AuthUtil.getUser().getNickName()); - recordService.save(record); - } - + // TODO: 2026/4/29 前端未传该字段,框架自动填充 + //if(1 == addOne.getStatus()){ + RaiseHandRecord record = new RaiseHandRecord(); + record.setHandId(addOne.getId()); + record.setNotes(""); + record.setIsSuccess("1"); + record.setCurrentStatus(0); + record.setCreateTime(new Date()); + record.setReviewUserId(AuthUtil.getUser().getUserId()); + record.setReviewUserName(AuthUtil.getUser().getNickName()); + recordService.save(record); + //} + createNextNodeRecord(addOne, addOne.getProcessUserId().toString()); return R.status(true); } 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; + } +} diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java index cc97015b..a4d415c2 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java @@ -51,7 +51,6 @@ import org.springblade.scheduling.scheduling.excel.QualityGradeExcel; import org.springblade.scheduling.scheduling.service.IQualityGradeService; import org.springblade.scheduling.scheduling.vo.QualityGradeVO; import org.springblade.scheduling.scheduling.wrapper.QualityGradeWrapper; -import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; @@ -108,6 +107,7 @@ public class QualityGradeController extends BladeController { @ApiOperationSupport(order = 3) @Operation(summary = "分页", description = "传入QualityGrade") public R> page(QualityGradeVO qualityGrade, Query query) { + convertSortField(query); IPage pages = qualityGradeService.selectQualityGradePage(Condition.getPage(query), qualityGrade); List list = pages.getRecords(); for(QualityGradeVO vo: list){ @@ -115,7 +115,55 @@ public class QualityGradeController extends BladeController { } return R.data(pages); } + public void convertSortField(Query query) { + if (query == null) { + return; + } + + // 处理降序排序字段 + if (Func.isNotEmpty(query.getDescs())) { + String descs = query.getDescs(); + descs = convertSingleSortField(descs); + query.setDescs(descs); + } + + // 处理升序排序字段 + if (Func.isNotEmpty(query.getAscs())) { + String ascs = query.getAscs(); + ascs = convertSingleSortField(ascs); + query.setAscs(ascs); + } + } + + /** + * 转换单个排序字段 + * @param sortField 排序字段字符串(可能包含多个字段,逗号分隔) + * @return 转换后的排序字段 + */ + public String convertSingleSortField(String sortField) { + if (Func.isEmpty(sortField)) { + return sortField; + } + + // 定义字段映射关系:前端字段名 -> 数据库字段名 + String[] fields = sortField.split(","); + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < fields.length; i++) { + String field = fields[i].trim(); + String convertedField = switch (field.toUpperCase()) { + case "TYPES" -> "TYPE"; + default -> field; + }; + result.append(convertedField); + if (i < fields.length - 1) { + result.append(","); + } + } + + return result.toString(); + } /** * 质量等级表 新增 */ diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java index 4df8be2c..2b4a6492 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java @@ -1952,7 +1952,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl voList = JsonUtil.readValue(personAbility.getStandardTime(), new TypeReference>() {}); for(PersonAbilityVO vo : voList){ - if(part.getExternalDiameter() > vo.getStartNum() && part.getExternalDiameter() <= vo.getEndNum()){ + if(part.getExternalDiameter() != null && part.getExternalDiameter() > vo.getStartNum() && part.getExternalDiameter() <= vo.getEndNum()){ personTime = Double.parseDouble(vo.getStandardTime()) * order.getYpQty() + personAbility.getPrepareTime().doubleValue(); break; } @@ -1965,7 +1965,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl voList = JsonUtil.readValue(personAbility.getStandardTime(), new TypeReference>() {}); for(PersonAbilityVO vo : voList){ - if(part.getBlbDiameter() >vo.getStartNum() && part.getBlbDiameter() <= vo.getEndNum()){ + if(part.getBlbDiameter() != null && part.getBlbDiameter() >vo.getStartNum() && part.getBlbDiameter() <= vo.getEndNum()){ personTime = Double.parseDouble(vo.getStandardTime()) * order.getYpQty() + personAbility.getPrepareTime().doubleValue(); break; } diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStOtherOutRecordService.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStOtherOutRecordService.java index 8fe1086b..5d981b08 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStOtherOutRecordService.java +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStOtherOutRecordService.java @@ -45,7 +45,7 @@ public interface IStOtherOutRecordService extends BaseService void approvalRequest(Long id, Short approvalResult, BladeUser user); - void createPendingOutRecord(StOtherOutRecord record, List stockList, BladeUser user); + void createPendingOutRecord(StOtherOutRecord record, List stockList, BladeUser user, Long rrId); StOtherOutRecordVO getDetail(Long id); } diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StExpireRecordServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StExpireRecordServiceImpl.java index 41b6e4f4..7d072d16 100644 --- a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StExpireRecordServiceImpl.java +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StExpireRecordServiceImpl.java @@ -138,7 +138,7 @@ public class StExpireRecordServiceImpl extends BaseServiceImpl stockList, BladeUser user) { + public void createPendingOutRecord(StOtherOutRecord stOtherOutRecord, List stockList, BladeUser user, Long rrId) { // 1. 设置默认审批状态:待审批 // 2. 补充审计字段 @@ -72,6 +76,12 @@ public class StOtherOutRecordServiceImpl extends BaseServiceImpl