liweidong
liweidong-hj 6 days ago
commit 84267e50e4
  1. 26
      blade-ops/blade-job/src/main/java/org/springblade/job/processor/oem/OemCustomerSyncProcessor.java
  2. 3
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/ehs/feign/IAcidMistTowerClient.java
  3. 53
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/entity/OemStandardProcessEntity.java
  4. 47
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/excel/OemStandardProcessExcel.java
  5. 38
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/oem/pojo/vo/OemStandardProcessVO.java
  6. 12
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/entity/RaiseHandRecord.java
  7. 7
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/quality/pojo/vo/RaiseHandVO.java
  8. 31
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbSplyClient.java
  9. 58
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/view/MesRbSply.java
  10. 54
      blade-service/blade-desk/pom.xml
  11. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BasicClazzController.java
  12. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BatConfigController.java
  13. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java
  14. 6
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/CraftAbilityController.java
  15. 7
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/LocallyPlatedPartController.java
  16. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/OemController.java
  17. 26
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/PlatingController.java
  18. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/TeamSetController.java
  19. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkCenterController.java
  20. 68
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/WorkTankController.java
  21. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/feign/AcidMistTowerClientImpl.java
  22. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.java
  23. 58
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/OemCustomerMapper.xml
  24. 93
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/OemCustomerServiceImpl.java
  25. 86
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/util/QueryUtils.java
  26. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/cost/mapper/CostStatisticsMapper.xml
  27. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/EpciuPatrolInspectionMapper.xml
  28. 5
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/InsTestMapper.xml
  29. 10
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/mapper/TowerReportMapper.xml
  30. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/service/impl/BsTowerReportServiceImpl.java
  31. 29
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/PipelineServiceImpl.java
  32. 2
      blade-service/blade-desk/src/main/java/org/springblade/desk/logistics/service/impl/TaskExecuteRecordServiceImpl.java
  33. 146
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/controller/OemStandardProcessController.java
  34. 27
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/mapper/OemStandardProcessMapper.java
  35. 63
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/mapper/OemStandardProcessMapper.xml
  36. 25
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/IOemStandardProcessService.java
  37. 25
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStandardProcessServiceImpl.java
  38. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldOrderServiceImpl.java
  39. 168
      blade-service/blade-desk/src/main/java/org/springblade/desk/quality/controller/RaiseHandController.java
  40. 32
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbSplyClientImpl.java
  41. 23
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.java
  42. 20
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbSplyMapper.xml
  43. 21
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbSplyService.java
  44. 34
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbSplyServiceImpl.java
  45. 50
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java
  46. 4
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  47. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStOtherOutRecordService.java
  48. 2
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StExpireRecordServiceImpl.java
  49. 12
      blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StOtherOutRecordServiceImpl.java

@ -31,23 +31,13 @@ public class OemCustomerSyncProcessor implements BasicProcessor {
log.info("========== 开始执行外协厂家管理数据同步定时任务 ==========");
log.info("任务参数: {}", context.getJobParams());
CompletableFuture<Void> 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());
}
}
}

@ -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);
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<RaiseHandRecord> all = new ArrayList<>();
@TableField(exist = false)
@Schema(description = "下一节点审批人ID")
private String nextUserId;
@TableField(exist = false)
@Schema(description = "下一节点审批人名称")
private String nextUserName;
}

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

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

@ -77,39 +77,39 @@
<!-- <artifactId>vwebfrk-base</artifactId>-->
<!-- <version>1.4.6-RELEASE</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>3.0.9</version> <!-- 使用最新的稳定版本 -->
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.codehaus.groovy</groupId>-->
<!-- <artifactId>groovy</artifactId>-->
<!-- <version>3.0.9</version> &lt;!&ndash; 使用最新的稳定版本 &ndash;&gt;-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.videasoft.m3</groupId>-->
<!-- <artifactId>barbecue</artifactId>-->
<!-- <version>0.0.1</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.1.16</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-resource-api</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.itextpdf</groupId>-->
<!-- <artifactId>itext7-core</artifactId>-->
<!-- <version>7.1.16</version>-->
<!-- <type>pom</type>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.lowagie</groupId>-->
<!-- <artifactId>itext</artifactId>-->
<!-- <version>2.1.7</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springblade</groupId>-->
<!-- <artifactId>blade-resource-api</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-system-api</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-scheduling-api</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springblade</groupId>-->
<!-- <artifactId>blade-scheduling-api</artifactId>-->
<!-- </dependency>-->
<!-- Source: https://mvnrepository.com/artifact/com.googlecode.aviator/aviator -->
<!-- SpringBoot 3 + JDK 17 项目必须使用Aviator 5.3.0 及以上版本,低版本存在兼容性和功能限制 -->
<!-- Aviator表达式引擎核心依赖 -->
@ -145,12 +145,6 @@
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-auth</artifactId>
<version>4.6.0.RELEASE</version>
</dependency>
</dependencies>
<build>

