Kaynağa Gözat

修改
1、优化获取楼栋查询接口提升查询速率
2、金蝶推送去掉长护险推送
3、出入库单增加规格返回

liangwenxuan 3 ay önce
ebeveyn
işleme
659b4ad822
10 değiştirilmiş dosya ile 283 ekleme ve 9 silme
  1. 5 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/kingdee/KingdeeApiImpl.java
  2. 36 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyExpenseController.java
  3. 65 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyFixedExpenseAppendReqVO.java
  4. 2 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/materialio/inbound/MaterialInboundOrderItemRespVO.java
  5. 2 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/materialio/outbound/MaterialOutboundOrderItemRespVO.java
  6. 34 8
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/BuildServiceImpl.java
  7. 4 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java
  8. 3 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseService.java
  9. 130 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseServiceImpl.java
  10. 2 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/MaterialIoServiceImpl.java

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/kingdee/KingdeeApiImpl.java

@@ -154,6 +154,11 @@ public class KingdeeApiImpl implements KingdeeApi {
                 if(StringUtils.isBlank(FCOSTID)){
                     return;
                 }
+                // 补上长护险费用,还是应该要收的
+                if(FCOSTID.equals("CI051")){
+                    expenseOrderDO.setActualAmount(expenseOrderDO.getActualAmount().subtract(expenseOrderItemDO.getTotalAmount()));
+                    return;
+                }
                 // 老人公寓四舍五入调整
                 BigDecimal roundAmount = expenseOrderItemDO.getTotalAmount();
                 String count = expenseOrderItemDO.getCount().toString();

+ 36 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/ElderlyExpenseController.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyFixedExpenseAppendReqVO;
+import cn.iocoder.yudao.module.system.service.biz.ExpenseService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 长者固定费用")
+@RestController
+@RequestMapping("/elderly/elderlyExpense")
+@Validated
+public class ElderlyExpenseController {
+
+    @Resource
+    private ExpenseService expenseService;
+
+    @PostMapping("/addFixedExpense")
+    @Operation(summary = "给长者追加固定费用")
+    @TenantIgnore
+    public CommonResult<Boolean> addFixedExpense(@Valid @RequestBody ElderlyFixedExpenseAppendReqVO reqVO) {
+        expenseService.appendFixedExpense(reqVO);
+        return success(true);
+    }
+}

+ 65 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/ElderlyFixedExpenseAppendReqVO.java

@@ -0,0 +1,65 @@
+package cn.iocoder.yudao.module.system.controller.admin.biz.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
+
+@Schema(description = "管理后台 - 长者追加固定费用 Request VO")
+@Data
+public class ElderlyFixedExpenseAppendReqVO {
+
+    @Schema(description = "长者ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "长者ID不能为空")
+    private Long elderId;
+
+    @Schema(description = "收费项ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1001")
+    @NotNull(message = "收费项ID不能为空")
+    private Long itemId;
+
+    @Schema(description = "收费项分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "床位费")
+    @NotBlank(message = "收费项分类名称不能为空")
+    private String itemCategoryName;
+
+    @Schema(description = "收费项名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "单人间床位费")
+    @NotBlank(message = "收费项名称不能为空")
+    private String itemName;
+
+    @Schema(description = "费用具体类型,1:床位费,2:护理费,3:膳食费,7:服务费等", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "费用类型不能为空")
+    private Integer type;
+
+    @Schema(description = "单价(原价)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1800")
+    @NotNull(message = "单价不能为空")
+    @DecimalMin(value = "0", inclusive = false, message = "单价必须大于0")
+    private BigDecimal amount;
+
+    @Schema(description = "实际单价,不传默认等于单价", example = "1700")
+    @DecimalMin(value = "0", inclusive = false, message = "实际单价必须大于0")
+    private BigDecimal actualAmount;
+
+    @Schema(description = "数量,不传默认 1", example = "1")
+    private Integer count;
+
+    @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-03-01")
+    @NotNull(message = "开始时间不能为空")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate startDate;
+
+    @Schema(description = "结束时间,不传默认等于开始时间", example = "2026-03-31")
+    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
+    private LocalDate endDate;
+
+    @Schema(description = "备注", example = "手工补录")
+    private String remark;
+
+    @Schema(description = "机构ID,不传默认当前租户", example = "1")
+    private Long tenantId;
+}

+ 2 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/materialio/inbound/MaterialInboundOrderItemRespVO.java

@@ -21,6 +21,8 @@ public class MaterialInboundOrderItemRespVO {
 
     private String materialName;
 
+    private String specification;
+
     @Schema(description = "物资类别")
     private String categoryName;
 

+ 2 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/vo/materialio/outbound/MaterialOutboundOrderItemRespVO.java

@@ -21,6 +21,8 @@ public class MaterialOutboundOrderItemRespVO {
 
     private String materialName;
 
+    private String specification;
+
     private String materialUnit;
 
     @Schema(description = "关联入库明细ID")

+ 34 - 8
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/BuildServiceImpl.java

@@ -897,6 +897,33 @@ public class BuildServiceImpl implements BuildService {
                     .orderByAsc(BuildRoomDO::getId));
             roomMap = roomList.stream().collect(Collectors.groupingBy(BuildRoomDO::getFloorId, LinkedHashMap::new, Collectors.toList()));
         }
+        List<Long> roomIds = roomMap.values().stream()
+                .flatMap(Collection::stream)
+                .map(BuildRoomDO::getId)
+                .collect(Collectors.toList());
+        Map<Long, List<ElderlyInfoDO>> elderlyByRoomId;
+        Set<Long> orderedElderIdsToday;
+        if (CollectionUtil.isNotEmpty(roomIds)) {
+            List<ElderlyInfoDO> elderlyInfoList = elderlyInfoMapper.selectList(new LambdaQueryWrapperX<ElderlyInfoDO>()
+                    .in(ElderlyInfoDO::getRoomId, roomIds));
+            elderlyByRoomId = elderlyInfoList.stream()
+                    .collect(Collectors.groupingBy(ElderlyInfoDO::getRoomId, LinkedHashMap::new, Collectors.toList()));
+
+            List<Long> elderIds = elderlyInfoList.stream().map(ElderlyInfoDO::getId).collect(Collectors.toList());
+            if (CollectionUtil.isNotEmpty(elderIds)) {
+                List<ElderlyOrderFoodDO> orderFoodList = elderlyOrderFoodMapper.selectList(new LambdaQueryWrapperX<ElderlyOrderFoodDO>()
+                        .in(ElderlyOrderFoodDO::getElderId, elderIds)
+                        .eq(ElderlyOrderFoodDO::getOrderFoodDate, LocalDate.now()));
+                orderedElderIdsToday = orderFoodList.stream()
+                        .map(ElderlyOrderFoodDO::getElderId)
+                        .collect(Collectors.toSet());
+            } else {
+                orderedElderIdsToday = Collections.emptySet();
+            }
+        } else {
+            orderedElderIdsToday = Collections.emptySet();
+            elderlyByRoomId = Collections.emptyMap();
+        }
         List<BuildFloorTreeRespVO> result = new ArrayList<>();
         for (BuildDO build : buildList) {
             BuildFloorTreeRespVO buildVO = new BuildFloorTreeRespVO();
@@ -913,7 +940,9 @@ public class BuildServiceImpl implements BuildService {
                             BuildFloorTreeRespVO.RoomVO roomVO = new BuildFloorTreeRespVO.RoomVO();
                             roomVO.setRoomId(room.getId());
                             roomVO.setRoomName(room.getRoomName());
-                            handleIsFinishAndBedList(roomVO);
+                            handleIsFinishAndBedList(roomVO,
+                                    elderlyByRoomId.getOrDefault(room.getId(), Collections.emptyList()),
+                                    orderedElderIdsToday);
                             return roomVO;
                         }).collect(Collectors.toList());
                 floorVO.setRoomList(roomVOList);
@@ -1419,9 +1448,9 @@ public class BuildServiceImpl implements BuildService {
                 .toInstant());
     }
 
-    private void handleIsFinishAndBedList(BuildFloorTreeRespVO.RoomVO roomVO){
-        List<ElderlyInfoDO> elderlyInfoList = elderlyInfoMapper.selectList(new LambdaQueryWrapperX<ElderlyInfoDO>()
-                .eq(ElderlyInfoDO::getRoomId, roomVO.getRoomId()));
+    private void handleIsFinishAndBedList(BuildFloorTreeRespVO.RoomVO roomVO,
+                                           List<ElderlyInfoDO> elderlyInfoList,
+                                           Set<Long> orderedElderIdsToday){
         List<BuildFloorTreeRespVO.BedVO> bedList = new ArrayList<>();
         boolean isFinish = true;
         for (ElderlyInfoDO elderlyInfoDO : elderlyInfoList) {
@@ -1431,10 +1460,7 @@ public class BuildServiceImpl implements BuildService {
             bedVO.setElderId(elderlyInfoDO.getId());
             bedVO.setElderName(elderlyInfoDO.getElderName());
             bedList.add(bedVO);
-            ElderlyOrderFoodDO orderFoodDO = elderlyOrderFoodMapper.selectOne(new LambdaQueryWrapperX<ElderlyOrderFoodDO>()
-                    .eq(ElderlyOrderFoodDO::getElderId, elderlyInfoDO.getId())
-                    .eq(ElderlyOrderFoodDO::getOrderFoodDate, LocalDate.now()));
-            if(orderFoodDO == null){
+            if (!orderedElderIdsToday.contains(elderlyInfoDO.getId())) {
                 isFinish = false;
             }
         }

+ 4 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseOrderServiceImpl.java

@@ -46,6 +46,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.mzt.logapi.context.LogRecordContext;
 import com.mzt.logapi.starter.annotation.LogRecord;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -2888,7 +2889,9 @@ public class ExpenseOrderServiceImpl implements ExpenseOrderService {
         }
         expenseOrderDO.setActualAmount(totalAmount);
         expenseOrderMapper.updateById(expenseOrderDO);
-        dailyExpensesMapper.updateBatch(updateDailyExpenseList);
+        if(CollectionUtils.isNotEmpty(updateDailyExpenseList)){
+            dailyExpensesMapper.updateBatch(updateDailyExpenseList);
+        }
     }
 
     @Override

+ 3 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseService.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.system.service.biz;
 
 
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyFixedExpenseAppendReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ExpenseRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ExpenseSaveReqVO;
 
@@ -17,4 +18,6 @@ public interface ExpenseService {
     ExpenseRespVO getExpense(Long elderId, Long contractId);
 
     void renewContract(ExpenseSaveReqVO createReqVO);
+
+    void appendFixedExpense(ElderlyFixedExpenseAppendReqVO reqVO);
 }

+ 130 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/ExpenseServiceImpl.java

@@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.system.api.bpm.vo.CheckInContractReqVO;
 import cn.iocoder.yudao.module.system.api.bpm.vo.CheckInExpenseSaveReqVO;
 import cn.iocoder.yudao.module.bpm.api.business.BpmBusinessFormApi;
 import cn.iocoder.yudao.module.bpm.api.business.dto.BpmBusinessFormCreateReqDTO;
+import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ElderlyFixedExpenseAppendReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ExpenseRespVO;
 import cn.iocoder.yudao.module.system.controller.admin.biz.vo.ExpenseSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.biz.*;
@@ -41,6 +42,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.YearMonth;
 import java.time.ZoneId;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
@@ -523,6 +525,134 @@ public class ExpenseServiceImpl implements ExpenseService {
         addCheckInApply(createReqVO);
     }
 
+    @Override
+    @Transactional
+    public void appendFixedExpense(ElderlyFixedExpenseAppendReqVO reqVO) {
+        Long tenantId = reqVO.getTenantId() == null ? TenantContextHolder.getTenantId() : reqVO.getTenantId();
+
+        ExpenseDO expense = expenseMapper.selectOne(new LambdaQueryWrapperX<ExpenseDO>()
+                .eq(ExpenseDO::getElderId, reqVO.getElderId())
+                .eq(tenantId != null, ExpenseDO::getTenantId, tenantId)
+                .orderByDesc(ExpenseDO::getCreatedTime)
+                .last("LIMIT 1"));
+
+        if (expense == null) {
+            expense = new ExpenseDO();
+            expense.setElderId(reqVO.getElderId());
+            expense.setTenantId(tenantId);
+            expense.setRemark("手工追加固定费项创建");
+            expense.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
+            expense.setCreatedTime(new Date());
+            expense.setTotalAmount(BigDecimal.ZERO);
+            expenseMapper.insert(expense);
+        }
+
+        int count = Optional.ofNullable(reqVO.getCount()).orElse(1);
+        if (count <= 0) {
+            throw exceptionCustomMsg(ErrorCodeConstants.COMMON_ERROR, "数量必须大于0");
+        }
+
+        LocalDate startDate = reqVO.getStartDate();
+        LocalDate endDate = reqVO.getEndDate() == null ? startDate : reqVO.getEndDate();
+        if (endDate.isBefore(startDate)) {
+            throw exceptionCustomMsg(ErrorCodeConstants.COMMON_ERROR, "结束时间不能早于开始时间");
+        }
+
+        BigDecimal actualAmount = reqVO.getActualAmount() == null ? reqVO.getAmount() : reqVO.getActualAmount();
+        BigDecimal totalAmount = actualAmount.multiply(BigDecimal.valueOf(count)).setScale(2, RoundingMode.HALF_UP);
+
+        ExpenseItemDO item = new ExpenseItemDO();
+        item.setExpenseId(expense.getId());
+        item.setItemId(reqVO.getItemId());
+        item.setItemCategoryName(reqVO.getItemCategoryName());
+        item.setItemName(reqVO.getItemName());
+        item.setAmount(reqVO.getAmount());
+        item.setActualAmount(actualAmount);
+        item.setCount(count);
+        item.setTotalAmount(totalAmount);
+        item.setType(reqVO.getType());
+        item.setIsMonthlyExpense(BooleanEnum.TRUE.getValue());
+        item.setIsOneTimeFee(BooleanEnum.FALSE.getValue());
+        item.setTenantId(tenantId);
+        item.setCreateTime(new Date());
+
+        item.setChangeStartDate(startDate);
+        item.setChangeEndDate(endDate);
+
+        String targetBillingMonth = YearMonth.from(startDate).format(DateTimeFormatter.ofPattern("yyyy-MM"));
+
+        expenseItemMapper.insert(item);
+
+        // 追加费项后,立即触发目标月份账单补差
+        reconcileCurrentMonthBillAfterAppend(reqVO.getElderId(), tenantId, item, targetBillingMonth, startDate, endDate);
+    }
+
+    /**
+     * 追加固定费项后,对当月账单进行补差(新增一条账单明细)
+     */
+    private void reconcileCurrentMonthBillAfterAppend(Long elderId, Long tenantId, ExpenseItemDO item,
+                                                      String targetBillingMonth, LocalDate startDate, LocalDate endDate) {
+        ExpenseOrderDO currentOrder = expenseOrderMapper.selectOne(new LambdaQueryWrapperX<ExpenseOrderDO>()
+                .eq(ExpenseOrderDO::getElderId, elderId)
+                .eq(ExpenseOrderDO::getBillingMonth, targetBillingMonth)
+                .in(ExpenseOrderDO::getType, 2, 3)
+                .eq(tenantId != null, ExpenseOrderDO::getTenantId, tenantId)
+                .orderByDesc(ExpenseOrderDO::getCreatedTime)
+                .last("LIMIT 1"));
+
+        if (currentOrder == null) {
+            return;
+        }
+        if (Boolean.TRUE.equals(currentOrder.getConfirmStatus()) || Boolean.TRUE.equals(currentOrder.getIsLock())) {
+            throw exceptionCustomMsg(ErrorCodeConstants.COMMON_ERROR, "当月账单已确认或已锁定,无法自动补差");
+        }
+
+        YearMonth billingYm = YearMonth.parse(targetBillingMonth, DateTimeFormatter.ofPattern("yyyy-MM"));
+        LocalDate billStart = billingYm.atDay(1);
+        LocalDate billEnd = billingYm.atEndOfMonth();
+
+        LocalDate actualStart = startDate.isBefore(billStart) ? billStart : startDate;
+        LocalDate actualEnd = endDate.isAfter(billEnd) ? billEnd : endDate;
+        if (actualEnd.isBefore(actualStart)) {
+            return;
+        }
+
+        long overlapDays = ChronoUnit.DAYS.between(actualStart, actualEnd) + 1;
+        int monthDays = billingYm.lengthOfMonth();
+        BigDecimal dayPrice = item.getActualAmount().divide(BigDecimal.valueOf(monthDays), 8, RoundingMode.DOWN);
+        BigDecimal billDeltaAmount = dayPrice.multiply(BigDecimal.valueOf(overlapDays)).setScale(2, RoundingMode.HALF_UP);
+        if (billDeltaAmount.compareTo(BigDecimal.ZERO) == 0) {
+            return;
+        }
+
+        ExpenseOrderItemDO orderItem = new ExpenseOrderItemDO();
+        orderItem.setExpenseOrderId(currentOrder.getId());
+        orderItem.setSourceExpenseItemId(item.getId());
+        orderItem.setExpenseSource(BusinessConstants.EXPENSE_ITEM);
+        orderItem.setCount((int) overlapDays);
+        orderItem.setItemName(item.getItemName());
+        orderItem.setItemCategoryName(item.getItemCategoryName());
+        orderItem.setPrice(item.getAmount());
+        orderItem.setActualPrice(dayPrice);
+        orderItem.setTotalAmount(billDeltaAmount);
+        orderItem.setRoundAmount(billDeltaAmount.setScale(0, RoundingMode.HALF_UP));
+        orderItem.setRoundTwoDecimalAmount(billDeltaAmount.setScale(2, RoundingMode.HALF_UP));
+        orderItem.setCreatedTime(new Date());
+        orderItem.setCreatedBy(SecurityFrameworkUtils.getLoginUserNickname());
+        orderItem.setType(item.getType());
+        orderItem.setTenantId(tenantId);
+        orderItem.setStartDate(actualStart);
+        orderItem.setEndDate(actualEnd);
+        orderItem.setDescription("固定费项补差:" + actualStart + "至" + actualEnd + ",共" + overlapDays + "天," + item.getItemName());
+        expenseOrderItemMapper.insert(orderItem);
+
+        BigDecimal billAmount = currentOrder.getActualAmount() == null ? BigDecimal.ZERO : currentOrder.getActualAmount();
+        currentOrder.setActualAmount(billAmount.add(billDeltaAmount));
+        currentOrder.setPayStatus(BooleanEnum.FALSE.getValue());
+        currentOrder.setPayType(null);
+        expenseOrderMapper.updateById(currentOrder);
+    }
+
     /**
      * 更新长者床位信息
      */

+ 2 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/MaterialIoServiceImpl.java

@@ -822,6 +822,7 @@ public class MaterialIoServiceImpl implements MaterialIoService {
                 if (material != null) {
                     itemRespVO.setMaterialNumber(material.getMaterialNumber());
                     itemRespVO.setMaterialName(material.getMaterialName());
+                    itemRespVO.setSpecification(material.getSpecification());
                     itemRespVO.setMaterialUnit(material.getMaterialUnit());
                     // 从material_info获取仓库ID和供应商ID
                     if (material.getStoreId() != null) {
@@ -961,6 +962,7 @@ public class MaterialIoServiceImpl implements MaterialIoService {
                 if (material != null) {
                     itemRespVO.setMaterialNumber(material.getMaterialNumber());
                     itemRespVO.setMaterialName(material.getMaterialName());
+                    itemRespVO.setSpecification(material.getSpecification());
                     itemRespVO.setMaterialUnit(material.getMaterialUnit());
                     // 从material_info获取仓库ID和供应商ID
                     if (material.getStoreId() != null) {