فهرست منبع

aps-导入导出修改

sucheng 3 ماه پیش
والد
کامیت
fa94d4cc41

+ 2 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java

@@ -143,6 +143,8 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
     void updateProcessPlanTimeByProcessIds(@Param("processIdList") Set<String> processIdList);
 
     List<ApsProcessOperationProcessEquDoAndWidthVo> getAllWaitDoList();
+
+    List<DeviceCodeAndNameDownVo> selectAllDevice();
 }
 
 

+ 73 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/listener/SpecificRowDropDownHandler.java

@@ -0,0 +1,73 @@
+package com.rongwei.bscommon.sys.listener;
+
+/**
+ * @author :sc
+ * @since :2025/4/19
+ */
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+
+import java.util.List;
+import java.util.function.IntPredicate;
+import java.util.function.Supplier;
+
+/**
+ * 为指定行设置动态下拉框的处理器
+ */
+public class SpecificRowDropDownHandler implements CellWriteHandler {
+    private final int columnIndex;  // 要设置下拉的列索引
+    private final IntPredicate rowPredicate;  // 行判断条件
+    private final Supplier<List<String>> optionsSupplier;  // 动态选项提供者
+    private final String expression;
+
+    /**
+     * @param columnIndex 列索引(从0开始)
+     * @param rowPredicate 行判断条件(参数为行索引,返回true表示需要设置下拉)
+     * @param optionsSupplier 动态下拉选项提供者
+     */
+    public SpecificRowDropDownHandler(int columnIndex,
+                                      IntPredicate rowPredicate,
+                                      Supplier<List<String>> optionsSupplier,
+                                      String expression) {
+        this.columnIndex = columnIndex;
+        this.rowPredicate = rowPredicate;
+        this.optionsSupplier = optionsSupplier;
+        this.expression = expression;
+    }
+
+    @Override
+    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
+                                Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+        // 跳过表头和非目标列
+        if (isHead || cell.getColumnIndex() != columnIndex) {
+            return;
+        }
+
+        // 检查是否目标行(relativeRowIndex从0开始,对应数据的第一行)
+        if (rowPredicate.test(relativeRowIndex)) {
+            Sheet sheet = writeSheetHolder.getSheet();
+            DataValidationHelper helper = sheet.getDataValidationHelper();
+
+            // 获取动态选项
+//            List<String> options = optionsSupplier.get();
+
+            // 创建下拉约束
+            DataValidationConstraint constraint = helper.createFormulaListConstraint(expression);
+
+            // 只对当前单元格设置下拉(单单元格范围)
+            CellRangeAddressList addressList = new CellRangeAddressList(
+                    cell.getRowIndex(), cell.getRowIndex(),
+                    columnIndex, columnIndex
+            );
+
+            DataValidation validation = helper.createValidation(constraint, addressList);
+            validation.setSuppressDropDownArrow(false);  // 显示下拉箭头
+            sheet.addValidationData(validation);
+        }
+    }
+}

+ 50 - 6
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -6,6 +6,8 @@ import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -17,6 +19,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Maps;
 import com.rongwei.bscommon.sys.dao.ApsProcessOperationProcessEquDao;
+import com.rongwei.bscommon.sys.listener.SpecificRowDropDownHandler;
 import com.rongwei.bscommon.sys.listener.WorkShopImportListener;
 import com.rongwei.bscommon.sys.service.*;
 import com.rongwei.bscommon.sys.utils.ApsUtils;
@@ -57,6 +60,8 @@ import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.IntPredicate;
+import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -2619,16 +2624,53 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
             WorkShopExportVo workShopExportVo = BeanUtil.toBean(convertKeysToLowercase, WorkShopExportVo.class);
             res.add(workShopExportVo);
         }
+
+        // 动态选项提供者(可以从数据库或其他服务获取)
+        //查询设备信息,组装数据
+        List<DeviceCodeAndNameDownVo> devices = this.baseMapper.selectAllDevice();
+        String deviceExpression = "下拉选!$A$2:$A$" + (devices.size() + 1);
+        List<String> deviceList = devices.stream().map(DeviceCodeAndNameDownVo::getDevice).collect(Collectors.toList());
+        Supplier<List<String>> statusOptions = () -> deviceList;
+//        Supplier<List<String>> statusOptions = () -> Arrays.asList("Z-03-01-003(03#冷轧机)");
+
+        // 只对第2行和第4行设置下拉(relativeRowIndex从0开始)
+        IntPredicate rowFilter = rowIndex -> rowIndex == 0 || rowIndex == 1;
+
         // 设置响应头
         String fileName = "车间作业跟踪导出数据_" + System.currentTimeMillis() + ".xlsx";
         response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
         response.setCharacterEncoding("utf-8");
         response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
 