@ -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<IPage<BasicClazzVO>> page(BasicClazzVO basicClazz, Query query) {
// 处理排序字段转换:将前端虚拟字段转换为实际数据库字段(如 MEMO -> CREATE_TIME)
QueryUtils.convertSortField(query);
IPage<BasicClazzVO> pagesVO = service.selectBasicClazzPage(
Condition.getPage(query), basicClazz
);

@ -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<IPage<BatConfigVO>> page(BatConfigVO batConfig, Query query) {
QueryUtils.convertSortField( query);
IPage<BatConfigVO> pagesVO = service.selectBatConfigPage(
Condition.getPage(query), batConfig
);

@ -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<IPage<BsAssignVO>> page(BsAssignVO bsAssign, Query query) {
query.setDescs(null);
query.setAscs(null);
QueryUtils.convertSortField(query);
IPage<BsAssignVO> pages = bsAssignService.selectBsAssignPage(Condition.getPage(query), bsAssign);
List<BsAssignVO> list = pages.getRecords();
for(BsAssignVO vo:list){

@ -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<IPage<CraftAbilityVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> craftAbility, Query query) {
craftAbility.remove("descs");
craftAbility.remove("ascs");
query.setDescs(null);
query.setAscs(null);
QueryUtils.convertSortField(query);
Date startTime = null;
Date endTime = null;

@ -84,12 +84,9 @@ public class LocallyPlatedPartController extends BladeController {
@Operation(summary = "list分页", description = "传入LocallyPlatedPart Obj")
public R<IPage<LocallyPlatedPartVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> locallyPlatedPart,
Query query) {
locallyPlatedPart.remove("descs");
locallyPlatedPart.remove("ascs");
query.setDescs(null);
query.setAscs(null);
QueryWrapper<LocallyPlatedPart> qw = Condition.getQueryWrapper(locallyPlatedPart, LocallyPlatedPart.class);
qw.last("ORDER BY UPDATE_TIME DESC ");
IPage<LocallyPlatedPart> pages = service.page(Condition.getPage(query), qw);
IPage<LocallyPlatedPartVO> pagesVO = LocallyPlatedPartWrapper.build().pageVO(pages);
pagesVO.getRecords()

@ -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<IPage<OemVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> map,
Query query) {
QueryUtils.convertSortField(query);
// build QueryWrapper
QueryWrapper<Oem> qw = Condition.getQueryWrapper(map, Oem.class);
qw.eq(map.containsKey(Oem.COL_CODE), Oem.COL_CODE, (Func.toStr(map.get(OemSearch.COL_CODE))));

@ -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<IPage<PlatingVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> plating,
Query query) {
QueryWrapper<Plating> 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<Plating> 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<Plating> pages = service.page(Condition.getPage(query), qw);
IPage<PlatingVO> pagesVO = PlatingWrapper.build().pageVO(pages);
//bcId
//镀种ID , 镀种名称
Set<Long> bcIds = pagesVO.getRecords().stream().map(PlatingVO::getBcId).collect(Collectors.toSet());
if (CollUtil.isEmpty(bcIds)){
return R.data(pagesVO);
}
Map<Long, String> bcIdAndName = basicClazzService
.listByIds(bcIds)
.stream()

@ -247,10 +247,10 @@ public class TeamSetController extends BladeController {
@Operation(summary = "list分页", description = "传入TeamSet Obj")
public R<IPage<TeamSetVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> 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<Long> ids = new ArrayList<>();
// if(map.containsKey("dispatcherRealName")){
// List<User> users = iUserClient.userListByName(Func.toStr(map.get("dispatcherRealName")));

@ -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<IPage<WorkCenterVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> 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<WorkCenter> 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<WorkCenter> pages = service.page(Condition.getPage(query), qw);
IPage<WorkCenterVO> pagesVO = WorkCenterWrapper.build().pageVO(pages);
List<WorkCenterVO> vos = pagesVO.getRecords();

@ -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<IPage<WorkTankVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> workTank,
Query query) {
//
QueryWrapper<WorkTank> qw = Condition.getQueryWrapper(workTank, WorkTank.class);
IPage<WorkTank> pages = service.page(Condition.getPage(query), qw);
QueryUtils.convertSortField(query);
IPage<WorkTank> page = Condition.getPage(query);
IPage<WorkTank> pages = service.page(page, qw);
IPage<WorkTankVO> pagesVO = WorkTankWrapper.build().pageVO(pages);
List<WorkTankVO> 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<IPage<WorkTankVO>> page(WorkTankVO workTank, Query query) {
// 处理排序字段转换:将前端传来的虚拟字段转换为实际数据库字段
convertSortField(query);
IPage<WorkTankVO> 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();
}
}

@ -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);
}

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

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

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

@ -0,0 +1,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();
}
}

@ -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 ) )
</select>
@ -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 ) )
</select>

