feat:添加报工记录页面及修改甘特图返回

ck
HuangHuiKang 1 month ago
parent 4935872568
commit 5dd2d7fa59

@ -115,7 +115,7 @@ public class BaogongRecordController {
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得报工分页") @Operation(summary = "获得报工分页")
@PreAuthorize("@ss.hasPermission('mes:baogong-record:query')") @PreAuthorize("@ss.hasPermission('mes:baogong-record:query')")
public CommonResult<PageResult<BaogongRecordRespVO>> getBaogongRecordPage(@Valid BaogongRecordPageReqVO pageReqVO) { public CommonResult<PageResult<BaogongRecordRespVO>> getBaogongRecordPage(@Valid BaogongRecordPageReqVO pageReqVO) {
PageResult<BaogongRecordDO> pageResult = baogongRecordService.getBaogongRecordPage(pageReqVO); PageResult<BaogongRecordDO> pageResult = baogongRecordService.getBaogongRecordPage(pageReqVO);
return success(new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal())); return success(new PageResult<>(buildVOList(pageResult.getList()), pageResult.getTotal()));
} }
@ -145,4 +145,26 @@ public class BaogongRecordController {
BeanUtils.toBean(list, BaogongRecordRespVO.class)); BeanUtils.toBean(list, BaogongRecordRespVO.class));
} }
@GetMapping("/stat-page")
@Operation(summary = "报工统计分页")
@PreAuthorize("@ss.hasPermission('mes:baogong-record:query')")
public CommonResult<PageResult<BaogongRecordStatRespVO>> getBaogongRecordStatPage(@Valid BaogongRecordStatPageReqVO reqVO) {
return success(baogongRecordService.getBaogongRecordStatPage(reqVO));
}
@GetMapping("/stat-export-excel")
@Operation(summary = "导出报工统计 Excel")
@PreAuthorize("@ss.hasPermission('mes:baogong-record:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportBaogongRecordStatExcel(@Valid BaogongRecordStatPageReqVO reqVO,
HttpServletResponse response) throws IOException {
reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<BaogongRecordStatRespVO> list = baogongRecordService.getBaogongRecordStatPage(reqVO).getList();
ExcelUtils.write(response, "报工统计.xls", "数据", BaogongRecordStatRespVO.class, list);
}
} }

