Merge remote-tracking branch 'origin/master'

develop-QA
liuqingkun 4 months ago
commit 38e3eec46c
  1. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/SchedulingApplication.java
  2. 5
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/EquipResourceController.java
  3. 161
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/PersonResourceController.java
  4. 163
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/controller/YieldOrderController.java
  5. 4
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/dto/WorkOrderDto.java
  6. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/entity/EquipAbilityEntity.java
  7. 4
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/entity/EquipResourceEntity.java
  8. 6
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/entity/PersonResourceEntity.java
  9. 18
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/entity/YieldOrderEntity.java
  10. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/EquipResourceMapper.java
  11. 6
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/EquipResourceMapper.xml
  12. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/PersonResourceMapper.java
  13. 14
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/PersonResourceMapper.xml
  14. 4
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
  15. 27
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/YieldOrderMapper.xml
  16. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IEquipResourceService.java
  17. 2
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/IPersonResourceService.java
  18. 146
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java
  19. 88
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java
  20. 70
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/WorkOrderServiceImpl.java
  21. 15
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/task/EquipResourceJob.java
  22. 30
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/task/InitResourceJob.java
  23. 28
      blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/task/SchedulingJob.java

@ -29,6 +29,7 @@ import org.springblade.common.constant.LauncherConstant;
import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springblade.core.launch.constant.AppConstant;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* Desk启动器
@ -36,6 +37,7 @@ import org.springblade.core.launch.constant.AppConstant;
* @author Chill
*/
@BladeCloudApplication
@EnableScheduling
public class SchedulingApplication {
public static void main(String[] args) {

@ -153,4 +153,9 @@ public class EquipResourceController extends BladeController {
ExcelUtil.export(response, "设备资源表数据" + DateUtil.time(), "设备资源表数据表", list, EquipResourceExcel.class);
}
@GetMapping("/initEquipResource")
@ApiOperationSupport(order = 9)
public void initEquipResource(){
equipResourceService.initEquipResource();
}
}

@ -0,0 +1,161 @@
/**
* 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.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.secure.annotation.IsAdmin;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.scheduling.scheduling.entity.PersonResourceEntity;
import org.springblade.scheduling.scheduling.excel.PersonResourceExcel;
import org.springblade.scheduling.scheduling.service.IPersonResourceService;
import org.springblade.scheduling.scheduling.vo.PersonResourceVO;
import org.springblade.scheduling.scheduling.wrapper.PersonResourceWrapper;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 设备资源表 控制器
*
* @author BladeX
* @since 2025-11-12
*/
@RestController
@AllArgsConstructor
@RequestMapping("/personResource")
@Tag(name = "人员资源表", description = "人员资源表接口")
public class PersonResourceController extends BladeController {
private final IPersonResourceService personResourceService;
/**
* 设备资源表 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@Operation(summary = "详情", description = "传入mesPersonResource")
public R<PersonResourceVO> detail(PersonResourceEntity entity) {
PersonResourceEntity detail = personResourceService.getOne(Condition.getQueryWrapper(entity));
return R.data(PersonResourceWrapper.build().entityVO(detail));
}
/**
* 设备资源表 分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 2)
@Operation(summary = "分页", description = "传入mesPersonResource")
public R<IPage<PersonResourceVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> entity, Query query) {
IPage<PersonResourceEntity> pages = personResourceService.page(Condition.getPage(query), Condition.getQueryWrapper(entity, PersonResourceEntity.class));
return R.data(PersonResourceWrapper.build().pageVO(pages));
}
/**
* 设备资源表 自定义分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入mesPersonResource")
public R<IPage<PersonResourceVO>> page(PersonResourceVO entity, Query query) {
IPage<PersonResourceVO> pages = personResourceService.selectPersonResourcePage(Condition.getPage(query), entity);
return R.data(pages);
}
/**
* 设备资源表 新增
*/
@PostMapping("/save")
@ApiOperationSupport(order = 4)
@Operation(summary = "新增", description = "传入mesPersonResource")
public R save(@Valid @RequestBody PersonResourceEntity entity) {
return R.status(personResourceService.save(entity));
}
/**
* 设备资源表 修改
*/
@PostMapping("/update")
@ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入mesPersonResource")
public R update(@Valid @RequestBody PersonResourceEntity entity) {
return R.status(personResourceService.updateById(entity));
}
/**
* 设备资源表 新增或修改
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 6)
@Operation(summary = "新增或修改", description = "传入mesPersonResource")
public R submit(@Valid @RequestBody PersonResourceEntity entity) {
return R.status(personResourceService.saveOrUpdate(entity));
}
/**
* 设备资源表 删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 7)
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(personResourceService.deleteLogic(Func.toLongList(ids)));
}
/**
* 导出数据
*/
@IsAdmin
@GetMapping("/export")
@ApiOperationSupport(order = 9)
@Operation(summary = "导出数据", description = "传入mesPersonResource")
public void export(@Parameter(hidden = true) @RequestParam Map<String, Object> entity, BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<PersonResourceEntity> queryWrapper = Condition.getQueryWrapper(entity, PersonResourceEntity.class);
List<PersonResourceExcel> list = personResourceService.export(queryWrapper);
ExcelUtil.export(response, "设备资源表数据" + DateUtil.time(), "设备资源表数据表", list, PersonResourceExcel.class);
}
@GetMapping("/initPersonResource")
@ApiOperationSupport(order = 9)
public void initPersonResource(){
personResourceService.initPersonResource();
}
}

@ -0,0 +1,163 @@
/**
* 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.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.secure.annotation.IsAdmin;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.scheduling.scheduling.entity.YieldOrderEntity;
import org.springblade.scheduling.scheduling.excel.YieldOrderExcel;
import org.springblade.scheduling.scheduling.service.IYieldOrderService;
import org.springblade.scheduling.scheduling.vo.YieldOrderVO;
import org.springblade.scheduling.scheduling.wrapper.YieldOrderWrapper;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 车间订单表 控制器
*
* @author BladeX
* @since 2025-11-28
*/
@RestController
@AllArgsConstructor
@RequestMapping("/yieldOrder")
@Tag(name = "车间订单表", description = "车间订单表接口")
public class YieldOrderController extends BladeController {
private final IYieldOrderService YieldOrderService;
/**
* 车间订单表 详情
*/
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@Operation(summary = "详情", description = "传入YieldOrder")
public R<YieldOrderVO> detail(YieldOrderEntity YieldOrder) {
YieldOrderEntity detail = YieldOrderService.getOne(Condition.getQueryWrapper(YieldOrder));
return R.data(YieldOrderWrapper.build().entityVO(detail));
}
/**
* 车间订单表 分页
*/
@GetMapping("/list")
@ApiOperationSupport(order = 2)
@Operation(summary = "分页", description = "传入YieldOrder")
public R<IPage<YieldOrderVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> YieldOrder, Query query) {
IPage<YieldOrderEntity> pages = YieldOrderService.page(Condition.getPage(query), Condition.getQueryWrapper(YieldOrder, YieldOrderEntity.class));
return R.data(YieldOrderWrapper.build().pageVO(pages));
}
/**
* 车间订单表 自定义分页
*/
@GetMapping("/page")
@ApiOperationSupport(order = 3)
@Operation(summary = "分页", description = "传入YieldOrder")
public R<IPage<YieldOrderVO>> page(YieldOrderVO YieldOrder, Query query) {
IPage<YieldOrderVO> pages = YieldOrderService.selectYieldOrderPage(Condition.getPage(query), YieldOrder);
return R.data(pages);
}
/**
* 车间订单表 新增
*/
@PostMapping("/save")
@ApiOperationSupport(order = 4)
@Operation(summary = "新增", description = "传入YieldOrder")
public R save(@Valid @RequestBody YieldOrderEntity YieldOrder) {
return R.status(YieldOrderService.save(YieldOrder));
}
/**
* 车间订单表 修改
*/
@PostMapping("/update")
@ApiOperationSupport(order = 5)
@Operation(summary = "修改", description = "传入YieldOrder")
public R update(@Valid @RequestBody YieldOrderEntity YieldOrder) {
return R.status(YieldOrderService.updateById(YieldOrder));
}
/**
* 车间订单表 新增或修改
*/
@PostMapping("/submit")
@ApiOperationSupport(order = 6)
@Operation(summary = "新增或修改", description = "传入YieldOrder")
public R submit(@Valid @RequestBody YieldOrderEntity YieldOrder) {
return R.status(YieldOrderService.saveOrUpdate(YieldOrder));
}
/**
* 车间订单表 删除
*/
@PostMapping("/remove")
@ApiOperationSupport(order = 7)
@Operation(summary = "逻辑删除", description = "传入ids")
public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
return R.status(YieldOrderService.deleteLogic(Func.toLongList(ids)));
}
/**
* 导出数据
*/
@IsAdmin
@GetMapping("/export")
@ApiOperationSupport(order = 9)
@Operation(summary = "导出数据", description = "传入YieldOrder")
public void exportYieldOrder(@Parameter(hidden = true) @RequestParam Map<String, Object> YieldOrder, BladeUser bladeUser, HttpServletResponse response) {
QueryWrapper<YieldOrderEntity> queryWrapper = Condition.getQueryWrapper(YieldOrder, YieldOrderEntity.class);
//if (!AuthUtil.isAdministrator()) {
// queryWrapper.lambda().eq(YieldOrder::getTenantId, bladeUser.getTenantId());
//}
//queryWrapper.lambda().eq(YieldOrderEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
List<YieldOrderExcel> list = YieldOrderService.export(queryWrapper);
ExcelUtil.export(response, "车间订单表数据" + DateUtil.time(), "车间订单表数据表", list, YieldOrderExcel.class);
}
}

