35R 零件的变量出图修改

This commit is contained in:
tzy 2025-12-01 17:30:26 +08:00
parent 50630eae22
commit eeae37b7b7
11 changed files with 977 additions and 128 deletions

View File

@ -0,0 +1,106 @@
package com.ruoyi.system.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.vo.DeviceSpec35rVo;
import com.ruoyi.system.domain.bo.DeviceSpec35rBo;
import com.ruoyi.system.service.IDeviceSpec35rService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 35R设备规格参数
*
* @author ruoyi
* @date 2025-12-01
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/spec35r")
public class DeviceSpec35rController extends BaseController {
private final IDeviceSpec35rService iDeviceSpec35rService;
/**
* 查询35R设备规格参数列表
*/
@SaCheckPermission("system:spec35r:list")
@GetMapping("/list")
public TableDataInfo<DeviceSpec35rVo> list(DeviceSpec35rBo bo, PageQuery pageQuery) {
return iDeviceSpec35rService.queryPageList(bo, pageQuery);
}
/**
* 导出35R设备规格参数列表
*/
@SaCheckPermission("system:spec35r:export")
@Log(title = "35R设备规格参数", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(DeviceSpec35rBo bo, HttpServletResponse response) {
List<DeviceSpec35rVo> list = iDeviceSpec35rService.queryList(bo);
ExcelUtil.exportExcel(list, "35R设备规格参数", DeviceSpec35rVo.class, response);
}
/**
* 获取35R设备规格参数详细信息
*
* @param id 主键
*/
@SaCheckPermission("system:spec35r:query")
@GetMapping("/{id}")
public R<DeviceSpec35rVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(iDeviceSpec35rService.queryById(id));
}
/**
* 新增35R设备规格参数
*/
@SaCheckPermission("system:spec35r:add")
@Log(title = "35R设备规格参数", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DeviceSpec35rBo bo) {
return toAjax(iDeviceSpec35rService.insertByBo(bo));
}
/**
* 修改35R设备规格参数
*/
@SaCheckPermission("system:spec35r:edit")
@Log(title = "35R设备规格参数", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DeviceSpec35rBo bo) {
return toAjax(iDeviceSpec35rService.updateByBo(bo));
}
/**
* 删除35R设备规格参数
*
* @param ids 主键串
*/
@SaCheckPermission("system:spec35r:remove")
@Log(title = "35R设备规格参数", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(iDeviceSpec35rService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}

View File

@ -8,6 +8,7 @@ import java.util.*;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.ruoyi.common.excel.DefaultExcelListener; import com.ruoyi.common.excel.DefaultExcelListener;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
@ -75,6 +76,7 @@ public class ProcessOrderProController extends BaseController {
private final IImMaterialService imMaterialService; private final IImMaterialService imMaterialService;
private final ISafetyStockService iSafetyStockService; private final ISafetyStockService iSafetyStockService;
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy年MM月dd日"); private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy年MM月dd日");
/** /**
* 查询项目令号列表 * 查询项目令号列表
*/ */
@ -370,7 +372,6 @@ public class ProcessOrderProController extends BaseController {
} }
@SaCheckPermission("system:route:exportRoute") @SaCheckPermission("system:route:exportRoute")
@Log(title = "下载工艺生产表", businessType = BusinessType.EXPORT) @Log(title = "下载工艺生产表", businessType = BusinessType.EXPORT)
@PostMapping("/exportRoute") @PostMapping("/exportRoute")
@ -391,8 +392,8 @@ public class ProcessOrderProController extends BaseController {
} }
// 1. 读取第一个sheet的数据list - 使用POI直接读取以保留空格 // 1. 读取第一个sheet的数据list - 使用POI直接读取以保留空格
List<ProductionOrderVo> allDataList = readExcelWithPOI(excelName); List<ProductionOrderVo> allDataList = readExcelWithPOI(excelName,orderPro.getProductionOrderNo());
List<ProcessRoute> routeList = readExcelPOIRoute(excelName); List<ProcessRoute> routeList = readExcelPOIRoute(excelName,orderPro.getProductionOrderNo());
// 2. 读取原始表数据 // 2. 读取原始表数据
List<BomDataVO> rawDataList = readRawDataTable(rawDataFile); List<BomDataVO> rawDataList = readRawDataTable(rawDataFile);
@ -554,7 +555,7 @@ public class ProcessOrderProController extends BaseController {
staticDataMap.put("productionName", orderPro.getProductionName()); staticDataMap.put("productionName", orderPro.getProductionName());
//获取工艺数据信息 //获取工艺数据信息
List<ProcessRouteExcelDTO> excelDTOList = iProcessOrderProService.getRouteAndBomDetail(routeList,processDataList,orderPro); List<ProcessRouteExcelDTO> excelDTOList = iProcessOrderProService.getRouteAndBomDetail(routeList, processDataList, orderPro);
excelDTOList.sort(Comparator.comparing(ProcessRouteExcelDTO::getMaterial, Comparator.nullsLast((m1, m2) -> { excelDTOList.sort(Comparator.comparing(ProcessRouteExcelDTO::getMaterial, Comparator.nullsLast((m1, m2) -> {
// 总装部件优先 // 总装部件优先
boolean isTotal1 = "总装部件".equals(m1); boolean isTotal1 = "总装部件".equals(m1);
@ -653,7 +654,7 @@ public class ProcessOrderProController extends BaseController {
} }
} }
private List<ProcessRoute> readExcelPOIRoute(String excelName) { private List<ProcessRoute> readExcelPOIRoute(String excelName,String name) {
List<ProcessRoute> resultList = new ArrayList<>(); List<ProcessRoute> resultList = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(excelName); try (FileInputStream fis = new FileInputStream(excelName);
@ -662,7 +663,7 @@ public class ProcessOrderProController extends BaseController {
XSSFSheet sheet = workbook.getSheetAt(6); // 读取第一个sheet XSSFSheet sheet = workbook.getSheetAt(6); // 读取第一个sheet
// 从第3行开始读取headRowNumber=2所以从第3行开始 // 从第3行开始读取headRowNumber=2所以从第3行开始
for (int rowIndex = 2; rowIndex <= sheet.getLastRowNum(); rowIndex++) { for (int rowIndex = 3; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
XSSFRow row = sheet.getRow(rowIndex); XSSFRow row = sheet.getRow(rowIndex);
if (row == null) { if (row == null) {
continue; continue;
@ -671,6 +672,7 @@ public class ProcessOrderProController extends BaseController {
// 根据列索引读取数据保留原始空格 // 根据列索引读取数据保留原始空格
vo.setMaterialCode(getCellValueAsString(row.getCell(0))); // 图号 vo.setMaterialCode(getCellValueAsString(row.getCell(0))); // 图号
vo.setRouteDescription(name); // 图号
vo.setMaterialName(getCellValueAsString(row.getCell(1))); // 名称 vo.setMaterialName(getCellValueAsString(row.getCell(1))); // 名称
vo.setMaterial(getCellValueAsString(row.getCell(2))); // 数量 vo.setMaterial(getCellValueAsString(row.getCell(2))); // 数量
vo.setDiscWeight(getCellValueAsDouble(row.getCell(3))); vo.setDiscWeight(getCellValueAsDouble(row.getCell(3)));
@ -755,7 +757,7 @@ public class ProcessOrderProController extends BaseController {
/** /**
* 使用POI直接读取Excel文件保留前后空格 * 使用POI直接读取Excel文件保留前后空格
*/ */
private List<ProductionOrderVo> readExcelWithPOI(String excelPath) { private List<ProductionOrderVo> readExcelWithPOI(String excelPath,String orderName) {
List<ProductionOrderVo> resultList = new ArrayList<>(); List<ProductionOrderVo> resultList = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(excelPath); try (FileInputStream fis = new FileInputStream(excelPath);
@ -772,6 +774,7 @@ public class ProcessOrderProController extends BaseController {
ProductionOrderVo vo = new ProductionOrderVo(); ProductionOrderVo vo = new ProductionOrderVo();
// 根据列索引读取数据保留原始空格 // 根据列索引读取数据保留原始空格
vo.setId(getCellValueAsLong(row.getCell(0))); vo.setId(getCellValueAsLong(row.getCell(0)));
vo.setProductionOrderNo(orderName);
vo.setDrawingNo(getCellValueAsString(row.getCell(1))); // 图号 vo.setDrawingNo(getCellValueAsString(row.getCell(1))); // 图号
vo.setDrawingName(getCellValueAsString(row.getCell(2))); // 名称 vo.setDrawingName(getCellValueAsString(row.getCell(2))); // 名称
vo.setQuantity(getCellValueAsDouble(row.getCell(3))); // 数量 vo.setQuantity(getCellValueAsDouble(row.getCell(3))); // 数量
@ -1096,9 +1099,11 @@ public class ProcessOrderProController extends BaseController {
} }
return mapList; return mapList;
} }
private String formatDate(Date date) { private String formatDate(Date date) {
return date == null ? "" : DATE_FORMAT.format(date); return date == null ? "" : DATE_FORMAT.format(date);
} }
/** /**
* 转换工艺VO为Map列表用于模板 * 转换工艺VO为Map列表用于模板
*/ */
@ -1134,9 +1139,8 @@ public class ProcessOrderProController extends BaseController {
} }
@SaCheckPermission("system:route:exportRoute") @SaCheckPermission("system:route:exportRoute")
@Log(title = "下载工艺生产表", businessType = BusinessType.EXPORT) @Log(title = "下载工艺生产表2", businessType = BusinessType.EXPORT)
@PostMapping("/exportRoute2") @PostMapping("/exportRoute2")
public void exportRoute2(@RequestParam("id") Long id, HttpServletResponse response) { public void exportRoute2(@RequestParam("id") Long id, HttpServletResponse response) {
try { try {
@ -1155,8 +1159,8 @@ public class ProcessOrderProController extends BaseController {
} }
// 1. 读取第一个sheet的数据list - 使用POI直接读取以保留空格 // 1. 读取第一个sheet的数据list - 使用POI直接读取以保留空格
List<ProductionOrderVo> allDataList = readExcelWithPOI(excelName); List<ProductionOrderVo> allDataList = readExcelWithPOI(excelName,orderPro.getProductionOrderNo());
List<ProcessRoute> routeList = readExcelPOIRoute(excelName); List<ProcessRoute> routeList = readExcelPOIRoute(excelName,orderPro.getProductionOrderNo());
List<ProcessRoute> routes = new ArrayList<>(); List<ProcessRoute> routes = new ArrayList<>();
List<Map<String, Object>> kingdeeBomRows = new ArrayList<>(); List<Map<String, Object>> kingdeeBomRows = new ArrayList<>();
for (ProcessRoute base : routeList) { for (ProcessRoute base : routeList) {
@ -1176,26 +1180,9 @@ public class ProcessOrderProController extends BaseController {
String bomversion = JdUtil.readGetTheLatestVersion(materialCode); String bomversion = JdUtil.readGetTheLatestVersion(materialCode);
List<MaterialUseDTO> bomItems = StringUtils.isNotBlank(bomversion) ? JdUtil.getMaterialUseXByVer(bomversion) : Collections.emptyList(); List<MaterialUseDTO> bomItems = StringUtils.isNotBlank(bomversion) ? JdUtil.getMaterialUseXByVer(bomversion) : Collections.emptyList();
List<ProcessRouteDTO> routeGuDing = JdUtil.getRouteGuDing(materialCode); List<ProcessRouteDTO> routeGuDing = JdUtil.getRouteGuDing(materialCode);
if (bomItems != null && !bomItems.isEmpty()) {
for (MaterialUseDTO b : bomItems) {
Map<String, Object> bomMap = new HashMap<>();
bomMap.put("routeDescription", base.getRouteDescription());
bomMap.put("materialCode", base.getMaterialCode());
bomMap.put("materialName", base.getMaterialName());
bomMap.put("material", base.getMaterial());
bomMap.put("discWeight", base.getDiscWeight());
bomMap.put("rawMaterialCode", b.getMaterialCode());
bomMap.put("rawMaterialName", b.getMaterialName());
bomMap.put("bomMaterial", b.getCaizhi());
bomMap.put("bomDanZhong", b.getDanzhong());
bomMap.put("discUsage", (b.getFenzi() != null && b.getFenmu() != null) ? (b.getFenzi() + "/" + b.getFenmu()) : null);
bomMap.put("bomUnit", b.getChildUnit());
kingdeeBomRows.add(bomMap);
}
}
if (routeGuDing != null && !routeGuDing.isEmpty()) { if (routeGuDing != null && !routeGuDing.isEmpty()) {
routeGuDing.stream() routeGuDing.stream().forEach(r -> {
.forEach(r -> {
ProcessRoute item = new ProcessRoute(); ProcessRoute item = new ProcessRoute();
item.setRouteDescription(base.getRouteDescription()); item.setRouteDescription(base.getRouteDescription());
item.setMaterialCode(base.getMaterialCode()); item.setMaterialCode(base.getMaterialCode());
@ -1226,6 +1213,32 @@ public class ProcessOrderProController extends BaseController {
// 不写入BOM字段保持纯工艺数据行 // 不写入BOM字段保持纯工艺数据行
routes.add(item); routes.add(item);
} }
if (bomItems != null && !bomItems.isEmpty()) {
if ("总装部件".equals(Objects.toString(base.getMaterial(), "").trim())) {
} else {
for (MaterialUseDTO b : bomItems) {
Map<String, Object> bomMap = new HashMap<>();
bomMap.put("routeDescription", base.getRouteDescription());
bomMap.put("materialCode", base.getMaterialCode());
bomMap.put("materialName", base.getMaterialName());
bomMap.put("material", base.getMaterial());
bomMap.put("discWeight", base.getDiscWeight());
bomMap.put("rawMaterialCode", b.getMaterialCode());
bomMap.put("rawMaterialName", b.getMaterialName());
bomMap.put("bomMaterial", b.getCaizhi());
bomMap.put("bomDanZhong", b.getDanzhong());
if (b.getChildUnit().equals("")) {
bomMap.put("discUsage", (b.getFenzi() != null && b.getFenmu() != null) ? (b.getFenzi() + "/" + b.getFenmu()) : null);
} else {
bomMap.put("discUsage", (b.getFenzi() != null && b.getFenmu() != null) ? b.getFenzi() : null);
}
bomMap.put("bomUnit", b.getChildUnit());
kingdeeBomRows.add(bomMap);
}
}
}
} }
// 用生成的 routes 替换原始 routeList保持原序展开后的结构用于后续导出 // 用生成的 routes 替换原始 routeList保持原序展开后的结构用于后续导出
routeList = routes; routeList = routes;
@ -1282,10 +1295,8 @@ public class ProcessOrderProController extends BaseController {
// 电气外包分类条件物料编码开头空格/特定前缀 备注包含"外购" // 电气外包分类条件物料编码开头空格/特定前缀 备注包含"外购"
if (materialCode.startsWith(" ") if (materialCode.startsWith(" ")
|| materialCode.startsWith("009301") || materialCode.startsWith("009999") || materialCode.startsWith("009301") || materialCode.startsWith("009999") || materialCode.startsWith("017003") || materialCode.startsWith("017002")
|| materialCode.startsWith("017003") || materialCode.startsWith("017002") || materialCode.startsWith("009001") || materialCode.startsWith("009081") || (remark != null && remark.contains("外购"))) {
|| materialCode.startsWith("009001") || materialCode.startsWith("009081")
|| (remark != null && remark.contains("外购"))) {
// 过滤安全库存如果属于安全库存则进入工艺数据列表 // 过滤安全库存如果属于安全库存则进入工艺数据列表
Boolean isSafeStock = iSafetyStockService.isSafeCode(materialCode.trim()); Boolean isSafeStock = iSafetyStockService.isSafeCode(materialCode.trim());
if (isSafeStock) { if (isSafeStock) {
@ -1387,25 +1398,6 @@ public class ProcessOrderProController extends BaseController {
staticDataMap.put("productionOrderNo", orderPro.getProductionOrderNo()); staticDataMap.put("productionOrderNo", orderPro.getProductionOrderNo());
staticDataMap.put("productionName", orderPro.getProductionName()); staticDataMap.put("productionName", orderPro.getProductionName());
//获取工艺数据信息
/* List<ProcessRouteExcelDTO> excelDTOList = iProcessOrderProService.getRouteAndBomDetail(routeList,processDataList,orderPro);
excelDTOList.sort(Comparator.comparing(ProcessRouteExcelDTO::getMaterial, Comparator.nullsLast((m1, m2) -> {
// 总装部件优先
boolean isTotal1 = "总装部件".equals(m1);
boolean isTotal2 = "总装部件".equals(m2);
if (isTotal1 && !isTotal2) return -1;
if (!isTotal1 && isTotal2) return 1;
if (isTotal1 && isTotal2) return 0;
// 其他材质按字母顺序排序
if (m1 == null && m2 == null) return 0;
if (m1 == null) return 1;
if (m2 == null) return -1;
return m1.compareTo(m2);
})
).thenComparing(
ProcessRouteExcelDTO::getMaterialCode,
Comparator.nullsLast(new VersionComparator())
));*/
// 准备动态数据映射 // 准备动态数据映射
List<DynamicDataMapping> dynamicDataMappingList = new ArrayList<>(); List<DynamicDataMapping> dynamicDataMappingList = new ArrayList<>();
@ -1502,61 +1494,28 @@ public class ProcessOrderProController extends BaseController {
* 合并工艺路线与金蝶BOM行按物料编码分组生成统一的 RouteBomData 列表 * 合并工艺路线与金蝶BOM行按物料编码分组生成统一的 RouteBomData 列表
* 每条记录包含两类rowType=route工艺行 rowType=bomBOM行以便模板在同一块中连续展示 * 每条记录包含两类rowType=route工艺行 rowType=bomBOM行以便模板在同一块中连续展示
*/ */
private List<Map<String, Object>> convertRouteBomToMapList(List<ProcessRoute> routeDataList, private List<Map<String, Object>> convertRouteBomToMapList(List<ProcessRoute> routeDataList, List<Map<String, Object>> kingdeeBomRows) {
List<Map<String, Object>> kingdeeBomRows) {
Map<String, List<Map<String, Object>>> grouped = new LinkedHashMap<>(); Map<String, List<Map<String, Object>>> grouped = new LinkedHashMap<>();
// 先按工艺数据建立分组与顺序
for (ProcessRoute item : routeDataList) {
String mcode = item.getMaterialCode();
if (mcode == null) mcode = "";
grouped.computeIfAbsent(mcode, k -> new ArrayList<>());
Map<String, Object> map = new HashMap<>();
map.put("rowType", "route");
map.put("routeDescription", item.getRouteDescription());
map.put("materialCode", item.getMaterialCode());
map.put("materialName", item.getMaterialName());
map.put("material", item.getMaterial());
map.put("discWeight", item.getDiscWeight());
map.put("processNo", item.getProcessNo());
map.put("workCenter", item.getWorkCenter());
map.put("processName", item.getProcessName());
map.put("processDescription", item.getProcessDescription());
map.put("processControl", item.getProcessControl());
map.put("activityDuration", item.getActivityDuration());
map.put("activityUnit", item.getActivityUnit());
map.put("unitQuantity", item.getUnitQuantity());
map.put("batchQuantity", item.getBatchQuantity());
map.put("firstBatchQuantity", item.getFirstBatchQuantity());
map.put("planStartTime", formatDate(item.getPlanStartTime()));
map.put("planEndTime", formatDate(item.getPlanEndTime()));
map.put("xuStartTime", formatDate(item.getXuStartTime()));
map.put("xuEndTime", formatDate(item.getXuEndTime()));
// BOM占位当前行类型为工艺BOM字段置空
map.put("rawMaterialCode", "");
map.put("rawMaterialName", "");
map.put("bomMaterial", "");
map.put("bomDanZhong", "");
map.put("discUsage", "");
map.put("bomUnit", "");
grouped.get(mcode).add(map);
}
// 追加BOM数据到对应物料分组若该物料此前未出现则在最后新增一个分组 // 追加BOM数据到对应物料分组若该物料此前未出现则在最后新增一个分组
for (Map<String, Object> row : kingdeeBomRows) { for (Map<String, Object> row : kingdeeBomRows) {
String mcode = Objects.toString(row.get("materialCode"), ""); String mcode = Objects.toString(row.get("materialCode"), "").trim();
String childCode = Objects.toString(row.get("rawMaterialCode"), "").trim();
String parentMaterial = Objects.toString(row.get("material"), "").trim();
if (mcode.isEmpty() || childCode.isEmpty()) {
continue;
}
if ("总装部件".equals(parentMaterial)) {
continue;
}
grouped.computeIfAbsent(mcode, k -> new ArrayList<>()); grouped.computeIfAbsent(mcode, k -> new ArrayList<>());
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("rowType", "bom"); map.put("rowType", "bom");
map.put("routeDescription", row.get("routeDescription")); map.put("routeDescription", Objects.toString(row.get("routeDescription"), ""));
map.put("materialCode", row.get("materialCode")); map.put("materialCode", mcode);
map.put("materialName", row.get("materialName")); map.put("materialName", Objects.toString(row.get("materialName"), ""));
map.put("material", row.get("material")); map.put("material", Objects.toString(row.get("material"), ""));
map.put("discWeight", row.get("discWeight")); map.put("discWeight", Objects.toString(row.get("discWeight"), ""));
// 工艺占位当前行类型为BOM工艺字段置空 // 工艺占位当前行类型为BOM工艺字段置空
map.put("processNo", ""); map.put("processNo", "");
@ -1575,12 +1534,71 @@ public class ProcessOrderProController extends BaseController {
map.put("xuEndTime", ""); map.put("xuEndTime", "");
// BOM具体字段 // BOM具体字段
map.put("rawMaterialCode", row.get("rawMaterialCode")); map.put("rawMaterialCode", childCode);
map.put("rawMaterialName", row.get("rawMaterialName")); map.put("rawMaterialName", Objects.toString(row.get("rawMaterialName"), ""));
map.put("bomMaterial", row.get("bomMaterial")); map.put("bomMaterial", Objects.toString(row.get("bomMaterial"), ""));
map.put("bomDanZhong", row.get("bomDanZhong")); map.put("bomDanZhong", Objects.toString(row.get("bomDanZhong"), ""));
map.put("discUsage", row.get("discUsage")); map.put("discUsage", Objects.toString(row.get("discUsage"), ""));
map.put("bomUnit", row.get("bomUnit")); map.put("bomUnit", Objects.toString(row.get("bomUnit"), ""));
grouped.get(mcode).add(map);
}
// 先按工艺数据建立分组与顺序
for (ProcessRoute item : routeDataList) {
String mcode = Objects.toString(item.getMaterialCode(), "").trim();
boolean noRoute =
Objects.toString(item.getMaterialCode(), "").trim().isEmpty() &&
Objects.toString(item.getMaterialName(), "").trim().isEmpty() &&
Objects.toString(item.getMaterial(), "").trim().isEmpty() &&
item.getDiscWeight() == null &&
item.getProcessNo() == null &&
Objects.toString(item.getWorkCenter(), "").trim().isEmpty() &&
Objects.toString(item.getProcessName(), "").trim().isEmpty() &&
Objects.toString(item.getProcessDescription(), "").trim().isEmpty() &&
Objects.toString(item.getProcessControl(), "").trim().isEmpty() &&
item.getActivityDuration() == null &&
Objects.toString(item.getActivityUnit(), "").trim().isEmpty() &&
item.getUnitQuantity() == null &&
item.getBatchQuantity() == null &&
Objects.toString(item.getFirstBatchQuantity(), "").trim().isEmpty() &&
item.getPlanStartTime() == null &&
item.getPlanEndTime() == null &&
item.getXuStartTime() == null &&
item.getXuEndTime() == null;
if (noRoute) {
continue;
}
grouped.computeIfAbsent(mcode, k -> new ArrayList<>());
Map<String, Object> map = new HashMap<>();
map.put("rowType", "route");
map.put("routeDescription", Objects.toString(item.getRouteDescription(), ""));
map.put("materialCode", mcode);
map.put("materialName", Objects.toString(item.getMaterialName(), ""));
map.put("material", Objects.toString(item.getMaterial(), ""));
map.put("discWeight", Objects.toString(item.getDiscWeight(), ""));
map.put("processNo", item.getProcessNo());
map.put("workCenter", Objects.toString(item.getWorkCenter(), ""));
map.put("processName", Objects.toString(item.getProcessName(), ""));
map.put("processDescription", Objects.toString(item.getProcessDescription(), ""));
map.put("processControl", Objects.toString(item.getProcessControl(), ""));
map.put("activityDuration", Objects.toString(item.getActivityDuration(), ""));
map.put("activityUnit", Objects.toString(item.getActivityUnit(), ""));
map.put("unitQuantity", item.getUnitQuantity());
map.put("batchQuantity", item.getBatchQuantity());
map.put("firstBatchQuantity", Objects.toString(item.getFirstBatchQuantity(), ""));
map.put("planStartTime", formatDate(item.getPlanStartTime()));
map.put("planEndTime", formatDate(item.getPlanEndTime()));
map.put("xuStartTime", formatDate(item.getXuStartTime()));
map.put("xuEndTime", formatDate(item.getXuEndTime()));
// BOM占位当前行类型为工艺BOM字段置空
map.put("rawMaterialCode", "");
map.put("rawMaterialName", "");
map.put("bomMaterial", "");
map.put("bomDanZhong", "");
map.put("discUsage", "");
map.put("bomUnit", "");
grouped.get(mcode).add(map); grouped.get(mcode).add(map);
} }

View File

@ -0,0 +1,129 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 35R设备规格参数对象 device_spec_35r
*
* @author ruoyi
* @date 2025-12-01
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("device_spec_35r")
public class DeviceSpec35r extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 行程变量
*/
private String travelLength;
/**
* 类型
*/
private String itemType;
/**
* 轴向
*/
private String axialType;
/**
* 箱体
*/
private String boxType;
/**
* 行程
*/
private Long V1;
/**
* 设备总长
*/
private Long V2;
/**
* 地脚位置1
*/
private Long V3;
/**
* 箱体装配长度
*/
private Long V5;
/**
* 箱体地脚位置1
*/
private Long V6;
/**
* 铝箱长度1
*/
private Long V8;
/**
* 铝箱1重量
*/
private BigDecimal G1;
/**
* 铝箱长度2
*/
private BigDecimal V9;
/**
* 铝箱2重量
*/
private BigDecimal G2;
/**
* 导向条长度1
*/
private Long V10;
/**
* 导向条1单重
*/
private BigDecimal G5;
/**
* 导向条长度2
*/
private Long V12;
/**
* 导向条2单重
*/
private BigDecimal G6;
/**
* 导向条长度3
*/
private Long V14;
/**
* 导向条3单重
*/
private BigDecimal G7;
/**
* 轴挡
*/
private Long V41;
/**
* 35E链条滚轮
*/
private Long V42;
/**
* 35E垫圈
*/
private Long V43;
/**
* 35R链节轴2
*/
private Long V44;
/**
* 35E链节轴2
*/
private Long V45;
/**
* 35E链板
*/
private Long V46;
}

View File

@ -0,0 +1,180 @@
package com.ruoyi.system.domain.bo;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.math.BigDecimal;
/**
* 35R设备规格参数业务对象 device_spec_35r
*
* @author ruoyi
* @date 2025-12-01
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DeviceSpec35rBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 行程变量
*/
@NotBlank(message = "行程变量不能为空", groups = { AddGroup.class, EditGroup.class })
private String travelLength;
/**
* 类型
*/
@NotBlank(message = "类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String itemType;
/**
* 轴向
*/
@NotBlank(message = "轴向不能为空", groups = { AddGroup.class, EditGroup.class })
private String axialType;
/**
* 箱体
*/
@NotBlank(message = "箱体不能为空", groups = { AddGroup.class, EditGroup.class })
private String boxType;
/**
* 行程
*/
@NotNull(message = "行程不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V1;
/**
* 设备总长
*/
@NotNull(message = "设备总长不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V2;
/**
* 地脚位置1
*/
@NotNull(message = "地脚位置1不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V3;
/**
* 箱体装配长度
*/
@NotNull(message = "箱体装配长度不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V5;
/**
* 箱体地脚位置1
*/
@NotNull(message = "箱体地脚位置1不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V6;
/**
* 铝箱长度1
*/
@NotNull(message = "铝箱长度1不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V8;
/**
* 铝箱1重量
*/
@NotNull(message = "铝箱1重量不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal G1;
/**
* 铝箱长度2
*/
@NotNull(message = "铝箱长度2不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal V9;
/**
* 铝箱2重量
*/
@NotNull(message = "铝箱2重量不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal G2;
/**
* 导向条长度1
*/
@NotNull(message = "导向条长度1不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V10;
/**
* 导向条1单重
*/
@NotNull(message = "导向条1单重不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal G5;
/**
* 导向条长度2
*/
@NotNull(message = "导向条长度2不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V12;
/**
* 导向条2单重
*/
@NotNull(message = "导向条2单重不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal G6;
/**
* 导向条长度3
*/
@NotNull(message = "导向条长度3不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V14;
/**
* 导向条3单重
*/
@NotNull(message = "导向条3单重不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal G7;
/**
* 轴挡
*/
@NotNull(message = "轴挡不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V41;
/**
* 35E链条滚轮
*/
@NotNull(message = "35E链条滚轮不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V42;
/**
* 35E垫圈
*/
@NotNull(message = "35E垫圈不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V43;
/**
* 35R链节轴2
*/
@NotNull(message = "35R链节轴2不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V44;
/**
* 35E链节轴2
*/
@NotNull(message = "35E链节轴2不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V45;
/**
* 35E链板
*/
@NotNull(message = "35E链板不能为空", groups = { AddGroup.class, EditGroup.class })
private Long V46;
}

View File

@ -0,0 +1,180 @@
package com.ruoyi.system.domain.vo;
import java.math.BigDecimal;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.ruoyi.common.annotation.ExcelDictFormat;
import com.ruoyi.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 35R设备规格参数视图对象 device_spec_35r
*
* @author ruoyi
* @date 2025-12-01
*/
@Data
@ExcelIgnoreUnannotated
public class DeviceSpec35rVo {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 行程变量
*/
@ExcelProperty(value = "行程变量")
private String travelLength;
/**
* 类型
*/
@ExcelProperty(value = "类型")
private String itemType;
/**
* 轴向
*/
@ExcelProperty(value = "轴向")
private String axialType;
/**
* 箱体
*/
@ExcelProperty(value = "箱体")
private String boxType;
/**
* 行程
*/
@ExcelProperty(value = "行程")
private Long V1;
/**
* 设备总长
*/
@ExcelProperty(value = "设备总长")
private Long V2;
/**
* 地脚位置1
*/
@ExcelProperty(value = "地脚位置1")
private Long V3;
/**
* 箱体装配长度
*/
@ExcelProperty(value = "箱体装配长度")
private Long V5;
/**
* 箱体地脚位置1
*/
@ExcelProperty(value = "箱体地脚位置1")
private Long V6;
/**
* 铝箱长度1
*/
@ExcelProperty(value = "铝箱长度1")
private Long V8;
/**
* 铝箱1重量
*/
@ExcelProperty(value = "铝箱1重量")
private BigDecimal G1;
/**
* 铝箱长度2
*/
@ExcelProperty(value = "铝箱长度2")
private BigDecimal V9;
/**
* 铝箱2重量
*/
@ExcelProperty(value = "铝箱2重量")
private BigDecimal G2;
/**
* 导向条长度1
*/
@ExcelProperty(value = "导向条长度1")
private Long V10;
/**
* 导向条1单重
*/
@ExcelProperty(value = "导向条1单重")
private BigDecimal G5;
/**
* 导向条长度2
*/
@ExcelProperty(value = "导向条长度2")
private Long V12;
/**
* 导向条2单重
*/
@ExcelProperty(value = "导向条2单重")
private BigDecimal G6;
/**
* 导向条长度3
*/
@ExcelProperty(value = "导向条长度3")
private Long V14;
/**
* 导向条3单重
*/
@ExcelProperty(value = "导向条3单重")
private BigDecimal G7;
/**
* 轴挡
*/
@ExcelProperty(value = "轴挡")
private Long V41;
/**
* 35E链条滚轮
*/
@ExcelProperty(value = "35E链条滚轮")
private Long V42;
/**
* 35E垫圈
*/
@ExcelProperty(value = "35E垫圈")
private Long V43;
/**
* 35R链节轴2
*/
@ExcelProperty(value = "35R链节轴2")
private Long V44;
/**
* 35E链节轴2
*/
@ExcelProperty(value = "35E链节轴2")
private Long V45;
/**
* 35E链板
*/
@ExcelProperty(value = "35E链板")
private Long V46;
}

View File

@ -0,0 +1,15 @@
package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.DeviceSpec35r;
import com.ruoyi.system.domain.vo.DeviceSpec35rVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
/**
* 35R设备规格参数Mapper接口
*
* @author ruoyi
* @date 2025-12-01
*/
public interface DeviceSpec35rMapper extends BaseMapperPlus<DeviceSpec35rMapper, DeviceSpec35r, DeviceSpec35rVo> {
}

View File

@ -0,0 +1,49 @@
package com.ruoyi.system.service;
import com.ruoyi.system.domain.DeviceSpec35r;
import com.ruoyi.system.domain.vo.DeviceSpec35rVo;
import com.ruoyi.system.domain.bo.DeviceSpec35rBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 35R设备规格参数Service接口
*
* @author ruoyi
* @date 2025-12-01
*/
public interface IDeviceSpec35rService {
/**
* 查询35R设备规格参数
*/
DeviceSpec35rVo queryById(Long id);
/**
* 查询35R设备规格参数列表
*/
TableDataInfo<DeviceSpec35rVo> queryPageList(DeviceSpec35rBo bo, PageQuery pageQuery);
/**
* 查询35R设备规格参数列表
*/
List<DeviceSpec35rVo> queryList(DeviceSpec35rBo bo);
/**
* 新增35R设备规格参数
*/
Boolean insertByBo(DeviceSpec35rBo bo);
/**
* 修改35R设备规格参数
*/
Boolean updateByBo(DeviceSpec35rBo bo);
/**
* 校验并批量删除35R设备规格参数信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,133 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.ruoyi.system.domain.bo.DeviceSpec35rBo;
import com.ruoyi.system.domain.vo.DeviceSpec35rVo;
import com.ruoyi.system.domain.DeviceSpec35r;
import com.ruoyi.system.mapper.DeviceSpec35rMapper;
import com.ruoyi.system.service.IDeviceSpec35rService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 35R设备规格参数Service业务层处理
*
* @author ruoyi
* @date 2025-12-01
*/
@RequiredArgsConstructor
@Service
public class DeviceSpec35rServiceImpl implements IDeviceSpec35rService {
private final DeviceSpec35rMapper baseMapper;
/**
* 查询35R设备规格参数
*/
@Override
public DeviceSpec35rVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询35R设备规格参数列表
*/
@Override
public TableDataInfo<DeviceSpec35rVo> queryPageList(DeviceSpec35rBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<DeviceSpec35r> lqw = buildQueryWrapper(bo);
Page<DeviceSpec35rVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询35R设备规格参数列表
*/
@Override
public List<DeviceSpec35rVo> queryList(DeviceSpec35rBo bo) {
LambdaQueryWrapper<DeviceSpec35r> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<DeviceSpec35r> buildQueryWrapper(DeviceSpec35rBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<DeviceSpec35r> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getTravelLength()), DeviceSpec35r::getTravelLength, bo.getTravelLength());
lqw.eq(StringUtils.isNotBlank(bo.getItemType()), DeviceSpec35r::getItemType, bo.getItemType());
lqw.eq(StringUtils.isNotBlank(bo.getAxialType()), DeviceSpec35r::getAxialType, bo.getAxialType());
lqw.eq(StringUtils.isNotBlank(bo.getBoxType()), DeviceSpec35r::getBoxType, bo.getBoxType());
lqw.eq(bo.getV1() != null, DeviceSpec35r::getV1, bo.getV1());
lqw.eq(bo.getV2() != null, DeviceSpec35r::getV2, bo.getV2());
lqw.eq(bo.getV3() != null, DeviceSpec35r::getV3, bo.getV3());
lqw.eq(bo.getV5() != null, DeviceSpec35r::getV5, bo.getV5());
lqw.eq(bo.getV6() != null, DeviceSpec35r::getV6, bo.getV6());
lqw.eq(bo.getV8() != null, DeviceSpec35r::getV8, bo.getV8());
lqw.eq(bo.getG1() != null, DeviceSpec35r::getG1, bo.getG1());
lqw.eq(bo.getV9() != null, DeviceSpec35r::getV9, bo.getV9());
lqw.eq(bo.getG2() != null, DeviceSpec35r::getG2, bo.getG2());
lqw.eq(bo.getV10() != null, DeviceSpec35r::getV10, bo.getV10());
lqw.eq(bo.getG5() != null, DeviceSpec35r::getG5, bo.getG5());
lqw.eq(bo.getV12() != null, DeviceSpec35r::getV12, bo.getV12());
lqw.eq(bo.getG6() != null, DeviceSpec35r::getG6, bo.getG6());
lqw.eq(bo.getV14() != null, DeviceSpec35r::getV14, bo.getV14());
lqw.eq(bo.getG7() != null, DeviceSpec35r::getG7, bo.getG7());
lqw.eq(bo.getV41() != null, DeviceSpec35r::getV41, bo.getV41());
lqw.eq(bo.getV42() != null, DeviceSpec35r::getV42, bo.getV42());
lqw.eq(bo.getV43() != null, DeviceSpec35r::getV43, bo.getV43());
lqw.eq(bo.getV44() != null, DeviceSpec35r::getV44, bo.getV44());
lqw.eq(bo.getV45() != null, DeviceSpec35r::getV45, bo.getV45());
lqw.eq(bo.getV46() != null, DeviceSpec35r::getV46, bo.getV46());
return lqw;
}
/**
* 新增35R设备规格参数
*/
@Override
public Boolean insertByBo(DeviceSpec35rBo bo) {
DeviceSpec35r add = BeanUtil.toBean(bo, DeviceSpec35r.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改35R设备规格参数
*/
@Override
public Boolean updateByBo(DeviceSpec35rBo bo) {
DeviceSpec35r update = BeanUtil.toBean(bo, DeviceSpec35r.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(DeviceSpec35r entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除35R设备规格参数
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@ -424,6 +424,7 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService {
// 批量查询PcRigidChain避免N+1问题 // 批量查询PcRigidChain避免N+1问题
Set<String> figureNumbers = productionOrders.stream().map(FigureSave::getFigureNumber).collect(Collectors.toSet()); Set<String> figureNumbers = productionOrders.stream().map(FigureSave::getFigureNumber).collect(Collectors.toSet());
Map<String, PcRigidChain> rigidChainMap = pcRigidChainService.selectByTypeNames(figureNumbers).stream().collect(Collectors.toMap(PcRigidChain::getTypeName, Function.identity())); Map<String, PcRigidChain> rigidChainMap = pcRigidChainService.selectByTypeNames(figureNumbers).stream().collect(Collectors.toMap(PcRigidChain::getTypeName, Function.identity()));
return productionOrders.stream().map(figureSave -> buildProductInfo(figureSave, rigidChainMap.get(figureSave.getFigureNumber()))).collect(Collectors.toList()); return productionOrders.stream().map(figureSave -> buildProductInfo(figureSave, rigidChainMap.get(figureSave.getFigureNumber()))).collect(Collectors.toList());
@ -434,12 +435,9 @@ public class ProcessOrderProServiceImpl implements IProcessOrderProService {
productInfo.setAssembledrawing(figureSave.getFigureNumber()); productInfo.setAssembledrawing(figureSave.getFigureNumber());
productInfo.setNumber(String.valueOf(figureSave.getFigureNum())); productInfo.setNumber(String.valueOf(figureSave.getFigureNum()));
productInfo.setSourcefile(figureSave.getDrawPath().replace("/", "\\")); productInfo.setSourcefile(figureSave.getDrawPath().replace("/", "\\"));
log.info("项目生产令号为:{}查询产品型号信息: {}+ 产品名称: {}", figureSave.getProductionCode(), figureSave.getFigureNumber(), figureSave.getFigureName()); log.info("项目生产令号为:{}查询产品型号信息: {}+ 产品名称: {}", figureSave.getProductionCode(), figureSave.getFigureNumber(), figureSave.getFigureName());
DataInfo datainfo = buildDataInfo(rigidChain); DataInfo datainfo = buildDataInfo(rigidChain);
productInfo.setVars(datainfo); productInfo.setVars(datainfo);
return productInfo; return productInfo;
} }

View File

@ -0,0 +1,41 @@
<?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.system.mapper.DeviceSpec35rMapper">
<resultMap type="com.ruoyi.system.domain.DeviceSpec35r" id="DeviceSpec35rResult">
<result property="id" column="id"/>
<result property="travelLength" column="travel_length"/>
<result property="itemType" column="item_type"/>
<result property="axialType" column="axial_type"/>
<result property="boxType" column="box_type"/>
<result property="V1" column="V1"/>
<result property="V2" column="V2"/>
<result property="V3" column="V3"/>
<result property="V5" column="V5"/>
<result property="V6" column="V6"/>
<result property="V8" column="V8"/>
<result property="G1" column="G1"/>
<result property="V9" column="V9"/>
<result property="G2" column="G2"/>
<result property="V10" column="V10"/>
<result property="G5" column="G5"/>
<result property="V12" column="V12"/>
<result property="G6" column="G6"/>
<result property="V14" column="V14"/>
<result property="G7" column="G7"/>
<result property="V41" column="V41"/>
<result property="V42" column="V42"/>
<result property="V43" column="V43"/>
<result property="V44" column="V44"/>
<result property="V45" column="V45"/>
<result property="V46" column="V46"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="updateBy" column="update_by"/>
</resultMap>
</mapper>