@ -8,9 +8,9 @@
<result column="EPC_ID" property="epcId"/>
<result column="INS_NUM" property="insNum"/>
<result column="INS_SITE" property="insSite"/>
<result column="uName" property="insMan"/>
<result column="INS_MAN" property="insMan"/>
<!-- <result column="WAIT_CYCLE" property="waitCycle"/>-->
<result column="pMemo" property="insMemo"/>
<result column="INS_MEMO" property="insMemo"/>
<result column="PAR_MEMO" property="parMemo"/>
<result column="LAUNCH_TIME" property="launchTime"/>
<result column="TEST_TIME" property="testTime"/>
@ -27,7 +27,11 @@
<select id="selectBsEpciuPatrolInspectionPage" resultMap="bsEpciuPatrolInspectionResultMap">
select n.*,po.MEMO AS pMemo,u.name as uName from BS_EPCIU_PATROL_INSPECTION n
select n.ID, n.EPC_ID, n.INS_NUM, n.INS_SITE, n.WAIT_CYCLE, n.PAR_MEMO,
n.LAUNCH_TIME, n.TEST_TIME, n.TASK_STATUS, n.CREATE_USER, n.CREATE_DEPT,
n.CREATE_TIME, n.UPDATE_USER, n.UPDATE_TIME, n.STATUS, n.IS_DELETED, n.INS_TYPE,
po.MEMO AS INS_MEMO, u.name as INS_MAN
from BS_EPCIU_PATROL_INSPECTION n
INNER JOIN BS_EPCIU_INSPECTION_POINT po on po.ID = n.EPC_ID
left join blade_user u on u.id = n.INS_MAN
<where>

@ -25,7 +25,10 @@
<select id="selectBsInsTestPage" resultMap="bsInsTestResultMap">
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
<where>
n.is_deleted = 0
<if test="bsInsTest.device!=null and bsInsTest.device!=''">