@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.mes.controller.admin.baogongrecord.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 报工统计分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class BaogongRecordStatPageReqVO extends PageParam {
@Schema(description = "开始时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime beginBaogongTime;
@Schema(description = "结束时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime endBaogongTime;
}

@ -0,0 +1,63 @@
package cn.iocoder.yudao.module.mes.controller.admin.baogongrecord.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 报工统计 Response VO")
@Data
public class BaogongRecordStatRespVO {
@Schema(description = "任务单编码")
@ExcelProperty("任务单编码")
private String taskCode;
@Schema(description = "计划单编码")
@ExcelProperty("计划单编码")
private String planCode;
@Schema(description = "员工ID")
@ExcelProperty("员工ID")
private String employeeId;
@Schema(description = "员工姓名")
@ExcelProperty("员工姓名")
private String employeeName;
@Schema(description = "产品名称")
@ExcelProperty("产品名称")
private String productName;
@Schema(description = "产品编码")
@ExcelProperty("产品编码")
private String productCode;
@Schema(description = "报工数量")
@ExcelProperty("报工数量")
private Long baogongNum;
@Schema(description = "合格数量")
@ExcelProperty("合格数量")
private Long passNum;
@Schema(description = "不合格数量")
@ExcelProperty("不合格数量")
private Long noPassNum;
@Schema(description = "合格率(%)")
@ExcelProperty("合格率(%)")
private BigDecimal passRate;
@Schema(description = "原因")
@ExcelProperty("原因")
private String reason;
@Schema(description = "报工时间")
@ExcelProperty("报工时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime baogongTime;
}

@ -22,6 +22,15 @@ public class DevicePlanGanttRespVO {
@Schema(description = "该设备计划列表") @Schema(description = "该设备计划列表")
private List<PlanItem> plans; private List<PlanItem> plans;
@Schema(description = "额定产能")
private Integer ratedCapacity;
@Schema(description = "每日报工平均值(根据工单报工计算)")
private Integer dailyAverageValue;
@Schema(description = "数据采集产能")
private Integer dataCollectionCapacity;
@Data @Data
public static class PlanItem { public static class PlanItem {
@Schema(description = "计划ID") @Schema(description = "计划ID")

@ -6,8 +6,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.mes.dal.dataobject.baogongrecord.BaogongRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.baogongrecord.BaogongRecordDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.mes.controller.admin.baogongrecord.vo.*; import cn.iocoder.yudao.module.mes.controller.admin.baogongrecord.vo.*;
import org.apache.ibatis.annotations.Param;
/** /**
* Mapper * Mapper
@ -26,4 +29,9 @@ public interface BaogongRecordMapper extends BaseMapperX<BaogongRecordDO> {
.orderByDesc(BaogongRecordDO::getId)); .orderByDesc(BaogongRecordDO::getId));
} }
IPage<BaogongRecordStatRespVO> selectStatPage(Page<BaogongRecordStatRespVO> page,
@Param("reqVO") BaogongRecordStatPageReqVO reqVO);
} }

@ -52,4 +52,13 @@ public interface BaogongRecordService {
*/ */
PageResult<BaogongRecordDO> getBaogongRecordPage(BaogongRecordPageReqVO pageReqVO); PageResult<BaogongRecordDO> getBaogongRecordPage(BaogongRecordPageReqVO pageReqVO);
/**
*
*
* @param reqVO
* @return
*/
PageResult<BaogongRecordStatRespVO> getBaogongRecordStatPage(BaogongRecordStatPageReqVO reqVO);
} }

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.mes.service.baogongrecord; package cn.iocoder.yudao.module.mes.service.baogongrecord;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -71,4 +73,12 @@ public class BaogongRecordServiceImpl implements BaogongRecordService {
return baogongRecordMapper.selectPage(pageReqVO); return baogongRecordMapper.selectPage(pageReqVO);
} }
@Override
public PageResult<BaogongRecordStatRespVO> getBaogongRecordStatPage(BaogongRecordStatPageReqVO reqVO) {
Page<BaogongRecordStatRespVO> page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize());
IPage<BaogongRecordStatRespVO> result = baogongRecordMapper.selectStatPage(page, reqVO);
return new PageResult<>(result.getRecords(), result.getTotal());
}
} }

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.service.plan;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil;
import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO; import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
@ -615,9 +616,11 @@ public class PlanServiceImpl implements PlanService {
vo.setDeviceId(deviceId); vo.setDeviceId(deviceId);
vo.setDeviceName(device == null ? null : device.getDeviceName()); vo.setDeviceName(device == null ? null : device.getDeviceName());
vo.setDeviceCode(device == null ? null : device.getDeviceCode()); vo.setDeviceCode(device == null ? null : device.getDeviceCode());
vo.setRatedCapacity(device == null ? null : device.getRatedCapacity());
vo.setDailyAverageValue(device == null ? null : device.getDailyAverageValue());
vo.setDataCollectionCapacity(device == null ? null : device.getDataCollectionCapacity());
List<DevicePlanGanttRespVO.PlanItem> plans = new ArrayList<>(); List<DevicePlanGanttRespVO.PlanItem> plans = new ArrayList<>();
DateTimeFormatter DATETIME_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for (PlanDO plan : entry.getValue()) { for (PlanDO plan : entry.getValue()) {
DevicePlanGanttRespVO.PlanItem item = new DevicePlanGanttRespVO.PlanItem(); DevicePlanGanttRespVO.PlanItem item = new DevicePlanGanttRespVO.PlanItem();
@ -634,9 +637,10 @@ public class PlanServiceImpl implements PlanService {
item.setProductCode(product == null ? null : product.getBarCode()); item.setProductCode(product == null ? null : product.getBarCode());
item.setDeviceCode(device == null ? null : device.getDeviceCode()); item.setDeviceCode(device == null ? null : device.getDeviceCode());
item.setSourceType("HISTORY"); item.setSourceType("HISTORY");
item.setPlanStartTimeStr(plan.getPlanStartTime().format(DATETIME_FMT)); item.setDeliveryDateStr(plan.getDeliveryDate() == null ? null : plan.getDeliveryDate().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY)));
item.setPlanEndTimeStr(plan.getPlanEndTime().format(DATETIME_FMT)); item.setPlanStartTimeStr(plan.getPlanStartTime().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)));
item.setLatestStartTimeStr(plan.getLatestStartTime().format(DATETIME_FMT)); item.setPlanEndTimeStr(plan.getPlanEndTime().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)));
item.setLatestStartTimeStr(plan.getLatestStartTime().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)));
plans.add(item); plans.add(item);
} }

@ -9,4 +9,39 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/ 文档可见https://www.iocoder.cn/MyBatis/x-plugins/
--> -->
<select id="selectStatPage"
resultType="cn.iocoder.yudao.module.mes.controller.admin.baogongrecord.vo.BaogongRecordStatRespVO">
SELECT
t.code AS taskCode,
p.code AS planCode,
r.creator AS employeeId,
u.nickname AS employeeName,
pr.name AS productName,
pr.bar_code AS productCode,
(IFNULL(r.num, 0) + IFNULL(r.no_pass_num, 0)) AS baogongNum,
IFNULL(r.num, 0) AS passNum,
IFNULL(r.no_pass_num, 0) AS noPassNum,
CASE
WHEN (IFNULL(r.num, 0) + IFNULL(r.no_pass_num, 0)) = 0 THEN 0
ELSE ROUND(IFNULL(r.num, 0) / (IFNULL(r.num, 0) + IFNULL(r.no_pass_num, 0)) * 100, 2)
END AS passRate,
r.remark AS reason,
r.baogong_time AS baogongTime
FROM mes_baogong_record r
LEFT JOIN mes_plan p ON p.id = r.plan_id AND p.deleted = b'0'
LEFT JOIN mes_task t ON t.id = p.task_id AND t.deleted = b'0'
LEFT JOIN erp_product pr ON pr.id = p.product_id AND pr.deleted = b'0'
LEFT JOIN system_users u ON u.id = CAST(r.creator AS UNSIGNED)
WHERE r.deleted = b'0'
<if test="reqVO.beginBaogongTime != null">
AND r.baogong_time &gt;= #{reqVO.beginBaogongTime}
</if>
<if test="reqVO.endBaogongTime != null">
AND r.baogong_time &lt;= #{reqVO.endBaogongTime}
</if>
ORDER BY r.baogong_time DESC
</select>
</mapper> </mapper>
Loading…
Cancel
Save