@ -17,6 +17,10 @@ public class WorkOrderDto {
private String processName;
private String startTime;
private String endTime;
private String planStartTime;
private String planEndTime;
private String factStartTime;
private String factEndTime;
private String teamName;
private String equipName;
private String equipCode;

@ -53,7 +53,7 @@ public class EquipAbilityEntity extends BaseEntity {
* 作业中心编码
*/
@Schema(description = "作业中心编码")
private BigDecimal workCenterId;
private Long workCenterId;
/**
* 作业中心

@ -131,13 +131,13 @@ public class EquipResourceEntity extends BaseEntity {
* 设备类型 0-产线设备 1-普通设备
*/
@Schema(description = "设备类型 0-产线设备 1-普通设备")
private Integer equipType;
private String equipType;
/**
* 额定工时
*/
@Schema(description = "额定工时")
private Integer standardTime;
private BigDecimal standardTime;
/**
* 设备顺序

@ -97,6 +97,12 @@ public class PersonResourceEntity extends BaseEntity {
@Schema(description = "是否可用")
private volatile String isUsed;
/**
* 日期
*/
@Schema(description = "日期")
private String dateTime;

@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springblade.core.mp.base.BaseEntity;
import org.springblade.core.tenant.mp.TenantEntity;
import org.springblade.core.tool.utils.DateUtil;
import org.springframework.format.annotation.DateTimeFormat;
@ -20,7 +21,7 @@ import java.util.Date;
*/
@TableName(value = "MES_YIELD_ORDER")
@Data
public class YieldOrderEntity extends BaseEntity {
public class YieldOrderEntity extends TenantEntity {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
@ -28,7 +29,7 @@ public class YieldOrderEntity extends BaseEntity {
* 作业中心
*/
@Schema(description = "作业中心")
private String workCenterId;
private Long workCenterId;
/**
* 生产单号
@ -208,19 +209,6 @@ public class YieldOrderEntity extends BaseEntity {
@TableField(value = "BUSINESS_TYPE")
private Long businessType;
/**
* 分派人员
*/
@TableField(value = "ASSIGN_MAN")
private Long assignMan;
/**
* 分派时间
*/
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
@TableField(value = "ASSIGN_TIME")
private Date assignTime;
/**
* 协作工序号

@ -61,7 +61,7 @@ public interface EquipResourceMapper extends BaseMapper<EquipResourceEntity> {
*/
List<EquipResourceExcel> export(@Param("ew") Wrapper<EquipResourceEntity> queryWrapper);
Map<String,Object> selectTeamByWorkCenter(Long workCenterId);
List<Map<String,Object>> selectTeamByWorkCenter(@Param("workCenterId") Long workCenterId);
}

@ -33,9 +33,9 @@
<select id="selectTeamByWorkCenter" resultType="map">
SELECT DISTINCT
c.ts_id,
c.start_time,
c.end_time
c.ts_id as "teamId",
c.start_time as "startTime",
c.end_time as "endTime"
FROM
"MES_EQUIP_ABILITY" a
LEFT JOIN BS_CENTER_TEAM b ON a.WORK_CENTER_ID = b.WC_ID

@ -34,6 +34,7 @@ import org.springblade.scheduling.scheduling.excel.PersonResourceExcel;
import org.springblade.scheduling.scheduling.vo.PersonResourceVO;
import java.util.List;
import java.util.Map;
/**
* Mapper 接口
@ -60,5 +61,6 @@ public interface PersonResourceMapper extends BaseMapper<PersonResourceEntity> {
*/
List<PersonResourceExcel> export(@Param("ew") Wrapper<PersonResourceEntity> queryWrapper);
List<Map<String,Object>> selectTeamByWorkCenter(@Param("workCenterId") Long workCenterId);
}

@ -26,4 +26,18 @@
<select id="export" resultType="org.springblade.scheduling.scheduling.excel.PersonResourceExcel">
SELECT * FROM MES_PERSON_RESOURCE ${ew.customSqlSegment}
</select>
<select id="selectTeamByWorkCenter" resultType="map">
SELECT DISTINCT
c.ts_id as "teamId",
c.start_time as "startTime",
c.end_time as "endTime"
FROM
MES_PERSON_ABILITY a
LEFT JOIN BS_CENTER_TEAM b ON a.WORK_CENTER_ID = b.WC_ID
LEFT JOIN BS_TEAM_TIME c ON b.TS_ID = c.ts_id
WHERE
c.special = 0
and a.work_center_id = #{workCenterId}
</select>
</mapper>

@ -91,6 +91,10 @@
d.name AS "processName",
to_char(b.start_time,'HH24:MI') AS "startTime",
to_char(b.end_time,'HH24:MI') AS "endTime",
to_char(b.start_time,'YYYY-MM-DD HH24:MI:SS') AS "planStartTime",
to_char(b.end_time,'YYYY-MM-DD HH24:MI:SS') AS "planEndTime",
to_char(b.fact_start_time,'YYYY-MM-DD HH24:MI:SS') AS "factStartTime",
to_char(b.fact_end_time,'YYYY-MM-DD HH24:MI:SS') AS "factEndTime",
c.ts_name AS "teamName",
b.equip_name AS "equipName",
b.equip_code AS "equipCode"

@ -30,11 +30,8 @@
<result column="BATCH_NO" property="batchNo"/>
<result column="SITE_WORK" property="siteWork"/>
<result column="YP_QTY" property="ypQty"/>
<result column="SYNC_TIME" property="syncTime"/>
<result column="CUR_STATUS" property="curStatus"/>
<result column="ROAM_NO" property="roamNo"/>
<result column="PRIMARY_CRAFT" property="primaryCraft"/>
<result column="NEXT_ROAM" property="nextRoam"/>
<result column="PDM_URL" property="pdmUrl"/>
<result column="PRIORITY_APS" property="priorityAps"/>
<result column="CUSTODIAN" property="custodian"/>
@ -42,12 +39,8 @@
<result column="REWORK_NO" property="reworkNo"/>
<result column="ENTRUST_DEPT" property="entrustDept"/>
<result column="REWORK_MEMO" property="reworkMemo"/>
<result column="FAILURE_MEMO" property="failureMemo"/>
<result column="BUSINESS_TYPE" property="businessType"/>
<result column="FAILURE_MAN" property="failureMan"/>
<result column="FAILURE_TIME" property="failureTime"/>
<result column="RECSEQ_NO" property="recseqNo"/>
<result column="CART_ID" property="cartId"/>
<result column="MANUAL_INCREASE" property="manualIncrease"/>
<result column="YIELD_TYPE" property="yieldType"/>
<result column="FATHER_YO_ID" property="fatherYoId"/>
@ -66,7 +59,25 @@
<select id="selectYieldOrderPage" resultMap="yieldOrderResultMap">
select * from MES_YIELD_ORDER where is_deleted = 0
select * from MES_YIELD_ORDER
<where>
is_deleted = 0
<if test="yieldOrder.status != null and yieldOrder.status != ''">
and status = #{yieldOrder.status}
</if>
<if test="yieldOrder.batchNo != null and yieldOrder.batchNo != ''">
and batch_no = #{yieldOrder.batchNo}
</if>
<if test="yieldOrder.yoCode != null and yieldOrder.yoCode != ''">
and yo_code = #{yieldOrder.yoCode}
</if>
<if test="yieldOrder.partCode != null and yieldOrder.partCode != ''">
and part_code = #{yieldOrder.partCode}
</if>
<if test="yieldOrder.roamNo != null and yieldOrder.roamNo != ''">
and roam_no = #{yieldOrder.roamNo}
</if>
</where>
</select>

@ -58,4 +58,6 @@ public interface IEquipResourceService extends BaseService<EquipResourceEntity>
*/
List<EquipResourceExcel> export(Wrapper<EquipResourceEntity> queryWrapper);
public void initEquipResource();
}

@ -58,4 +58,6 @@ public interface IPersonResourceService extends BaseService<PersonResourceEntity
*/
List<PersonResourceExcel> export(Wrapper<PersonResourceEntity> queryWrapper);
void initPersonResource();
}

@ -43,11 +43,14 @@ import org.springblade.scheduling.scheduling.vo.EquipResourceVO;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -81,43 +84,122 @@ public class EquipResourceServiceImpl extends BaseServiceImpl<EquipResourceMappe
String tomorrow = DateFormatUtils.format(DateUtils.addDays(date,1),"yyyy-MM-dd");
String dayAfterTomorrow = DateFormatUtils.format(DateUtils.addDays(date,2),"yyyy-MM-dd");
List<EquipResourceEntity> list1 = this.list(Wrappers.<EquipResourceEntity>lambdaQuery().eq(EquipResourceEntity::getDateTime,today));
List<EquipResourceEntity> list2 = this.list(Wrappers.<EquipResourceEntity>lambdaQuery().eq(EquipResourceEntity::getDateTime,tomorrow));
List<EquipResourceEntity> list3 = this.list(Wrappers.<EquipResourceEntity>lambdaQuery().eq(EquipResourceEntity::getDateTime,dayAfterTomorrow));
if(CollectionUtils.isEmpty(list1)){
//获取设备能力列表
List<EquipAbilityEntity> equipAbilityList = equipAbilityService.list();
if(CollectionUtils.isNotEmpty(equipAbilityList)){
DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
LocalDateTime startOfDay = LocalDateTime.parse(today,DEFAULT_FORMATTER); // 当天0:00
for(EquipAbilityEntity equipAbility : equipAbilityList){
//0-产线设备 1-普通设备
if("0".equals(equipAbility.getEquipType())){
//产线设备根据轮询间隔生成数据,根据轮询间隔判断一天要分成多少段
int interval = equipAbility.getInterval() == null ? 60 : Integer.parseInt(equipAbility.getInterval().toString()); // 默认60分钟
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(interval).plusMinutes(equipAbility.getStandardTime().longValue());
EquipResourceEntity equipResource = new EquipResourceEntity();
equipResource.setDateTime(today);
equipResource.setEquipCode(equipAbility.getEquipCode());
equipResource.setEquipName(equipAbility.getEquipName());
equipResource.setCraftId(equipAbility.getCraftId());
equipResource.setCraftName(equipAbility.getCraftName());
equipResource.setPeriod(startTime.format(TIME_FORMATTER) + "-" + endTime.format(TIME_FORMATTER));
equipResource.setTotalCapacity(equipAbility.getStandardProcessAbility());
equipResource.setRestCapacity(equipAbility.getStandardProcessAbility());
equipResource.setStartTime(startTime);
equipResource.setEndTime(endTime);
equipResource.setEquipOrder(equipAbility.getEquipOrder());
//获取
// equipResource.setTeamId();
// resourceList.add(resource);
generateData(today);
}
if(CollectionUtils.isEmpty(list2)){
generateData(tomorrow);
}
if(CollectionUtils.isEmpty(list3)){
generateData(dayAfterTomorrow);
}
}
public void generateData(String day){
//获取设备能力列表
List<EquipAbilityEntity> equipAbilityList = equipAbilityService.list();
if(CollectionUtils.isNotEmpty(equipAbilityList)){
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDate targetDate = LocalDate.parse(day, dateFormatter);
LocalDateTime startOfDay = LocalDateTime.of(targetDate, LocalTime.MIDNIGHT);
for(EquipAbilityEntity equipAbility : equipAbilityList){
//获取
List<Map<String,Object>> teamIdList = baseMapper.selectTeamByWorkCenter(equipAbility.getWorkCenterId());
//0-产线设备 1-普通设备
if("0".equals(equipAbility.getEquipType())){
//产线设备根据轮询间隔生成数据,根据轮询间隔判断一天要分成多少段
int interval = equipAbility.getInterval() == null ? 60 : Integer.parseInt(equipAbility.getInterval().toString()); // 默认60分钟
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
List<EquipResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(interval);
EquipResourceEntity equipResource = new EquipResourceEntity();
equipResource.setDateTime(day);
equipResource.setEquipCode(equipAbility.getEquipCode());
equipResource.setEquipName(equipAbility.getEquipName());
equipResource.setCraftId(equipAbility.getCraftId());
equipResource.setCraftName(equipAbility.getCraftName());
equipResource.setPeriod(startTime.format(timeFormatter) + "-" + endTime.format(timeFormatter));
equipResource.setTotalCapacity(equipAbility.getStandardProcessAbility());
equipResource.setRestCapacity(equipAbility.getStandardProcessAbility());
equipResource.setStartTime(startTime);
equipResource.setEndTime(endTime);
equipResource.setEquipOrder(equipAbility.getEquipOrder());
equipResource.setStandardTime(equipAbility.getStandardTime());
equipResource.setIsUsed("0");
equipResource.setEquipType(equipAbility.getEquipType());
Long teamId = null;
for(Map<String,Object> map : teamIdList){
LocalDateTime teamStartTime = LocalDateTime.parse(day + ' '+ map.get("startTime").toString(), dateTimeFormatter);
LocalDateTime teamEndTime = LocalDateTime.parse(day + ' '+ map.get("endTime").toString(), dateTimeFormatter);
if((startTime.compareTo(teamStartTime) >=0 && endTime.compareTo(teamEndTime) <= 0) || (startTime.compareTo(teamStartTime) >=0 && startTime.compareTo(teamEndTime) <0)){
teamId = Long.parseLong(map.get("teamId").toString());
}
}
equipResource.setTeamId(teamId);
resourceList.add(equipResource);
}
if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList);
}
}else{
//普通设备每30分钟间隔生成数据
int interval = 30;
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
List<EquipResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(equipAbility.getStandardTime().longValue());
EquipResourceEntity equipResource = new EquipResourceEntity();
equipResource.setDateTime(day);
equipResource.setEquipCode(equipAbility.getEquipCode());
equipResource.setEquipName(equipAbility.getEquipName());
equipResource.setCraftId(equipAbility.getCraftId());
equipResource.setCraftName(equipAbility.getCraftName());
equipResource.setPeriod(startTime.format(timeFormatter) + "-" + endTime.format(timeFormatter));
equipResource.setTotalCapacity(equipAbility.getStandardProcessAbility());
equipResource.setRestCapacity(equipAbility.getStandardProcessAbility());
equipResource.setStartTime(startTime);
equipResource.setEndTime(endTime);
equipResource.setEquipOrder(equipAbility.getEquipOrder());
equipResource.setStandardTime(equipAbility.getStandardTime());
equipResource.setIsUsed("0");
equipResource.setEquipType(equipAbility.getEquipType());
Long teamId = null;
for(Map<String,Object> map : teamIdList){
LocalDateTime teamStartTime = LocalDateTime.parse(day + ' '+ map.get("startTime").toString(), dateTimeFormatter);
LocalDateTime teamEndTime = LocalDateTime.parse(day + ' '+ map.get("endTime").toString(), dateTimeFormatter);
if((startTime.compareTo(teamStartTime) >=0 && endTime.compareTo(teamEndTime) <= 0) || (startTime.compareTo(teamStartTime) >=0 && startTime.compareTo(teamEndTime) <0)){
teamId = Long.parseLong(map.get("teamId").toString());
}
}
equipResource.setTeamId(teamId);
resourceList.add(equipResource);
}
if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList);
}
}
}
}
}
}

