From 98fc64576d9cb494dddefa8e1ecdf28fd0774fc1 Mon Sep 17 00:00:00 2001 From: sunjianxi <839419401@qq.com> Date: Fri, 27 Feb 2026 14:24:36 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=8E=92=E4=BA=A7=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=88=86=E6=9E=90-sjx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/WorkPlanEntity.java | 5 +- .../FmProjectApplicationController.java | 8 + .../controller/CertificateTypeController.java | 134 ++++++++++++++++ .../controller/QualityGradeController.java | 11 ++ .../controller/WorkOrderController.java | 24 ++- .../mapper/CertificateTypeMapper.java | 39 +++++ .../mapper/CertificateTypeMapper.xml | 36 +++++ .../scheduling/mapper/WorkOrderMapper.java | 5 + .../scheduling/mapper/WorkOrderMapper.xml | 147 +++++++++++++++++- .../service/ICertificateTypeService.java | 37 +++++ .../scheduling/service/IWorkOrderService.java | 5 + .../impl/CertificateTypeServiceImpl.java | 39 +++++ .../service/impl/WorkOrderServiceImpl.java | 59 ++++++- .../service/impl/WorkPlanServiceImpl.java | 20 +++ .../scheduling/scheduling/vo/WorkPlanVO.java | 7 +- .../wrapper/CertificateTypeWrapper.java | 35 +++++ 16 files changed, 598 insertions(+), 13 deletions(-) create mode 100644 blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/CertificateTypeController.java create mode 100644 blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.java create mode 100644 blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.xml create mode 100644 blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/ICertificateTypeService.java create mode 100644 blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/CertificateTypeServiceImpl.java create mode 100644 blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/wrapper/CertificateTypeWrapper.java diff --git a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java index 0f41ac6d..0bd714cf 100644 --- a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java +++ b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java @@ -274,9 +274,6 @@ public class WorkPlanEntity extends BaseEntity { */ private String factTeamMembers; - /** - * 零件号 - */ - private String partCode; + } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApplicationController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApplicationController.java index bcf09a40..d43202d5 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApplicationController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApplicationController.java @@ -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 stoneList=fmProjectApplication.getStoneList(); diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/CertificateTypeController.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/CertificateTypeController.java new file mode 100644 index 00000000..61f50a6d --- /dev/null +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/CertificateTypeController.java @@ -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 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> page(CertificateTypeVO certificateType, Query query) { + IPage 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 certificateType, BladeUser bladeUser, HttpServletResponse response) { + QueryWrapper 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 list = certificateTypeService.exportCertificateType(queryWrapper); + ExcelUtil.export(response, "证书类型数据" + DateUtil.time(), "证书类型数据表", list, CertificateTypeExcel.class); + } + + /** + * 质量等级表 分页 + */ + @GetMapping("/selectList") + @ApiOperationSupport(order = 2) + @Operation(summary = "分页", description = "传入QualityGrade") + public R> selectGradeList() { + List list = certificateTypeService.list(); + return R.data(list); + } + +} diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java index c121b502..310287fc 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java @@ -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> selectGradeList() { + List list = qualityGradeService.list(); + return R.data(list); + } + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java index 5f022d9b..0fb68fcd 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java @@ -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> selectProcessExecutePage(WorkPlanVO workPlan, Query query) { + IPage pages = workOrderService.selectProcessExecutePage(Condition.getPage(query), workPlan); + return R.data(pages); + } + + /** + * 工序执行分析明细 自定义分页 + */ + @GetMapping("/selectProcessExecuteDetailPage") + @ApiOperationSupport(order = 3) + @Operation(summary = "分页", description = "传入WorkOrder") + public R> selectProcessExecuteDetailPage(WorkPlanVO workPlan, Query query) { + IPage pages = workOrderService.selectProcessExecuteDetailPage(Condition.getPage(query), workPlan); + return R.data(pages); + } + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.java new file mode 100644 index 00000000..912c2c1b --- /dev/null +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.java @@ -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 { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param certificateType 查询参数 + * @return List + */ + List selectCertificateTypePage(IPage page, CertificateTypeVO certificateType); + + + /** + * 获取导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportCertificateType(@Param("ew") Wrapper queryWrapper); + +} diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.xml new file mode 100644 index 00000000..8432019f --- /dev/null +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java index 1926cd65..b2dce072 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java @@ -89,4 +89,9 @@ public interface WorkOrderMapper extends BaseMapper { List selectOrderExecuteDetailPage(IPage page, WorkPlanVO workPlan); + List selectProcessExecutePage(IPage page, WorkPlanVO workPlan); + + List selectProcessExecuteDetailPage(IPage page, WorkPlanVO workPlan); + + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml index b5e42fe3..5098abf6 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml @@ -395,7 +395,7 @@ sum( CASE WHEN a.FACT_END_TIME 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 ]]> 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 @@ + + + + diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/ICertificateTypeService.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/ICertificateTypeService.java new file mode 100644 index 00000000..736de04f --- /dev/null +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/ICertificateTypeService.java @@ -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 { + /** + * 自定义分页 + * + * @param page 分页参数 + * @param certificateType 查询参数 + * @return IPage + */ + IPage selectCertificateTypePage(IPage page, CertificateTypeVO certificateType); + + + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportCertificateType(Wrapper queryWrapper); + +} diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java index 4eef3a0d..8a4b6ea4 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java @@ -113,4 +113,9 @@ public interface IWorkOrderService extends BaseService { List selectCenterExecuteList(WorkPlanVO workPlan); IPage selectOrderExecuteDetailPage(IPage page, WorkPlanVO workPlan); + + IPage selectProcessExecutePage(IPage page, WorkPlanVO workPlan); + + IPage selectProcessExecuteDetailPage(IPage page, WorkPlanVO workPlan); + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/CertificateTypeServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/CertificateTypeServiceImpl.java new file mode 100644 index 00000000..4f4a1cbf --- /dev/null +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/CertificateTypeServiceImpl.java @@ -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 implements ICertificateTypeService { + + @Override + public IPage selectCertificateTypePage(IPage page, CertificateTypeVO certificateType) { + return page.setRecords(baseMapper.selectCertificateTypePage(page, certificateType)); + } + + + @Override + public List exportCertificateType(Wrapper queryWrapper) { + List certificateTypeList = baseMapper.exportCertificateType(queryWrapper); + //certificateTypeList.forEach(certificateType -> { + // certificateType.setTypeName(DictCache.getValue(DictEnum.YES_NO, CertificateType.getType())); + //}); + return certificateTypeList; + } + +} diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java index 50b6f1eb..40792205 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java @@ -1472,15 +1472,18 @@ public class WorkOrderServiceImpl extends BaseServiceImpl selectCenterExecuteList(WorkPlanVO workPlan) { + if(workPlan.getInterval() == null){ + workPlan.setInterval(0); + } List 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 selectOrderExecuteDetailPage(IPage 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 selectProcessExecutePage(IPage 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 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 selectProcessExecuteDetailPage(IPage 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 list = baseMapper.selectProcessExecuteDetailPage(page, workPlan); + return page.setRecords(list); + } + + } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java index 09d0122f..1d42cc5b 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java @@ -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 implements IWorkPlanService { + private final WorkOrderMapper workOrderMapper; + @Override public IPage selectWorkPlanPage(IPage page, WorkPlanVO workPlan) { return page.setRecords(baseMapper.selectWorkPlanPage(page, workPlan)); @@ -83,11 +90,24 @@ public class WorkPlanServiceImpl extends BaseServiceImpl allPlanList = baseMapper.selectList(Wrappers.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); } } diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/vo/WorkPlanVO.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/vo/WorkPlanVO.java index 79e9bbfb..3caa6c1c 100644 --- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/vo/WorkPlanVO.java +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/vo/WorkPlanVO.java @@ -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; diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/wrapper/CertificateTypeWrapper.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/wrapper/CertificateTypeWrapper.java new file mode 100644 index 00000000..77d985a4 --- /dev/null +++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/wrapper/CertificateTypeWrapper.java @@ -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 { + + 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; + } + + +} From 4fbb5653532c9fb79378ed14ea9cdd42cdc96b6d Mon Sep 17 00:00:00 2001 From: ShiJiuZhou <15315423958@163.com> Date: Fri, 27 Feb 2026 14:53:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=97=B6=E6=97=A5=E5=BF=97=E5=AD=98=E5=82=A8=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=9F=A5=E8=AF=A2=E7=99=BB=E9=99=86=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/BladeAuthorizationHandler.java | 39 ++++++++++++++++- .../core/log/controller/LogApiController.java | 15 ++++++- .../core/log/pojo/dto/UserLoginStatsDTO.java | 39 +++++++++++++++++ .../core/log/service/ILogApiService.java | 10 +++++ .../log/service/impl/LogApiServiceImpl.java | 42 +++++++++++++++++++ 5 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 blade-ops/blade-log/src/main/java/org/springblade/core/log/pojo/dto/UserLoginStatsDTO.java diff --git a/blade-auth/src/main/java/org/springblade/auth/handler/BladeAuthorizationHandler.java b/blade-auth/src/main/java/org/springblade/auth/handler/BladeAuthorizationHandler.java index 33d7f27e..939d2fc8 100644 --- a/blade-auth/src/main/java/org/springblade/auth/handler/BladeAuthorizationHandler.java +++ b/blade-auth/src/main/java/org/springblade/auth/handler/BladeAuthorizationHandler.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 redisTemplate; /** * 自定义弱密码列表 @@ -134,10 +143,36 @@ 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 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); + } /** * 认证失败回调 * diff --git a/blade-ops/blade-log/src/main/java/org/springblade/core/log/controller/LogApiController.java b/blade-ops/blade-log/src/main/java/org/springblade/core/log/controller/LogApiController.java index 5ba1d79f..0e09ccb6 100644 --- a/blade-ops/blade-log/src/main/java/org/springblade/core/log/controller/LogApiController.java +++ b/blade-ops/blade-log/src/main/java/org/springblade/core/log/controller/LogApiController.java @@ -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> getUserLoginStats( + @RequestParam(required = false) String username, + @RequestParam(required = false) String deptId + ) { + // 获取所有 user:login:* 键 + List result = logService.getUserLoginStats(username, deptId); + return R.data(result); + } + } diff --git a/blade-ops/blade-log/src/main/java/org/springblade/core/log/pojo/dto/UserLoginStatsDTO.java b/blade-ops/blade-log/src/main/java/org/springblade/core/log/pojo/dto/UserLoginStatsDTO.java new file mode 100644 index 00000000..279eab47 --- /dev/null +++ b/blade-ops/blade-log/src/main/java/org/springblade/core/log/pojo/dto/UserLoginStatsDTO.java @@ -0,0 +1,39 @@ +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; +} diff --git a/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/ILogApiService.java b/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/ILogApiService.java index 08cf39a8..95d79b4c 100644 --- a/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/ILogApiService.java +++ b/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/ILogApiService.java @@ -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 { + /** + * 获取用户登录状态 + * @param username 用户名 + * @param deptId 部门ID + * @return 用户登录状态列表 + */ + List getUserLoginStats(String username, String deptId); } diff --git a/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/impl/LogApiServiceImpl.java b/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/impl/LogApiServiceImpl.java index c3c0de68..407f230e 100644 --- a/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/impl/LogApiServiceImpl.java +++ b/blade-ops/blade-log/src/main/java/org/springblade/core/log/service/impl/LogApiServiceImpl.java @@ -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,39 @@ import org.springframework.stereotype.Service; @Service public class LogApiServiceImpl extends ServiceImpl implements ILogApiService { + @Resource + private RedisTemplate redisTemplate; + @Override + public List getUserLoginStats(String username, String deptId) { + Set keys = redisTemplate.keys("user:login:*"); + if (keys == null || keys.isEmpty()) { + new ArrayList<>(); + } + // 获取用户登录信息(带筛选) + List result = new ArrayList<>(); + for (String key : Objects.requireNonNull(keys)) { + HashOperations hashOps = redisTemplate.opsForHash(); + String userId = key.replace("user:login:", ""); + String currentUsername = (String) hashOps.get(key, "username"); + String currentDeptId = (String) hashOps.get(key, "deptId"); + // 过滤条件:根据 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 + )); + } + } + } + return result; + } }