doc/20260427_create_table_product_work_order_rapporteur.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ drop table if exists product_work_order_rapporteur; create table product_work_order_rapporteur ( id bigint auto_increment primary key, work_order_id bigint not null comment 'å·¥åID', user_id bigint not null comment 'æ¥å人ID', create_time datetime null comment 'å建æ¶é´', create_user int null comment 'åå»ºç¨æ·', update_time datetime null comment 'ä¿®æ¹æ¶é´', update_user int null comment 'ä¿®æ¹ç¨æ·', tenant_id bigint not null comment 'ç§æ·ID', dept_id bigint null comment 'é¨é¨ID', unique key uk_work_order_user (work_order_id, user_id), key idx_work_order_id (work_order_id), key idx_user_id (user_id) ) comment ='产åå·¥å-æ¥åäººå ³è表'; doc/¾ý¸è»¯¹¤.sql
@@ -35,4 +35,10 @@ ALTER TABLE `product-inventory-management-jghg`.`product_process_route_item` ADD COLUMN `type` int NULL COMMENT 'ç±»å1-å å·¥ï¼2-宿¿å·è¯å¶ä½ã3-管路ç»å¯¹ã4-ç½ä½è¿æ¥åè°è¯ï¼5-æµè¯æåï¼6-å ¶ä»' AFTER `dept_id`, ADD COLUMN `planner_id` bigint NULL COMMENT '计å人åID' AFTER `type`, ADD COLUMN `planner_name` varchar(255) NULL COMMENT '计å人åå§å' AFTER `planner_id`; ADD COLUMN `planner_name` varchar(255) NULL COMMENT '计å人åå§å' AFTER `planner_id`; ALTER TABLE `product-inventory-management-jghg`.`product_work_order` MODIFY COLUMN `plan_start_time` datetime NULL DEFAULT NULL COMMENT '计åå¼å§æ¶é´' AFTER `work_order_no`, MODIFY COLUMN `plan_end_time` datetime NULL DEFAULT NULL COMMENT '计åç»ææ¶é´' AFTER `plan_start_time`, MODIFY COLUMN `actual_start_time` datetime NULL DEFAULT NULL COMMENT 'å®é å¼å§æ¶é´' AFTER `plan_end_time`, MODIFY COLUMN `actual_end_time` datetime NULL DEFAULT NULL COMMENT 'å®é ç»ææ¶é´' AFTER `actual_start_time`; src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -584,8 +584,8 @@ public ProductionTurnoverDto workInProcessTurnover() { ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto(); ProductWorkOrderDto workOrder = new ProductWorkOrderDto(); workOrder.setPlanStartTime(LocalDate.now().minusMonths(1)); workOrder.setPlanEndTime(LocalDate.now()); workOrder.setPlanStartTime(LocalDateTime.now()); workOrder.setPlanEndTime(LocalDateTime.now()); List<ProductWorkOrderDto> productWorkOrders = productWorkOrderMapper .pageProductWorkOrder(new Page<>(1, -1), workOrder).getRecords(); long sum = productWorkOrders.stream() @@ -1589,30 +1589,31 @@ @Override public List<MapDto> processOutputAnalysis(Integer type) { LocalDate today = LocalDate.now(); LocalDate startDate; LocalDate endDate = today; // è·åå½åæ¶é´ç¹ LocalDateTime now = LocalDateTime.now(); LocalDateTime startDateTime; LocalDateTime endDateTime = now.with(LocalTime.MAX); switch (type) { case 1: // å¨ startDate = today.with(DayOfWeek.MONDAY); startDateTime = now.with(DayOfWeek.MONDAY).with(LocalTime.MIN); break; case 2: // æ startDate = today.withDayOfMonth(1); startDateTime = now.withDayOfMonth(1).with(LocalTime.MIN); break; case 3: // å£åº¦ int currentMonth = today.getMonthValue(); int currentMonth = now.getMonthValue(); int startMonth = ((currentMonth - 1) / 3) * 3 + 1; startDate = LocalDate.of(today.getYear(), startMonth, 1); startDateTime = LocalDateTime.of(now.getYear(), startMonth, 1, 0, 0, 0); break; default: startDate = today.with(DayOfWeek.MONDAY); startDateTime = now.with(DayOfWeek.MONDAY).with(LocalTime.MIN); break; } ProductWorkOrderDto queryDto = new ProductWorkOrderDto(); queryDto.setPlanStartTime(startDate); queryDto.setPlanEndTime(endDate); queryDto.setPlanStartTime(startDateTime); queryDto.setPlanEndTime(endDateTime); List<ProductWorkOrderDto> list = productWorkOrderMapper.pageProductWorkOrder(new Page<>(1, -1), queryDto) .getRecords(); @@ -1632,7 +1633,7 @@ BigDecimal total = processOutputMap.values().stream() .reduce(BigDecimal.ZERO, BigDecimal::add); if (BigDecimal.ZERO.compareTo(total) == 0) { if (total.compareTo(BigDecimal.ZERO) == 0) { return new ArrayList<>(); } src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -1,14 +1,12 @@ package com.ruoyi.production.dto; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.pojo.ProductWorkOrderFile; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.List; @EqualsAndHashCode(callSuper = true) @Data @@ -43,4 +41,17 @@ @ApiModelProperty(value = "å·¥åç±»å æ£å¸¸ /è¿å·¥è¿ä¿®") private String workOrderType; @ApiModelProperty("计åå·¥æ¶") private BigDecimal salaryQuota; @ApiModelProperty("æ¥å·¥äººID") private Long[] reportWorkersId; @ApiModelProperty("1-ç产工å,2-ç产æ¥å·¥") @TableField(exist = false) private Integer type; @TableField(exist = false) private Long currentUserId; } src/main/java/com/ruoyi/production/mapper/ProductWorkOrderRapporteurMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.pojo.ProductWorkOrderRapporteur; import org.apache.ibatis.annotations.Mapper; @Mapper public interface ProductWorkOrderRapporteurMapper extends BaseMapper<ProductWorkOrderRapporteur> { } src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -2,14 +2,12 @@ import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; /** @@ -81,33 +79,33 @@ * 计åå¼å§æ¶é´ */ @ApiModelProperty(value = "计åå¼å§æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate planStartTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime planStartTime; /** * 计åç»ææ¶é´ */ @ApiModelProperty(value = "计åç»ææ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate planEndTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime planEndTime; /** * å®é å¼å§æ¶é´ */ @ApiModelProperty(value = "å®é å¼å§æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate actualStartTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime actualStartTime; /** * å®é ç»ææ¶é´ */ @ApiModelProperty(value = "å®é ç»ææ¶é´") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate actualEndTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime actualEndTime; /** * éæ±é src/main/java/com/ruoyi/production/pojo/ProductWorkOrderRapporteur.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,54 @@ package com.ruoyi.production.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; /** * 产åå·¥å-æ¥å·¥äººå ³è */ @Data @TableName("product_work_order_rapporteur") public class ProductWorkOrderRapporteur implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty("å·¥åID") private Long workOrderId; @ApiModelProperty("æ¥å人ID") private Long userId; @ApiModelProperty("å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty("åå»ºç¨æ·") @TableField(fill = FieldFill.INSERT) private Integer createUser; @ApiModelProperty("ä¿®æ¹æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty("ä¿®æ¹ç¨æ·") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateUser; @ApiModelProperty("ç§æ·ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -25,7 +25,6 @@ import com.ruoyi.production.service.ProductProcessService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.project.system.service.ISysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -37,6 +36,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Slf4j @Service @@ -91,6 +91,7 @@ if (productModel == null) { throw new ServiceException("æ°å¢å¤±è´¥,该é¨ä»¶ä¸åå¨"); } validateDuplicateTypeForSameProduct(productModel.getId(), productProcessDto.getType(), null); ProductProcess productProcess = new ProductProcess(); BeanUtils.copyProperties(productProcessDto, productProcess); @@ -109,6 +110,9 @@ @Override @Transactional(rollbackFor = Exception.class) public void update(ProductProcessDto productProcessDto) { if (ObjectUtils.isEmpty(productProcessDto.getId())) { throw new ServiceException("ä¿®æ¹å¤±è´¥ï¼å·¥åºIDä¸è½ä¸ºç©º"); } if (ObjectUtils.isEmpty(productProcessDto.getName())) { throw new ServiceException("é¨ä»¶åç§°ä¸è½ä¸ºç©º"); } @@ -121,13 +125,21 @@ } } // å¤æå ³èäº§åæ¯å¦åå¨ if (ObjectUtils.isNotEmpty(productProcessDto.getProductModelId())) { ProductModel productModel = productModelService.getById(productProcessDto.getProductModelId()); if (productModel == null) { throw new ServiceException("ä¿®æ¹å¤±è´¥ï¼å ³èé¨ä»¶ä¸åå¨"); } ProductProcess oldProductProcess = this.getById(productProcessDto.getId()); if (oldProductProcess == null) { throw new ServiceException("ä¿®æ¹å¤±è´¥ï¼å·¥åºä¸åå¨"); } Long finalProductModelId = ObjectUtils.isNotEmpty(productProcessDto.getProductModelId()) ? productProcessDto.getProductModelId() : oldProductProcess.getProductModelId(); Integer finalType = ObjectUtils.isNotEmpty(productProcessDto.getType()) ? productProcessDto.getType() : oldProductProcess.getType(); // å¤æå ³èäº§åæ¯å¦åå¨ ProductModel productModel = productModelService.getById(finalProductModelId); if (productModel == null) { throw new ServiceException("ä¿®æ¹å¤±è´¥ï¼å ³èé¨ä»¶ä¸åå¨"); } validateDuplicateTypeForSameProduct(productModel.getId(), finalType, productProcessDto.getId()); // æ ¡éªè®¡å人å validatePlanner(productProcessDto.getPlannerId(), productProcessDto.getPlannerName(), null); @@ -232,6 +244,34 @@ } } /** * æ ¡éªåä¸äº§åä¸å·¥åºç±»åä¸è½éå¤ */ private void validateDuplicateTypeForSameProduct(Long productModelId, Integer type, Long excludeId) { if (productModelId == null || type == null) { return; } ProductModel currentModel = productModelService.getById(productModelId); if (currentModel == null || currentModel.getProductId() == null) { return; } List<ProductModel> productModels = productModelService.list( Wrappers.<ProductModel>lambdaQuery().eq(ProductModel::getProductId, currentModel.getProductId())); if (CollectionUtils.isEmpty(productModels)) { return; } List<Long> productModelIds = productModels.stream().map(ProductModel::getId).collect(Collectors.toList()); LambdaQueryWrapper<ProductProcess> queryWrapper = Wrappers.<ProductProcess>lambdaQuery() .in(ProductProcess::getProductModelId, productModelIds) .eq(ProductProcess::getType, type); if (excludeId != null) { queryWrapper.ne(ProductProcess::getId, excludeId); } if (this.count(queryWrapper) > 0) { throw new ServiceException("æä½å¤±è´¥ï¼åä¸äº§åä¸è½åå¨éå¤çé¨ä»¶ç±»å"); } } @Override @Transactional(rollbackFor = Exception.class) public void batchDelete(List<Integer> ids) { src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -7,19 +7,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.PictureRenderData; import com.deepoove.poi.data.Pictures; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.MatrixToImageWriter; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.mapper.ProductWorkOrderFileMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; import com.ruoyi.production.mapper.ProductWorkOrderRapporteurMapper; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.pojo.ProductWorkOrderFile; import com.ruoyi.production.pojo.ProductWorkOrderRapporteur; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.quality.pojo.QualityInspectParam; import lombok.AllArgsConstructor; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -30,9 +32,13 @@ import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) @@ -42,18 +48,100 @@ private ProductWorkOrderMapper productWorkOrdermapper; @Autowired private ProductWorkOrderFileMapper productWorkOrderFileMapper; @Autowired private ProductWorkOrderRapporteurMapper productWorkOrderRapporteurMapper; @Autowired private SysUserMapper sysUserMapper; @Value("${file.temp-dir}") private String tempDir; @Override public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) { return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder); if (productWorkOrder != null && Integer.valueOf(2).equals(productWorkOrder.getType())) { productWorkOrder.setCurrentUserId(SecurityUtils.getUserId()); } IPage<ProductWorkOrderDto> pageData = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder); List<ProductWorkOrderDto> records = pageData.getRecords(); if (CollectionUtils.isEmpty(records)) { return pageData; } List<Long> workOrderIds = records.stream() .map(ProductWorkOrderDto::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(workOrderIds)) { return pageData; } List<ProductWorkOrderRapporteur> rapporteurs = productWorkOrderRapporteurMapper.selectList(Wrappers.<ProductWorkOrderRapporteur>lambdaQuery() .in(ProductWorkOrderRapporteur::getWorkOrderId, workOrderIds)); final Map<Long, List<Long>> rapporteurMap = CollectionUtils.isNotEmpty(rapporteurs) ? rapporteurs.stream() .filter(item -> item.getWorkOrderId() != null && item.getUserId() != null) .collect(Collectors.groupingBy( ProductWorkOrderRapporteur::getWorkOrderId, LinkedHashMap::new, Collectors.mapping(ProductWorkOrderRapporteur::getUserId, Collectors.toList()) )) : new LinkedHashMap<>(); records.forEach(item -> { List<Long> userIds = rapporteurMap.get(item.getId()); item.setReportWorkersId(userIds == null ? new Long[0] : userIds.toArray(new Long[0])); }); return pageData; } @Override public int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto) { return productWorkOrdermapper.updateById(productWorkOrderDto); int rows = productWorkOrdermapper.updateById(productWorkOrderDto); if (rows <= 0 || productWorkOrderDto.getId() == null) { return rows; } productWorkOrderRapporteurMapper.delete(Wrappers.<ProductWorkOrderRapporteur>lambdaQuery() .eq(ProductWorkOrderRapporteur::getWorkOrderId, productWorkOrderDto.getId())); Long[] rapporteurIds = productWorkOrderDto.getReportWorkersId(); if (rapporteurIds == null || rapporteurIds.length == 0) { return rows; } List<Long> candidateUserIds = Arrays.stream(rapporteurIds) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); if (CollectionUtils.isEmpty(candidateUserIds)) { return rows; } List<Long> existUserIds = sysUserMapper.selectUserByIds(candidateUserIds).stream() .map(SysUser::getUserId) .filter(Objects::nonNull) .collect(Collectors.toList()); if (existUserIds.size() != candidateUserIds.size()) { List<Long> invalidUserIds = candidateUserIds.stream() .filter(id -> !existUserIds.contains(id)) .collect(Collectors.toList()); throw new ServiceException("æ¥å·¥äººä¸åå¨: " + invalidUserIds); } List<ProductWorkOrderRapporteur> rapporteurList = candidateUserIds.stream() .map(userId -> { ProductWorkOrderRapporteur rapporteur = new ProductWorkOrderRapporteur(); rapporteur.setWorkOrderId(productWorkOrderDto.getId()); rapporteur.setUserId(userId); return rapporteur; }) .collect(Collectors.toList()); if (!rapporteurList.isEmpty()) { rapporteurList.forEach(productWorkOrderRapporteurMapper::insert); } return rows; } @Override @@ -71,7 +159,7 @@ if (CollectionUtils.isNotEmpty(productWorkOrderFiles)) { productWorkOrderFiles.forEach(productWorkOrderFile -> { Map<String, Object> image = new HashMap<>(); PictureRenderData pictureRenderData = Pictures.ofLocal( productWorkOrderFile.getUrl()).sizeInCm(17, 20).create(); PictureRenderData pictureRenderData = Pictures.ofLocal(productWorkOrderFile.getUrl()).sizeInCm(17, 20).create(); image.put("url", pictureRenderData); images.add(image); }); @@ -92,7 +180,7 @@ put("actualStartTime", productWorkOrderDto.getActualStartTime()); put("actualEndTime", productWorkOrderDto.getActualEndTime()); put("twoCode", Pictures.ofLocal(codePath).create()); put("images", images.isEmpty()?null:images); put("images", images.isEmpty() ? null : images); }}); try { src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -215,10 +215,10 @@ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId()); productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty)); if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) { productWorkOrder.setActualStartTime(LocalDate.now());//å®é å¼å§æ¶é´ productWorkOrder.setActualStartTime(LocalDateTime.now());//å®é å¼å§æ¶é´ } if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) { productWorkOrder.setActualEndTime(LocalDate.now());//å®é ç»ææ¶é´ productWorkOrder.setActualEndTime(LocalDateTime.now());//å®é ç»ææ¶é´ } productWorkOrderMapper.updateById(productWorkOrder); //ç产订å src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -12,10 +12,10 @@ <result column="work_order_no" property="workOrderNo"/> <result column="status" property="status"/> <result column="tenant_id" property="tenantId"/> <result column="actual_end_time" property="planStartTime"/> <result column="plan_start_time" property="planStartTime"/> <result column="plan_end_time" property="planEndTime"/> <result column="actual_start_time" property="actualStartTime"/> <result column="actualEndTime" property="actualEndTime"/> <result column="actual_end_time" property="actualEndTime"/> </resultMap> <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> @@ -26,6 +26,7 @@ pm.unit, p.product_name AS productName, po.nps_no AS productOrderNpsNo, pp.salary_quota, ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus, CASE WHEN pwo.work_order_no LIKE 'FG%' THEN 'è¿å·¥è¿ä¿®' @@ -43,11 +44,20 @@ and pwo.work_order_no like concat('%',#{c.workOrderNo},'%') </if> <if test="c.planStartTime != null and c.planEndTime != null"> and DATE(pwo.create_time) between #{c.planStartTime} and #{c.planEndTime} and pwo.create_time <![CDATA[ >= ]]> #{c.planStartTime} and pwo.create_time <![CDATA[ <= ]]> #{c.planEndTime} </if> <if test="c.productOrderId != null and c.productOrderId != ''"> and pwo.product_order_id = #{c.productOrderId} </if> <if test="c.type != null and c.type == 2 and c.currentUserId != null"> and exists ( select 1 from product_work_order_rapporteur pwor where pwor.work_order_id = pwo.id and pwor.user_id = #{c.currentUserId} ) </if> </select> <select id="getProductWorkOrderFlowCard" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> SELECT