From f2c7c2aca847fda1b96387938a9dcd511daf1461 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期二, 28 四月 2026 14:18:27 +0800
Subject: [PATCH] feat(production): 新增生产上机记录功能并优化报工流程

---
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                         |    3 
 src/main/resources/mapper/production/ProductionMachineRecordMapper.xml                  |   36 ++++
 src/main/java/com/ruoyi/production/controller/ProductProcessController.java             |    9 
 src/main/java/com/ruoyi/production/pojo/ProductionMachineRecord.java                    |   84 ++++++++++
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java   |    8 
 src/main/java/com/ruoyi/production/mapper/ProductionMachineRecordMapper.java            |   23 ++
 src/main/java/com/ruoyi/production/dto/ProductionMachineRecordDto.java                  |   17 ++
 src/main/java/com/ruoyi/production/controller/ProductionMachineRecordController.java    |   46 +++++
 src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java          |   54 +++++-
 src/main/java/com/ruoyi/production/dto/ProductProcessDto.java                           |    9 
 src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java                         |    6 
 src/main/java/com/ruoyi/production/pojo/ProductProcess.java                             |    4 
 src/main/java/com/ruoyi/production/service/ProductProcessService.java                   |    7 
 src/main/java/com/ruoyi/production/service/ProductionMachineRecordService.java          |   26 +++
 src/main/java/com/ruoyi/production/service/impl/ProductionMachineRecordServiceImpl.java |  111 +++++++++++++
 15 files changed, 412 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/controller/ProductProcessController.java b/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
index c25f2cc..329de32 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductProcessController.java
+++ b/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("鍒犻櫎宸ュ簭")
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionMachineRecordController.java b/src/main/java/com/ruoyi/production/controller/ProductionMachineRecordController.java
new file mode 100644
index 0000000..b4bcdcd
--- /dev/null
+++ b/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));
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductProcessDto.java b/src/main/java/com/ruoyi/production/dto/ProductProcessDto.java
index 81a571a..eaa00fc 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductProcessDto.java
+++ b/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;
 
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
index da2e3a8..59ad36a 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
+++ b/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;
 }
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionMachineRecordDto.java b/src/main/java/com/ruoyi/production/dto/ProductionMachineRecordDto.java
new file mode 100644
index 0000000..88a9561
--- /dev/null
+++ b/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;
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionMachineRecordMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionMachineRecordMapper.java
new file mode 100644
index 0000000..3ada37a
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
index 21c3f62..7c9c7d4 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -55,6 +55,10 @@
     @Excel(name = "澶囨敞")
     private String remark;
 
+    @ApiModelProperty(value ="鎶ュ伐浜篿ds")
+    @TableField(value = "user_ids")
+    @Excel(name = "鎶ュ伐浜篿ds")
+    private String userIds;
 
     /**
      * 宸ヨ祫瀹氶
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionMachineRecord.java b/src/main/java/com/ruoyi/production/pojo/ProductionMachineRecord.java
new file mode 100644
index 0000000..e2727b8
--- /dev/null
+++ b/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("涓婃満浜篒D")
+    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浠h〃瀛樺湪 1浠h〃鍒犻櫎锛�")
+    private String delFlag;
+}
diff --git a/src/main/java/com/ruoyi/production/service/ProductProcessService.java b/src/main/java/com/ruoyi/production/service/ProductProcessService.java
index 8b61bdd..09cc982 100644
--- a/src/main/java/com/ruoyi/production/service/ProductProcessService.java
+++ b/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);
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionMachineRecordService.java b/src/main/java/com/ruoyi/production/service/ProductionMachineRecordService.java
new file mode 100644
index 0000000..94360f1
--- /dev/null
+++ b/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);
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
index b6c7548..5032e5f 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
+++ b/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瀛楁锛欸X + 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 "";
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionMachineRecordServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionMachineRecordServiceImpl.java
new file mode 100644
index 0000000..2c9a810
--- /dev/null
+++ b/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);
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index ef69ff5..252a409 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/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());
 
 
 
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index fef7112..5664e4a 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -31,7 +31,8 @@
         WHEN pwo.work_order_no LIKE 'FG%' THEN '杩斿伐杩斾慨'
         ELSE '姝e父'
         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
diff --git a/src/main/resources/mapper/production/ProductionMachineRecordMapper.xml b/src/main/resources/mapper/production/ProductionMachineRecordMapper.xml
new file mode 100644
index 0000000..d673824
--- /dev/null
+++ b/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>

--
Gitblit v1.9.3