package org.jeecg.modules.base.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.vo.SelectTreeModel; import org.jeecg.modules.base.entity.MaterialCategory; import org.jeecg.modules.base.service.IMaterialCategoryService; import org.jeecg.modules.quartz.entity.QuartzJob; import org.jeecg.modules.quartz.service.IQuartzJobService; import org.jeecg.common.system.base.entity.DataVersion; import org.jeecg.modules.system.service.IDataVersionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; /** * @Description: 物料分类 * @Author: jeecg-boot * @Date: 2023-04-20 * @Version: V1.0 */ @Api(tags = "物料分类") @RestController @RequestMapping("/base/materialCategory") @Slf4j public class MaterialCategoryController extends JeecgController { @Autowired private IMaterialCategoryService materialCategoryService; @Autowired private IDataVersionService dataVersionService; @Autowired private IQuartzJobService quartzJobService; /** * 获取物料分类架构树 */ @GetMapping("/enterpriseTree") @ApiOperation(value = "获取物料分类架构树", notes = "获取物料分类架构树") public Result getEnterpriseTree(@RequestParam(value = "version", required = false) Integer version) { SelectTreeModel selectTreeModel = new SelectTreeModel(); selectTreeModel.setKey("0"); selectTreeModel.setTitle("物料分类"); List finallyList = new ArrayList<>(); selectTreeModel.setChildren(materialCategoryService.getMaterialCategoryVersionTree("0", version)); finallyList.add(selectTreeModel); return Result.OK(finallyList); } /** * 分页列表查询 * * @param map * @param pageNo * @param pageSize * @param parentId * @return */ @ApiOperation(value = "物料分类-分页列表查询", notes = "物料分类-分页列表查询") @GetMapping(value = "/list") public Result>> queryPageList(Map map, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, @RequestParam(name = "parentId", required = false) String parentId, @RequestParam(name = "version", required = false) Integer version) { Page> page = new Page(pageNo, pageSize); IPage> pageList = materialCategoryService.getMaterialCategoryListByPid(page, version, parentId); return Result.OK(pageList); } /** * 获取初始版本号 */ @GetMapping("/getInitVersion") public Result getUsableVersion() { return Result.OK(materialCategoryService.getInitVersion()); } /** * 获取所有版本号 */ @GetMapping("/getVersionList") @ApiOperation(value = "获取所有版本号", notes = "获取所有版本号") public Result getAllVersion() { return Result.OK(materialCategoryService.getAllVersion()); } /** * 添加需要一次性完成 * * @param materialCategory * @return */ @AutoLog(value = "物料分类-添加") @ApiOperation(value = "物料分类-添加", notes = "物料分类-添加") @PostMapping(value = "/add") @Transactional public Result add(@RequestBody MaterialCategory materialCategory) { materialCategoryService.save(materialCategory); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(MaterialCategory::getCode, materialCategory.getCode()) .eq(MaterialCategory::getVersion, materialCategory.getVersion()) .eq(MaterialCategory::getDelFlag, CommonConstant.DEL_FLAG_0); MaterialCategory selectMaterialCategory = materialCategoryService.getOne(queryWrapper, true); DataVersion dataVersion = new DataVersion(); dataVersion.setBusinessId(selectMaterialCategory.getId()) .setBusinessType("物料分类") .setVersion(selectMaterialCategory.getVersion()) .setVersionStatus(materialCategory.getVersionStatus()) .setDelFlag(CommonConstant.DEL_FLAG_0) .setEffectiveType("0") .setIsLastUsable("0"); dataVersionService.save(dataVersion); LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper() .eq(DataVersion::getBusinessId, selectMaterialCategory.getId()) .eq(DataVersion::getDelFlag, CommonConstant.DEL_FLAG_0); DataVersion selectDataVersion = dataVersionService.getOne(queryWrapper1, true); selectMaterialCategory.setDataVersionId(selectDataVersion.getId()); materialCategoryService.saveOrUpdate(selectMaterialCategory); return Result.OK("添加成功!"); } /** * 升版 * 需要一次完成 * * @param map * @param * @return */ @ApiOperation(value = "物料分类-版本升级", notes = "物料分类-版本升级") @PostMapping("/updateVersion") @Transactional public Result updateVersion(@RequestBody Map map) { Integer version = map.get("version"); Set allVersion = materialCategoryService.getAllVersion(); int newVersion = 1; if (CollectionUtils.isNotEmpty(allVersion)) { newVersion = allVersion.stream().findFirst().get() + 1; } recurrenceUpdata("0", "0", version, newVersion); return Result.OK("升版成功", newVersion); } /** * 递归升版多个节点 * * @param parentId * @param newParentId * @param version * @param newVersion * @return */ public void recurrenceUpdata(String parentId, String newParentId, Integer version, Integer newVersion) { CopyOnWriteArrayList childList = new CopyOnWriteArrayList<>(materialCategoryService.list(new QueryWrapper() .eq("parent_id", parentId) .eq("version", version) .eq("del_flag", 0))); if (CollectionUtils.isNotEmpty(childList)) { childList.forEach(childEnterprise -> { //把child的Id存下来,因为在流里边操作对象容易扯着蛋 String childNewId = childEnterprise.getId(); //将数据存入数据库 String childNewParentId = updataOneNode(childEnterprise, newParentId, newVersion); //递归 recurrenceUpdata(childNewId, childNewParentId, version, newVersion); }); } } /** * 立即生效 * 需要一次完成 * * @param map * @param * @return */ @PostMapping("/updateVersionStatusToUsable") @Transactional public Result updateVersionStatusToUsable(@RequestBody Map map) { //如果有定时生生效,则将定时生效任务关闭 QuartzJob quartzJob = quartzJobService.getOne(new QueryWrapper() .eq("job_class_name", "org.jeecg.modules.quartz.job.EnterpriseSetUsableJob"), true); if (ObjectUtils.isNotNull(quartzJob)) { quartzJobService.deleteAndStopJob(quartzJob); } //获取版本号 Integer version = Integer.parseInt((String) map.get("version")); //获取上次生效版本并将其是否上次生效位置置为否 List lastUsableList = materialCategoryService.getLastUsableList(); if (CollectionUtils.isNotEmpty(lastUsableList)) { List lastUsableVersionList = dataVersionService.list(new QueryWrapper() .in("business_id", lastUsableList.stream() .map(MaterialCategory::getId) .collect(Collectors.toList())).eq("del_flag", 0)); lastUsableVersionList.stream().forEach(dataVersion -> { dataVersion.setIsLastUsable("0"); }); dataVersionService.updateBatchById(lastUsableVersionList); } //获取生效版本及版本信息并将其置为失效 List usableList = materialCategoryService.getUsableList(); if (CollectionUtils.isNotEmpty(usableList)) { List usableDataVersionList = dataVersionService.list(new QueryWrapper() .in("business_id", usableList.stream() .map(MaterialCategory::getId) .collect(Collectors.toList()))); usableDataVersionList.stream().forEach(dataVersion -> { dataVersion .setVersionStatus("3") .setIsLastUsable("1") .setExpiredTime(new Date(System.currentTimeMillis())); }); dataVersionService.updateBatchById(usableDataVersionList); } //获取待生效版本及版本信息并将其置为生效 List dataVersionList = dataVersionService.list(new QueryWrapper() .in("business_id", materialCategoryService .list( new QueryWrapper() .eq("version", version) .eq("del_flag", 0) ) .stream().map(MaterialCategory::getId) .collect(Collectors.toList()))); dataVersionList.stream().forEach(dataVersion -> { dataVersion.setVersionStatus("2") .setEffectiveType("2") .setEffectiveTime(new Date(System.currentTimeMillis())) .setIsLastUsable("0"); }); //存入数据库 dataVersionService.updateBatchById(dataVersionList); return Result.OK("生效成功"); } /** * 定时生效 * 需要一次性完成 * * @param quartzJob * @param * @return */ @PostMapping("/updateVersionStatusToUsableBySetTime") @Transactional public Result updateVersionStatusToUsableBySetTime(@RequestBody QuartzJob quartzJob) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("ss mm HH dd MM ? yyyy"); String jobClassName = quartzJob.getJobClassName(); String time = quartzJob.getCronExpression(); LocalDateTime localDateTime = LocalDateTime.parse(time, dateTimeFormatter); String cronStr = dateTimeFormatter1.format(localDateTime); quartzJob.setCronExpression(cronStr); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("JOB_CLASS_NAME", jobClassName); List quartzJobs = quartzJobService.list(queryWrapper); if (CollectionUtils.isEmpty(quartzJobs)) { quartzJobService.saveAndScheduleJob(quartzJob); quartzJobs = quartzJobService.list(queryWrapper); quartzJob.setId(quartzJobs.get(0).getId()); quartzJobService.resumeJob(quartzJob); return Result.OK(quartzJob); } else { quartzJob.setId(quartzJobs.get(0).getId()); quartzJobService.resumeJob(quartzJob); return Result.OK(quartzJob); } } /** * 编辑 * * @param materialCategory * @return */ @AutoLog(value = "物料分类-编辑") @ApiOperation(value = "物料分类-编辑", notes = "物料分类-编辑") @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) public Result edit(@RequestBody MaterialCategory materialCategory) { materialCategoryService.updateById(materialCategory); return Result.OK("编辑成功!"); } /** * 通过id删除 * * @param id * @return */ @AutoLog(value = "物料分类-通过id删除") @ApiOperation(value = "物料分类-通过id删除", notes = "物料分类-通过id删除") @DeleteMapping(value = "/delete") @Transactional public Result delete(@RequestParam(name = "id", required = true) String id) { dataVersionService.update(new UpdateWrapper() .set("del_flag", 1) .eq("business_id", id)); materialCategoryService.update(new UpdateWrapper(). set("del_flag", 1) .eq("id", id)); return Result.OK("删除成功!"); } /** * 升版单个树节点并返回升版后新节点Id * * @param materialCategory * @param newParentId * @param newVersion * @return newEnterPriseId */ public String updataOneNode(MaterialCategory materialCategory, String newParentId, Integer newVersion) { //1.取出旧版本信息;2.创建将新版本物料分类及其版本号并存入数据库 DataVersion oldDataVersion = dataVersionService.getOne(new LambdaQueryWrapper() .eq(DataVersion::getBusinessId, materialCategory.getId()) .eq(DataVersion::getDelFlag, CommonConstant.DEL_FLAG_0.toString()), true); materialCategory.setId(null); materialCategory.setParentId(newParentId); materialCategory.setVersion(newVersion); // 添加物料分类 materialCategoryService.save(materialCategory); MaterialCategory newEnterprise = materialCategoryService.getOne(new QueryWrapper() .eq("code", materialCategory.getCode()) .eq("version", newVersion) .eq("del_flag", 0), true); DataVersion newDataVersion = new DataVersion(); newDataVersion .setVersion(newVersion) .setBusinessType("物料分类") .setBusinessId(newEnterprise.getId()) .setIsLastUsable("0") .setVersionStatus("1") .setDelFlag(0) .setSourceVersionId(oldDataVersion.getId()); // 添加数据版本 dataVersionService.save(newDataVersion); //将版本号存入关联的集团架构 String newDataVersionId = dataVersionService .getOne(new QueryWrapper() .eq("business_id", newDataVersion.getBusinessId()) .eq("del_flag", 0)).getId(); materialCategoryService.update(new UpdateWrapper() .set("data_version_id", newDataVersionId) .eq("id", newEnterprise.getId())); return newEnterprise.getId(); } /** * 获取当前生效版本和上一次生效版本的版本号 * * @return */ @GetMapping("/getNowAndLastUsableVersion") public Result getNowAndLastUsableVersion() { return Result.OK(materialCategoryService.getNowAndLastUsableVersion()); } /** * 表单验证 */ @GetMapping("/check") public Result check(@RequestParam(name = "name", required = false) String name, @RequestParam(name = "version", required = false) Integer version, @RequestParam(name = "parentId", required = true) String parentId ) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (!StringUtils.isBlank(name)) { wrapper.eq(MaterialCategory::getName, name); } if (version != null) { wrapper.eq(MaterialCategory::getVersion, version); } if (!StringUtils.isBlank(parentId)) { wrapper.eq(MaterialCategory::getParentId, parentId); } wrapper.eq(MaterialCategory::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); return Result.OK(materialCategoryService.list(wrapper)); } }