@ -23,7 +23,10 @@
<select id="selectBsTowerReportPage" resultMap="bsTowerReportResultMap">
select * from BS_TOWER_REPORT n
select n.ID, n.BT_ID, n.DEAL_STATUS, n.BT_CODE, n.BT_DATE, n.ERROR_POINT,
n.MESS_TEXT, n.CONS_LONG, n.CREATE_USER, n.CREATE_DEPT,
n.CREATE_TIME, n.UPDATE_USER, n.UPDATE_TIME, n.STATUS, n.IS_DELETED
from BS_TOWER_REPORT n
<where>
n.is_deleted = 0
<if test="bsTowerReport.dealStatus!=null">
@ -41,10 +44,7 @@
<if test="bsTowerReport.consLong!=null">
and n.CONS_LONG = #{bsTowerReport.consLong}
</if>
<if test="bsTowerReport.btDate!=null">
and n.BT_DATE like '%' || #{bsTowerReport.btDate} || '%'
</if>
<if test="bsTowerReport.queryBtDate!=null">
<if test="bsTowerReport.queryBtDate!=null and bsTowerReport.queryBtDate!= ''">
and n.BT_DATE BETWEEN to_date(#{bsTowerReport.startDate},'YYYY-MM-DD HH24:MI:SS') AND to_date(#{bsTowerReport.endDate},'YYYY-MM-DD HH24:MI:SS')
</if>
</where>

@ -32,6 +32,7 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.desk.common.constant.BizTypeConstant;
import org.springblade.desk.common.feign.IMesNotifyMessageClient;
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity;
import org.springblade.desk.energy.excel.BsTowerReportExcel;
@ -215,6 +216,7 @@ public class BsTowerReportServiceImpl extends BaseServiceImpl<BsTowerReportMappe
// 创建通知消息实体
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder()
.bizType(BizTypeConstant.CRAFT_TASK_REDEPLOY)
.title(title)
.content(content)
.receiveRoleId(environmentalTechnicianRoleId)

@ -1,37 +1,8 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.desk.logistics.service.impl;
import groovy.lang.Lazy;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.tool.api.R;
import org.springblade.desk.logistics.constant.AgvConstant;
import org.springblade.desk.logistics.pojo.dto.BoxBindingDto;
import org.springblade.desk.logistics.pojo.entity.*;
import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
import org.springblade.desk.logistics.service.*;
import org.springblade.desk.logistics.utils.AgvTaskTypeUtil;
import org.springframework.beans.factory.annotation.Autowired;

@ -6,7 +6,6 @@ import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import groovy.lang.Lazy;
import lombok.extern.slf4j.Slf4j;
import org.redisson.executor.TasksService;
import org.springblade.core.log.exception.ServiceException;
@ -21,6 +20,7 @@ import org.springblade.desk.logistics.pojo.vo.AgvSchedulingTaskVO;
import org.springblade.desk.logistics.service.*;
import org.springblade.desk.logistics.utils.AgvTaskTypeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

@ -0,0 +1,146 @@
package org.springblade.desk.oem.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.basic.util.ExcelExtUtil;
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity;
import org.springblade.desk.dashboard.service.IBsProcessSetService;
import org.springblade.desk.oem.pojo.entity.OemStandardProcessEntity;
import org.springblade.desk.oem.pojo.excel.OemStandardProcessExcel;
import org.springblade.desk.oem.pojo.vo.OemStandardProcessVO;
import org.springblade.desk.oem.service.IOemStandardProcessService;
import org.springframework.beans.BeanUtils;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 外协标准工序代码 控制器
*
* @author maxg
* @since 2026-04-29
*/
@RestController
@AllArgsConstructor
@RequestMapping("/mesOemStandardProcess")
@Tag(name = "外协标准工序代码", description = "外协标准工序代码接口")
public class OemStandardProcessController {
private final IOemStandardProcessService oemStandardProcessService;
private final IBsProcessSetService bsProcessSetService;
/**
* 外协标准工序代码 自定义分页
*/
@GetMapping("/page")
@Operation(summary = "分页", description = "传入oemStandardProcess")
public R<IPage<OemStandardProcessVO>> page(OemStandardProcessVO oemStandardProcess, Query query) {
IPage<OemStandardProcessVO> pages = oemStandardProcessService.selectOemStandardProcessPage(Condition.getPage(query), oemStandardProcess);
return R.data(pages);
}
/**
* 外协标准工序代码 新增或修改
*
* @param oemStandardProcessList
* @return
*/
@PostMapping("/submit")
@Operation(summary = "新增或修改", description = "传入bsEfficiencyTempList")
public R submit(@Valid @RequestBody List<OemStandardProcessEntity> oemStandardProcessList) {
for (OemStandardProcessEntity oemStandardProcessEntity : oemStandardProcessList) {
LambdaQueryWrapper<OemStandardProcessEntity> wrapper = new LambdaQueryWrapper<OemStandardProcessEntity>().eq(OemStandardProcessEntity::getProcessId, oemStandardProcessEntity.getProcessId()).eq(OemStandardProcessEntity::getPlate, oemStandardProcessEntity.getPlate()).eq(OemStandardProcessEntity::getPlateThickness, oemStandardProcessEntity.getPlateThickness()).eq(OemStandardProcessEntity::getPartName, oemStandardProcessEntity.getPartName());
if (oemStandardProcessEntity.getId() != null) {
wrapper.ne(OemStandardProcessEntity::getId, oemStandardProcessEntity.getId());
}
List<OemStandardProcessEntity> list = oemStandardProcessService.list(wrapper);
if (!CollectionUtils.isEmpty(list)) {
return R.fail("数据已存在");
}
}
return R.status(oemStandardProcessService.saveOrUpdateBatch(oemStandardProcessList));
}
/**
* 外协标准工序代码 删除
*/
@PostMapping("/remove")
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(oemStandardProcessService.deleteLogic(Func.toLongList(ids)));
}
/**
* 外协标准工序代码 下载模板
* @return
*/
@GetMapping("/download-excel-template")
@Operation(summary = "下载Excel模板", description = "")
public ResponseEntity<Resource> downloadExcelTemplate() {
return ExcelExtUtil.downloadXlsTemplate("Excel/oem/标准工序代码.xls", "导入模版-标准工序代码.xls");
}
/**
* 外协标准工序代码 导入Excel
* @param file
* @return
*/
@PostMapping("/import-excel")
@Operation(summary = "导入Excel", description = "MultipartFile")
public R importExcel(@RequestParam("file") MultipartFile file) {
R checkR = ExcelExtUtil.importExcelCheck(file);
if (checkR != null) {
return checkR;
}
List<OemStandardProcessExcel> importList = ExcelUtil.read(file, 0, 1, OemStandardProcessExcel.class);
Set<String> uniqueSet = new HashSet<>();
List<OemStandardProcessEntity> entityList = new ArrayList<>();
for (int i = 0; i < importList.size(); i++) {
int rowNum = i + 2;
OemStandardProcessExcel row = importList.get(i);
if (StringUtils.isEmpty(row.getProcessName())) {
return R.fail(rowNum + "行工序未填写");
}
if(StringUtils.isEmpty(row.getStandardProcessCode())){
return R.fail(rowNum + "行标准工序代码未填写");
}
String uniqueStr = StringUtils.joinWith("|", row.getProcessName(), row.getPlate(), row.getPlateThickness(), row.getPartName());
if (!uniqueSet.add(uniqueStr)) {
return R.fail(rowNum + "行在Excel中重复");
}
BsProcessSetEntity processSet = bsProcessSetService.getOne(new LambdaQueryWrapper<BsProcessSetEntity>().eq(BsProcessSetEntity::getName, row.getProcessName()));
if (processSet == null) {
return R.fail(rowNum + "行错误,系统无此工序");
}
OemStandardProcessEntity exist = oemStandardProcessService.getOne(new LambdaQueryWrapper<OemStandardProcessEntity>().eq(OemStandardProcessEntity::getProcessId, processSet.getId()).eq(OemStandardProcessEntity::getPlate, row.getPlate()).eq(OemStandardProcessEntity::getPlateThickness, row.getPlateThickness()).eq(OemStandardProcessEntity::getPartName, row.getPartName()));
if (exist != null) {
return R.fail(rowNum + "行错误,数据已存在");
}
OemStandardProcessEntity entity = new OemStandardProcessEntity();
BeanUtils.copyProperties(row, entity);
entity.setProcessId(processSet.getId());
entityList.add(entity);
}
return R.status(oemStandardProcessService.saveBatch(entityList));
}
}