@ -27,15 +27,26 @@ package org.springblade.scheduling.scheduling.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.scheduling.scheduling.entity.PersonAbilityEntity;
import org.springblade.scheduling.scheduling.entity.PersonResourceEntity;
import org.springblade.scheduling.scheduling.excel.PersonResourceExcel;
import org.springblade.scheduling.scheduling.mapper.PersonResourceMapper;
import org.springblade.scheduling.scheduling.service.IPersonAbilityService;
import org.springblade.scheduling.scheduling.service.IPersonResourceService;
import org.springblade.scheduling.scheduling.vo.PersonResourceVO;
import org.springframework.stereotype.Service;
import java.util.List;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* 工艺能力表 服务实现类
@ -44,8 +55,10 @@ import java.util.List;
* @since 2025-11-12
*/
@Service
@AllArgsConstructor
public class PersonResourceServiceImpl extends BaseServiceImpl<PersonResourceMapper, PersonResourceEntity> implements IPersonResourceService {
private final IPersonAbilityService personAbilityService;
@Override
public IPage<PersonResourceVO> selectPersonResourcePage(IPage<PersonResourceVO> page, PersonResourceVO entity) {
return page.setRecords(baseMapper.selectPersonResourcePage(page, entity));
@ -58,4 +71,77 @@ public class PersonResourceServiceImpl extends BaseServiceImpl<PersonResourceMap
return list;
}
public void initPersonResource(){
//获取包括今天在内未来3天
Date date = new Date();
String today = DateFormatUtils.format(date,"yyyy-MM-dd");
String tomorrow = DateFormatUtils.format(DateUtils.addDays(date,1),"yyyy-MM-dd");
String dayAfterTomorrow = DateFormatUtils.format(DateUtils.addDays(date,2),"yyyy-MM-dd");
List<PersonResourceEntity> list1 = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().eq(PersonResourceEntity::getDateTime,today));
List<PersonResourceEntity> list2 = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().eq(PersonResourceEntity::getDateTime,tomorrow));
List<PersonResourceEntity> list3 = this.list(Wrappers.<PersonResourceEntity>lambdaQuery().eq(PersonResourceEntity::getDateTime,dayAfterTomorrow));
if(CollectionUtils.isEmpty(list1)){
generateData(today);
}
if(CollectionUtils.isEmpty(list2)){
generateData(tomorrow);
}
if(CollectionUtils.isEmpty(list3)){
generateData(dayAfterTomorrow);
}
}
public void generateData(String day){
//获取设备能力列表
List<String> workCenterList = Arrays.asList("86","85");
List<PersonAbilityEntity> personAbilityList = personAbilityService.list(Wrappers.<PersonAbilityEntity>lambdaQuery().in(PersonAbilityEntity::getWorkCenterId,workCenterList));
if(CollectionUtils.isNotEmpty(personAbilityList)){
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDate targetDate = LocalDate.parse(day, dateFormatter);
LocalDateTime startOfDay = LocalDateTime.of(targetDate, LocalTime.MIDNIGHT);
for(PersonAbilityEntity personAbility : personAbilityList){
//获取
List<Map<String,Object>> teamIdList = baseMapper.selectTeamByWorkCenter(personAbility.getWorkCenterId());
//普通设备每30分钟间隔生成数据
int interval = 30;
int totalMinutes = 24 * 60; // 一天总分钟数
int totalCount = totalMinutes / interval; // 生成条数
List<PersonResourceEntity> resourceList = new ArrayList<>();
for (int i = 0; i < totalCount; i++) {
LocalDateTime startTime = startOfDay.plusMinutes(i * interval);
LocalDateTime endTime = startTime.plusMinutes(30);
PersonResourceEntity personResource = new PersonResourceEntity();
personResource.setDateTime(day);
personResource.setCraftId(personAbility.getCraftId());
personResource.setCraftName(personAbility.getCraftName());
personResource.setPeriod(startTime.format(timeFormatter) + "-" + endTime.format(timeFormatter));
personResource.setStartTime(startTime);
personResource.setEndTime(endTime);
personResource.setIsUsed("0");
Long teamId = null;
for(Map<String,Object> map : teamIdList){
LocalDateTime teamStartTime = LocalDateTime.parse(day + ' '+ map.get("startTime").toString(), dateTimeFormatter);
LocalDateTime teamEndTime = LocalDateTime.parse(day + ' '+ map.get("endTime").toString(), dateTimeFormatter);
if((startTime.compareTo(teamStartTime) >=0 && endTime.compareTo(teamEndTime) <= 0) || (startTime.compareTo(teamStartTime) >=0 && startTime.compareTo(teamEndTime) <0)){
teamId = Long.parseLong(map.get("teamId").toString());
}
}
personResource.setTeamId(teamId);
resourceList.add(personResource);
}
if(CollectionUtils.isNotEmpty(resourceList)){
this.saveBatch(resourceList);
}
}
}
}
}

