add produce report

main
chenshuichuan 2 years ago
parent e6692e2fde
commit dd86c35c44

@ -46,15 +46,19 @@ CREATE TABLE `mes_work_team_detail`
CREATE TABLE `mes_produce_report`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
`process_instance_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '流程实例的编号',
`work_team_id` bigint NOT NULL COMMENT '组别ID',
`group_id` bigint NOT NULL COMMENT '班组ID',
`report_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '报工日期',
`status` tinyint NOT NULL COMMENT '状态',
`group_type` tinyint NOT NULL COMMENT '白班/夜班',
`process_instance_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '流程实例编号',
`report_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '编号',
`user_id` bigint NOT NULL COMMENT '用户ID',
`org_id` bigint NOT NULL COMMENT '工序ID',
`report_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '代报/自报',
`group_type` int DEFAULT NULL COMMENT '白班夜班',
`org_type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '工序',
`report_time` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '计件时段',
`total_time` decimal(24, 6) DEFAULT NULL COMMENT '总时长',
`report_date` datetime DEFAULT NULL COMMENT '报工日期',
`report_status` tinyint DEFAULT NULL COMMENT '报工状态',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '备注',
`is_enable` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
@ -72,29 +76,34 @@ CREATE TABLE `mes_produce_report_detail`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',
`report_id` bigint DEFAULT NULL COMMENT '报工单id',
`plan_id` bigint NOT NULL COMMENT '生产计划ID',
`product_id` bigint NOT NULL COMMENT '产品ID',
`user_id` bigint NOT NULL COMMENT '用户ID',
`org_id` bigint NOT NULL COMMENT '组织ID',
`plan_id` bigint DEFAULT NULL COMMENT '生产计划ID',
`product_id` bigint DEFAULT NULL COMMENT '产品ID',
`user_id` bigint DEFAULT NULL COMMENT '用户ID',
`report_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '代报/自报',
`group_type` int DEFAULT NULL COMMENT '白班夜班',
`org_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '工序类型',
`org_id` bigint DEFAULT NULL COMMENT '组织ID',
`quality_number` decimal(24, 6) DEFAULT NULL COMMENT '成品数量',
`waste_number` decimal(24, 6) DEFAULT NULL COMMENT '废品数量',
`total_number` decimal(24, 6) DEFAULT NULL COMMENT '废品数量',
`total_number` decimal(24, 6) DEFAULT NULL COMMENT '数量',
`quality_rate` decimal(24, 6) DEFAULT NULL COMMENT '成品率',
`waste_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '备注',
`report_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '计件时间',
`report_time` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '计件时间',
`total_time` decimal(24, 6) DEFAULT NULL COMMENT '总时长',
`package_number` decimal(24, 6) DEFAULT NULL COMMENT '打包数量',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '备注',
`is_enable` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否启用',
`is_enable` bit(1) DEFAULT b'1' COMMENT '是否启用',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint DEFAULT NULL COMMENT '租户id',
`report_date` datetime DEFAULT NULL COMMENT '报工日期',
`report_status` tinyint DEFAULT NULL COMMENT '报工状态',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 91
AUTO_INCREMENT = 108
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT ='生产报工明细';
@ -368,7 +377,16 @@ CREATE TABLE `mes_produce_report_change_record`
CREATE VIEW mes_view_report_plan_detail
AS
SELECT wp.*, pd.user_id ,pd.report_type ,pd.group_type ,pd.org_type ,pd.org_id ,pd.quality_number ,pd.waste_number ,
pd.report_date ,pd.report_status ,pd.creator as report_creator
SELECT wp.*,
pd.user_id,
pd.report_type,
pd.group_type,
pd.org_type,
pd.org_id,
pd.quality_number,
pd.waste_number,
pd.report_date,
pd.report_status,
pd.creator as report_creator
FROM mes_work_report_plan wp
JOIN mes_produce_report_detail pd ON wp.report_id = pd.id;

