运维-物资管理接口
This commit is contained in:
		| @ -96,4 +96,13 @@ public class RemoteFileServiceImpl implements RemoteFileService { | ||||
|             storage.delete(url); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 通过ossId列表删除 | ||||
|      * @param ossIds | ||||
|      */ | ||||
|     @Override | ||||
|     public void deleteFileByIds(Collection<Long> ossIds) { | ||||
|         sysOssService.deleteWithValidByIds(ossIds,false); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -92,6 +92,11 @@ | ||||
|             <groupId>org.dromara</groupId> | ||||
|             <artifactId>ruoyi-common-encrypt</artifactId> | ||||
|         </dependency> | ||||
| <!--        <dependency>--> | ||||
| <!--            <groupId>org.dromara</groupId>--> | ||||
| <!--            <artifactId>ruoyi-workflow</artifactId>--> | ||||
| <!--            <version>2.4.1</version>--> | ||||
| <!--        </dependency>--> | ||||
|  | ||||
|     </dependencies> | ||||
|  | ||||
|  | ||||
| @ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.validation.constraints.*; | ||||
| import cn.dev33.satoken.annotation.SaCheckPermission; | ||||
| import org.dromara.personnel.domain.dto.OpsBeipinBeijianDto; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianCountVo; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||
| @ -42,8 +44,17 @@ public class OpsBeipinBeijianController extends BaseController { | ||||
|      */ | ||||
|     @SaCheckPermission("personnel:beipinBeijian:list") | ||||
|     @GetMapping("/list") | ||||
|     public TableDataInfo<OpsBeipinBeijianVo> list(OpsBeipinBeijianBo bo, PageQuery pageQuery) { | ||||
|         return opsBeipinBeijianService.queryPageList(bo, pageQuery); | ||||
|     public TableDataInfo<OpsBeipinBeijianDto> list(OpsBeipinBeijianBo bo, PageQuery pageQuery) { | ||||
|         return opsBeipinBeijianService.getList(bo, pageQuery); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 查询运维-物资-备品配件列表 | ||||
|      */ | ||||
|     @SaCheckPermission("personnel:beipinBeijian:list") | ||||
|     @GetMapping("/getCount") | ||||
|     public R<OpsBeipinBeijianCountVo> getCount(OpsBeipinBeijianBo bo) { | ||||
|         return R.ok(opsBeipinBeijianService.getCount(bo)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|  | ||||
| @ -29,6 +29,11 @@ public class OpsCaigouPlanChanpin extends BaseEntity { | ||||
|     @TableId(value = "id") | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 项目id | ||||
|      */ | ||||
|     private Long projectId; | ||||
|  | ||||
|     /** | ||||
|      * 采购申请计划id | ||||
|      */ | ||||
| @ -39,6 +44,11 @@ public class OpsCaigouPlanChanpin extends BaseEntity { | ||||
|      */ | ||||
|     private String shebeiType; | ||||
|  | ||||
|     /** | ||||
|      * 产品编号 | ||||
|      */ | ||||
|     private String chanpinBianhao; | ||||
|  | ||||
|     /** | ||||
|      * 产品名称 | ||||
|      */ | ||||
|  | ||||
| @ -28,6 +28,11 @@ public class OpsCaigouPlanChanpinBo extends BaseEntity { | ||||
|      */ | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 项目id | ||||
|      */ | ||||
|     private Long projectId; | ||||
|  | ||||
|     /** | ||||
|      * 采购申请计划id | ||||
|      */ | ||||
| @ -38,6 +43,10 @@ public class OpsCaigouPlanChanpinBo extends BaseEntity { | ||||
|      * 设备类型 | ||||
|      */ | ||||
|     private String shebeiType; | ||||
|     /** | ||||
|      * 产品编号 | ||||
|      */ | ||||
|     private String chanpinBianhao; | ||||
|  | ||||
|     /** | ||||
|      * 产品名称 | ||||
|  | ||||
| @ -36,7 +36,7 @@ public class OpsChurukudanBo extends BaseEntity { | ||||
|     /** | ||||
|      * 产品id | ||||
|      */ | ||||
|     @NotBlank(message = "产品不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||
|     @NotNull(message = "产品不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||
|     private Long chanpinId; | ||||
|  | ||||
|     /** | ||||
|  | ||||
| @ -0,0 +1,76 @@ | ||||
| package org.dromara.personnel.domain.dto; | ||||
|  | ||||
| import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import cn.idev.excel.annotation.ExcelProperty; | ||||
| import io.github.linpeilie.annotations.AutoMapper; | ||||
| import lombok.Data; | ||||
| import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||
| import org.dromara.common.excel.convert.ExcelDictConvert; | ||||
| import org.dromara.personnel.domain.OpsBeipinBeijian; | ||||
|  | ||||
| import java.io.Serial; | ||||
| import java.io.Serializable; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * 运维-物资-备品配件视图对象 ops_beipin_beijian | ||||
|  * | ||||
|  * @author LionLi | ||||
|  * @date 2025-09-24 | ||||
|  */ | ||||
| @Data | ||||
| public class OpsBeipinBeijianDto implements Serializable { | ||||
|  | ||||
|     @Serial | ||||
|     private static final long serialVersionUID = 1L; | ||||
|  | ||||
|     /** | ||||
|      * id | ||||
|      */ | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 项目id | ||||
|      */ | ||||
|     private Long projectId; | ||||
|  | ||||
|     /** | ||||
|      * 备件编号 | ||||
|      */ | ||||
|     private String beijianNumber; | ||||
|  | ||||
|     /** | ||||
|      * 备件名称 | ||||
|      */ | ||||
|     private String beijianName; | ||||
|  | ||||
|     /** | ||||
|      * 设备类型 | ||||
|      */ | ||||
|     private String shebeiType; | ||||
|  | ||||
|     /** | ||||
|      * 规格型号 | ||||
|      */ | ||||
|     private String guigexinghao; | ||||
|  | ||||
|     /** | ||||
|      * 库存状态(待定) | ||||
|      */ | ||||
|     private String kucunStatus; | ||||
|  | ||||
|     /** | ||||
|      * 入库数量 | ||||
|      */ | ||||
|     private Long ruKuCount; | ||||
|     /** | ||||
|      * 出库数量 | ||||
|      */ | ||||
|     private Long chuKuCount; | ||||
|  | ||||
|     /** | ||||
|      * 库存数量 | ||||
|      */ | ||||
|     private Long kucunCount; | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,44 @@ | ||||
| package org.dromara.personnel.domain.vo; | ||||
|  | ||||
| import cn.idev.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import cn.idev.excel.annotation.ExcelProperty; | ||||
| import io.github.linpeilie.annotations.AutoMapper; | ||||
| import lombok.Data; | ||||
| import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||
| import org.dromara.common.excel.convert.ExcelDictConvert; | ||||
| import org.dromara.personnel.domain.OpsBeipinBeijian; | ||||
|  | ||||
| import java.io.Serial; | ||||
| import java.io.Serializable; | ||||
| import java.util.Map; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * 运维-物资-备品配件视图对象 ops_beipin_beijian | ||||
|  * | ||||
|  * @author LionLi | ||||
|  * @date 2025-09-24 | ||||
|  */ | ||||
| @Data | ||||
| public class OpsBeipinBeijianCountVo implements Serializable { | ||||
|  | ||||
|     @Serial | ||||
|     private static final long serialVersionUID = 1L; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 总数量 | ||||
|      */ | ||||
|     private Long zonCount; | ||||
|     /** | ||||
|      * 低库存数量 | ||||
|      */ | ||||
|     private Long diCount; | ||||
|  | ||||
|     /** | ||||
|      * 设备类型数量 | ||||
|      */ | ||||
|     private Map<String,Long> typeCount; | ||||
|  | ||||
|  | ||||
| } | ||||
| @ -71,6 +71,15 @@ public class OpsBeipinBeijianVo implements Serializable { | ||||
|     @ExcelDictFormat(readConverterExp = "待=定") | ||||
|     private String kucunStatus; | ||||
|  | ||||
|     /** | ||||
|      * 入库数量 | ||||
|      */ | ||||
|     private Long ruKuCount; | ||||
|     /** | ||||
|      * 出库数量 | ||||
|      */ | ||||
|     private Long chuKuCount; | ||||
|  | ||||
|     /** | ||||
|      * 库存数量 | ||||
|      */ | ||||
|  | ||||
| @ -35,6 +35,12 @@ public class OpsCaigouPlanChanpinVo implements Serializable { | ||||
|     @ExcelProperty(value = "id") | ||||
|     private Long id; | ||||
|  | ||||
|     /** | ||||
|      * 项目id | ||||
|      */ | ||||
|     @ExcelProperty(value = "项目id") | ||||
|     private Long projectId; | ||||
|  | ||||
|     /** | ||||
|      * 采购申请计划id | ||||
|      */ | ||||
| @ -47,6 +53,11 @@ public class OpsCaigouPlanChanpinVo implements Serializable { | ||||
|     @ExcelProperty(value = "设备类型") | ||||
|     private String shebeiType; | ||||
|  | ||||
|     /** | ||||
|      * 产品编号 | ||||
|      */ | ||||
|     private String chanpinBianhao; | ||||
|  | ||||
|     /** | ||||
|      * 产品名称 | ||||
|      */ | ||||
|  | ||||
| @ -105,6 +105,7 @@ public class OpsCaigouPlanVo implements Serializable { | ||||
|      */ | ||||
|     @ExcelProperty(value = "供应商id") | ||||
|     private Long gonyingshangId; | ||||
|     private String gonyingshangName; | ||||
|  | ||||
|     /** | ||||
|      * 出货时间 | ||||
|  | ||||
| @ -1,9 +1,17 @@ | ||||
| package org.dromara.personnel.mapper; | ||||
|  | ||||
| import com.baomidou.mybatisplus.core.metadata.IPage; | ||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
| import org.apache.ibatis.annotations.Param; | ||||
| import org.dromara.personnel.domain.OpsCaigouPlanChanpin; | ||||
| import org.dromara.personnel.domain.bo.OpsBeipinBeijianBo; | ||||
| import org.dromara.personnel.domain.dto.OpsBeipinBeijianDto; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianVo; | ||||
| import org.dromara.personnel.domain.vo.OpsCaigouPlanChanpinVo; | ||||
| import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * 运维-物资-采购申请计划-产品信息Mapper接口 | ||||
|  * | ||||
| @ -12,4 +20,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||
|  */ | ||||
| public interface OpsCaigouPlanChanpinMapper extends BaseMapperPlus<OpsCaigouPlanChanpin, OpsCaigouPlanChanpinVo> { | ||||
|  | ||||
|     Page<OpsBeipinBeijianDto> getBeiJianList(IPage<OpsBeipinBeijianDto> build, @Param("bo") OpsBeipinBeijianBo bo); | ||||
|  | ||||
|     List<OpsBeipinBeijianDto> getCount(@Param("projectId") Long projectId); | ||||
| } | ||||
|  | ||||
| @ -2,6 +2,8 @@ package org.dromara.personnel.service; | ||||
|  | ||||
| import com.baomidou.mybatisplus.extension.service.IService; | ||||
| import org.dromara.personnel.domain.OpsBeipinBeijian; | ||||
| import org.dromara.personnel.domain.dto.OpsBeipinBeijianDto; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianCountVo; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianVo; | ||||
| import org.dromara.personnel.domain.bo.OpsBeipinBeijianBo; | ||||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||
| @ -67,4 +69,8 @@ public interface IOpsBeipinBeijianService extends IService<OpsBeipinBeijian> { | ||||
|      * @return 是否删除成功 | ||||
|      */ | ||||
|     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | ||||
|  | ||||
|     TableDataInfo<OpsBeipinBeijianDto> getList(OpsBeipinBeijianBo bo, PageQuery pageQuery); | ||||
|  | ||||
|     OpsBeipinBeijianCountVo getCount(OpsBeipinBeijianBo bo); | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,13 @@ | ||||
| package org.dromara.personnel.service; | ||||
|  | ||||
| import com.baomidou.mybatisplus.core.metadata.IPage; | ||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
| import com.baomidou.mybatisplus.extension.service.IService; | ||||
| import org.apache.ibatis.annotations.Param; | ||||
| import org.dromara.personnel.domain.OpsCaigouPlanChanpin; | ||||
| import org.dromara.personnel.domain.bo.OpsBeipinBeijianBo; | ||||
| import org.dromara.personnel.domain.dto.OpsBeipinBeijianDto; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianVo; | ||||
| import org.dromara.personnel.domain.vo.OpsCaigouPlanChanpinVo; | ||||
| import org.dromara.personnel.domain.bo.OpsCaigouPlanChanpinBo; | ||||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||
| @ -75,4 +81,8 @@ public interface IOpsCaigouPlanChanpinService extends IService<OpsCaigouPlanChan | ||||
|      * @return | ||||
|      */ | ||||
|     List<OpsCaigouPlanChanpinVo> getVoByCaiGouPlanId(Long caigouId); | ||||
|  | ||||
|     Page<OpsBeipinBeijianDto> getBeiJianList(IPage<OpsBeipinBeijianDto> build, OpsBeipinBeijianBo bo); | ||||
|  | ||||
|     List<OpsBeipinBeijianDto> getCount(OpsBeipinBeijianBo bo); | ||||
| } | ||||
|  | ||||
| @ -10,6 +10,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.dromara.personnel.domain.dto.OpsBeipinBeijianDto; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianCountVo; | ||||
| import org.dromara.personnel.service.IOpsCaigouPlanChanpinService; | ||||
| import org.dromara.personnel.service.IOpsCaigouPlanService; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.dromara.personnel.domain.bo.OpsBeipinBeijianBo; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianVo; | ||||
| @ -17,6 +21,7 @@ import org.dromara.personnel.domain.OpsBeipinBeijian; | ||||
| import org.dromara.personnel.mapper.OpsBeipinBeijianMapper; | ||||
| import org.dromara.personnel.service.IOpsBeipinBeijianService; | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Collection; | ||||
| @ -34,6 +39,8 @@ public class OpsBeipinBeijianServiceImpl extends ServiceImpl<OpsBeipinBeijianMap | ||||
|  | ||||
|     private final OpsBeipinBeijianMapper baseMapper; | ||||
|  | ||||
|     private final IOpsCaigouPlanChanpinService caigouPlanChanpinService; | ||||
|  | ||||
|     /** | ||||
|      * 查询运维-物资-备品配件 | ||||
|      * | ||||
| @ -136,4 +143,47 @@ public class OpsBeipinBeijianServiceImpl extends ServiceImpl<OpsBeipinBeijianMap | ||||
|         } | ||||
|         return baseMapper.deleteByIds(ids) > 0; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public TableDataInfo<OpsBeipinBeijianDto> getList(OpsBeipinBeijianBo bo, PageQuery pageQuery) { | ||||
|         Page<OpsBeipinBeijianDto> result = caigouPlanChanpinService.getBeiJianList(pageQuery.build(),bo); | ||||
|         result.getRecords().forEach(item -> { | ||||
|            item.setKucunCount(item.getRuKuCount()-item.getChuKuCount()); | ||||
|            if (item.getKucunCount() == 0){ | ||||
|                item.setKucunStatus("2"); | ||||
|            } | ||||
|            if (item.getRuKuCount() > 0 && item.getRuKuCount() / 2 > item.getKucunCount()){ | ||||
|                item.setKucunStatus("1"); | ||||
|            } | ||||
|            if (item.getRuKuCount() > 0 && item.getRuKuCount() / 2 < item.getKucunCount()){ | ||||
|                item.setKucunStatus("0"); | ||||
|            } | ||||
|         }); | ||||
|         return TableDataInfo.build(result); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public OpsBeipinBeijianCountVo getCount(OpsBeipinBeijianBo bo) { | ||||
|         List<OpsBeipinBeijianDto> records = caigouPlanChanpinService.getCount(bo); | ||||
|         OpsBeipinBeijianCountVo vo = new OpsBeipinBeijianCountVo(); | ||||
|         long zonCount = 0L; | ||||
|         long diCount = 0L; | ||||
|         Map<String, Long> map = new HashMap<>(); | ||||
|         for (OpsBeipinBeijianDto item : records) { | ||||
|             long kucunCount = item.getRuKuCount() - item.getChuKuCount(); | ||||
|             zonCount += kucunCount; | ||||
|             if (kucunCount == 0 || (item.getRuKuCount() > 0 && item.getRuKuCount() / 2 > item.getKucunCount())){ | ||||
|                 diCount++; | ||||
|             } | ||||
|             if (!map.containsKey(item.getShebeiType())) { | ||||
|                 map.put(item.getShebeiType(), kucunCount); | ||||
|             }else { | ||||
|                 map.put(item.getShebeiType(), map.get(item.getShebeiType()) + kucunCount); | ||||
|             } | ||||
|         } | ||||
|         vo.setZonCount(zonCount); | ||||
|         vo.setDiCount(diCount); | ||||
|         vo.setTypeCount(map); | ||||
|         return vo; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package org.dromara.personnel.service.impl; | ||||
|  | ||||
| import com.baomidou.mybatisplus.core.metadata.IPage; | ||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||
| import org.dromara.common.core.utils.MapstructUtils; | ||||
| import org.dromara.common.core.utils.StringUtils; | ||||
| @ -10,6 +11,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.dromara.personnel.domain.bo.OpsBeipinBeijianBo; | ||||
| import org.dromara.personnel.domain.dto.OpsBeipinBeijianDto; | ||||
| import org.dromara.personnel.domain.vo.OpsBeipinBeijianVo; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.dromara.personnel.domain.bo.OpsCaigouPlanChanpinBo; | ||||
| import org.dromara.personnel.domain.vo.OpsCaigouPlanChanpinVo; | ||||
| @ -142,4 +146,14 @@ public class OpsCaigouPlanChanpinServiceImpl extends ServiceImpl<OpsCaigouPlanCh | ||||
|         return baseMapper.selectVoList(new LambdaQueryWrapper<OpsCaigouPlanChanpin>().eq(OpsCaigouPlanChanpin::getCaigouPlanId, caigouId)); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Page<OpsBeipinBeijianDto> getBeiJianList(IPage<OpsBeipinBeijianDto> build, OpsBeipinBeijianBo bo) { | ||||
|         return baseMapper.getBeiJianList(build,bo); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<OpsBeipinBeijianDto> getCount(OpsBeipinBeijianBo bo) { | ||||
|         return baseMapper.getCount(bo.getProjectId()); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -1,8 +1,9 @@ | ||||
| package org.dromara.personnel.service.impl; | ||||
|  | ||||
| import cn.hutool.core.bean.BeanUtil; | ||||
| import com.baomidou.mybatisplus.core.toolkit.BeanUtils; | ||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||
| import jakarta.validation.constraints.NotNull; | ||||
| import org.apache.seata.spring.annotation.GlobalTransactional; | ||||
| import org.dromara.common.core.exception.ServiceException; | ||||
| import org.dromara.common.core.utils.MapstructUtils; | ||||
| import org.dromara.common.core.utils.StringUtils; | ||||
| @ -16,16 +17,18 @@ import lombok.extern.slf4j.Slf4j; | ||||
| import org.dromara.common.satoken.utils.LoginHelper; | ||||
| import org.dromara.personnel.domain.OpsCaigouPlanChanpin; | ||||
| import org.dromara.personnel.domain.OpsCaigouPlanFiles; | ||||
| import org.dromara.personnel.domain.OpsTenderSupplierInput; | ||||
| import org.dromara.personnel.domain.bo.OpsCaigouPlanChanpinBo; | ||||
| import org.dromara.personnel.domain.bo.OpsCaigouPlanFilesBo; | ||||
| import org.dromara.personnel.domain.bo.OpsCaigouPlanReq; | ||||
| import org.dromara.personnel.domain.enums.OpsCaigouPlanEnum; | ||||
| import org.dromara.personnel.domain.vo.OpsCaigouPlanChanpinListVo; | ||||
| import org.dromara.personnel.domain.vo.OpsCaigouPlanChanpinVo; | ||||
| import org.dromara.personnel.domain.vo.OpsCaigouPlanCountVo; | ||||
| import org.dromara.personnel.service.IOpsCaigouPlanChanpinService; | ||||
| import org.dromara.personnel.service.IOpsCaigouPlanFilesService; | ||||
| import org.dromara.personnel.service.IOpsTenderSupplierInputService; | ||||
| import org.dromara.personnel.utils.CglxdIdGenerator; | ||||
| import org.dromara.resource.api.RemoteFileService; | ||||
| import org.dromara.system.api.model.LoginUser; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.dromara.personnel.domain.bo.OpsCaigouPlanBo; | ||||
| @ -38,6 +41,7 @@ import org.springframework.transaction.annotation.Transactional; | ||||
| import java.math.BigDecimal; | ||||
| import java.time.LocalDateTime; | ||||
| import java.util.*; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| /** | ||||
|  * 运维-物资-采购计划单Service业务层处理 | ||||
| @ -55,6 +59,9 @@ public class OpsCaigouPlanServiceImpl extends ServiceImpl<OpsCaigouPlanMapper,Op | ||||
|     private final IOpsCaigouPlanFilesService caigouPlanFilesService; | ||||
|  | ||||
|     private final IOpsCaigouPlanChanpinService caigouPlanChanpinService; | ||||
|     private final RemoteFileService remoteFileService; | ||||
|  | ||||
|     private final IOpsTenderSupplierInputService tenderSupplierInputService; | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -67,6 +74,10 @@ public class OpsCaigouPlanServiceImpl extends ServiceImpl<OpsCaigouPlanMapper,Op | ||||
|     @Override | ||||
|     public OpsCaigouPlanVo queryById(Long id){ | ||||
|         OpsCaigouPlanVo opsCaigouPlanVo = baseMapper.selectVoById(id); | ||||
|         if (opsCaigouPlanVo.getGonyingshangId() != null){ | ||||
|             OpsTenderSupplierInput supplierInput = tenderSupplierInputService.getById(opsCaigouPlanVo.getGonyingshangId()); | ||||
|             opsCaigouPlanVo.setGonyingshangName(supplierInput.getSupplierName()); | ||||
|         } | ||||
|         opsCaigouPlanVo.setOpsCaigouPlanChanpinVos(caigouPlanChanpinService.getVoByCaiGouPlanId(id)); | ||||
|         opsCaigouPlanVo.setOpsCaigouPlanFilesVos(caigouPlanFilesService.getVoByCaiGouPlanId(id)); | ||||
|         return opsCaigouPlanVo; | ||||
| @ -116,7 +127,7 @@ public class OpsCaigouPlanServiceImpl extends ServiceImpl<OpsCaigouPlanMapper,Op | ||||
|      * @return 是否新增成功 | ||||
|      */ | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @GlobalTransactional(rollbackFor = Exception.class) | ||||
|     public Boolean insertByBo(OpsCaigouPlanBo bo) { | ||||
|         LoginUser loginUser = LoginHelper.getLoginUser(); | ||||
|         OpsCaigouPlan add = MapstructUtils.convert(bo, OpsCaigouPlan.class); | ||||
| @ -124,15 +135,22 @@ public class OpsCaigouPlanServiceImpl extends ServiceImpl<OpsCaigouPlanMapper,Op | ||||
|         add.setJingbanrenName(loginUser.getUsername()); | ||||
|         add.setCaigouDanwei(loginUser.getDeptId()); | ||||
|         add.setCaigouDanweiName(loginUser.getDeptName()); | ||||
|         add.setJihuaBianhao(CglxdIdGenerator.generateId("CGLXD")); | ||||
|         add.setJihuaBianhao(CglxdIdGenerator.generateId("CGLXD-")); | ||||
|         validEntityBeforeSave(add); | ||||
|         boolean flag = baseMapper.insert(add) > 0; | ||||
|         if (flag) { | ||||
|             bo.setId(add.getId()); | ||||
|             if (bo.getOpsCaigouPlanChanpinBos() ==null){ | ||||
|                 throw new ServiceException("产品信息不能为空!!!"); | ||||
|             } | ||||
|             List<OpsCaigouPlanChanpinBo> opsCaigouPlanChanpinBos = bo.getOpsCaigouPlanChanpinBos(); | ||||
|             BigDecimal yujiJine = opsCaigouPlanChanpinBos.stream() | ||||
|                 // 步骤1:设置 caigouPlanId(副作用,也可单独处理) | ||||
|                 .peek(chanpin -> chanpin.setCaigouPlanId(add.getId())) | ||||
|                 .peek(chanpin -> { | ||||
|                     chanpin.setCaigouPlanId(add.getId()); | ||||
|                     chanpin.setProjectId(add.getProjectId()); | ||||
|                     chanpin.setChanpinBianhao(CglxdIdGenerator.generateId("CP-")); | ||||
|                 }) | ||||
|                 // 步骤2:提取要累加的 totalPrice | ||||
|                 .map(OpsCaigouPlanChanpinBo::getTotalPrice) | ||||
|                 // 步骤3:过滤 null(避免 NPE) | ||||
| @ -160,37 +178,100 @@ public class OpsCaigouPlanServiceImpl extends ServiceImpl<OpsCaigouPlanMapper,Op | ||||
|      * @return 是否修改成功 | ||||
|      */ | ||||
|     @Override | ||||
|     @Transactional(rollbackFor = Exception.class) | ||||
|     @GlobalTransactional(rollbackFor = Exception.class) | ||||
|     public Boolean updateByBo(OpsCaigouPlanBo bo) { | ||||
|         if (!OpsCaigouPlanEnum.CAOGAO.getValue().equals(bo.getStatus()) && !OpsCaigouPlanEnum.WEITONGUO.getValue().equals(bo.getStatus())) { | ||||
|             throw new ServiceException("已开始审核,不允许修改"); | ||||
|         } | ||||
|         caigouPlanChanpinService.getBaseMapper().delete(new LambdaQueryWrapper<OpsCaigouPlanChanpin>().eq(OpsCaigouPlanChanpin::getCaigouPlanId, bo.getId())); | ||||
|         caigouPlanFilesService.getBaseMapper().delete(new LambdaQueryWrapper<OpsCaigouPlanFiles>().eq(OpsCaigouPlanFiles::getCaigouPlanId, bo.getId())); | ||||
|         List<OpsCaigouPlanChanpinBo> opsCaigouPlanChanpinBos = bo.getOpsCaigouPlanChanpinBos(); | ||||
|         if (opsCaigouPlanChanpinBos == null) { | ||||
|             throw new ServiceException("产品信息不能为空!!!"); | ||||
|         } | ||||
|  | ||||
|         //查询该计划下产品信息列表 | ||||
|         List<OpsCaigouPlanChanpin> opsCaigouPlanChanpins = caigouPlanChanpinService.getBaseMapper().selectList(new LambdaQueryWrapper<OpsCaigouPlanChanpin>().eq(OpsCaigouPlanChanpin::getCaigouPlanId, bo.getId())); | ||||
|         OpsCaigouPlan update = MapstructUtils.convert(bo, OpsCaigouPlan.class); | ||||
|         validEntityBeforeSave(update); | ||||
|         List<OpsCaigouPlanChanpinBo> opsCaigouPlanChanpinBos = bo.getOpsCaigouPlanChanpinBos(); | ||||
|         BigDecimal yujiJine = opsCaigouPlanChanpinBos.stream() | ||||
|             // 步骤1:设置 caigouPlanId(副作用,也可单独处理) | ||||
|             .peek(chanpin -> chanpin.setCaigouPlanId(update.getId())) | ||||
|             // 步骤2:提取要累加的 totalPrice | ||||
|             .map(OpsCaigouPlanChanpinBo::getTotalPrice) | ||||
|             // 步骤3:过滤 null(避免 NPE) | ||||
|             .filter(Objects::nonNull) | ||||
|             // 步骤2:提取要累加的 totalPrice | ||||
|             .map(OpsCaigouPlanChanpinBo::getTotalPrice) | ||||
|             // 步骤4:累加所有 BigDecimal(初始值为 BigDecimal.ZERO) | ||||
|             .reduce(BigDecimal.ZERO, BigDecimal::add); | ||||
|         update.setYujiJine(yujiJine); | ||||
|         List<OpsCaigouPlanChanpin> planChanpinList = MapstructUtils.convert(opsCaigouPlanChanpinBos, OpsCaigouPlanChanpin.class); | ||||
|         caigouPlanChanpinService.saveBatch(planChanpinList); | ||||
|         if (opsCaigouPlanChanpins != null) { | ||||
|             //获取已存在产品id | ||||
|             Set<Long> chanpinOldIds = opsCaigouPlanChanpins.stream().filter(Objects::nonNull).map(OpsCaigouPlanChanpin::getId).collect(Collectors.toSet()); | ||||
|             //获取新的产品id列表 | ||||
|             Set<Long> chanpinNowIds = opsCaigouPlanChanpinBos.stream().filter(Objects::nonNull).map(OpsCaigouPlanChanpinBo::getId).collect(Collectors.toSet()); | ||||
|             //获取需要删除的产品id | ||||
|             List<Long> detChanpinIds = new ArrayList<>(); | ||||
|             chanpinOldIds.forEach(detChanpinId -> { | ||||
|                 if (!chanpinNowIds.contains(detChanpinId)) { | ||||
|                     detChanpinIds.add(detChanpinId); | ||||
|                 } | ||||
|             }); | ||||
|             //判断需要删除产品id是否为空,不为空则删除 | ||||
|             if (!detChanpinIds.isEmpty()) { | ||||
|                 caigouPlanChanpinService.getBaseMapper().deleteByIds(detChanpinIds); | ||||
|             } | ||||
|             //过滤掉不存在的产品,对原有产品进行修改 | ||||
|             List<OpsCaigouPlanChanpinBo> list =opsCaigouPlanChanpinBos.stream() | ||||
|                 .filter(Objects::nonNull) | ||||
|                 .filter(chanpin -> chanpinOldIds.contains(chanpin.getId())) | ||||
|                 .toList(); | ||||
|             List<OpsCaigouPlanChanpin> planChanpinList = MapstructUtils.convert(list, OpsCaigouPlanChanpin.class); | ||||
|             caigouPlanChanpinService.updateBatchById(planChanpinList); | ||||
|             //过滤掉存在产品,并新增产品 | ||||
|             List<OpsCaigouPlanChanpinBo> chanpinBoList = opsCaigouPlanChanpinBos.stream() | ||||
|                 .filter(Objects::nonNull) | ||||
|                 .filter(opsCaigouPlanChanpinBo -> opsCaigouPlanChanpinBo.getId() == null).toList(); | ||||
|             for (OpsCaigouPlanChanpinBo chanpin : chanpinBoList) { | ||||
|                 if (chanpin != null) { | ||||
|                     chanpin.setCaigouPlanId(update.getId()); | ||||
|                     chanpin.setProjectId(update.getProjectId()); | ||||
|                     chanpin.setChanpinBianhao(CglxdIdGenerator.generateId("CP-")); | ||||
|                 } | ||||
|             } | ||||
|             List<OpsCaigouPlanChanpin> planChanpinNowList = MapstructUtils.convert(chanpinBoList, OpsCaigouPlanChanpin.class); | ||||
|             caigouPlanChanpinService.saveBatch(planChanpinNowList); | ||||
|         }else { | ||||
|             for (OpsCaigouPlanChanpinBo chanpin : opsCaigouPlanChanpinBos) { | ||||
|                 if (chanpin != null) { | ||||
|                     chanpin.setCaigouPlanId(update.getId()); | ||||
|                     chanpin.setChanpinBianhao(CglxdIdGenerator.generateId("CP-")); | ||||
|                 } | ||||
|             } | ||||
|             List<OpsCaigouPlanChanpin> planChanpinList = MapstructUtils.convert(opsCaigouPlanChanpinBos, OpsCaigouPlanChanpin.class); | ||||
|             caigouPlanChanpinService.saveBatch(planChanpinList); | ||||
|         } | ||||
| //        caigouPlanChanpinService.getBaseMapper().delete(new LambdaQueryWrapper<OpsCaigouPlanChanpin>().eq(OpsCaigouPlanChanpin::getCaigouPlanId, bo.getId())); | ||||
|         //查询该计划文件id | ||||
|  | ||||
|         caigouPlanFilesService.getBaseMapper().delete(new LambdaQueryWrapper<OpsCaigouPlanFiles>().eq(OpsCaigouPlanFiles::getCaigouPlanId, bo.getId())); | ||||
|         List<OpsCaigouPlanFilesBo> opsCaigouPlanFilesBos = bo.getOpsCaigouPlanFilesBos(); | ||||
|         opsCaigouPlanFilesBos.forEach(fileBo -> { | ||||
|             fileBo.setCaigouPlanId(update.getId()); | ||||
|         }); | ||||
|         List<OpsCaigouPlanFiles> planFilesList = MapstructUtils.convert(opsCaigouPlanFilesBos, OpsCaigouPlanFiles.class); | ||||
|         caigouPlanFilesService.saveBatch(planFilesList); | ||||
|         if (opsCaigouPlanFilesBos != null) { | ||||
|             //保存文件 | ||||
|             opsCaigouPlanFilesBos.forEach(fileBo -> { | ||||
|                 fileBo.setCaigouPlanId(update.getId()); | ||||
|             }); | ||||
|             List<OpsCaigouPlanFiles> planFilesList = MapstructUtils.convert(opsCaigouPlanFilesBos, OpsCaigouPlanFiles.class); | ||||
|             caigouPlanFilesService.saveBatch(planFilesList); | ||||
|         } | ||||
|         return baseMapper.updateById(update) > 0; | ||||
|     } | ||||
|  | ||||
|     private List<Long> detPlanFileIds(List<Long> chanpinId) { | ||||
|         List<OpsCaigouPlanFiles> opsCaigouPlanFiles = caigouPlanFilesService.getBaseMapper() | ||||
|             .selectList(new LambdaQueryWrapper<OpsCaigouPlanFiles>() | ||||
|                 .in(OpsCaigouPlanFiles::getCaigouPlanId, chanpinId)); | ||||
|         List<Long> ossIds = new ArrayList<>(); | ||||
|         opsCaigouPlanFiles.forEach(fileBo -> {ossIds.add(fileBo.getId());}); | ||||
|  | ||||
|         return ossIds; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 保存前的数据校验 | ||||
|      */ | ||||
| @ -213,14 +294,28 @@ public class OpsCaigouPlanServiceImpl extends ServiceImpl<OpsCaigouPlanMapper,Op | ||||
|      * @return 是否删除成功 | ||||
|      */ | ||||
|     @Override | ||||
|     @GlobalTransactional(rollbackFor = Exception.class) | ||||
|     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | ||||
|         if(isValid){ | ||||
|             //TODO 做一些业务上的校验,判断是否需要校验 | ||||
|             baseMapper.selectVoByIds(ids).forEach(vo -> { | ||||
|             List<OpsCaigouPlanVo> opsCaigouPlanVos = baseMapper.selectVoByIds(ids); | ||||
|             opsCaigouPlanVos.forEach(vo -> { | ||||
|                 if (!OpsCaigouPlanEnum.CAOGAO.getValue().equals(vo.getStatus())) { | ||||
|                     throw new ServiceException("已开始审核,不允许修改"); | ||||
|                 } | ||||
|             }); | ||||
|             caigouPlanChanpinService | ||||
|                 .getBaseMapper() | ||||
|                 .delete(new LambdaQueryWrapper<OpsCaigouPlanChanpin>() | ||||
|                     .in(OpsCaigouPlanChanpin::getCaigouPlanId,ids)); | ||||
|             List<Long> ossIds = detPlanFileIds((List<Long>) ids); | ||||
|             if (!ossIds.isEmpty()){ | ||||
|                 remoteFileService.deleteFileByIds(ossIds); | ||||
|             } | ||||
|             caigouPlanFilesService | ||||
|                 .getBaseMapper() | ||||
|                 .delete(new LambdaQueryWrapper<OpsCaigouPlanFiles>() | ||||
|                     .in(OpsCaigouPlanFiles::getCaigouPlanId,ids)); | ||||
|         } | ||||
|         return baseMapper.deleteByIds(ids) > 0; | ||||
|     } | ||||
|  | ||||
| @ -4,4 +4,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | ||||
| "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||||
| <mapper namespace="org.dromara.personnel.mapper.OpsCaigouPlanChanpinMapper"> | ||||
|  | ||||
|     <select id="getBeiJianList" resultType="org.dromara.personnel.domain.dto.OpsBeipinBeijianDto"> | ||||
|         SELECT ocpc.id                                                          AS id, | ||||
|                ocpc.chanpin_bianhao                                             AS beijianNumber, | ||||
|                ocpc.shebei_type                                                 AS shebeiType, | ||||
|                ocpc.chanpin_type                                                AS guigexinghao, | ||||
|                ocpc.chanpin_name                                                AS beijianName, | ||||
|                SUM(CASE WHEN oc.danjv_type = '1' THEN oc.zon_number ELSE 0 END) AS chuKuCount, | ||||
|                SUM(CASE WHEN oc.danjv_type = '2' THEN oc.zon_number ELSE 0 END) AS ruKuCount | ||||
|         FROM ops_caigou_plan_chanpin ocpc | ||||
|                  LEFT JOIN ops_churukudan oc ON ocpc.id = oc.chanpin_id | ||||
|         WHERE | ||||
| --             oc.shenhe_status = 'finish' AND | ||||
|             ocpc.project_id = #{bo.projectId} | ||||
|         GROUP BY ocpc.id | ||||
|         ORDER BY ocpc.create_time | ||||
|     </select> | ||||
|     <select id="getCount" resultType="org.dromara.personnel.domain.dto.OpsBeipinBeijianDto"> | ||||
|         SELECT ocpc.id                                                          AS id, | ||||
|                ocpc.chanpin_bianhao                                             AS beijianNumber, | ||||
|                ocpc.shebei_type                                                 AS shebeiType, | ||||
|                ocpc.chanpin_type                                                AS guigexinghao, | ||||
|                ocpc.chanpin_name                                                AS beijianName, | ||||
|                SUM(CASE WHEN oc.danjv_type = '1' THEN oc.zon_number ELSE 0 END) AS chuKuCount, | ||||
|                SUM(CASE WHEN oc.danjv_type = '2' THEN oc.zon_number ELSE 0 END) AS ruKuCount | ||||
|         FROM ops_caigou_plan_chanpin ocpc | ||||
|                  LEFT JOIN ops_churukudan oc ON ocpc.id = oc.chanpin_id | ||||
|         WHERE | ||||
| --             oc.shenhe_status = 'finish' AND | ||||
|             ocpc.project_id = #{projectId} | ||||
|         GROUP BY ocpc.id | ||||
|         ORDER BY ocpc.create_time | ||||
|     </select> | ||||
| </mapper> | ||||
|  | ||||
| @ -55,7 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | ||||
|     </select> | ||||
|     <select id="getChuRuKuZonCount" resultType="java.lang.Long"> | ||||
|         SELECT | ||||
|             SUM(zon_number) | ||||
|             IFNULL(SUM(zon_number),0) | ||||
|         FROM | ||||
|             ops_churukudan | ||||
|         WHERE | ||||
|  | ||||
		Reference in New Issue
	
	Block a user