@ -0,0 +1,27 @@
package org.springblade.desk.oem.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.desk.efficiency.pojo.vo.BsEfficiencyTaskVO;
import org.springblade.desk.oem.pojo.entity.OemStandardProcessEntity;
import org.springblade.desk.oem.pojo.vo.OemStandardProcessVO;
import java.util.List;
/**
* 外协标准工序代码 Mapper接口
*
* @author maxg
* @since 2026-04-29
*/
public interface OemStandardProcessMapper extends BaseMapper<OemStandardProcessEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param oemStandardProcess 查询参数
* @return List<BsEfficiencyTaskVO>
*/
List<OemStandardProcessVO> selectOemStandardProcessPage(IPage page, OemStandardProcessVO oemStandardProcess);
}

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.oem.mapper.OemStandardProcessMapper">
<!-- 通用查询映射结果 -->
<resultMap id="mesOemStandardProcessVOResultMap" type="org.springblade.desk.oem.pojo.vo.OemStandardProcessVO">
<result column="ID" property="id"/>
<result column="PROCESS_ID" property="processId"/>
<result column="PLATE" property="plate"/>
<result column="PLATE_THICKNESS" property="plateThickness"/>
<result column="PART_NAME" property="partName"/>
<result column="STANDARD_PROCESS_CODE" property="standardProcessCode"/>
<result column="CREATE_USER" property="createUser"/>
<result column="CREATE_TIME" property="createTime"/>
<result column="CREATE_DEPT" property="createDept"/>
<result column="UPDATE_USER" property="updateUser"/>
<result column="UPDATE_TIME" property="updateTime"/>
<result column="STATUS" property="status"/>
<result column="IS_DELETED" property="isDeleted"/>
<result column="PROCESS_NAME" property="processName"/>
<result column="UPDATE_USER_NAME" property="updateUserName"/>
</resultMap>
<select id="selectOemStandardProcessPage" resultMap="mesOemStandardProcessVOResultMap">
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
<where>
t.IS_DELETED = 0
<if test="oemStandardProcess.processName != null">
AND p.NAME like concat(concat('%', #{oemStandardProcess.processName}),'%')
</if>
<if test="oemStandardProcess.plate != null">
AND t.PLATE like concat(concat('%', #{oemStandardProcess.plate}),'%')
</if>
<if test="oemStandardProcess.plateThickness != null">
AND t.PLATE_THICKNESS like concat(concat('%', #{oemStandardProcess.plateThickness}),'%')
</if>
<if test="oemStandardProcess.partName != null">
AND t.PART_NAME like concat(concat('%', #{oemStandardProcess.partName}),'%')
</if>
<if test="oemStandardProcess.standardProcessCode != null">
AND t.STANDARD_PROCESS_CODE like concat(concat('%', #{oemStandardProcess.standardProcessCode}),'%')
</if>
</where>
)
<choose>
<when test="oemStandardProcess.orderByField != null and oemStandardProcess.orderByField != ''">
ORDER BY ${oemStandardProcess.orderByField}
<if test="oemStandardProcess.isAsc">ASC</if>
<if test="!oemStandardProcess.isAsc">DESC</if>
</when>
<otherwise>
ORDER BY CREATE_TIME DESC
</otherwise>
</choose>
</select>
</mapper>

@ -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<OemStandardProcessEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param oemStandardProcess 查询参数
* @return IPage<OemStandardProcessVO>
*/
IPage<OemStandardProcessVO> selectOemStandardProcessPage(IPage<OemStandardProcessVO> page, OemStandardProcessVO oemStandardProcess);
}

@ -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<OemStandardProcessMapper, OemStandardProcessEntity> implements IOemStandardProcessService {
@Override
public IPage<OemStandardProcessVO> selectOemStandardProcessPage(IPage<OemStandardProcessVO> page, OemStandardProcessVO oemStandardProcess) {
return page.setRecords(baseMapper.selectOemStandardProcessPage(page, oemStandardProcess));
}
}

@ -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<YieldOrderMapper, Yie
boolean result = this.verifyYieldOrderResource(yieldOrder);
if(result){
List<YieldOrderCraft> list = yieldOrderCraftService.list(Wrappers.<YieldOrderCraft>lambdaQuery().eq(YieldOrderCraft::getYoId,yieldOrder.getId()));
List<YieldOrderCraft> list = yieldOrderCraftService.list(Wrappers.<YieldOrderCraft>lambdaQuery().eq(YieldOrderCraft::getYoId,yieldOrder.getId()).orderByAsc(YieldOrderCraft::getProcessNo));
list.stream().forEach(craft -> {
if(craft.getWorkCenterId() != null){
WorkCenter workCenter = workCenterService.getById(craft.getWorkCenterId());

@ -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);
}

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

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

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

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

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

@ -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<IPage<QualityGradeVO>> page(QualityGradeVO qualityGrade, Query query) {
convertSortField(query);
IPage<QualityGradeVO> pages = qualityGradeService.selectQualityGradePage(Condition.getPage(query), qualityGrade);
List<QualityGradeVO> 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();
}
/**
* 质量等级表 新增
*/

@ -1952,7 +1952,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
for(PersonAbilityEntity personAbility : personAbilityList){
List<PersonAbilityVO> voList = JsonUtil.readValue(personAbility.getStandardTime(), new TypeReference<List<PersonAbilityVO>>() {});
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<WorkOrderMapper, WorkO
for(PersonAbilityEntity personAbility : personAbilityList){
List<PersonAbilityVO> voList = JsonUtil.readValue(personAbility.getStandardTime(), new TypeReference<List<PersonAbilityVO>>() {});
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;
}

@ -45,7 +45,7 @@ public interface IStOtherOutRecordService extends BaseService<StOtherOutRecord>
void approvalRequest(Long id, Short approvalResult, BladeUser user);
void createPendingOutRecord(StOtherOutRecord record, List<StRealtimeStock> stockList, BladeUser user);
void createPendingOutRecord(StOtherOutRecord record, List<StRealtimeStock> stockList, BladeUser user, Long rrId);
StOtherOutRecordVO getDetail(Long id);
}

@ -138,7 +138,7 @@ public class StExpireRecordServiceImpl extends BaseServiceImpl<StExpireRecordMap
record.setBfType(bfType);
record.setRlsId(rlsId);
record.setOutQty(outQty);
stOtherOutRecordService.createPendingOutRecord(record, stockList, user);
stOtherOutRecordService.createPendingOutRecord(record, stockList, user, rrId);
}

@ -14,8 +14,10 @@ import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User;
import org.springblade.wms.excel.StOtherOutRecordExcel;
import org.springblade.wms.mapper.StOtherOutRecordMapper;
import org.springblade.wms.mapper.StReturnRecordMapper;
import org.springblade.wms.pojo.entity.StOtherOutRecord;
import org.springblade.wms.pojo.entity.StRealtimeStock;
import org.springblade.wms.pojo.entity.StReturnRecord;
import org.springblade.wms.pojo.entity.StStockInoutRecord;
import org.springblade.wms.pojo.vo.StOtherOutRecordVO;
import org.springblade.wms.service.IStOtherOutRecordService;
@ -44,6 +46,8 @@ public class StOtherOutRecordServiceImpl extends BaseServiceImpl<StOtherOutRecor
@Resource
IStRealtimeStockService stRealtimeStockService;
@Resource
StReturnRecordMapper stReturnRecordMapper;
@Resource
IMesApprovalRecordClient mesApprovalRecordClient;
@Resource
IUserClient userClient;
@ -61,7 +65,7 @@ public class StOtherOutRecordServiceImpl extends BaseServiceImpl<StOtherOutRecor
}
@Transactional(rollbackFor = Exception.class)
public void createPendingOutRecord(StOtherOutRecord stOtherOutRecord, List<StRealtimeStock> stockList, BladeUser user) {
public void createPendingOutRecord(StOtherOutRecord stOtherOutRecord, List<StRealtimeStock> stockList, BladeUser user, Long rrId) {
// 1. 设置默认审批状态:待审批
// 2. 补充审计字段
@ -72,6 +76,12 @@ public class StOtherOutRecordServiceImpl extends BaseServiceImpl<StOtherOutRecor
// 3. 先保存出库单基础记录(获取ID)
this.save(stOtherOutRecord);
if(stOtherOutRecord.getBfType() == 2 && rrId != null){
StReturnRecord stReturnRecord = stReturnRecordMapper.selectById(rrId);
stReturnRecord.setBfCode(String.valueOf(stOtherOutRecord.getId()));
stReturnRecordMapper.updateById(stReturnRecord);
}
MesApprovalRecordEntity approvalRecord = new MesApprovalRecordEntity();
approvalRecord.setBizId(stOtherOutRecord.getId());
approvalRecord.setBizType("报废审批");

Loading…
Cancel
Save