pangyang 2 months ago
commit 8a4a18c386
  1. 45
      blade-auth/src/main/java/org/springblade/auth/handler/BladeAuthorizationHandler.java
  2. 15
      blade-ops/blade-log/src/main/java/org/springblade/core/log/controller/LogApiController.java
  3. 44
      blade-ops/blade-log/src/main/java/org/springblade/core/log/pojo/dto/UserLoginStatsDTO.java
  4. 10
      blade-ops/blade-log/src/main/java/org/springblade/core/log/service/ILogApiService.java
  5. 44
      blade-ops/blade-log/src/main/java/org/springblade/core/log/service/impl/LogApiServiceImpl.java
  6. 2
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataPartClientFallback.java
  7. 60
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataSearchClient.java
  8. 21
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpDataSearchClientFallback.java
  9. 43
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbPkpqryClient.java
  10. 19
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpMesRbPkpqryClientFallback.java
  11. 34
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpPartoplinkFirseqClient.java
  12. 20
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/feign/IErpPartoplinkFirseqClientFallback.java
  13. 92
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/AllocationDTO.java
  14. 129
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/MesRbPkpqryDTO.java
  15. 48
      blade-service-api/blade-erpdata-api/src/main/java/org/springblade/erpdata/pojo/dto/PartoplinkFirseqDTO.java
  16. 5
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java
  17. 3
      blade-service/blade-desk/src/main/java/org/springblade/desk/dashboard/service/impl/DsPartServiceImpl.java
  18. 31
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/controller/YieldPlanController.java
  19. 17
      blade-service/blade-desk/src/main/java/org/springblade/desk/order/service/impl/YieldPlanServiceImpl.java
  20. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApplicationController.java
  21. 5
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataPartClient.java
  22. 35
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpDataSearchClient.java
  23. 38
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpMesRbPkpqryClient.java
  24. 35
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/feign/ErpPartoplinkFirseqClient.java
  25. 30
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpDataSearchMapper.java
  26. 15
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpDataSearchMapper.xml
  27. 27
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbPkpqryMapper.java
  28. 22
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpMesRbPkpqryMapper.xml
  29. 22
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpPartoplinkFirseqMapper.java
  30. 9
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/mapper/ErpPartoplinkFirseqMapper.xml
  31. 22
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpDataSearchService.java
  32. 25
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpMesRbPkpqryService.java
  33. 22
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/IErpPartoplinkFirseqService.java
  34. 29
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpDataSearchServiceImpl.java
  35. 29
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpMesRbPkpqryServiceImpl.java
  36. 32
      blade-service/blade-erpdata/src/main/java/org/springblade/erpdata/service/impl/ErpPartoplinkFirseqServiceImpl.java
  37. 134
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/CertificateTypeController.java
  38. 11
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java
  39. 24
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java
  40. 39
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.java
  41. 36
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.xml
  42. 5
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java
  43. 147
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  44. 37
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/ICertificateTypeService.java
  45. 5
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java
  46. 39
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/CertificateTypeServiceImpl.java
  47. 59
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  48. 20
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java
  49. 7
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/vo/WorkPlanVO.java
  50. 35
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/wrapper/CertificateTypeWrapper.java