@ -117,7 +117,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
//计算cr值
calculateCr(list);
//根据作业中心将订单分组,并根据优先级、cr值、订单需求数量、计划下达时间4个维度进行组内排序
Map<String, List<YieldOrderEntity>> map =
Map<Long, List<YieldOrderEntity>> map =
list.stream()
.collect(Collectors.groupingBy(
YieldOrderEntity::getWorkCenterId,
@ -181,9 +181,42 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
.max(String::compareTo)
.orElse(null);
// 计算最小开始时间
String minPlanStartTime = woList.stream()
.map(WorkOrderDto::getPlanStartTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.min(String::compareTo)
.orElse(null);
// 计算最大结束时间
String maxPlanEndTime = woList.stream()
.map(WorkOrderDto::getPlanEndTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.max(String::compareTo)
.orElse(null);
// 计算最小开始时间
String minFactStartTime = woList.stream()
.map(WorkOrderDto::getFactStartTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.min(String::compareTo)
.orElse(null);
// 计算最大结束时间
String maxFactEndTime = woList.stream()
.map(WorkOrderDto::getFactEndTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.max(String::compareTo)
.orElse(null);
workOrderDto.setWoCode(woCode);
workOrderDto.setStartTime(minStartTime);
workOrderDto.setEndTime(maxEndTime);
workOrderDto.setPlanStartTime(minPlanStartTime);
workOrderDto.setPlanEndTime(maxPlanEndTime);
workOrderDto.setFactStartTime(minFactStartTime);
workOrderDto.setFactEndTime(maxFactEndTime);
workOrderDto.setTeamName(teamName);
list1.add(workOrderDto);
}
resultList.put(teamName,list1);
@ -218,9 +251,42 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
.max(String::compareTo)
.orElse(null);
// 计算最小开始时间
String minPlanStartTime = woList.stream()
.map(WorkOrderDto::getPlanStartTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.min(String::compareTo)
.orElse(null);
// 计算最大结束时间
String maxPlanEndTime = woList.stream()
.map(WorkOrderDto::getPlanEndTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.max(String::compareTo)
.orElse(null);
// 计算最小开始时间
String minFactStartTime = woList.stream()
.map(WorkOrderDto::getFactStartTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.min(String::compareTo)
.orElse(null);
// 计算最大结束时间
String maxFactEndTime = woList.stream()
.map(WorkOrderDto::getFactEndTime)
.filter(Objects::nonNull) // 过滤空时间,避免NPE
.max(String::compareTo)
.orElse(null);
workOrderDto.setPlanStartTime(minPlanStartTime);
workOrderDto.setPlanEndTime(maxPlanEndTime);
workOrderDto.setFactStartTime(minFactStartTime);
workOrderDto.setFactEndTime(maxFactEndTime);
workOrderDto.setWoCode(woCode);
workOrderDto.setStartTime(minStartTime);
workOrderDto.setEndTime(maxEndTime);
workOrderDto.setEquipName(equipName);
list1.add(workOrderDto);
}
resultList.put(equipName,list1);
@ -373,7 +439,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO
WorkPlanEntity workPlan = new WorkPlanEntity();
workPlan.setStartTime(equipResource.getStartTime());
if(entry.getKey() == 1){
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime()));
workPlan.setEndTime(equipResource.getStartTime().plusMinutes(equipResource.getStandardTime().longValue()));
}else{
workPlan.setEndTime(equipResource.getEndTime());
}

@ -1,15 +0,0 @@
package org.springblade.scheduling.scheduling.task;
/**
* TODO功能描述
*
* @author sjx
* @version 1.0
* @BelongsProject jonhon-mes-svr
* @BelongsPackage org.springblade.scheduling.scheduling.task
* @since 2025-11-27 14:56
*/
public class EquipResourceJob {
//查询设备能力
//根据设备能力
}

@ -0,0 +1,30 @@
package org.springblade.scheduling.scheduling.task;
import lombok.AllArgsConstructor;
import org.springblade.scheduling.scheduling.service.IEquipResourceService;
import org.springblade.scheduling.scheduling.service.IPersonResourceService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* TODO功能描述
*
* @author sjx
* @version 1.0
* @BelongsProject jonhon-mes-svr
* @BelongsPackage org.springblade.scheduling.scheduling.task
* @since 2025-11-27 14:56
*/
@Component
@AllArgsConstructor
public class InitResourceJob {
private final IPersonResourceService personResourceService;
private final IEquipResourceService equipResourceService;
@Scheduled(cron = "* * 1 * * ?")
public void initResourceJob() {
equipResourceService.initEquipResource();
personResourceService.initPersonResource();
}
}

@ -0,0 +1,28 @@
package org.springblade.scheduling.scheduling.task;
import lombok.AllArgsConstructor;
import org.springblade.scheduling.scheduling.service.IEquipResourceService;
import org.springblade.scheduling.scheduling.service.IPersonResourceService;
import org.springblade.scheduling.scheduling.service.IWorkOrderService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* TODO功能描述
*
* @author sjx
* @version 1.0
* @BelongsProject jonhon-mes-svr
* @BelongsPackage org.springblade.scheduling.scheduling.task
* @since 2025-12-10 16:15
*/
@Component
@AllArgsConstructor
public class SchedulingJob {
private final IWorkOrderService workOrderService;
@Scheduled(cron = "* * 1 * * ?")
public void schedulingJob() {
workOrderService.scheduling();
}
}
Loading…
Cancel
Save