feat: 计划时间格式调整为年月日+时分秒;多选报工人;生产报工只能看指定报告人
已添加3个文件
已修改8个文件
335 ■■■■ 文件已修改
doc/20260427_create_table_product_work_order_rapporteur.sql 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/君歌化工.sql 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductWorkOrderRapporteurMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductWorkOrderRapporteur.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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