多单位版国产化地质资料管理系统
zhai
2025-09-17 7a8a84577894b766a95c6cbfa5ac7b51e54ac242
src/main/java/com/zbooksoft/gdmis/controller/ImportExcelController.java
@@ -9,6 +9,7 @@
import com.ruili.wcp.web.common.LicenseException;
import com.ruili.wcp.web.model.AjaxResponse;
import com.ruili.wcp.web.model.ErrorInfo;
import com.zbooksoft.gdmis.common.BoxEnum;
import com.zbooksoft.gdmis.service.CatSwajxxService;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFSheet;
@@ -29,6 +30,7 @@
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import javax.crypto.spec.PSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
@@ -123,13 +125,19 @@
        HashMap<String, Object> map = new HashMap<>();
        //读取第i个工作表
        HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
//项目名称:1:25万南沙幅海域区域地质调查
        //项目名称:1:25万南沙幅海域区域地质调查
        String xmmc = getValue(sheet, 6, 3);
        map.put("XMMC", xmmc);
        String xmbh = getValue(sheet, 7, 3);
        map.put("XMBH", xmbh);
        String selectProject = "SELECT ID FROM CAT_FILE_AJJXX WHERE XMKYQMC = '" + xmmc + "' AND XMKYQBH = '" + xmbh + "'";
        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(selectProject);
        if (mapList.size() > 0) {
            String ajId = mapList.get(0).get("ID").toString();
            map.put("AJ_ID", ajId);
        }
        String dcchc = getValue(sheet, 8, 3);
        map.put("DCCHC", dcchc);
@@ -304,4 +312,153 @@
            }
        }
    }
    /**
     * 关联盒号关联
     *
     * @param
     * @return
     */
    @RequestMapping({"/packingIndex"})
    @RequiresUser
    public ModelAndView packingIndex() {
        ModelAndView mv = new ModelAndView("gh/excel/packingExcel");
        return mv;
    }
    /**
     * @param file 0 导入转孔信息  1 导入图幅信息 2 导入实物案卷信息
     * @return
     * @throws LicenseException
     */
    @RequestMapping({"/packingExcel"})
    @ResponseBody
    @RequiresUser
    public Object packingExcel(@RequestParam(value = "file", required = false) MultipartFile file) throws LicenseException {
        try {
            relationPacking(file);
            return new AjaxResponse(true);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            return new AjaxResponse(new ErrorInfo("导入失败"), false);
        }
    }
    private void relationPacking(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        InputStream inputStream = file.getInputStream();
        if (originalFilename.matches("^.+\\.(?i)(xls)$")) {
            //创建工作簿对象
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream);
            //读取第i个工作表
            HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
            int maxRow = sheet.getLastRowNum();
            for (int j = 1; j <= maxRow; j++) {
                Row rowValue = sheet.getRow(j);
                Cell boxNumberCell = rowValue.getCell(0);
                Object boxNumber = getExcelValue(boxNumberCell);
                Cell storageLocationCell = rowValue.getCell(1);
                Object storageLocation = getExcelValue(storageLocationCell);
                //04 1 10 1 02 06
                //ZO1 A10左 02列 06层
                String update = "update BUS_PACKING_MANAGE set STORAGE_LOCATION ='" + storageLocation + "' where BOX_NUMBER = '" + boxNumber + "'";
                jdbcTemplate.update(update);
            }
        }
        if (originalFilename.matches("^.+\\.(?i)(xlsx)$")) {
            //创建工作簿对象
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
            XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
            //获取最后一行的num,即总行数。此处从0开始
            int maxRow = sheet.getLastRowNum();
            Row row = sheet.getRow(0);
            for (int j = 1; j <= maxRow; j++) {
                Row rowValue = sheet.getRow(j);
                Cell boxNumberCell = rowValue.getCell(0);
                Object boxNumber = getExcelValue(boxNumberCell);
                Cell storageLocationCell = rowValue.getCell(1);
                Object storageLocationCode = getExcelValue(storageLocationCell);
                String storageLocation = parseStorageLocationWithEnum(storageLocationCode == null ? "" : storageLocationCode.toString());
                String update = "update BUS_PACKING_MANAGE set STORAGE_LOCATION_CODE = '" + storageLocationCode + "', STORAGE_LOCATION ='" + storageLocation + "' where BOX_NUMBER = '" + boxNumber + "'";
                jdbcTemplate.update(update);
            }
        }
    }
    public static String parseStorageLocationWithEnum(String code) {
        if (code == null || code.length() != 10) {
            throw new IllegalArgumentException("Invalid code format, expected 10 characters");
        }
        // 提取各部分
        String zoneCode = code.substring(0, 2);
        String zoneName = code.substring(2, 3);
        String rackCode = code.substring(3, 5);
        String sideCode = code.substring(5, 6);
        String column = code.substring(6, 8);
        String layer = code.substring(8, 10);
        // 使用枚举获取区域名称
        String zoneStr = BoxEnum.getNameByCode(zoneCode);
        // 处理方向映射
        String sideStr = "1".equals(sideCode) ? "左" : "右";
        // 根据数字获取对应字母
        String letter = BoxEnum.RackLetter.getLetterByNumber(zoneName); // 返回 "A"
        // 构造架号
        String rackStr = letter + rackCode;
        // 组合最终结果
        return String.format("%s-%s%s-%s列-%s层", zoneStr, rackStr, sideStr, column, layer);
    }
    public static String generateStorageLocationCode(String location) {
        // 示例输入: Z01-A01左-08列-02层
        String[] parts = location.split("-");
        String zoneStr = parts[0];           // Z01
        String rackAndSide = parts[1];       // A01左
        // 区域代码 (例如 Z01 -> 04)
        String zoneCode = BoxEnum.getCodeByName(zoneStr);
        // 架号中的字母与数字 (例如 A01 -> A=1, 01)
        String rackLetter = rackAndSide.substring(0, 1);   // A
        String rackNumber = rackAndSide.substring(1, 3); // 01
        String sideStr = rackAndSide.substring(3); // 左 or 右
        // 获取字母对应的数字 (例如 A -> 1)
        // 根据数字获取对应字母
        String rackLetterNum = BoxEnum.RackLetter.getNumberByLetter(rackLetter); // 返回 "A"
        // 方向代码 (左 -> 1, 右 -> 2)
        String sideCode = "左".equals(sideStr) ? "1" : "0";
        // 拼接最终结果
        return zoneCode + rackLetterNum + rackNumber + sideCode;
    }
    public static void main(String[] args) {
//        String s = parseStorageLocationWithEnum("0411010206");
        String locationNumber = "Z01-A01左-08列-02层";
        //0410110802
        String s = generateStorageLocationCode(locationNumber);
        System.out.println(s);
    }
}