排产统计分析-sjx

liweidong
sunjianxi 2 months ago
parent df0904443d
commit 98fc64576d
  1. 5
      blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/pojo/entity/WorkPlanEntity.java
  2. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApplicationController.java
  3. 134
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/CertificateTypeController.java
  4. 11
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/QualityGradeController.java
  5. 24
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/WorkOrderController.java
  6. 39
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.java
  7. 36
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/CertificateTypeMapper.xml
  8. 5
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.java
  9. 147
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  10. 37
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/ICertificateTypeService.java
  11. 5
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IWorkOrderService.java
  12. 39
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/CertificateTypeServiceImpl.java
  13. 59
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  14. 20
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkPlanServiceImpl.java
  15. 7
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/vo/WorkPlanVO.java
  16. 35
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/wrapper/CertificateTypeWrapper.java

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

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

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