@ -25,10 +25,13 @@
*/
package org.springblade.auth.handler;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.constant.TenantConstant;
import org.springblade.core.launch.props.BladeProperties;
import org.springblade.core.log.logger.BladeLogger;
import org.springblade.core.oauth2.exception.ExceptionCode;
import org.springblade.core.oauth2.handler.AbstractAuthorizationHandler;
import org.springblade.core.oauth2.props.OAuth2Properties;
@ -42,6 +45,10 @@ import org.springblade.core.tool.utils.DesUtil;
import org.springblade.core.tool.utils.SM2Util;
import org.springblade.system.cache.SysCache;
import org.springblade.system.pojo.entity.Tenant;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Date;
import java.util.List;
@ -59,6 +66,8 @@ public class BladeAuthorizationHandler extends AbstractAuthorizationHandler {
private final BladeTenantProperties tenantProperties;
private final OAuth2Properties oAuth2Properties;
private final BladeLockHandler lockHandler;
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 自定义弱密码列表
@ -134,10 +143,44 @@ public class BladeAuthorizationHandler extends AbstractAuthorizationHandler {
public void authSuccessful(OAuth2User user, OAuth2Request request) {
// 处理认证成功,清空错误次数
lockHandler.handleAuthSuccess(user.getTenantId(), user.getAccount());
// 更新 Redis 登录统计
updateUserLoginStats(user);
log.info("用户:{},认证成功", user.getAccount());
}
/**
* 更新用户登录统计信息到 Redis
*/
private void updateUserLoginStats(OAuth2User user) {
// 获取用户ID
String userId = user.getUserId();
// 获取用户名
String username = user.getName();
String key = "user:login:" + userId;
// 获取登录IP
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String loginIp = request.getRemoteAddr();
// 获取部门ID(假设 user 对象提供 getDeptId 方法)
String deptId = user.getDeptId();
// 获取 Redis 操作对象
HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();
// 1. 更新用户名(可选,若用户名可能变更)
hashOps.put(key, "username", username);
// 2. 存储登录IP
hashOps.put(key, "loginIp", loginIp);
// 3. 存储部门ID
hashOps.put(key, "deptId", deptId);
// 4. 更新最后一次登录时间
long lastLoginTime = System.currentTimeMillis();
hashOps.put(key, "lastLoginTime", lastLoginTime);
// 新增:登录次数递增
Object countObj = hashOps.get(key, "loginCount");
long loginCount = 1;
if (countObj != null) {
loginCount = (Long) countObj + 1;
}
hashOps.put(key, "loginCount", loginCount);
}
/**
* 认证失败回调
*

@ -30,6 +30,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.AllArgsConstructor;
import org.springblade.core.log.model.LogApi;
import org.springblade.core.log.pojo.dto.UserLoginStatsDTO;
import org.springblade.core.log.pojo.vo.LogApiVO;
import org.springblade.core.log.service.ILogApiService;
import org.springblade.core.log.wrapper.LogApiWrapper;
@ -38,12 +39,13 @@ import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.annotation.IsAdmin;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.*;
/**
* 控制器
@ -77,4 +79,15 @@ public class LogApiController {
return R.data(LogApiWrapper.build().pageVO(pages));
}
@IsAdmin
@GetMapping("/listUserLoginStatus")
public R<List<UserLoginStatsDTO>> getUserLoginStats(
@RequestParam(required = false) String username,
@RequestParam(required = false) String deptId
) {
// 获取所有 user:login:* 键
List<UserLoginStatsDTO> result = logService.getUserLoginStats(username, deptId);
return R.data(result);
}
}

@ -0,0 +1,44 @@
package org.springblade.core.log.pojo.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author 石玖洲
* @Description
* @create 2026-02-27 14:15
*/
@Data
@AllArgsConstructor
public class UserLoginStatsDTO {
/**
* 用户ID
*/
private String userId;
/**
* 用户名
*/
private String username;
/**
* 登录IP
*/
private String loginIp;
/**
* 部门ID
*/
private String deptId;
/**
* 最后一次登录时间
*/
private Long lastLoginTime;
/**
* 登录次数
*/
private Long loginCount;
}

@ -27,6 +27,9 @@ package org.springblade.core.log.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springblade.core.log.model.LogApi;
import org.springblade.core.log.pojo.dto.UserLoginStatsDTO;
import java.util.List;
/**
* 服务类
@ -35,4 +38,11 @@ import org.springblade.core.log.model.LogApi;
*/
public interface ILogApiService extends IService<LogApi> {
/**
* 获取用户登录状态
* @param username 用户名
* @param deptId 部门ID
* @return 用户登录状态列表
*/
List<UserLoginStatsDTO> getUserLoginStats(String username, String deptId);
}

@ -26,11 +26,19 @@
package org.springblade.core.log.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springblade.core.log.controller.LogApiController;
import org.springblade.core.log.mapper.LogApiMapper;
import org.springblade.core.log.model.LogApi;
import org.springblade.core.log.pojo.dto.UserLoginStatsDTO;
import org.springblade.core.log.service.ILogApiService;
import org.springblade.core.tool.api.R;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 服务实现类
*
@ -39,5 +47,41 @@ import org.springframework.stereotype.Service;
@Service
public class LogApiServiceImpl extends ServiceImpl<LogApiMapper, LogApi> implements ILogApiService {
@Resource
private RedisTemplate<String,String> redisTemplate;
@Override
public List<UserLoginStatsDTO> getUserLoginStats(String username, String deptId) {
Set<String> keys = redisTemplate.keys("user:login:*");
if (keys == null || keys.isEmpty()) {
new ArrayList<>();
}
// 获取用户登录信息(带筛选)
List<UserLoginStatsDTO> result = new ArrayList<>();
for (String key : Objects.requireNonNull(keys)) {
HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();
String userId = key.replace("user:login:", "");
String currentUsername = (String) hashOps.get(key, "username");
String currentDeptId = (String) hashOps.get(key, "deptId");
Long loginCount = (Long) hashOps.get(key, "loginCount");
// 过滤条件:根据 username 和 deptId 筛选
boolean matchUsername = username == null || currentUsername != null && currentUsername.contains(username);
boolean matchDept = deptId == null || currentDeptId != null && currentDeptId.equals(deptId);
if (matchUsername && matchDept) {
String loginIp = (String) hashOps.get(key, "loginIp");
Long lastLoginTime = (Long) hashOps.get(key, "lastLoginTime");
if (currentUsername != null && loginIp != null && lastLoginTime != null) {
result.add(new UserLoginStatsDTO(
userId,
currentUsername,
loginIp,
currentDeptId,
lastLoginTime,
loginCount
));
}
}
}
return result;
}
}

@ -1,8 +1,6 @@
package org.springblade.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springframework.stereotype.Component;
/**

@ -1,60 +0,0 @@
/**
* 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.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
/**
* Feign接口类
*
* @author Chill
*/
@FeignClient(
value = AppConstant.APPLICATION_SYSTEM_NAME,
fallback = IErpDataSearchClientFallback.class
)
public interface IErpDataSearchClient {
String API_PREFIX = "/feign/erpdata/client";
String PAGE_ALLOCATION = API_PREFIX + "/pageAllocation";
/**
* 查询烧结配套信息
*
* @param page
* @param entity
* @return
*/
@PostMapping(PAGE_ALLOCATION)
R<IPage<AllocationDTO>> pageAllocation(IPage<AllocationDTO> page, AllocationDTO entity);
}

@ -1,21 +0,0 @@
package org.springblade.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springframework.stereotype.Component;
/**
* Feign失败配置
*
* @author lqk
* @date 2025-12-17 15:13
*/
@Component
public class IErpDataSearchClientFallback implements IErpDataSearchClient {
@Override
public R<IPage<AllocationDTO>> pageAllocation(IPage<AllocationDTO> page, AllocationDTO entity) {
return R.fail("获取数据失败");
}
}

@ -0,0 +1,43 @@
package org.springblade.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* Feign接口类
*
* @author liuqingkun
*/
@FeignClient(
value = AppConstant.APPLICATION_SYSTEM_NAME,
fallback = IErpMesRbPkpqryClientFallback.class
)
public interface IErpMesRbPkpqryClient {
String API_PREFIX = "/feign/erpdata/mesRbPkpqry/";
String SELECT_PAGE = API_PREFIX + "selectPage";
/**
* 查询配置结果
*
* @param current 分页参数
* @param size 分页参数
* @param pkno 配套单号
* @param prtmdept 主制部门
* @param subpkdateStart 配套开始时间
* @param subpkdateEnd 配套结束时间
* @return
*/
@GetMapping(SELECT_PAGE)
R<IPage<MesRbPkpqryDTO>> selectPage(@RequestParam(value = "current", required = false, defaultValue = "1") Integer current,
@RequestParam(value = "size", required = false, defaultValue = "10") Integer size,
@RequestParam(value = "pkno", required = false) String pkno,
@RequestParam(value = "prtmdept", required = false) String prtmdept,
@RequestParam(value = "subpkdateStart", required = false) String subpkdateStart,
@RequestParam(value = "subpkdateEnd", required = false) String subpkdateEnd);
}

@ -0,0 +1,19 @@
package org.springblade.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO;
/**
* Feign接口类
*
* @author liuqingkun
*/
public class IErpMesRbPkpqryClientFallback implements IErpMesRbPkpqryClient {
@Override
public R<IPage<MesRbPkpqryDTO>> selectPage(Integer current, Integer size, String pkno, String prtmdept, String subpkdateStart, String subpkdateEnd) {
return R.fail("获取数据失败");
}
}

@ -0,0 +1,34 @@
package org.springblade.erpdata.feign;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
/**
* Feign接口类
*
* @author liuqingkun
*/
@FeignClient(
value = AppConstant.APPLICATION_SYSTEM_NAME,
fallback = IErpPartoplinkFirseqClientFallback.class
)
public interface IErpPartoplinkFirseqClient {
String API_PREFIX = "/feign/erpdata/partoplinkFirseq/";
String LIST_BY_PART_CODE = API_PREFIX + "listByPartCode";
/**
* 根据物料号查询一级工序
*
* @param partCode
* @return
*/
@GetMapping(LIST_BY_PART_CODE)
R<List<PartoplinkFirseqDTO>> listByPartCode(String partCode);
}

@ -0,0 +1,20 @@
package org.springblade.erpdata.feign;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO;
import java.util.List;
/**
* Feign接口类
*
* @author liuqingkun
*/
public class IErpPartoplinkFirseqClientFallback implements IErpPartoplinkFirseqClient {
@Override
public R<List<PartoplinkFirseqDTO>> listByPartCode(String partCode) {
return R.fail("获取数据失败");
}
}

@ -1,92 +0,0 @@
package org.springblade.erpdata.pojo.dto;
import lombok.Data;
import java.io.Serializable;
/**
* 配套信息查询
*
* @author lqk
*/
@Data
public class AllocationDTO implements Serializable {
/**
* 配套单号
*/
private String pkno;
/**
* 父件号
*/
private String prntno;
/**
* 型号
*/
private String mtltmrk;
/**
* 生产标识
*/
private String prtlotno;
/**
* 需求日期
*/
private String pkreqdat;
/**
* 父件批次
*/
private String fjSplcode;
/**
* 父件配套数
*/
private String fjPkavqty;
/**
* 配套序号
*/
private String serialno;
/**
* 主制部门
*/
private String prtmdept;
/**
* 计划标记
*/
private String plnsign;
/**
* 制造订单号
*/
private String mono;
/**
* 计划员
*/
private String schemer;
/**
* 调度员
*/
private String planner1;
/**
* 配套日期
*/
private String subpkdate;
/**
* 保管员
*/
private String warctlr;
/**
* 条码序号
*/
private String barcodeno;
/**
* 计划部门
*/
private String plandept;
/**
* 备注
*/
private String remark;
/**
* 物料标识
*/
private String prtclass;
}

@ -0,0 +1,129 @@
package org.springblade.erpdata.pojo.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author liuqingkun
*/
@Data
@NoArgsConstructor
public class MesRbPkpqryDTO {
/**
* 配套单号
*/
@Schema(description = "配套单号")
@TableField("pkno")
private String pkno;
/**
* 父件号
*/
@Schema(description = "父件号")
@TableField("prntno")
private String prntno;
/**
* 型号
*/
@Schema(description = "型号")
@TableField("mtltmrk")
private String mtltmrk;
/**
* 生产标识
*/
@Schema(description = "生产标识")
@TableField("prtlotno")
private String prtlotno;
/**
* 需求日期
*/
@Schema(description = "需求日期")
@TableField("pkreqdat")
private String pkreqdat;
/**
* 父件批次
*/
@Schema(description = "父件批次")
@TableField("fj_splcode")
private String fjSplcode;
/**
* 父件配套数
*/
@Schema(description = "父件配套数")
@TableField("fj_pkavqty")
private String fjPkavqty;
/**
* 配套序号
*/
@Schema(description = "配套序号")
@TableField("serialno")
private String serialno;
/**
* 主制部门
*/
@Schema(description = "主制部门")
@TableField("prtmdept")
private String prtmdept;
/**
* 计划标记
*/
@Schema(description = "计划标记")
@TableField("plnsign")
private String plnsign;
/**
* 制造订单号
*/
@Schema(description = "制造订单号")
@TableField("mono")
private String mono;
/**
* 计划员
*/
@Schema(description = "计划员")
@TableField("schemer")
private String schemer;
/**
* 调度员
*/
@Schema(description = "调度员")
@TableField("planner1")
private String planner1;
/**
* 配套日期
*/
@Schema(description = "配套日期")
@TableField("subpkdate")
private String subpkdate;
/**
* 保管员
*/
@Schema(description = "保管员")
@TableField("warctlr")
private String warctlr;
/**
* 条码序号
*/
@Schema(description = "条码序号")
@TableField("barcodeno")
private String barcodeno;
/**
* 计划部门
*/
@Schema(description = "计划部门")
@TableField("plandept")
private String plandept;
/**
* 备注
*/
@Schema(description = "备注")
@TableField("remark")
private String remark;
/**
* 物料标识
*/
@Schema(description = "物料标识")
@TableField("prtclass")
private String prtclass;
}

@ -0,0 +1,48 @@
package org.springblade.erpdata.pojo.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author liuqingkun
*/
@Data
@NoArgsConstructor
public class PartoplinkFirseqDTO {
/**
* 零件号
*/
@Schema(description = "零件号")
private String partcode;
/**
* 零件名称
*/
@Schema(description = "零件名称")
private String partname;
/**
* 一级工艺计划(A)
*/
@Schema(description = "一级工艺计划(A)号")
private String firpp;
/**
* 一级工艺计划名称
*/
@Schema(description = "一级工艺计划名称")
private String firppname;
/**
* 一级工序
*/
@Schema(description = "一级工序")
private String firseq;
/**
* 一级工序名称
*/
@Schema(description = "一级工序名称")
private String firseqname;
/**
* 一级工序序号
*/
@Schema(description = "一级工序序号")
private String firseqno;
}

@ -274,9 +274,6 @@ public class WorkPlanEntity extends BaseEntity {
*/
private String factTeamMembers;
/**
* 零件号
*/
private String partCode;
}

@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.SpringUtil;
@ -17,8 +16,6 @@ import org.springblade.desk.dashboard.pojo.entity.*;
import org.springblade.desk.dashboard.pojo.vo.*;
import org.springblade.desk.dashboard.service.*;
import org.springblade.erpdata.feign.IErpDataPartClient;
import org.springblade.erpdata.feign.IErpDataSearchClient;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springblade.system.feign.IUserClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

@ -15,14 +15,13 @@ 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.core.tool.utils.SpringUtil;
import org.springblade.desk.order.pojo.entity.YieldPlan;
import org.springblade.desk.order.pojo.enums.YieldPlanEnum;
import org.springblade.desk.order.pojo.vo.YieldPlanVo;
import org.springblade.desk.order.service.IYieldPlanService;
import org.springblade.desk.order.wrapper.YieldPlanWrapper;
import org.springblade.erpdata.feign.IErpDataSearchClient;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springblade.erpdata.feign.IErpMesRbPkpqryClient;
import org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -40,14 +39,7 @@ public class YieldPlanController extends BladeController {
private final IYieldPlanService yieldPlanService;
private static IErpDataSearchClient erpDataSearchClient;
private static IErpDataSearchClient getErpDataSearchClient() {
if (erpDataSearchClient == null) {
erpDataSearchClient = SpringUtil.getBean(IErpDataSearchClient.class);
}
return erpDataSearchClient;
}
private final IErpMesRbPkpqryClient mesRbPkpqryClient;
/**
* 分页查询列表-电镀
@ -186,18 +178,21 @@ public class YieldPlanController extends BladeController {
/**
* 分页查询配套信息
*
* @param entity
* @param pkno
* @param prtmdept
* @param subpkdateStart
* @param subpkdateEnd
* @param query
* @return
*/
@GetMapping("/pageAllocation")
@Parameters({
@Parameter(name = "ypCode", description = "计划单号", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
@Parameter(name = "partCode", description = "零件号", in = ParameterIn.QUERY, schema = @Schema(type = "string"))
})
@Operation(summary = "分页查询配套信息", description = "")
public R<IPage<AllocationDTO>> pageAllocation(@Parameter(hidden = true) AllocationDTO entity, Query query) {
R<IPage<AllocationDTO>> result = getErpDataSearchClient().pageAllocation(Condition.getPage(query), entity);
public R<IPage<MesRbPkpqryDTO>> pageAllocation(@Parameter(description = "配套单号", required = false) @RequestParam String pkno,
@Parameter(description = "主制部门", required = false) @RequestParam String prtmdept,
@Parameter(description = "配套开始时间", required = false) @RequestParam String subpkdateStart,
@Parameter(description = "配套结束时间", required = false) @RequestParam String subpkdateEnd,
Query query) {
R<IPage<MesRbPkpqryDTO>> result = mesRbPkpqryClient.selectPage(query.getCurrent(), query.getSize(), pkno, prtmdept, subpkdateStart, subpkdateEnd);
return result;
}
}

@ -9,6 +9,8 @@ import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.api.ResultCode;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.desk.dashboard.service.IDsPartService;
@ -19,12 +21,15 @@ import org.springblade.desk.order.pojo.enums.YieldPlanEnum;
import org.springblade.desk.order.pojo.vo.LineMemoVo;
import org.springblade.desk.order.service.IYieldOrderService;
import org.springblade.desk.order.service.IYieldPlanService;
import org.springblade.erpdata.feign.IErpPartoplinkFirseqClient;
import org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 服务实现类
@ -79,11 +84,19 @@ public class YieldPlanServiceImpl extends BaseServiceImpl<YieldPlanMapper, Yield
return resultJson;
}
private final IErpPartoplinkFirseqClient partoplinkFirseqClient;
@Override
public List<JSONObject> getFirstProcess(String partCode) {
List<JSONObject> resultList = new ArrayList<>();
//TODO 根据物料号, 调用ERP方法查询一级工序
// select * from dba_mgr.v_partoplink_firseq@erp_mes_link a where prtno=:partCode
// 根据物料号, 调用ERP方法查询一级工序
R<List<PartoplinkFirseqDTO>> result = partoplinkFirseqClient.listByPartCode(partCode);
if (ResultCode.SUCCESS.getCode() == result.getCode()) {
resultList = result.getData().stream()
.map(item -> JSONObject.parseObject(JSONObject.toJSONString(item)))
.collect(Collectors.toList());
}
return resultList;
}

@ -40,6 +40,7 @@ import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.annotation.IsAdmin;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
@ -50,6 +51,8 @@ import org.springblade.desk.process.pojo.vo.FmProjectApplicationVO;
import org.springblade.desk.process.service.IFmProjectApplicationService;
import org.springblade.desk.process.service.IFmProjectMilestoneService;
import org.springblade.desk.process.wrapper.FmProjectApplicationWrapper;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
@ -73,6 +76,8 @@ public class FmProjectApplicationController extends BladeController {
private final IFmProjectMilestoneService fmProjectMilestoneService;
private final IUserClient userClient;
/**
* 项目管理 详情
*/
@ -145,6 +150,9 @@ public class FmProjectApplicationController extends BladeController {
if(fmProjectApplication.getTouchingTime()==null){
fmProjectApplication.setTouchingTime(new Date());
}
BladeUser bladeUser = AuthUtil.getUser();
User user = userClient.userInfoById(bladeUser.getUserId()).getData();
fmProjectApplication.setTouchingMan(user.getRealName());
Boolean flag=fmProjectApplicationService.saveOrUpdate(fmProjectApplication);
if(flag){
List<FmProjectMilestoneEntity> stoneList=fmProjectApplication.getStoneList();

@ -1,15 +1,10 @@
package org.springblade.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor;
import org.springblade.common.exception.BusinessException;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springblade.erpdata.service.IErpDataSearchService;
import org.springblade.erpdata.service.IErpPartService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@ -1,35 +0,0 @@
package org.springblade.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springblade.erpdata.service.IErpDataSearchService;
import org.springblade.erpdata.service.IErpPartService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 字典服务Feign实现类
*
* @author Chill
*/
@NonDS
@Hidden
@RestController
@AllArgsConstructor
public class ErpDataSearchClient implements IErpDataSearchClient{
private final IErpDataSearchService dataSearchService;
@Override
@GetMapping(PAGE_ALLOCATION)
public R<IPage<AllocationDTO>> pageAllocation(IPage<AllocationDTO> page, AllocationDTO entity) {
return R.data(dataSearchService.queryAllocation(page, entity));
}
}

@ -0,0 +1,38 @@
package org.springblade.erpdata.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO;
import org.springblade.erpdata.service.IErpMesRbPkpqryService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 字典服务Feign实现类
*
* @author liuqingkun
*/
@NonDS
@Hidden
@RestController
@AllArgsConstructor
public class ErpMesRbPkpqryClient implements IErpMesRbPkpqryClient {
private final IErpMesRbPkpqryService mesRbPkpqryService;
@GetMapping(SELECT_PAGE)
@Override
public R<IPage<MesRbPkpqryDTO>> selectPage(Integer current, Integer size, String pkno, String prtmdept, String subpkdateStart, String subpkdateEnd) {
Query query = new Query();
query.setCurrent(current);
query.setSize(size);
return R.data(mesRbPkpqryService.page(Condition.getPage(query), pkno, prtmdept, subpkdateStart, subpkdateEnd));
}
}

@ -0,0 +1,35 @@
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.core.tool.api.R;
import org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO;
import org.springblade.erpdata.service.IErpPartoplinkFirseqService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 字典服务Feign实现类
*
* @author liuqingkun
*/
@NonDS
@Hidden
@RestController
@AllArgsConstructor
public class ErpPartoplinkFirseqClient implements IErpPartoplinkFirseqClient {
private final IErpPartoplinkFirseqService partoplinkFirseqService;
@GetMapping(LIST_BY_PART_CODE)
@Override
public R<List<PartoplinkFirseqDTO>> listByPartCode(String partCode) {
List<PartoplinkFirseqDTO> dataList = partoplinkFirseqService.listByPartCode(partCode);
return R.data(dataList);
}
}

@ -1,30 +0,0 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springblade.erpdata.pojo.dto.view.MesRbWo;
import java.util.List;
/**
* Mapper 接口
*
* @author lqk
*/
public interface ErpDataSearchMapper extends Mapper {
/**
* 查询烧结配套信息
*
* @param page
* @return
*/
List<AllocationDTO> queryAllocation(IPage page);
/**
* 从ERP视图中获取要同步的生产计划
*
* @return
*/
List<MesRbWo> getYieldPlanErpList();
}

@ -1,15 +0,0 @@
<?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.ErpDataSearchMapper">
<select id = "queryAllocation" resultType = "org.springblade.erpdata.pojo.dto.AllocationDTO">
select *
from v_mes_rb_pkpqry
where 1=1
</select>
<select id = "getYieldPlanErpList" resultType = "org.springblade.erpdata.pojo.dto.view.MesRbWo">
SELECT * FROM v_mes_rb_wo WHERE is_deleted = 0
</select>
</mapper>

@ -0,0 +1,27 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO;
import java.util.List;
/**
* Mapper 接口
*
* @author lqk
*/
public interface ErpMesRbPkpqryMapper extends Mapper {
/**
* 自定义分页 - 查询配置结果
*
* @param page 分页参数
* @param pkno 配套单号
* @param prtmdept 主制部门
* @param subpkdateStart 配套开始时间
* @param subpkdateEnd 配套结束时间
* @return
*/
List<MesRbPkpqryDTO> selectPage(IPage page, String pkno, String prtmdept, String subpkdateStart, String subpkdateEnd);
}

@ -0,0 +1,22 @@
<?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.ErpMesRbPkpqryMapper">
<select id = "selectPage" resultType = "org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO">
SELECT *
FROM v_mes_rb_pkpqry
<where>
<if test = "pkno != null and pkno != ''">
AND pkno LIKE CONCAT('%', CONCAT(#{pkno}, '%'))
</if>
<if test = "prtmdept != null and pkno != ''">
AND prtmdept LIKE CONCAT('%', CONCAT(#{prtmdept}, '%'))
</if>
<if test = "subpkdateStart != null and subpkdateStart != ''">
AND subpkdate &gt;= TO_DATE(CONCAT(#{subpkdateStart}, ' 00:00:00'), 'yyyy-mm-dd hh24:mi:ss')
</if>
<if test = "subpkdateEnd != null and subpkdateEnd != ''">
AND subpkdate &lt;= TO_DATE(CONCAT(#{subpkdateEnd}, ' 23:59:59'), 'yyyy-mm-dd hh24:mi:ss')
</if>
</where>
</select>
</mapper>

@ -0,0 +1,22 @@
package org.springblade.erpdata.mapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO;
import java.util.List;
/**
* Mapper 接口
*
* @author lqk
*/
public interface ErpPartoplinkFirseqMapper extends Mapper {
/**
* 根据物料号查询一级工序
*
* @param partCode
* @return
*/
List<PartoplinkFirseqDTO> listByPartCode(String partCode);
}

@ -0,0 +1,9 @@
<?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.ErpPartoplinkFirseqMapper">
<select id = "listByPartCode" resultType = "org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO">
select a.partno as partcode, a.partname, a.firpp, a.firppname, a.firseq, a.firseqname, a.firseqno
from v_partoplink_firseq a
where prtno = #{partCode}
</select>
</mapper>

@ -1,22 +0,0 @@
package org.springblade.erpdata.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
/**
* ERP数据查询service
*
* @author lqk
*/
public interface IErpDataSearchService {
/**
* 查询烧结配套信息
*
* @param page
* @param entity
* @return
*/
IPage<AllocationDTO> queryAllocation(IPage page, AllocationDTO entity);
}

@ -0,0 +1,25 @@
package org.springblade.erpdata.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO;
/**
* ERP数据查询service
*
* @author liuqingkun
*/
public interface IErpMesRbPkpqryService {
/**
* 查询配置结果
*
* @param page 分页参数
* @param pkno 配套单号
* @param prtmdept 主制部门
* @param subpkdateStart 配套开始时间
* @param subpkdateEnd 配套结束时间
* @return
*/
IPage<MesRbPkpqryDTO> page(IPage<MesRbPkpqryDTO> page, String pkno, String prtmdept, String subpkdateStart, String subpkdateEnd);
}

@ -0,0 +1,22 @@
package org.springblade.erpdata.service;
import org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO;
import java.util.List;
/**
* ERP数据查询service
*
* @author liuqingkun
*/
public interface IErpPartoplinkFirseqService {
/**
* 根据物料号查询一级工序
*
* @param partCode
* @return
*/
List<PartoplinkFirseqDTO> listByPartCode(String partCode);
}

@ -1,29 +0,0 @@
package org.springblade.erpdata.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.erpdata.mapper.ErpDataSearchMapper;
import org.springblade.erpdata.pojo.dto.AllocationDTO;
import org.springblade.erpdata.service.IErpDataSearchService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author lqk
* @date 2025-11-26 9:39
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpDataSearchServiceImpl implements IErpDataSearchService {
private final ErpDataSearchMapper dataSearchMapper;
@Override
public IPage<AllocationDTO> queryAllocation(IPage page, AllocationDTO entity) {
List<AllocationDTO> dataList = dataSearchMapper.queryAllocation(page);
return page.setRecords(dataList);
}
}

@ -0,0 +1,29 @@
package org.springblade.erpdata.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.erpdata.mapper.ErpMesRbPkpqryMapper;
import org.springblade.erpdata.pojo.dto.MesRbPkpqryDTO;
import org.springblade.erpdata.service.IErpMesRbPkpqryService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author liuqingkun
* @date 2026-1-31
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpMesRbPkpqryServiceImpl implements IErpMesRbPkpqryService {
private final ErpMesRbPkpqryMapper mesRbPkpqryMapper;
@Override
public IPage<MesRbPkpqryDTO> page(IPage<MesRbPkpqryDTO> page, String pkno, String prtmdept, String subpkdateStart, String subpkdateEnd) {
List<MesRbPkpqryDTO> dataList = mesRbPkpqryMapper.selectPage(page, pkno, prtmdept, subpkdateStart, subpkdateEnd);
return page.setRecords(dataList);
}
}

@ -0,0 +1,32 @@
package org.springblade.erpdata.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.erpdata.mapper.ErpPartoplinkFirseqMapper;
import org.springblade.erpdata.pojo.dto.PartoplinkFirseqDTO;
import org.springblade.erpdata.service.IErpPartoplinkFirseqService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author liuqingkun
* @date 2026-1-31
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class ErpPartoplinkFirseqServiceImpl implements IErpPartoplinkFirseqService {
private final ErpPartoplinkFirseqMapper erpPartoplinkFirseqMapper;
@Override
public List<PartoplinkFirseqDTO> listByPartCode(String partCode) {
if (StringUtils.isEmpty(partCode)) {
return null;
}
return erpPartoplinkFirseqMapper.listByPartCode(partCode);
}
}

@ -0,0 +1,134 @@
package org.springblade.scheduling.scheduling.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
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.secure.BladeUser;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.jobtransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.desk.jobtransfer.pojo.excel.CertificateTypeExcel;
import org.springblade.desk.jobtransfer.pojo.vo.CertificateTypeVO;
import org.springblade.scheduling.scheduling.service.ICertificateTypeService;
import org.springblade.scheduling.scheduling.wrapper.CertificateTypeWrapper;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 证书类型 控制器
*
* @author qyl
* @since 2026-01-08
*/
@RestController
@AllArgsConstructor
@RequestMapping("/certificateType")
@Tag(name = "证书类型维护", description = "证书类型维护接口")
public class CertificateTypeController extends BladeController {
private final ICertificateTypeService certificateTypeService;
/**
* 证书类型 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@Operation(summary = "详情", description = "传入certificateType")
public R<CertificateTypeVO> detail(CertificateTypeEntity certificateType) {
CertificateTypeEntity detail = certificateTypeService.getOne(Condition.getQueryWrapper(certificateType));
return R.data(CertificateTypeWrapper.build().entityVO(detail));
}
/**
* 证书类型 自定义分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入certificateType")
public R<IPage<CertificateTypeVO>> page(CertificateTypeVO certificateType, Query query) {
IPage<CertificateTypeVO> pages = certificateTypeService.selectCertificateTypePage(Condition.getPage(query), certificateType);
return R.data(pages);
}
/**
* 证书类型 新增
*/
@PostMapping("/save")
@ApiOperationSupport(order = 4)
@Operation(summary = "新增", description = "传入certificateType")
public R save(@Valid @RequestBody CertificateTypeEntity certificateType) {
return R.status(certificateTypeService.save(certificateType));
}
/**
* 证书类型 修改
*/
@PostMapping("/update")
@ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入certificateType")
public R update(@Valid @RequestBody CertificateTypeEntity certificateType) {
return R.status(certificateTypeService.updateById(certificateType));
}
/**
* 证书类型 新增或修改
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 6)
@Operation(summary = "新增或修改", description = "传入certificateType")
public R submit(@Valid @RequestBody CertificateTypeEntity certificateType) {
return R.status(certificateTypeService.saveOrUpdate(certificateType));
}
/**
* 证书类型 删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 7)
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(certificateTypeService.deleteLogic(Func.toLongList(ids)));
}
/**
* 导出数据
*/
@GetMapping("/export-certificateType")
@ApiOperationSupport(order = 9)
@Operation(summary = "导出数据", description = "传入certificateType")
public void exportCertificateType(@Parameter(hidden = true) @RequestParam Map<String, Object> certificateType, BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<CertificateTypeEntity> queryWrapper = Condition.getQueryWrapper(certificateType, CertificateTypeEntity.class);
//if (!AuthUtil.isAdministrator()) {
// queryWrapper.lambda().eq(CertificateType::getTenantId, bladeUser.getTenantId());
//}
//queryWrapper.lambda().eq(CertificateTypeEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<CertificateTypeExcel> list = certificateTypeService.exportCertificateType(queryWrapper);
ExcelUtil.export(response, "证书类型数据" + DateUtil.time(), "证书类型数据表", list, CertificateTypeExcel.class);
}
/**
* 质量等级表 分页
*/
@GetMapping("/selectList")
@ApiOperationSupport(order = 2)
@Operation(summary = "分页", description = "传入QualityGrade")
public R<List<CertificateTypeEntity>> selectGradeList() {
List<CertificateTypeEntity> list = certificateTypeService.list();
return R.data(list);
}
}

@ -220,4 +220,15 @@ public class QualityGradeController extends BladeController {
ExcelUtil.export(response, "质量等级表数据" + DateUtil.time(), "质量等级表数据表", list, QualityGradeExcel.class);
}
/**
* 质量等级表 分页
*/
@GetMapping("/selectList")
@ApiOperationSupport(order = 2)
@Operation(summary = "分页", description = "传入QualityGrade")
public R<List<QualityGradeEntity>> selectGradeList() {
List<QualityGradeEntity> list = qualityGradeService.list();
return R.data(list);
}
}

@ -287,7 +287,7 @@ public class WorkOrderController extends BladeController {
}
/**
* 资质执行分析 自定义分页
* 订单执行分析 自定义分页
*/
@GetMapping("/selectOrderExecuteDetailPage")
@ApiOperationSupport(order = 3)
@ -297,4 +297,26 @@ public class WorkOrderController extends BladeController {
return R.data(pages);
}
/**
* 工序执行分析 自定义分页
*/
@GetMapping("/selectProcessExecutePage")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入WorkOrder")
public R<IPage<WorkPlanVO>> selectProcessExecutePage(WorkPlanVO workPlan, Query query) {
IPage<WorkPlanVO> pages = workOrderService.selectProcessExecutePage(Condition.getPage(query), workPlan);
return R.data(pages);
}
/**
* 工序执行分析明细 自定义分页
*/
@GetMapping("/selectProcessExecuteDetailPage")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入WorkOrder")
public R<IPage<WorkPlanVO>> selectProcessExecuteDetailPage(WorkPlanVO workPlan, Query query) {
IPage<WorkPlanVO> pages = workOrderService.selectProcessExecuteDetailPage(Condition.getPage(query), workPlan);
return R.data(pages);
}
}

@ -0,0 +1,39 @@
package org.springblade.scheduling.scheduling.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.desk.jobtransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.desk.jobtransfer.pojo.excel.CertificateTypeExcel;
import org.springblade.desk.jobtransfer.pojo.vo.CertificateTypeVO;
import java.util.List;
/**
* 证书类型 Mapper 接口
*
* @author qyl
* @since 2026-01-08
*/
public interface CertificateTypeMapper extends BaseMapper<CertificateTypeEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param certificateType 查询参数
* @return List<CertificateTypeVO>
*/
List<CertificateTypeVO> selectCertificateTypePage(IPage page, CertificateTypeVO certificateType);
/**
* 获取导出数据
*
* @param queryWrapper 查询条件
* @return List<CertificateTypeExcel>
*/
List<CertificateTypeExcel> exportCertificateType(@Param("ew") Wrapper<CertificateTypeEntity> queryWrapper);
}

@ -0,0 +1,36 @@
<?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.scheduling.scheduling.mapper.CertificateTypeMapper">
<!-- 通用查询映射结果 -->
<resultMap id="mesCertificateTypeResultMap"
type="org.springblade.desk.jobtransfer.pojo.entity.CertificateTypeEntity">
<result column="ID" property="id"/>
<result column="TENANT_ID" property="tenantId"/>
<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="NAME" property="name"/>
<result column="VALIDITY_PERIOD" property="validityPeriod"/>
<result column="AIRWORTHINESS_VALIDITY_PERIOD" property="airworthinessValidityPeriod"/>
<result column="ASTRONAUT_VALIDITY_PERIOD" property="astronautValidityPeriod"/>
</resultMap>
<select id="selectCertificateTypePage" resultMap="mesCertificateTypeResultMap">
select *
from MES_CERTIFICATE_TYPE
where is_deleted = 0
</select>
<select id="exportCertificateType" resultType="org.springblade.desk.jobtransfer.pojo.excel.CertificateTypeExcel">
SELECT *
FROM MES_CERTIFICATE_TYPE ${ew.customSqlSegment}
</select>
</mapper>

@ -89,4 +89,9 @@ public interface WorkOrderMapper extends BaseMapper<WorkOrderEntity> {
List<WorkPlanVO> selectOrderExecuteDetailPage(IPage page, WorkPlanVO workPlan);
List<WorkPlanVO> selectProcessExecutePage(IPage page, WorkPlanVO workPlan);
List<WorkPlanVO> selectProcessExecuteDetailPage(IPage page, WorkPlanVO workPlan);
}

@ -395,7 +395,7 @@
sum( CASE WHEN a.FACT_END_TIME <![CDATA[ < ]]> a.PLAN_END_TIME - #{interval} / 1440 THEN 1 ELSE 0 END ) AS earlyFinishCount,
sum( CASE WHEN a.FACT_END_TIME BETWEEN a.PLAN_END_TIME - #{interval} / 1440 AND a.PLAN_END_TIME + #{interval} / 1440 THEN 1 ELSE 0 END ) AS onTimeFinishCount,
sum( CASE WHEN a.FACT_END_TIME <![CDATA[ > ]]> a.PLAN_END_TIME + #{interval} / 1440 THEN 1 ELSE 0 END ) AS delayFinishCount,
count( 1 ) AS totalOrderCount
count( 1 ) AS totalCount
FROM
MES_WORK_ORDER a
LEFT JOIN MES_YIELD_ORDER b ON a.yo_id = b.id
@ -496,4 +496,149 @@
</where>
</select>
<select id="selectProcessExecutePage" resultType="org.springblade.scheduling.scheduling.vo.WorkPlanVO">
SELECT
a.WORK_CENTER_ID AS "workCenterId",
b.wc_name AS "workCenterName",
a.ca_id AS "caId",
c.ca_name as "craftName",
a.pps_id AS "ppsId",
d.name as "processName",
sum( CASE WHEN a.FACT_START_TIME <![CDATA[ < ]]> a.PLAN_START_TIME - #{param2.interval} / 1440 THEN 1 ELSE 0 END ) AS earlyStartCount,
sum( CASE WHEN a.FACT_START_TIME BETWEEN a.PLAN_START_TIME - #{param2.interval} / 1440 AND a.PLAN_START_TIME + #{param2.interval} / 1440 THEN 1 ELSE 0 END ) AS onTimeStartCount,
sum( CASE WHEN a.FACT_START_TIME <![CDATA[ > ]]> a.PLAN_START_TIME + #{param2.interval} / 1440 THEN 1 ELSE 0 END ) AS delayStartCount,
sum( CASE WHEN a.FACT_END_TIME <![CDATA[ < ]]> a.PLAN_END_TIME - #{param2.interval} / 1440 THEN 1 ELSE 0 END ) AS earlyFinishCount,
sum( CASE WHEN a.FACT_END_TIME BETWEEN a.PLAN_END_TIME - #{param2.interval} / 1440 AND a.PLAN_END_TIME + #{param2.interval} / 1440 THEN 1 ELSE 0 END ) AS onTimeFinishCount,
sum( CASE WHEN a.FACT_END_TIME <![CDATA[ > ]]> a.PLAN_END_TIME + #{param2.interval} / 1440 THEN 1 ELSE 0 END ) AS delayFinishCount,
count( 1 ) AS totalCount
FROM
MES_WORK_PLAN a
LEFT JOIN BS_WORK_CENTER b ON a.work_center_id = b.id
LEFT JOIN BS_CRAFT_ABILITY c ON a.ca_id = c.id
LEFT JOIN BS_PROCESS_SET d ON a.pps_id = d.id
<where>
a.IS_DELETED = 0
AND PLAN_START_TIME IS NOT NULL
AND FACT_START_TIME IS NOT NULL
AND PLAN_END_TIME IS NOT NULL
AND FACT_END_TIME IS NOT NULL
<if test="param2.startTime !=null and param2.startTime != ''">
and a.fact_end_time <![CDATA[ >= ]]> to_date(#{param2.startTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.endTime !=null and param2.endTime != ''">
and a.fact_end_time <![CDATA[ <= ]]> to_date(#{param2.endTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.workCenterId !=null and param2.workCenterId != ''">
and a.work_center_id = #{param2.workCenterId}
</if>
<if test="param2.caId !=null and param2.caId != ''">
and a.ca_id = #{param2.caId}
</if>
<if test="param2.ppsId !=null and param2.ppsId != ''">
and a.pps_id = #{param2.ppsId}
</if>
</where>
group BY
a.WORK_CENTER_ID,
a.ca_id,
a.pps_id,
b.wc_name,
c.ca_name,
d.name
order by a.work_center_id
</select>
<select id="selectProcessExecuteDetailPage" resultType="org.springblade.scheduling.scheduling.vo.WorkPlanVO">
SELECT
a.WORK_CENTER_ID AS "workCenterId",
d.wc_name AS "workCenterName",
b.wo_code AS "woCode",
b.part_code AS "partCode",
c.part_name AS "partName",
b.batch_no AS "batchNo",
b.card_no AS "cardNo",
e.ca_name AS "craftName",
f.name AS "processName",
g.ts_name AS "teamName",
a.plan_start_time as "planStartTime",
a.fact_start_time as "factStartTime",
CASE WHEN a.FACT_START_TIME <![CDATA[ < ]]> a.PLAN_START_TIME - #{param2.interval} / 1440 THEN '提前'
WHEN a.FACT_START_TIME BETWEEN a.PLAN_START_TIME - #{param2.interval} / 1440 AND a.PLAN_START_TIME + #{param2.interval} / 1440 THEN '准时'
ELSE '延迟' END AS startType,
a.plan_end_time as "planEndTime",
a.fact_end_time as "factEndTime",
CASE WHEN a.FACT_END_TIME <![CDATA[ < ]]> a.PLAN_END_TIME - #{param2.interval} / 1440 THEN '提前'
WHEN a.FACT_END_TIME BETWEEN a.PLAN_END_TIME - #{param2.interval} / 1440 AND a.PLAN_END_TIME + #{param2.interval} / 1440 THEN '准时'
ELSE '延迟' END AS endType,
ROUND((a.plan_end_time - a.plan_start_time) * 1440, 0) AS "planDurationMinute",
ROUND((a.fact_end_time - a.fact_start_time) * 1440, 0) AS "factDurationMinute",
ROUND((a.fact_end_time - a.fact_start_time) * 1440, 0) - ROUND((a.plan_end_time - a.plan_start_time) * 1440, 0) as "biasDurationMinute"
FROM
MES_WORK_PLAN a
LEFT JOIN MES_WORK_ORDER b ON a.wo_id = b.id
LEFT JOIN MES_YIELD_ORDER c ON b.yo_id = c.id
LEFT JOIN BS_WORK_CENTER d ON a.work_center_id = d.id
LEFT JOIN BS_CRAFT_ABILITY e ON a.ca_id = e.id
LEFT JOIN BS_PROCESS_SET f ON a.pps_id = f.id
LEFT JOIN BS_TEAM_SET g ON a.make_team = g.id
<where>
a.IS_DELETED = 0
AND a.PLAN_START_TIME IS NOT NULL
AND a.FACT_START_TIME IS NOT NULL
AND a.PLAN_END_TIME IS NOT NULL
AND a.FACT_END_TIME IS NOT NULL
<if test="param2.startTime !=null and param2.startTime != ''">
and a.fact_end_time <![CDATA[ >= ]]> to_date(#{param2.startTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.endTime !=null and param2.endTime != ''">
and a.fact_end_time <![CDATA[ <= ]]> to_date(#{param2.endTime},'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="param2.partCode !=null and param2.partCode != ''">
and b.part_code like concat(concat('%',#{param2.partCode}),'%')
</if>
<if test="param2.woCode !=null and param2.woCode != ''">
and b.wo_code like concat(concat('%',#{param2.woCode}),'%')
</if>
<if test="param2.workCenterId !=null and param2.workCenterId != ''">
and a.work_center_id = #{param2.workCenterId}
</if>
<if test="param2.cardNo !=null and param2.cardNo != ''">
and b.card_no = #{param2.cardNo}
</if>
<if test="param2.batchNo !=null and param2.batchNo != ''">
and b.batch_no = #{param2.batchNo}
</if>
<if test="param2.caId !=null and param2.caId != ''">
and a.ca_id = #{param2.caId}
</if>
<if test="param2.ppsId !=null and param2.ppsId != ''">
and a.pps_id = #{param2.ppsId}
</if>
<if test="param2.partCode !=null and param2.partCode != ''">
and b.part_code like concat(concat('%',#{param2.partCode}),'%')
</if>
<if test="param2.makeTeam !=null and param2.makeTeam != ''">
and a.make_team = #{param2.makeTeam}
</if>
<if test="param2.interval != null and param2.interval != '' and param2.startType == '提前'">
and a.FACT_START_TIME <![CDATA[ < ]]> a.PLAN_START_TIME - #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.startType == '准时'">
and a.FACT_START_TIME BETWEEN a.PLAN_START_TIME - #{param2.interval} / 1440 AND a.PLAN_START_TIME + #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.startType == '延迟'">
and a.FACT_START_TIME <![CDATA[ > ]]> a.PLAN_START_TIME + #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.endType == '提前'">
and a.FACT_END_TIME <![CDATA[ < ]]> a.PLAN_END_TIME - #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.endType == '准时'">
and a.FACT_END_TIME BETWEEN a.PLAN_END_TIME - #{param2.interval} / 1440 AND a.PLAN_END_TIME + #{param2.interval} / 1440
</if>
<if test="param2.interval != null and param2.interval != '' and param2.endType == '延迟'">
and a.FACT_END_TIME <![CDATA[ > ]]> a.PLAN_END_TIME + #{param2.interval} / 1440
</if>
</where>
</select>
</mapper>

@ -0,0 +1,37 @@
package org.springblade.scheduling.scheduling.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.jobtransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.desk.jobtransfer.pojo.excel.CertificateTypeExcel;
import org.springblade.desk.jobtransfer.pojo.vo.CertificateTypeVO;
import java.util.List;
/**
* 证书类型 服务类
*
* @author qyl
* @since 2026-01-08
*/
public interface ICertificateTypeService extends BaseService<CertificateTypeEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param certificateType 查询参数
* @return IPage<CertificateTypeVO>
*/
IPage<CertificateTypeVO> selectCertificateTypePage(IPage<CertificateTypeVO> page, CertificateTypeVO certificateType);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<CertificateTypeExcel>
*/
List<CertificateTypeExcel> exportCertificateType(Wrapper<CertificateTypeEntity> queryWrapper);
}

@ -113,4 +113,9 @@ public interface IWorkOrderService extends BaseService<WorkOrderEntity> {
List<WorkPlanVO> selectCenterExecuteList(WorkPlanVO workPlan);
IPage<WorkPlanVO> selectOrderExecuteDetailPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan);
IPage<WorkPlanVO> selectProcessExecutePage(IPage<WorkPlanVO> page, WorkPlanVO workPlan);
IPage<WorkPlanVO> selectProcessExecuteDetailPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan);
}

@ -0,0 +1,39 @@
package org.springblade.scheduling.scheduling.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.jobtransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.desk.jobtransfer.pojo.excel.CertificateTypeExcel;
import org.springblade.desk.jobtransfer.pojo.vo.CertificateTypeVO;
import org.springblade.scheduling.scheduling.mapper.CertificateTypeMapper;
import org.springblade.scheduling.scheduling.service.ICertificateTypeService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 证书类型 服务实现类
*
* @author qyl
* @since 2026-01-08
*/
@Service
public class CertificateTypeServiceImpl extends BaseServiceImpl<CertificateTypeMapper, CertificateTypeEntity> implements ICertificateTypeService {
@Override
public IPage<CertificateTypeVO> selectCertificateTypePage(IPage<CertificateTypeVO> page, CertificateTypeVO certificateType) {
return page.setRecords(baseMapper.selectCertificateTypePage(page, certificateType));
}
@Override
public List<CertificateTypeExcel> exportCertificateType(Wrapper<CertificateTypeEntity> queryWrapper) {
List<CertificateTypeExcel> certificateTypeList = baseMapper.exportCertificateType(queryWrapper);
//certificateTypeList.forEach(certificateType -> {
// certificateType.setTypeName(DictCache.getValue(DictEnum.YES_NO, CertificateType.getType()));
//});
return certificateTypeList;
}
}

@ -1472,15 +1472,18 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
@Override
public List<WorkPlanVO> selectCenterExecuteList(WorkPlanVO workPlan) {
if(workPlan.getInterval() == null){
workPlan.setInterval(0);
}
List<WorkPlanVO> list = baseMapper.selectCenterExecuteList(workPlan);
if (CollectionUtils.isNotEmpty(list)) {
for (WorkPlanVO vo : list) {
vo.setEarlyStartCountRate(vo.getEarlyStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyStartCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setOnTimeStartCountRate(vo.getOnTimeStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeStartCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setDelayStartCountRate(vo.getDelayStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayStartCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setEarlyFinishCountRate(vo.getEarlyFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyFinishCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setOnTimeFinishCountRate(vo.getOnTimeFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeFinishCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setDelayFinishCountRate(vo.getDelayFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayFinishCount() / vo.getTotalOrderCount())) * 100 + "%");
vo.setEarlyStartCountRate(vo.getEarlyStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyStartCount() / vo.getTotalCount())) * 100 + "%");
vo.setOnTimeStartCountRate(vo.getOnTimeStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeStartCount() / vo.getTotalCount())) * 100 + "%");
vo.setDelayStartCountRate(vo.getDelayStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayStartCount() / vo.getTotalCount())) * 100 + "%");
vo.setEarlyFinishCountRate(vo.getEarlyFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyFinishCount() / vo.getTotalCount())) * 100 + "%");
vo.setOnTimeFinishCountRate(vo.getOnTimeFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeFinishCount() / vo.getTotalCount())) * 100 + "%");
vo.setDelayFinishCountRate(vo.getDelayFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayFinishCount() / vo.getTotalCount())) * 100 + "%");
}
}
return list;
@ -1488,6 +1491,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
@Override
public IPage<WorkPlanVO> selectOrderExecuteDetailPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan) {
if(workPlan.getInterval() == null){
workPlan.setInterval(0);
}
if (StringUtils.isNotEmpty(workPlan.getStartTime())) {
workPlan.setStartTime(workPlan.getStartTime() + " 00:00:00");
}
@ -1498,5 +1504,46 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
return page.setRecords(list);
}
@Override
public IPage<WorkPlanVO> selectProcessExecutePage(IPage<WorkPlanVO> page, WorkPlanVO workPlan) {
if(workPlan.getInterval() == null){
workPlan.setInterval(0);
}
if (StringUtils.isNotEmpty(workPlan.getStartTime())) {
workPlan.setStartTime(workPlan.getStartTime() + " 00:00:00");
}
if (StringUtils.isNotEmpty(workPlan.getEndTime())) {
workPlan.setEndTime(workPlan.getEndTime() + " 23:59:59");
}
List<WorkPlanVO> list = baseMapper.selectProcessExecutePage(page, workPlan);
if (CollectionUtils.isNotEmpty(list)) {
for (WorkPlanVO vo : list) {
vo.setEarlyStartCountRate(vo.getEarlyStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyStartCount() / vo.getTotalCount())) * 100 + "%");
vo.setOnTimeStartCountRate(vo.getOnTimeStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeStartCount() / vo.getTotalCount())) * 100 + "%");
vo.setDelayStartCountRate(vo.getDelayStartCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayStartCount() / vo.getTotalCount())) * 100 + "%");
vo.setEarlyFinishCountRate(vo.getEarlyFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getEarlyFinishCount() / vo.getTotalCount())) * 100 + "%");
vo.setOnTimeFinishCountRate(vo.getOnTimeFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getOnTimeFinishCount() / vo.getTotalCount())) * 100 + "%");
vo.setDelayFinishCountRate(vo.getDelayFinishCount() == 0 ? "0" : Double.parseDouble(String.format("%.2f", (double) vo.getDelayFinishCount() / vo.getTotalCount())) * 100 + "%");
}
}
return page.setRecords(list);
}
@Override
public IPage<WorkPlanVO> selectProcessExecuteDetailPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan) {
if(workPlan.getInterval() == null){
workPlan.setInterval(0);
}
if (StringUtils.isNotEmpty(workPlan.getStartTime())) {
workPlan.setStartTime(workPlan.getStartTime() + " 00:00:00");
}
if (StringUtils.isNotEmpty(workPlan.getEndTime())) {
workPlan.setEndTime(workPlan.getEndTime() + " 23:59:59");
}
List<WorkPlanVO> list = baseMapper.selectProcessExecuteDetailPage(page, workPlan);
return page.setRecords(list);
}
}

@ -26,11 +26,15 @@
package org.springblade.scheduling.scheduling.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.scheduling.pojo.entity.WorkOrderEntity;
import org.springblade.scheduling.pojo.entity.WorkPlanEntity;
import org.springblade.scheduling.scheduling.excel.WorkPlanExcel;
import org.springblade.scheduling.scheduling.mapper.WorkOrderMapper;
import org.springblade.scheduling.scheduling.mapper.WorkPlanMapper;
import org.springblade.scheduling.scheduling.service.ICraftAbilityService;
import org.springblade.scheduling.scheduling.service.IWorkPlanService;
import org.springblade.scheduling.scheduling.vo.WorkPlanVO;
import org.springframework.stereotype.Service;
@ -51,8 +55,11 @@ import java.util.List;
* @since 2025-11-28
*/
@Service
@RequiredArgsConstructor
public class WorkPlanServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPlanEntity> implements IWorkPlanService {
private final WorkOrderMapper workOrderMapper;
@Override
public IPage<WorkPlanVO> selectWorkPlanPage(IPage<WorkPlanVO> page, WorkPlanVO workPlan) {
return page.setRecords(baseMapper.selectWorkPlanPage(page, workPlan));
@ -83,11 +90,24 @@ public class WorkPlanServiceImpl extends BaseServiceImpl<WorkPlanMapper, WorkPla
baseMapper.updateById(item);
});
}
}
if (ObjectUtils.isNotEmpty(factEndTime)) {
workPlanUpdate.setFactEndTime(LocalDateTime.ofInstant(factEndTime.toInstant(), ZoneId.systemDefault()));
workPlanUpdate.setStatus(WorkPlanEntity.STATUS_COMPLETE);
}
this.updateById(workPlanUpdate);
//获取所有计划
WorkPlanEntity workPlan = baseMapper.selectById(id);
List<WorkPlanEntity> allPlanList = baseMapper.selectList(Wrappers.<WorkPlanEntity>lambdaQuery().eq(WorkPlanEntity::getWoId,workPlan.getWoId()).orderByAsc(WorkPlanEntity::getOrders));
//获取车间订单
WorkOrderEntity workOrder = workOrderMapper.selectById(workPlan.getWoId());
if(workOrder.getFactStartTime() == null && allPlanList.get(0).getFactStartTime() != null){
workOrder.setFactStartTime(allPlanList.get(0).getFactStartTime());
}
if(workOrder.getFactEndTime() == null && allPlanList.get(allPlanList.size()-1).getFactEndTime()!=null){
workOrder.setFactEndTime(allPlanList.get(allPlanList.size()-1).getFactEndTime());
}
workOrderMapper.updateById(workOrder);
}
}

@ -43,6 +43,11 @@ public class WorkPlanVO extends WorkPlanEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 零件号
*/
private String partCode;
private String partName;
private String batchNo;
@ -81,7 +86,7 @@ public class WorkPlanVO extends WorkPlanEntity {
private String earlyFinishCountRate;
private String onTimeFinishCountRate;
private String delayFinishCountRate;
private Integer totalOrderCount;
private Integer totalCount;
private Integer interval;
private String startType;
private String endType;

@ -0,0 +1,35 @@
package org.springblade.scheduling.scheduling.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.desk.jobtransfer.pojo.entity.CertificateTypeEntity;
import org.springblade.desk.jobtransfer.pojo.vo.CertificateTypeVO;
import java.util.Objects;
/**
* 证书类型 包装类,返回视图层所需的字段
*
* @author qyl
* @since 2026-01-08
*/
public class CertificateTypeWrapper extends BaseEntityWrapper<CertificateTypeEntity, CertificateTypeVO> {
public static CertificateTypeWrapper build() {
return new CertificateTypeWrapper();
}
@Override
public CertificateTypeVO entityVO(CertificateTypeEntity certificateType) {
CertificateTypeVO certificateTypeVO = Objects.requireNonNull(BeanUtil.copyProperties(certificateType, CertificateTypeVO.class));
//User createUser = UserCache.getUser(certificateType.getCreateUser());
//User updateUser = UserCache.getUser(certificateType.getUpdateUser());
//certificateTypeVO.setCreateUserName(createUser.getName());
//certificateTypeVO.setUpdateUserName(updateUser.getName());
return certificateTypeVO;
}
}
Loading…
Cancel
Save