diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryInImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryInImport.java new file mode 100644 index 0000000..d8a9e7c --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryInImport.java @@ -0,0 +1,83 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * @Classname MaterialInventoryInImport + * @Description 物料批量入库 + * @Date 2026/1/15 22:22 + * @Created by wangqian + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MaterialInventoryInImport { + + + @ExcelProperty(index = 1) + @NotEmpty(message = "物料名称不能为空") + private String materialName; + + @NotEmpty(message = "耗材类型不能为空") + @ExcelProperty(index = 2) + private String materialTypeName; + + @NotEmpty(message = "类别名称不能为空") + @ExcelProperty(index = 3) + private String typeName; + + + @NotEmpty(message = "类别明细不能为空") + @ExcelProperty(index = 4) + private String typeDetailName; + + @NotEmpty(message = "物料规格不能为空") + @ExcelProperty(index = 5) + private String specifications; + + @NotEmpty(message = "物料单位不能为空") + @ExcelProperty(index = 6) + private String unitName; + + @NotNull(message = "单价不能为空") + @ExcelProperty(index = 7) + private BigDecimal materialPrice; + + @NotNull(message = "入库数量不能为空") + @ExcelProperty(index = 8) + @Positive(message = "数量必须为正整数") + private Long inInventoryNum; + + @NotNull(message = "采购日期不能为空") + @ExcelProperty(index = 9) + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate buyDate; + + @NotEmpty(message = "供应商名称不能为空") + @ExcelProperty(index = 10) + private String supplierName; + + @NotEmpty(message = "联系人不能为空") + @ExcelProperty(index = 11) + private String contactsName; + + @NotEmpty(message = "联系电话不能为空") + @ExcelProperty(index = 12) + private String contactsPhone; + + @NotEmpty(message = "归属公司不能为空") + @ExcelProperty(index = 13) + private String belongCompanyName; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryOutImport.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryOutImport.java new file mode 100644 index 0000000..0f189f0 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/costfee/vo/MaterialInventoryOutImport.java @@ -0,0 +1,69 @@ +package com.zteits.urbanops.module.garden.controller.admin.costfee.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Classname MaterialInventoryOutImport + * @Description 物料批量出库 + * @Date 2026/1/15 22:22 + * @Created by wangqian + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MaterialInventoryOutImport { + + + + @ExcelProperty(index = 1) + @NotEmpty(message = "物料名称不能为空") + private String materialName; + + @NotEmpty(message = "耗材类型不能为空") + @ExcelProperty(index = 2) + private String materialTypeName; + + @NotEmpty(message = "类别名称不能为空") + @ExcelProperty(index = 3) + private String typeName; + + @NotEmpty(message = "类别明细不能为空") + @ExcelProperty(index = 4) + private String typeDetailName; + + @NotEmpty(message = "物料规格不能为空") + @ExcelProperty(index = 5) + private String specifications; + + @NotEmpty(message = "物料单位不能为空") + @ExcelProperty(index = 6) + private String unitName; + + @ExcelProperty(index = 7) + @NotNull(message = "出库数量不能为空") + @Positive(message = "数量必须为正整数") + private Long outInventoryNum; + + @NotNull(message = "出库日期不能为空") + @ExcelProperty(index = 8) + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate outDate; + + @NotEmpty(message = "归属公司不能为空") + @ExcelProperty(index = 9) + private String belongCompanyName; +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java index d11a53e..063eaa6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/TemplateEnum.java @@ -60,6 +60,20 @@ public enum TemplateEnum { 2, RentalMechanicalCostImport.class, true // 新增默认值 + ), + MATERIAL_INVENTORY_IN( + "materialInventory_in", + "物料入库模板.xlsx", + 1, + MaterialInventoryInImport.class, + true // 新增默认值 + ), + MATERIAL_INVENTORY_OUT( + "materialInventory_out", + "物料出库模板.xlsx", + 1, + MaterialInventoryOutImport.class, + true // 新增默认值 ); // 模板编码(前端传递的标识) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java index c97235a..58cb8d9 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/costfee/CostFeeServiceImpl.java @@ -5,12 +5,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.zteits.urbanops.module.garden.controller.admin.costfee.CostFeeController; import com.zteits.urbanops.module.garden.controller.admin.costfee.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.departmentcost.DepartmentCostDO; +import com.zteits.urbanops.module.garden.dal.dataobject.material.MaterialDO; +import com.zteits.urbanops.module.garden.dal.dataobject.materialinventoryin.MaterialInventoryInDO; +import com.zteits.urbanops.module.garden.dal.dataobject.materialinventoryout.MaterialInventoryOutDO; import com.zteits.urbanops.module.garden.dal.dataobject.mechanicalcost.MechanicalCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.personalcost.PersonalCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.rentalmechanicalcost.RentalMechanicalCostDO; import com.zteits.urbanops.module.garden.dal.dataobject.wasterecord.WasteRecordDO; import com.zteits.urbanops.module.garden.dal.dataobject.waterfee.WaterFeeDO; import com.zteits.urbanops.module.garden.dal.mysql.departmentcost.DepartmentCostMapper; +import com.zteits.urbanops.module.garden.dal.mysql.material.MaterialMapper; import com.zteits.urbanops.module.garden.dal.mysql.mechanicalcost.MechanicalCostMapper; import com.zteits.urbanops.module.garden.dal.mysql.personalcost.PersonalCostMapper; import com.zteits.urbanops.module.garden.dal.mysql.rentalmechanicalcost.RentalMechanicalCostMapper; @@ -19,6 +23,9 @@ import com.zteits.urbanops.module.garden.dal.mysql.waterfee.WaterFeeMapper; import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; import com.zteits.urbanops.module.garden.enums.CostFeeConstants; import com.zteits.urbanops.module.garden.enums.TemplateEnum; +import com.zteits.urbanops.module.garden.service.material.MaterialService; +import com.zteits.urbanops.module.garden.service.materialinventoryin.MaterialInventoryInService; +import com.zteits.urbanops.module.garden.service.materialinventoryout.MaterialInventoryOutService; import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import jakarta.annotation.Resource; @@ -84,6 +91,12 @@ public class CostFeeServiceImpl implements CostFeeService { private RentalMechanicalCostMapper rentalMechanicalCostMapper; @Autowired private WasteRecordMapper wasteRecordMapper; + @Resource + private MaterialMapper materialMapper; + @Resource + private MaterialInventoryInService materialInventoryInService; + @Resource + private MaterialInventoryOutService materialInventoryOutService; @Override @@ -412,6 +425,73 @@ public class CostFeeServiceImpl implements CostFeeService { } log.info("成功插入 {} 园林废弃物费用数据", dataList.size()); + } else if (MaterialInventoryInImport.class.isAssignableFrom(importClass)) { + List feeList = (List)dataList; + List saveFeeList = new ArrayList<>(CollectionUtils.isEmpty(feeList) ? 0 : feeList.size()); + if (!CollectionUtils.isEmpty(feeList)) { + Map materialMap = getMaterialAllMap(); + for (MaterialInventoryInImport importObj : feeList) { + MaterialInventoryInDO inventoryDO = new MaterialInventoryInDO(); + BeanUtils.copyProperties(importObj, inventoryDO); + //时间 + inventoryDO.setBuyDate(importObj.getBuyDate().atStartOfDay()); + String checkKey = importObj.getMaterialName() + "|" + + importObj.getMaterialTypeName() + "|" + + importObj.getTypeName() + "|" + + importObj.getTypeDetailName() + "|" + + importObj.getSpecifications() + "|" + + importObj.getUnitName(); + MaterialDO materialDO = materialMap.get(checkKey); + if (materialDO != null) { + inventoryDO.setMaterialId(materialDO.getMaterialId()); + inventoryDO.setMaterialTypeId(materialDO.getMaterialTypeId()); + inventoryDO.setTypeId(materialDO.getTypeId()); + inventoryDO.setTypeDetailId(materialDO.getTypeDetailId()); + inventoryDO.setUnitId(materialDO.getUnitId()); + inventoryDO.setBelongCompanyId(nameToCompanyIdMap.get(inventoryDO.getBelongCompanyName())); + } + saveFeeList.add(inventoryDO); + } + } + //入库 + if (!saveFeeList.isEmpty()) { + materialInventoryInService.batchCreateMaterialInventoryIn(saveFeeList); + } + log.info("成功插入 {} 物料入库数据", dataList.size()); + } else if (MaterialInventoryOutImport.class.isAssignableFrom(importClass)) { + + List feeList = (List)dataList; + List saveFeeList = new ArrayList<>(CollectionUtils.isEmpty(feeList) ? 0 : feeList.size()); + if (!CollectionUtils.isEmpty(feeList)) { + Map materialMap = getMaterialAllMap(); + for (MaterialInventoryOutImport importObj : feeList) { + MaterialInventoryOutDO inventoryDO = new MaterialInventoryOutDO(); + BeanUtils.copyProperties(importObj, inventoryDO); + //时间 + inventoryDO.setOutDate(importObj.getOutDate().atStartOfDay()); + String checkKey = importObj.getMaterialName() + "|" + + importObj.getMaterialTypeName() + "|" + + importObj.getTypeName() + "|" + + importObj.getTypeDetailName() + "|" + + importObj.getSpecifications() + "|" + + importObj.getUnitName(); + MaterialDO materialDO = materialMap.get(checkKey); + if (materialDO != null) { + inventoryDO.setMaterialId(materialDO.getMaterialId()); + inventoryDO.setMaterialTypeId(materialDO.getMaterialTypeId()); + inventoryDO.setTypeId(materialDO.getTypeId()); + inventoryDO.setTypeDetailId(materialDO.getTypeDetailId()); + inventoryDO.setUnitId(materialDO.getUnitId()); + inventoryDO.setBelongCompanyId(nameToCompanyIdMap.get(inventoryDO.getBelongCompanyName())); + } + saveFeeList.add(inventoryDO); + } + } + //出库 + if (!saveFeeList.isEmpty()) { + materialInventoryOutService.batchCreateMaterialInventoryOut(saveFeeList); + } + log.info("成功插入 {} 物料出库数据", dataList.size()); } } @@ -776,9 +856,112 @@ public class CostFeeServiceImpl implements CostFeeService { throw exception0(BAD_REQUEST.getCode(), String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); } } + } else if (MaterialInventoryInImport.class.isAssignableFrom(importClass)) { + //物料入库 + List importList = (List) dataList; + + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + MaterialInventoryInImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + for (ConstraintViolation violation : violations) { + //errorMsg.append(violation.getMessage()).append(";"); + throw exception0(BAD_REQUEST.getCode() ,String.format( + "第[{}]条数据:"+violation.getMessage() + ), rowNum); + } + } + + Long companyId = nameToCompanyIdMap.get(importBean.getBelongCompanyName()); + //单位校验 + validatecompany(rowNum, importBean.getBelongCompanyName(), companyId, belongCompanyId); + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw exception0(BAD_REQUEST.getCode(), String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + // 业务校验,检查物料信息是否正确 + validateMaterialIn(importList); + + } else if (MaterialInventoryOutImport.class.isAssignableFrom(importClass)) { + //物料出库 + List importList = (List) dataList; + // 2. 遍历,逐个创建 + for (int i = 0; i < importList.size(); i++) { + int rowNum = i + 1; // 第i条数据 → 第rowNum行(对应Excel导入的行号逻辑) + MaterialInventoryOutImport importBean = importList.get(i); + + try { + // 2.1 执行校验(替换原 ValidationUtils,直接用 Validator 校验,确保抛出 ConstraintViolationException) + Set> violations = validator.validate(importBean); + if (!violations.isEmpty()) { + for (ConstraintViolation violation : violations) { + //errorMsg.append(violation.getMessage()).append(";"); + throw exception0(BAD_REQUEST.getCode() ,String.format( + "第[{}]条数据:"+violation.getMessage() + ), rowNum); + } + } + + Long companyId = nameToCompanyIdMap.get(importBean.getBelongCompanyName()); + //单位校验 + validatecompany(rowNum, importBean.getBelongCompanyName(), companyId, belongCompanyId); + } catch (ConstraintViolationException ex) { + // 5. 包装异常,明确行号 + 真实校验错误( + throw exception0(BAD_REQUEST.getCode(), String.format("第%d条数据校验失败:%s", rowNum, ex.getMessage()), ex); + } + } + // 业务校验,检查物料信息是否正确 + validateMaterialOut(importList); + } + } + + private void validateMaterialIn(List importList) { + Set materialSet = getMaterialAllSet(); + for (int i = 0; i < importList.size() ; i++) { + int rowNum = i + 1; + MaterialInventoryInImport importBean = importList.get(i); + String checkKey = importBean.getMaterialName() + "|" + + importBean.getMaterialTypeName() + "|" + + importBean.getTypeName() + "|" + + importBean.getTypeDetailName() + "|" + + importBean.getSpecifications() + "|" + + importBean.getUnitName(); + + if (materialSet.contains(checkKey) == false) { + throw exception0(BAD_REQUEST.getCode(), String.format( + "第%d条数据:导入的物料信息有误", + rowNum + )); + } } } + private void validateMaterialOut(List importList) { + Set materialSet = getMaterialAllSet(); + for (int i = 0; i < importList.size() ; i++) { + int rowNum = i + 1; + MaterialInventoryOutImport importBean = importList.get(i); + String checkKey = importBean.getMaterialName() + "|" + + importBean.getMaterialTypeName() + "|" + + importBean.getTypeName() + "|" + + importBean.getTypeDetailName() + "|" + + importBean.getSpecifications() + "|" + + importBean.getUnitName(); + + if (materialSet.contains(checkKey) == false) { + throw exception0(BAD_REQUEST.getCode(), String.format( + "第%d条数据:%s信息有误", + rowNum, checkKey + )); + } + } + } private void validatecompany(int rowNum, String companyName, Long companyId, Long belongCompanyId){ // 校验数组长度是否一致 if (companyId == null) { @@ -998,4 +1181,52 @@ public class CostFeeServiceImpl implements CostFeeService { return list; } + + /** + * @Author wangqian + * @Description 获取物料详情 + * @Date 2026/1/16 9:22 + */ + private Set getMaterialAllSet() { + List material = materialMapper.selectList(); + Set materialKeySet = material.stream() + // 第一步:将MaterialDO转换为拼接key(处理空值) + .map(CostFeeServiceImpl::buildMaterialKey) + // 第三步:收集为Set(HashSet,自动去重) + .collect(Collectors.toCollection(HashSet::new)); + + return materialKeySet; + } + private Map getMaterialAllMap() { + List material = materialMapper.selectList(); + Map materialMap = material.stream() + // 转换为Map:key=拼接字符串,value=MaterialDO + .collect(Collectors.toMap( + // 第一个参数:生成Map的key(调用抽离的拼接方法) + CostFeeServiceImpl::buildMaterialKey, + // 第二个参数:生成Map的value(直接用当前MaterialDO对象) + m -> m, + // 第三个参数:重复key的合并规则(避免DuplicateKeyException) + // 规则1:保留第一个出现的对象(推荐,避免覆盖) + (existingValue, newValue) -> existingValue + + )); + return materialMap; + } + /** + * 抽离key拼接方法(复用性高,与checkKey规则完全一致) + * @param materialDO 物料对象 + * @return 拼接后的key(格式:A|B|C|D|E|F) + */ + private static String buildMaterialKey(MaterialDO materialDO) { + // 空值处理:字段为null时用空字符串替代,避免key中出现null + String materialName = materialDO.getMaterialName() == null ? "" : materialDO.getMaterialName(); + String materialTypeName = materialDO.getMaterialTypeName() == null ? "" : materialDO.getMaterialTypeName(); + String typeName = materialDO.getTypeName() == null ? "" : materialDO.getTypeName(); + String typeDetailName = materialDO.getTypeDetailName() == null ? "" : materialDO.getTypeDetailName(); + String specifications = materialDO.getSpecifications() == null ? "" : materialDO.getSpecifications(); + String unitName = materialDO.getUnitName() == null ? "" : materialDO.getUnitName(); + + return materialName + "|" + materialTypeName + "|" + typeName + "|" + typeDetailName + "|" + specifications + "|" + unitName; + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java index fcc6521..d9fb76f 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventory/MaterialInventoryServiceImpl.java @@ -107,6 +107,9 @@ public class MaterialInventoryServiceImpl implements MaterialInventoryService { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(MaterialInventoryDO::getBelongCompanyId, materialInventory.getBelongCompanyId()); queryWrapper.eq(MaterialInventoryDO::getMaterialId, materialInventory.getMaterialId()); + queryWrapper.eq(MaterialInventoryDO::getMaterialTypeId, materialInventory.getMaterialTypeId()); + queryWrapper.eq(MaterialInventoryDO::getTypeDetailId, materialInventory.getTypeDetailId()); + queryWrapper.eq(MaterialInventoryDO::getTypeId, materialInventory.getTypeId()); MaterialInventoryDO object = materialInventoryMapper.selectOne(queryWrapper); if(object != null){ object.setInventoryTotalNum(object.getInventoryTotalNum()+ materialInventory.getCurrentNum()); diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java index e5b5727..2006aad 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInService.java @@ -58,5 +58,13 @@ public interface MaterialInventoryInService { * @return 物料入库分页 */ PageResult getMaterialInventoryInPage(MaterialInventoryInPageReqVO pageReqVO); + /** + * @Author wangqian + * @Description 批量入库 + * @Date 2026/1/16 20:25 + * @Param createReqVO + * @Return void + */ + void batchCreateMaterialInventoryIn(List list); -} \ No newline at end of file +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java index 78ab0f2..92ab280 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryin/MaterialInventoryInServiceImpl.java @@ -8,6 +8,7 @@ import com.zteits.urbanops.module.garden.dal.mysql.material.MaterialMapper; import com.zteits.urbanops.module.garden.service.materialinventory.MaterialInventoryService; import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -187,4 +188,38 @@ public class MaterialInventoryInServiceImpl implements MaterialInventoryInServic return materialInventoryInMapper.selectPage(pageReqVO); } + + @Transactional + @Override + public void batchCreateMaterialInventoryIn(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + for (MaterialInventoryInDO in : list) { + in.setInventoryInNo(System.currentTimeMillis()+ RandomUtil.randomInt(10, 100000)+""); + in.setDeptId(getLoginUserDeptId()); + materialInventoryInMapper.insert(in); + + //更新库存 + MaterialInventoryDO inventory = new MaterialInventoryDO(); + inventory.setMaterialId(in.getMaterialId()); + inventory.setMaterialName(in.getMaterialName()); + inventory.setMaterialTypeId(in.getMaterialTypeId()); + inventory.setMaterialTypeName(in.getMaterialTypeName()); + inventory.setTypeId(in.getTypeId()); + inventory.setTypeName(in.getTypeName()); + inventory.setTypeDetailId(in.getTypeDetailId()); + inventory.setTypeDetailName(in.getTypeDetailName()); + inventory.setSpecifications(in.getSpecifications()); + inventory.setBelongCompanyId(in.getBelongCompanyId()); + inventory.setBelongCompanyName(in.getBelongCompanyName()); + inventory.setUnitId(in.getUnitId()); + inventory.setUnitName(in.getUnitName()); + inventory.setCurrentNum(in.getInInventoryNum()); + inventory.setOutTotalNum(0L); + inventory.setInventoryTotalNum(in.getInInventoryNum()); + inventory.setDeptId(getLoginUserDeptId()); + materialInventoryService.insertMaterialInventory(inventory); + } + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java index 7030aea..9e9abdd 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutService.java @@ -59,4 +59,13 @@ public interface MaterialInventoryOutService { */ PageResult getMaterialInventoryOutPage(MaterialInventoryOutPageReqVO pageReqVO); -} \ No newline at end of file + /** + * @Author wangqian + * @Description 批量出库 + * @Date 2026/1/16 21:40 + * @Param list + * @Return void + */ + void batchCreateMaterialInventoryOut(List list); + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java index ebaa320..c8c45d0 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/materialinventoryout/MaterialInventoryOutServiceImpl.java @@ -14,7 +14,9 @@ import com.zteits.urbanops.module.garden.service.materialinventory.MaterialInven import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; @@ -154,4 +156,33 @@ public class MaterialInventoryOutServiceImpl implements MaterialInventoryOutServ return materialInventoryOutMapper.selectPage(pageReqVO); } + + @Override + @Transactional + public void batchCreateMaterialInventoryOut(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + for (MaterialInventoryOutDO out : list) { + MaterialInventoryDO materialInventory = materialInventoryService.selectMaterialInventoryByMaterialId(out.getMaterialId(), out.getBelongCompanyId()); + if(null == materialInventory){ + throw exception0(BAD_REQUEST.getCode(),out.getMaterialName()+"没有库存"); + } + + //当前库存不足,无法出库 + if(materialInventory.getCurrentNum() < out.getOutInventoryNum()){ + throw exception0(BAD_REQUEST.getCode(),"当前库存不足,无法出库"); + } + DeptRespDTO deptRespDTO = deptApi.getDept(getCompanyId()); + if(null == deptRespDTO){ + throw exception0(BAD_REQUEST.getCode(), "无效参数-登录人所属单位为空"); + } + out.setInventoryOutNo(System.currentTimeMillis()+ RandomUtil.randomInt(10, 100000)+""); + materialInventoryOutMapper.insert(out); + + //更新库存 + materialInventoryService.updateInVentoryByMaterialId(materialInventory, out.getOutInventoryNum()); + } + + } }