@ -23,6 +23,8 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@ -41,6 +43,9 @@ public class ProduceReportController {
@Operation(summary = "创建生产报工单")
@PreAuthorize("@ss.hasPermission('mes:produce-report:create')")
public CommonResult<Long> createProduceReport(@Valid @RequestBody ProduceReportSaveReqVO createReqVO) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(createReqVO.getReportDateString(), formatter);
createReqVO.setReportDate(localDateTime);
return success(produceReportService.createProduceReport(createReqVO));
}
@ -48,6 +53,9 @@ public class ProduceReportController {
@Operation(summary = "更新生产报工单")
@PreAuthorize("@ss.hasPermission('mes:produce-report:update')")
public CommonResult<Boolean> updateProduceReport(@Valid @RequestBody ProduceReportSaveReqVO updateReqVO) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(updateReqVO.getReportDateString(), formatter);
updateReqVO.setReportDate(localDateTime);
produceReportService.updateProduceReport(updateReqVO);
return success(true);
}
@ -93,45 +101,18 @@ public class ProduceReportController {
// ==================== 子表(生产报工明细) ====================
@GetMapping("/produce-report-detail/page")
@Operation(summary = "获得生产报工明细分页")
@GetMapping("/produce-report-detail/list-by-report-id")
@Operation(summary = "获得生产报工明细列表")
@Parameter(name = "reportId", description = "报工单id")
@PreAuthorize("@ss.hasPermission('mes:produce-report:query')")
public CommonResult<PageResult<ProduceReportDetailDO>> getProduceReportDetailPage(PageParam pageReqVO,
@RequestParam("reportId") Long reportId) {
return success(produceReportService.getProduceReportDetailPage(pageReqVO, reportId));
public CommonResult<List<ProduceReportDetailDO>> getProduceReportDetailListByReportId(@RequestParam("reportId") Long reportId) {
return success(produceReportService.getProduceReportDetailListByReportId(reportId));
}
@PostMapping("/produce-report-detail/create")
@Operation(summary = "创建生产报工明细")
@PreAuthorize("@ss.hasPermission('mes:produce-report:create')")
public CommonResult<Long> createProduceReportDetail(@Valid @RequestBody ProduceReportDetailDO produceReportDetail) {
return success(produceReportService.createProduceReportDetail(produceReportDetail));
}
@PutMapping("/produce-report-detail/update")
@Operation(summary = "更新生产报工明细")
@PreAuthorize("@ss.hasPermission('mes:produce-report:update')")
public CommonResult<Boolean> updateProduceReportDetail(@Valid @RequestBody ProduceReportDetailDO produceReportDetail) {
produceReportService.updateProduceReportDetail(produceReportDetail);
@GetMapping("/updateStatus")
@Operation(summary = "提交报工单")
public CommonResult<Boolean> updateStatus(@RequestParam("id") Long id,
@RequestParam("status") Integer status) {
produceReportService.updateStatus(id,status);
return success(true);
}
@DeleteMapping("/produce-report-detail/delete")
@Parameter(name = "id", description = "编号", required = true)
@Operation(summary = "删除生产报工明细")
@PreAuthorize("@ss.hasPermission('mes:produce-report:delete')")
public CommonResult<Boolean> deleteProduceReportDetail(@RequestParam("id") Long id) {
produceReportService.deleteProduceReportDetail(id);
return success(true);
}
@GetMapping("/produce-report-detail/get")
@Operation(summary = "获得生产报工明细")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('mes:produce-report:query')")
public CommonResult<ProduceReportDetailDO> getProduceReportDetail(@RequestParam("id") Long id) {
return success(produceReportService.getProduceReportDetail(id));
}
}

@ -1,12 +1,11 @@
package cn.iocoder.yudao.module.mes.controller.admin.producereport.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import java.math.BigDecimal;
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;
@ -17,33 +16,47 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class ProduceReportPageReqVO extends PageParam {
@Schema(description = "流程实例编号", example = "2975")
@Schema(description = "流程实例编号", example = "12049")
private String processInstanceId;
@Schema(description = "组别ID", example = "32137")
private Long workTeamId;
@Schema(description = "编号")
private String reportCode;
@Schema(description = "班组ID", example = "10669")
private Long groupId;
@Schema(description = "用户ID", example = "19983")
private Long userId;
@Schema(description = "报工日期")
@Schema(description = "工序ID", example = "28795")
private Long orgId;
@Schema(description = "工序", example = "2")
private String orgType;
@Schema(description = "计件时段")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] reportDate;
private String[] reportTime;
@Schema(description = "状态", example = "1")
private Integer status;
@Schema(description = "总时长")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private BigDecimal[] totalTime;
@Schema(description = "白班/夜班", example = "1")
private Integer groupType;
@Schema(description = "报工状态", example = "2")
private Integer reportStatus;
@Schema(description = "备注", example = "随便")
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "是否启用")
private Boolean isEnable;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "班别", example = "1")
private Integer groupType;
@Schema(description = "报工类型", example = "1")
private String reportType;
@Schema(description = "报工日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] reportDate;
}

