liyong
2026-04-28 f2c7c2aca847fda1b96387938a9dcd511daf1461
feat(production): 新增生产上机记录功能并优化报工流程

- 新增 ProductionMachineRecord 实体类及对应的数据传输对象
- 创建生产上机记录的控制器、服务接口和服务实现类
- 实现上机记录的分页查询、添加和删除功能
- 重构报工逻辑,将报工人设置为当前登录用户而非传入参数
- 优化工序管理,支持报工用户多选和显示用户昵称
- 更新工单信息以同步最新的操作员和设备信息
- 移除无用的导入类和变量,优化代码结构
- 完善数据库映射配置,支持关联查询用户和设备信息
已添加7个文件
已修改8个文件
443 ■■■■■ 文件已修改
src/main/java/com/ruoyi/production/controller/ProductProcessController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionMachineRecordController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductProcessDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionMachineRecordDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionMachineRecordMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcess.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionMachineRecord.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductProcessService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionMachineRecordService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionMachineRecordServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionMachineRecordMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductProcessController.java
@@ -2,14 +2,11 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.oA.pojo.OaProject;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.impl.ProductProcessServiceImpl;
@@ -17,7 +14,6 @@
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -51,8 +47,9 @@
    @ApiOperation("更新工序")
    @Log(title = "修改", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    public AjaxResult update(@RequestBody ProductProcess productProcess) {
        return AjaxResult.success(productProcessService.updateById(productProcess));
    public AjaxResult update(@RequestBody ProductProcessDto productProcess) {
        return AjaxResult.success(productProcessService.updateProcess(productProcess));
    }
    @ApiOperation("删除工序")
src/main/java/com/ruoyi/production/controller/ProductionMachineRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductionMachineRecordDto;
import com.ruoyi.production.service.ProductionMachineRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§ä¸Šæœºè®°å½•表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-27 06:12:04
 */
@RestController
@RequestMapping("/productionMachineRecord")
@AllArgsConstructor
@Api(tags = "生产上机记录表")
public class ProductionMachineRecordController {
    private final ProductionMachineRecordService productionMachineRecordService;
    @GetMapping("/listPage")
    @ApiOperation("分页查询")
    public R listPage(Page<ProductionMachineRecordDto> page, ProductionMachineRecordDto productionMachineRecord) {
        return R.ok(productionMachineRecordService.listPage(page, productionMachineRecord));
    }
    @PostMapping("/add")
    @ApiOperation("添加")
    public R add(@RequestBody ProductionMachineRecordDto productionMachineRecordDto) {
        return R.ok(productionMachineRecordService.add(productionMachineRecordDto.getProductionMachineRecord()));
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除")
    public R delete(@RequestBody List<Long> ids) {
        return R.ok(productionMachineRecordService.delete(ids));
    }
}
src/main/java/com/ruoyi/production/dto/ProductProcessDto.java
@@ -1,16 +1,19 @@
package com.ruoyi.production.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.production.pojo.ProductProcess;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel
public class ProductProcessDto extends ProductProcess {
    @ApiModelProperty(value = "报工用户名称")
    private String userNames;
    @ApiModelProperty(value = "报工用户id")
    private List<Long> ids;
}
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -1,14 +1,11 @@
package com.ruoyi.production.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
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
@@ -47,4 +44,7 @@
    private String deviceName;
    private Long deviceId;
    @ApiModelProperty(value = "工单处理用户ids")
    private String processUserIds;
}
src/main/java/com/ruoyi/production/dto/ProductionMachineRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductionMachineRecord;
import lombok.Data;
import java.util.List;
@Data
public class ProductionMachineRecordDto extends ProductionMachineRecord {
    private String  nickName;
    private String deviceName;
    private List<ProductionMachineRecordDto> productionMachineRecord;
    private List<Long> operatorIds;
}
src/main/java/com/ruoyi/production/mapper/ProductionMachineRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductionMachineRecordDto;
import com.ruoyi.production.pojo.ProductionMachineRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * ç”Ÿäº§ä¸Šæœºè®°å½•表 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-27 06:12:04
 */
@Mapper
public interface ProductionMachineRecordMapper extends BaseMapper<ProductionMachineRecord> {
    IPage<ProductionMachineRecordDto> listPage(Page<ProductionMachineRecordDto> page, @Param("ew") ProductionMachineRecordDto productionMachineRecord);
}
src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -55,6 +55,10 @@
    @Excel(name = "备注")
    private String remark;
    @ApiModelProperty(value ="报工人ids")
    @TableField(value = "user_ids")
    @Excel(name = "报工人ids")
    private String userIds;
    /**
     * å·¥èµ„定额
src/main/java/com/ruoyi/production/pojo/ProductionMachineRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * ç”Ÿäº§ä¸Šæœºè®°å½•表
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-27 06:12:04
 */
@Getter
@Setter
@TableName("production_machine_record")
@ApiModel(value = "ProductionMachineRecord对象", description = "生产上机记录表")
public class ProductionMachineRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("工单ID")
    private Long workOrderId;
    @ApiModelProperty("上机人ID")
    private String operatorId;
    @ApiModelProperty("上机机台ID")
    private Long machineId;
    @ApiModelProperty("本次上机时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime machineStartTime;
    @ApiModelProperty("下机时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime machineEndTime;
    @ApiModelProperty("报工状态:0-未报工,1-已报工")
    private Boolean reportStatus;
    @ApiModelProperty("报工工时")
    private BigDecimal reportHours;
    @ApiModelProperty("租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("创建者")
    private String createBy;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新者")
    private String updateBy;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("删除标志(0代表存在 1代表删除)")
    private String delFlag;
}
src/main/java/com/ruoyi/production/service/ProductProcessService.java
@@ -3,14 +3,11 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.*;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -25,4 +22,6 @@
    AjaxResult importData(MultipartFile file);
    String batchDelete(List<Integer> ids);
    String updateProcess(ProductProcessDto productProcess);
}
src/main/java/com/ruoyi/production/service/ProductionMachineRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductionMachineRecordDto;
import com.ruoyi.production.pojo.ProductionMachineRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§ä¸Šæœºè®°å½•表 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-27 06:12:04
 */
public interface ProductionMachineRecordService extends IService<ProductionMachineRecord> {
    IPage<ProductionMachineRecordDto> listPage(Page<ProductionMachineRecordDto> page, ProductionMachineRecordDto productionMachineRecord);
    Boolean add(List<ProductionMachineRecordDto> productionMachineRecordDtoList);
    Object delete(List<Long> ids);
}
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -6,7 +6,6 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.mapper.DeviceLedgerMapper;
import com.ruoyi.device.pojo.DeviceLedger;
@@ -19,12 +18,15 @@
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import com.ruoyi.production.service.ProductProcessService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -40,15 +42,33 @@
    @Autowired
    private DeviceLedgerMapper deviceLedgerMapper;
    @Override
    public IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto) {
        return productProcessMapper.listPage(page, productProcessDto);
    }
    @Autowired
    private SysUserMapper userMapper;
    @Override
    public IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto) {
        IPage<ProductProcessDto> productProcessDtoIPage = productProcessMapper.listPage(page, productProcessDto);
        productProcessDtoIPage.getRecords().forEach(item -> {
            if (ObjectUtils.isNotEmpty(item.getUserIds())) {
                List<Long> userIds = Arrays.stream(item.getUserIds().split(","))
                        .filter(s -> !s.trim().isEmpty() && !"null".equals(s))
                        .map(Long::parseLong)
                        .collect(Collectors.toList());
                item.setIds(userIds);
                if (!userIds.isEmpty()) {
                    List<SysUser> sysUsers = userMapper.selectList(Wrappers.<SysUser>lambdaQuery().in(SysUser::getUserId, userIds));
                    item.setUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
                }
            }
        });
        return productProcessDtoIPage;
    }
    @Override
    public AjaxResult add(ProductProcessDto productProcessDto) {
        String idStr = String.join(",", productProcessDto.getUserIds());
        ProductProcess productProcess = new ProductProcess();
        BeanUtils.copyProperties(productProcessDto,productProcess);
        BeanUtils.copyProperties(productProcessDto, productProcess);
        productProcess.setUserIds(idStr);
        boolean save = productProcessMapper.insert(productProcess) > 0;
        if (save && ObjectUtils.isNull(productProcessDto.getNo())) {
            // æ ¹æ®id生成no字段:GX + 8位数字(不足8位前面补0)
@@ -66,7 +86,7 @@
        try {
            ExcelUtil<ProductProcess> util = new ExcelUtil<ProductProcess>(ProductProcess.class);
            List<ProductProcess> productProcessList = util.importExcel(file.getInputStream());
            if(CollectionUtils.isEmpty(productProcessList)){
            if (CollectionUtils.isEmpty(productProcessList)) {
                return AjaxResult.warn("模板错误或导入数据为空");
            }
            productProcessList.forEach(productProcess -> {
@@ -83,7 +103,7 @@
            // é€šè¿‡æœºå°åç§°æŸ¥è¯¢æœºå°ä¿¡æ¯
            List<String> deviceNames = productProcessList.stream().map(ProductProcess::getDeviceName).collect(Collectors.toList());
            List<DeviceLedger> deviceLedgerList = deviceLedgerMapper.selectList(Wrappers.<DeviceLedger>lambdaQuery().in(DeviceLedger::getDeviceName, deviceNames));
            if(CollectionUtils.isEmpty(deviceLedgerList)){
            if (CollectionUtils.isEmpty(deviceLedgerList)) {
                throw new RuntimeException("未能查询到该机台信息,请检查机台名称是否正确");
            }
            Map<String, DeviceLedger> deviceNameMap = deviceLedgerList.stream().collect(Collectors.toMap(DeviceLedger::getDeviceName, deviceLedger -> deviceLedger));
@@ -91,7 +111,7 @@
                DeviceLedger deviceLedger = deviceNameMap.get(productProcess.getDeviceName());
                productProcess.setDeviceLeaderId(deviceLedger.getId());
                this.save(productProcess);
                if(StrUtil.isEmpty(productProcess.getNo())){
                if (StrUtil.isEmpty(productProcess.getNo())) {
                    String no = "GX" + String.format("%08d", productProcess.getId());
                    productProcess.setNo(no);
                    productProcessMapper.updateById(productProcess);
@@ -100,7 +120,7 @@
            });
            return AjaxResult.success(true);
        }catch (Exception e){
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error(e.getMessage());
        }
@@ -111,10 +131,22 @@
        //查询是否生产中已经引用了这些工序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getProcessId, ids));
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().in(ProductProcessRouteItem::getProcessId, ids));
        if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)){
        if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)) {
            throw new RuntimeException("该工序已经被使用,无法删除");
        }
        productProcessMapper.deleteBatchIds(ids);
        return null;
    }
    @Override
    public String updateProcess(ProductProcessDto productProcess) {
        if (ObjectUtils.isEmpty(productProcess.getIds())) {
            throw new RuntimeException("报工用户不能为空");
        }
        productProcess.setUserIds(productProcess.getIds().stream()
                .map(String::valueOf)
                .collect(Collectors.joining(",")));
        productProcessMapper.updateById(productProcess);
        return "";
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionMachineRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProductionMachineRecordDto;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.mapper.ProductionMachineRecordMapper;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.pojo.ProductionMachineRecord;
import com.ruoyi.production.service.ProductionMachineRecordService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
 * ç”Ÿäº§ä¸Šæœºè®°å½•表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-04-27 06:12:04
 */
@Service
@RequiredArgsConstructor
public class ProductionMachineRecordServiceImpl extends ServiceImpl<ProductionMachineRecordMapper, ProductionMachineRecord> implements ProductionMachineRecordService {
    private final ProductionMachineRecordMapper productionMachineRecordMapper;
    private final ProductWorkOrderMapper productWorkOrderMapper;
    @Override
    public IPage<ProductionMachineRecordDto> listPage(Page<ProductionMachineRecordDto> page, ProductionMachineRecordDto productionMachineRecord) {
        return productionMachineRecordMapper.listPage(page, productionMachineRecord);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean add(List<ProductionMachineRecordDto> productionMachineRecord) {
        for (ProductionMachineRecordDto productionMachineRecordDto : productionMachineRecord) {
            this.saveOrUpdate(productionMachineRecordDto);
            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionMachineRecordDto.getWorkOrderId());
            if (productWorkOrder != null) {
                String userIds = productWorkOrder.getUserIds();
                String operatorId = productionMachineRecordDto.getOperatorId();
                if (ObjectUtils.isNotEmpty(operatorId)) {
                    if (userIds == null || userIds.isEmpty()) {
                        productWorkOrder.setUserIds(operatorId);
                    } else {
                        List<String> userIdList = new ArrayList<>(Arrays.asList(userIds.split(",")));
                        List<String> operatorIdList = Arrays.asList(operatorId.split(","));
                        for (String opId : operatorIdList) {
                            String trimmedOpId = opId.trim();
                            if (!userIdList.contains(trimmedOpId)) {
                                userIdList.add(trimmedOpId);
                            }
                        }
                        productWorkOrder.setUserIds(String.join(",", userIdList));
                    }
                }
                productWorkOrder.setDeviceId(productionMachineRecordDto.getMachineId());
                productWorkOrderMapper.updateById(productWorkOrder);
            } else {
                throw new RuntimeException("操作失败:工单信息不存在");
            }
        }
        return true;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Object delete(List<Long> ids) {
        List<ProductionMachineRecord> productionMachineRecords = this.listByIds(ids);
        for (ProductionMachineRecord productionMachineRecord : productionMachineRecords) {
            ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionMachineRecord.getWorkOrderId());
            if (productWorkOrder != null) {
                String operatorId = productionMachineRecord.getOperatorId();
                if (operatorId != null && !operatorId.isEmpty()) {
                    List<String> operatorIdList = Arrays.asList(operatorId.split(","));
                    List<String> userIdsToRemove = new ArrayList<>();
                    for (String opId : operatorIdList) {
                        String trimmedOpId = opId.trim();
                        Long count = this.lambdaQuery()
                                .eq(ProductionMachineRecord::getWorkOrderId, productionMachineRecord.getWorkOrderId())
                                .ne(ProductionMachineRecord::getId, productionMachineRecord.getId())
                                .apply("FIND_IN_SET({0}, operator_id)", trimmedOpId)
                                .count();
                        if (count == 0) {
                            userIdsToRemove.add(trimmedOpId);
                        }
                    }
                    if (!userIdsToRemove.isEmpty()) {
                        String userIds = productWorkOrder.getUserIds();
                        if (userIds != null && !userIds.isEmpty()) {
                            List<String> userIdList = new ArrayList<>(Arrays.asList(userIds.split(",")));
                            userIdList.removeAll(userIdsToRemove);
                            productWorkOrder.setUserIds(String.join(",", userIdList));
                            productWorkOrderMapper.updateById(productWorkOrder);
                        }
                    }
                }
            }
        }
        return this.removeByIds(ids);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -31,6 +31,7 @@
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import lombok.AllArgsConstructor;
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Service;
@@ -52,6 +53,7 @@
@Transactional(rollbackFor = Exception.class)
public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
    private final SalesLedgerMapper salesLedgerMapper;
    private IQualityInspectService qualityInspectService;
    private ProductionProductMainMapper productionProductMainMapper;
@@ -102,7 +104,6 @@
        LocalDateTime now = LocalDateTime.now();
        ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
        SysUser user = userMapper.selectUserById(dto.getUserId());
        ProductionProductMain productionProductMain = new ProductionProductMain();
        //当前工艺路线对应的工序详情
        ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId());
@@ -150,8 +151,9 @@
        productionProductMain.setTeamIds(dto.getTeamList().stream().map(ProductionProductMainDto.Team::getUserId).map(String::valueOf).collect(Collectors.joining(",")));
        productionProductMain.setTeamNames(dto.getTeamList().stream().map(ProductionProductMainDto.Team::getUserName).collect(Collectors.joining(",")));
        productionProductMain.setUserId(dto.getTeamList().get(0).getUserId());
        productionProductMain.setUserName(dto.getTeamList().get(0).getUserName());
        //报工人 æ˜¯ è°æŠ¥å·¥å°±æ˜¯æ˜¯è°
        productionProductMain.setUserId(SecurityUtils.getUserId());
        productionProductMain.setUserName(SecurityUtils.getLoginUser().getNickName());
src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -31,7 +31,8 @@
        WHEN pwo.work_order_no LIKE 'FG%' THEN '返工返修'
        ELSE '正常'
        END AS work_order_type,
        pp.device_name
        pp.device_name,
        pp.user_ids as process_user_ids
        FROM
        product_work_order pwo
        LEFT JOIN product_process_route_item ppri ON ppri.id = pwo.product_process_route_item_id
src/main/resources/mapper/production/ProductionMachineRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.production.mapper.ProductionMachineRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductionMachineRecord">
        <id column="id" property="id" />
        <result column="work_order_id" property="workOrderId" />
        <result column="process_id" property="processId" />
        <result column="operator_id" property="operatorId" />
        <result column="machine_id" property="machineId" />
        <result column="machine_start_time" property="machineStartTime" />
        <result column="machine_end_time" property="machineEndTime" />
        <result column="report_status" property="reportStatus" />
        <result column="report_hours" property="reportHours" />
        <result column="tenant_id" property="tenantId" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="remark" property="remark" />
        <result column="del_flag" property="delFlag" />
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.production.dto.ProductionMachineRecordDto">
        select pmr.*,su.nick_name,dl.device_name
        from production_machine_record pmr
        left join device_ledger dl on pmr.machine_id = dl.id
        left join sys_user su on pmr.operator_id = su.user_id
        <where>
            <if test="ew.workOrderId != null">
                and pmr.work_order_id = #{ew.workOrderId}
            </if>
        </where>
    </select>
</mapper>