-        // 写入Excel
-        EasyExcel.write(response.getOutputStream(), WorkShopExportVo.class)
-                .sheet("车间作业跟踪")
-                .doWrite(res);
+        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
+
+        // Sheet1 -
+        WriteSheet writeSheet1 = EasyExcel.writerSheet("车间作业跟踪")
+                .head(WorkShopExportVo.class)
+                .registerWriteHandler(new SpecificRowDropDownHandler(
+                        1, // 第2列(索引1)
+                        rowFilter,
+                        null,
+                        deviceExpression
+                ))
+                .build();
+        excelWriter.write(res, writeSheet1);
+
+        // 第二个Sheet:设备列表(直接写入字符串列表)
+        WriteSheet deviceSheet = EasyExcel.writerSheet(1, "下拉选")
+                .head(DeviceCodeAndNameDownVo.class)
+                .build();
+        excelWriter.write(devices, deviceSheet);
+        excelWriter.finish();
+//        // 写入Excel
+//        EasyExcel.write(response.getOutputStream(), WorkShopExportVo.class)
+//                .registerWriteHandler(new SpecificRowDropDownHandler(
+//                        1, // 第2列(索引1)
+//                        rowFilter,
+//                        statusOptions
+//                ))
+//                .sheet("车间作业跟踪")
+//                .doWrite(res);
     }
 
     public static JSONObject convertKeysToLowercase(JSONObject original) {
@@ -2704,10 +2746,11 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 continue;
             }
             //查找【当前加工设备】=(生产设备列表查找设备编号=当前作业明细设备编号的设备)
-            AspCheckItemsDo aspCheckItemsDo = allDeviceList.stream().filter(item -> item.getCheckitemcode().equals(workShopExportVo.getProcessdevicecode())).findFirst().orElse(null);
+            String processdevicecode = workShopExportVo.getProcessdevicecode().split("\\(")[0];
+            AspCheckItemsDo aspCheckItemsDo = allDeviceList.stream().filter(item -> item.getCheckitemcode().equals(processdevicecode)).findFirst().orElse(null);
             //如果没找到,则遍历下一个作业明细,并添加错误信息:第{行号}行的加工设备编号{加工设备编号}不正确;
             if (aspCheckItemsDo == null) {
-                errorMessageList.add("第" + num + "行的加工设备编号" + workShopExportVo.getProcessdevicecode() + "不正确;");
+                errorMessageList.add("第" + num + "行的加工设备编号" + processdevicecode + "不正确;");
                 continue;
             }
             //查找【当前工序】=(工序列表中工序=当前作业明细工序的工序)
@@ -2798,6 +2841,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                     }
                 }
                 needUpdate.setPlanenddate(DateUtil.offsetMinute(workShopExportVo.getPlanstartdate(), workTime));
+                apsProcessOperationProcessEquDos.add(needUpdate);
             }
         }
         JSONObject res = new JSONObject();

+ 3 - 0
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml

@@ -695,4 +695,7 @@
           AND apoom.DELETED = 0
           AND apope.WORKSTATUS = '待开工'
     </select>
+    <select id="selectAllDevice" resultType="com.rongwei.bsentity.vo.DeviceCodeAndNameDownVo">
+        select CONCAT(CHECKITEMCODE,'(',CHECKITEMNAME,')') AS 'device' from asp_check_items where DELETED = 0 AND CHECKITEMCODE != '' AND CHECKITEMCODE is not null
+    </select>
 </mapper>

+ 14 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/DeviceCodeAndNameDownVo.java

@@ -0,0 +1,14 @@
+package com.rongwei.bsentity.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @author :sc
+ * @since :2025/4/19
+ */
+@Data
+public class DeviceCodeAndNameDownVo {
+    @ExcelProperty("设备列表")
+    private String device;
+}