@ -1,59 +1,79 @@
package cn.iocoder.yudao.module.mes.controller.admin.producereport.vo;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.*;
import java.util.*;
import java.util.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
@Schema(description = "管理后台 - 生产报工单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ProduceReportRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6256")
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "29099")
@ExcelProperty("ID")
private Long id;
@Schema(description = "流程实例编号", example = "2975")
@ExcelProperty("流程实例编号")
@Schema(description = "流程实例编号", example = "12049")
@ExcelProperty("流程实例编号")
private String processInstanceId;
@Schema(description = "组别ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32137")
@ExcelProperty("组别ID")
private Long workTeamId;
@Schema(description = "编号")
@ExcelProperty("编号")
private String reportCode;
@Schema(description = "班组ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10669")
@ExcelProperty("班组ID")
private Long groupId;
@Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19983")
@ExcelProperty("用户ID")
private Long userId;
@Schema(description = "报工日期", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("报工日期")
private LocalDateTime reportDate;
@Schema(description = "工序ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28795")
@ExcelProperty("工序ID")
private Long orgId;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat("mes_record_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer status;
@Schema(description = "工序", example = "2")
@ExcelProperty(value = "工序", converter = DictConvert.class)
@DictFormat("mes_org_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private String orgType;
@Schema(description = "白班/夜班", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty(value = "白班/夜班", converter = DictConvert.class)
@DictFormat("mes_group_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer groupType;
@Schema(description = "计件时段")
@ExcelProperty("计件时段")
private String reportTime;
@Schema(description = "总时长")
@ExcelProperty("总时长")
private BigDecimal totalTime;
@Schema(description = "备注", example = "随便")
@Schema(description = "报工状态", example = "2")
@ExcelProperty(value = "报工状态", converter = DictConvert.class)
@DictFormat("mes_record_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer reportStatus;
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
@Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("是否启用")
private Boolean isEnable;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "班别", example = "1")
@ExcelProperty(value = "班别", converter = DictConvert.class)
@DictFormat("mes_group_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer groupType;
@Schema(description = "报工类型", example = "1")
@ExcelProperty(value = "报工类型", converter = DictConvert.class)
@DictFormat("mes_produce_report_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private String reportType;
@Schema(description = "报工日期")
@ExcelProperty("报工日期")
private LocalDateTime reportDate;
}

@ -1,46 +1,61 @@
package cn.iocoder.yudao.module.mes.controller.admin.producereport.vo;
import cn.iocoder.yudao.module.mes.dal.dataobject.producereport.ProduceReportDetailDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 生产报工单新增/修改 Request VO")
@Data
public class ProduceReportSaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6256")
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "29099")
private Long id;
@Schema(description = "流程实例编号", example = "2975")
@Schema(description = "流程实例编号", example = "12049")
private String processInstanceId;
@Schema(description = "组别ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "32137")
@NotNull(message = "组别ID不能为空")
private Long workTeamId;
@Schema(description = "编号")
private String reportCode;
@Schema(description = "班组ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10669")
@NotNull(message = "班组ID不能为空")
private Long groupId;
@Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19983")
@NotNull(message = "用户ID不能为空")
private Long userId;
@Schema(description = "报工日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "报工日期不能为空")
private LocalDateTime reportDate;
@Schema(description = "工序ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28795")
@NotNull(message = "工序ID不能为空")
private Long orgId;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态不能为空")
private Integer status;
@Schema(description = "工序", example = "2")
private String orgType;
@Schema(description = "白班/夜班", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "白班/夜班不能为空")
private Integer groupType;
@Schema(description = "计件时段")
private String reportTime;
@Schema(description = "总时长")
private BigDecimal totalTime;
@Schema(description = "报工状态", example = "2")
private Integer reportStatus;
@Schema(description = "备注", example = "随便")
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "班别", example = "1")
private Integer groupType;
@Schema(description = "报工类型", example = "1")
private String reportType;
private Boolean isEnable;
@Schema(description = "报工日期")
private LocalDateTime reportDate;
@Schema(description = "生产报工明细列表")
private List<ProduceReportDetailDO> produceReportDetails;
@Schema(description = "报工日期字符串")
private String reportDateString;
}

@ -1,12 +1,13 @@
package cn.iocoder.yudao.module.mes.dal.dataobject.producereport;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
@ -29,40 +30,60 @@ public class ProduceReportDO extends BaseDO {
@TableId
private Long id;
/**
*
*
*/
private String processInstanceId;
/**
* ID
*
*/
private Long workTeamId;
private String reportCode;
/**
* ID
* ID
*/
private Long groupId;
private Long userId;
/**
*
* ID
*/
private LocalDateTime reportDate;
private Long orgId;
/**
*
* <p>
*
*
* {@link TODO mes_org_type }
*/
private String orgType;
/**
*
*/
private String reportTime;
/**
*
*/
private BigDecimal totalTime;
/**
*
*
* {@link TODO mes_record_status }
*/
private Integer status;
private Integer reportStatus;
/**
*
*/
private String remark;
/**
* /
* <p>
*
*
* {@link TODO mes_group_type }
*/
private Integer groupType;
/**
*
*
*
* {@link TODO mes_produce_report_type }
*/
private String remark;
private String reportType;
/**
*
*
*/
private Boolean isEnable;
private LocalDateTime reportDate;
}

@ -57,6 +57,9 @@ public interface ProduceReportDetailMapper extends BaseMapperX<ProduceReportDeta
.eq(ProduceReportDetailDO::getReportId, reportId)
.orderByDesc(ProduceReportDetailDO::getId));
}
default List<ProduceReportDetailDO> selectListByReportId(Long reportId) {
return selectList(ProduceReportDetailDO::getReportId, reportId);
}
default int deleteByReportId(Long reportId) {
return delete(ProduceReportDetailDO::getReportId, reportId);

@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.mes.dal.mysql.producereport;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mes.controller.admin.producereport.vo.ProduceReportPageReqVO;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.mes.dal.dataobject.producereport.ProduceReportDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.mes.controller.admin.producereport.vo.*;
/**
* Mapper
@ -18,14 +20,18 @@ public interface ProduceReportMapper extends BaseMapperX<ProduceReportDO> {
default PageResult<ProduceReportDO> selectPage(ProduceReportPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProduceReportDO>()
.eqIfPresent(ProduceReportDO::getProcessInstanceId, reqVO.getProcessInstanceId())
.eqIfPresent(ProduceReportDO::getWorkTeamId, reqVO.getWorkTeamId())
.eqIfPresent(ProduceReportDO::getGroupId, reqVO.getGroupId())
.betweenIfPresent(ProduceReportDO::getReportDate, reqVO.getReportDate())
.eqIfPresent(ProduceReportDO::getStatus, reqVO.getStatus())
.eqIfPresent(ProduceReportDO::getGroupType, reqVO.getGroupType())
.eqIfPresent(ProduceReportDO::getReportCode, reqVO.getReportCode())
.eqIfPresent(ProduceReportDO::getUserId, reqVO.getUserId())
.eqIfPresent(ProduceReportDO::getOrgId, reqVO.getOrgId())
.eqIfPresent(ProduceReportDO::getOrgType, reqVO.getOrgType())
.betweenIfPresent(ProduceReportDO::getReportTime, reqVO.getReportTime())
.betweenIfPresent(ProduceReportDO::getTotalTime, reqVO.getTotalTime())
.eqIfPresent(ProduceReportDO::getReportStatus, reqVO.getReportStatus())
.eqIfPresent(ProduceReportDO::getRemark, reqVO.getRemark())
.eqIfPresent(ProduceReportDO::getIsEnable, reqVO.getIsEnable())
.betweenIfPresent(ProduceReportDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(ProduceReportDO::getGroupType, reqVO.getGroupType())
.eqIfPresent(ProduceReportDO::getReportType, reqVO.getReportType())
.betweenIfPresent(ProduceReportDO::getReportDate, reqVO.getReportDate())
.orderByDesc(ProduceReportDO::getId));
}

@ -63,4 +63,5 @@ public interface ProduceReportDetailService {
List<ProduceReportDetailRespVO> buildVOList(List<ProduceReportDetailDO> list);
void updateStatus(Long id, Integer status);
void updateStatus2( ProduceReportDetailDO reportDetailDO, Integer status);
}

@ -225,4 +225,54 @@ public class ProduceReportDetailServiceImpl implements ProduceReportDetailServic
else throw exception(PLAN_NOT_EXISTS);
}
}
//通过报工单
@Override
@Transactional
public void updateStatus2( ProduceReportDetailDO reportDetailDO, Integer status) {
reportDetailDO.setReportStatus(status);
produceReportDetailMapper.updateById(reportDetailDO);
//分配给开工中的计划
List<Integer> statusList = new ArrayList<>();
statusList.add(PlanStatusEnum..getValue());
List<PlanDO> planList = planService.getPlanByStatusAndProduct(statusList,reportDetailDO.getProductId());
if(planList!=null && planList.size()>0){
//该种产品只有一个计划在开工
if(planList.size()==1){
WorkReportPlanSaveReqVO saveReqVO = new WorkReportPlanSaveReqVO()
.setReportId(reportDetailDO.getId()).setPlanId(planList.get(0).getId())
.setProductId(reportDetailDO.getProductId())
.setQualityNumberPlan(reportDetailDO.getQualityNumber())
.setWasteNumberPlan(reportDetailDO.getWasteNumber());
workReportPlanService.createWorkReportPlan(saveReqVO);
}
else{
MathContext mc = new MathContext(0, RoundingMode.HALF_UP);
long totalNeed = 0;
Map<Long, Long> planDOMap = new HashMap<>();
for (PlanDO plan : planList) {
BigDecimal finishNumber = workReportPlanService.selectSumBy(plan.getId(),reportDetailDO.getOrgType());
long planNeed = plan.getPlanNumber() > finishNumber.longValue() ? plan.getPlanNumber() - finishNumber.longValue(): 0;
totalNeed += planNeed;
planDOMap.put(plan.getId(), planNeed);
}
//根据计划各自的需求比例分配给计划
for (Long planId : planDOMap.keySet()) {
Long planNeed = planDOMap.get(planId);
if(planNeed>0){
BigDecimal planNumber = reportDetailDO.getQualityNumber().multiply(BigDecimal.valueOf(planNeed/totalNeed),mc);
BigDecimal wasteNumber = reportDetailDO.getWasteNumber().multiply(BigDecimal.valueOf(planNeed/totalNeed),mc);
WorkReportPlanSaveReqVO saveReqVO = new WorkReportPlanSaveReqVO()
.setReportId(reportDetailDO.getId()).setPlanId(planId)
.setProductId(reportDetailDO.getProductId())
.setQualityNumberPlan(planNumber)
.setWasteNumberPlan(wasteNumber);
workReportPlanService.createWorkReportPlan(saveReqVO);
}
}
}
}
else throw exception(PLAN_NOT_EXISTS);
}
}

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.mes.service.producereport;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mes.controller.admin.producereport.vo.ProduceReportPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.producereport.vo.ProduceReportSaveReqVO;
@ -8,6 +7,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.producereport.ProduceReportDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.producereport.ProduceReportDetailDO;
import javax.validation.Valid;
import java.util.List;
/**
* Service
@ -57,42 +57,11 @@ public interface ProduceReportService {
// ==================== 子表(生产报工明细) ====================
/**
*
*
*
* @param pageReqVO
* @param reportId id
* @return
*/
PageResult<ProduceReportDetailDO> getProduceReportDetailPage(PageParam pageReqVO, Long reportId);
/**
*
*
* @param produceReportDetail
* @return
* @return
*/
Long createProduceReportDetail(@Valid ProduceReportDetailDO produceReportDetail);
/**
*
*
* @param produceReportDetail
*/
void updateProduceReportDetail(@Valid ProduceReportDetailDO produceReportDetail);
/**
*
*
* @param id
*/
void deleteProduceReportDetail(Long id);
/**
*
*
* @param id
* @return
*/
ProduceReportDetailDO getProduceReportDetail(Long id);
List<ProduceReportDetailDO> getProduceReportDetailListByReportId(Long reportId);
void updateStatus(Long id, Integer status);
}

@ -1,22 +1,24 @@
package cn.iocoder.yudao.module.mes.service.producereport;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.changerecord.vo.ChangeTypeEnum;
import cn.iocoder.yudao.module.mes.controller.admin.producereport.vo.ProduceReportPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.producereport.vo.ProduceReportSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.producereport.vo.ReportStatusEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.producereport.ProduceReportDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.producereport.ProduceReportDetailDO;
import cn.iocoder.yudao.module.mes.dal.mysql.producereport.ProduceReportDetailMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.producereport.ProduceReportMapper;
import cn.iocoder.yudao.module.mes.service.changerecord.ProduceReportChangeRecordService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRODUCE_REPORT_DETAIL_NOT_EXISTS;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.PRODUCE_REPORT_NOT_EXISTS;
/**
@ -34,21 +36,29 @@ public class ProduceReportServiceImpl implements ProduceReportService {
private ProduceReportDetailMapper produceReportDetailMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createProduceReport(ProduceReportSaveReqVO createReqVO) {
// 插入
ProduceReportDO produceReport = BeanUtils.toBean(createReqVO, ProduceReportDO.class);
produceReportMapper.insert(produceReport);
// 插入子表
createProduceReportDetailList( produceReport, createReqVO.getProduceReportDetails());
// 返回
return produceReport.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateProduceReport(ProduceReportSaveReqVO updateReqVO) {
// 校验存在
validateProduceReportExists(updateReqVO.getId());
// 更新
ProduceReportDO updateObj = BeanUtils.toBean(updateReqVO, ProduceReportDO.class);
produceReportMapper.updateById(updateObj);
// 更新子表
updateProduceReportDetailList(updateObj, updateReqVO.getProduceReportDetails());
}
@Override
@ -82,45 +92,49 @@ public class ProduceReportServiceImpl implements ProduceReportService {
// ==================== 子表(生产报工明细) ====================
@Override
public PageResult<ProduceReportDetailDO> getProduceReportDetailPage(PageParam pageReqVO, Long reportId) {
return produceReportDetailMapper.selectPage(pageReqVO, reportId);
public List<ProduceReportDetailDO> getProduceReportDetailListByReportId(Long reportId) {
return produceReportDetailMapper.selectListByReportId(reportId);
}
@Override
public Long createProduceReportDetail(ProduceReportDetailDO produceReportDetail) {
produceReportDetailMapper.insert(produceReportDetail);
return produceReportDetail.getId();
private void createProduceReportDetailList(ProduceReportDO reportDO, List<ProduceReportDetailDO> list) {
list.forEach(o -> o.setReportId(reportDO.getId()).setReportStatus(reportDO.getReportStatus())
.setReportDate(reportDO.getReportDate()).setGroupType(reportDO.getGroupType())
.setOrgId(reportDO.getOrgId()).setOrgType(reportDO.getOrgType())
);
produceReportDetailMapper.insertBatch(list);
}
@Override
public void updateProduceReportDetail(ProduceReportDetailDO produceReportDetail) {
// 校验存在
validateProduceReportDetailExists(produceReportDetail.getId());
// 更新
produceReportDetailMapper.updateById(produceReportDetail);
private void updateProduceReportDetailList(ProduceReportDO reportDO, List<ProduceReportDetailDO> list) {
deleteProduceReportDetailByReportId(reportDO.getId());
list.forEach(o -> o.setId(null).setReportStatus(reportDO.getReportStatus())
.setReportDate(reportDO.getReportDate()).setGroupType(reportDO.getGroupType())
.setOrgId(reportDO.getOrgId()).setOrgType(reportDO.getOrgType())
.setUpdater(null).setUpdateTime(null)
); // 解决更新情况下1id 冲突2updateTime 不更新
createProduceReportDetailList(reportDO, list);
}
@Override
public void deleteProduceReportDetail(Long id) {
// 校验存在
validateProduceReportDetailExists(id);
// 删除
produceReportDetailMapper.deleteById(id);
private void deleteProduceReportDetailByReportId(Long reportId) {
produceReportDetailMapper.deleteByReportId(reportId);
}
@Resource
private ProduceReportChangeRecordService produceReportChangeRecordService;
@Resource
private ProduceReportDetailService reportDetailService;
@Override
public ProduceReportDetailDO getProduceReportDetail(Long id) {
return produceReportDetailMapper.selectById(id);
@Transactional
public void updateStatus(Long id, Integer status) {
// ProduceReportDO reportDO = produceReportMapper.selectById(id);
// if(reportDO==null) throw exception(PRODUCE_REPORT_NOT_EXISTS);
if(status.equals(ReportStatusEnum..getValue())){
produceReportChangeRecordService.saveChange(id,"", "", ChangeTypeEnum..getValue());
}
private void validateProduceReportDetailExists(Long id) {
if (produceReportDetailMapper.selectById(id) == null) {
throw exception(PRODUCE_REPORT_DETAIL_NOT_EXISTS);
if(status.equals(ReportStatusEnum..getValue())) {
produceReportChangeRecordService.saveChange(id, "", "", ChangeTypeEnum..getValue());
List<ProduceReportDetailDO> list = getProduceReportDetailListByReportId(id);
for (ProduceReportDetailDO detail: list) {
reportDetailService.updateStatus2(detail,status);
}
}
private void deleteProduceReportDetailByReportId(Long reportId) {
produceReportDetailMapper.deleteByReportId(reportId);
}
}

@ -4,6 +4,7 @@ import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
@ -12,9 +13,8 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.producereport.ProduceReportDO;
import cn.iocoder.yudao.module.mes.dal.mysql.producereport.ProduceReportMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;
@ -111,45 +111,61 @@ public class ProduceReportServiceImplTest extends BaseDbUnitTest {
// mock 数据
ProduceReportDO dbProduceReport = randomPojo(ProduceReportDO.class, o -> { // 等会查询到
o.setProcessInstanceId(null);
o.setWorkTeamId(null);
o.setGroupId(null);
o.setReportDate(null);
o.setStatus(null);
o.setGroupType(null);
o.setReportCode(null);
o.setUserId(null);
o.setOrgId(null);
o.setOrgType(null);
o.setReportTime(null);
o.setTotalTime(null);
o.setReportStatus(null);
o.setRemark(null);
o.setIsEnable(null);
o.setCreateTime(null);
o.setGroupType(null);
o.setReportType(null);
o.setReportDate(null);
});
produceReportMapper.insert(dbProduceReport);
// 测试 processInstanceId 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setProcessInstanceId(null)));
// 测试 workTeamId 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setWorkTeamId(null)));
// 测试 groupId 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setGroupId(null)));
// 测试 reportDate 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setReportDate(null)));
// 测试 status 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setStatus(null)));
// 测试 groupType 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setGroupType(null)));
// 测试 reportCode 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setReportCode(null)));
// 测试 userId 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setUserId(null)));
// 测试 orgId 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setOrgId(null)));
// 测试 orgType 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setOrgType(null)));
// 测试 reportTime 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setReportTime(null)));
// 测试 totalTime 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setTotalTime(null)));
// 测试 reportStatus 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setReportStatus(null)));
// 测试 remark 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setRemark(null)));
// 测试 isEnable 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setIsEnable(null)));
// 测试 createTime 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setCreateTime(null)));
// 测试 groupType 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setGroupType(null)));
// 测试 reportType 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setReportType(null)));
// 测试 reportDate 不匹配
produceReportMapper.insert(cloneIgnoreId(dbProduceReport, o -> o.setReportDate(null)));
// 准备参数
ProduceReportPageReqVO reqVO = new ProduceReportPageReqVO();
reqVO.setProcessInstanceId(null);
reqVO.setWorkTeamId(null);
reqVO.setGroupId(null);
reqVO.setReportDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setStatus(null);
reqVO.setGroupType(null);
reqVO.setReportCode(null);
reqVO.setUserId(null);
reqVO.setOrgId(null);
reqVO.setOrgType(null);
reqVO.setReportTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setTotalTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setReportStatus(null);
reqVO.setRemark(null);
reqVO.setIsEnable(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setGroupType(null);
reqVO.setReportType(null);
reqVO.setReportDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
PageResult<ProduceReportDO> pageResult = produceReportService.getProduceReportPage(reqVO);

@ -267,22 +267,27 @@ CREATE TABLE IF NOT EXISTS "mes_produce_report"
(
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"process_instance_id" varchar,
"work_team_id" bigint NOT NULL,
"group_id" bigint NOT NULL,
"report_date" varchar NOT NULL,
"status" int NOT NULL,
"group_type" int NOT NULL,
"report_code" varchar,
"user_id" bigint NOT NULL,
"org_id" bigint NOT NULL,
"org_type" varchar,
"report_time" varchar,
"total_time" varchar,
"report_status" int,
"remark" varchar,
"is_enable" bit NOT NULL,
"creator" varchar DEFAULT '',
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar DEFAULT '',
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint,
"group_type" int,
"report_type" varchar,
"report_date" varchar,
PRIMARY KEY ("id")
) COMMENT '生产报工单';
CREATE TABLE IF NOT EXISTS "mes_produce_report_detail"
(
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,

Loading…
Cancel
Save