package org.jeecg.modules.base.controller; import java.text.ParseException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.SelectTreeModel; import org.jeecg.modules.base.entity.FactoryModel; import org.jeecg.modules.base.service.IEnterpriseService; import org.jeecg.modules.base.service.IFactoryModelService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.system.base.controller.JeecgController; 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.jeecg.modules.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.jeecg.common.aspect.annotation.AutoLog; /** * @Description: 工厂建模 * @Author: jeecg-boot * @Date: 2022-11-08 * @Version: V1.0 */ @Api(tags="工厂建模") @RestController @RequestMapping("/base/factoryModel") @Slf4j public class FactoryModelController extends JeecgController{ @Autowired private IFactoryModelService factoryModelService; @Autowired private IEnterpriseService enterpriseService; @Autowired private ISysUserService sysUserService; @Autowired private IDataVersionService dataVersionService; @Autowired private IQuartzJobService quartzJobService; /** * 获取初始信息 * * */ @GetMapping("/getFactoryInfo") public Result getFactoryInfo(){ Map infoMap = new HashMap<>(2); LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); // infoMap.put("enterpriseId",loginUser.getEnterpriseId()); infoMap.put("version",factoryModelService.getUsableVersion().get(0)); return Result.OK(infoMap); } /** * 生效车间列表 * @return */ @GetMapping("getUsableWorkShopList") public Result getUsableList(){ return Result.OK(factoryModelService.getUsableWorkShopList()); } /** * 根据版本获取版本号 * * */ @GetMapping("/getVersionStatusByVersion") public Result getVersionStatusByVersion(@RequestParam(value = "version",required = false) Integer version){ return Result.OK(factoryModelService.getVersionStatusByVersion(version)); } /** * 获取初始版本号 * * */ @GetMapping("/getInitVersion") public Result getUsableVersion(){ return Result.OK(factoryModelService.getInitVersion()); } /** * 获取所有版本号 * * */ @GetMapping("/getVersionList") public Result getAllVersion(){ return Result.OK(factoryModelService.getVersionList()); } /** * //根据企业id及版本号查询工厂树 * * @param enterpriseId * @param version * @return */ @GetMapping("/loadTree")//根据使用者的id查其所在工厂的树 public Result loadTree(@RequestParam(value = "enterpriseId", required = false)String enterpriseId, @RequestParam(value = "version", required = false) Integer version){ List list = new ArrayList<>(); SelectTreeModel selectTreeModel = new SelectTreeModel(); selectTreeModel.setKey(enterpriseId); selectTreeModel.setChildren(factoryModelService.loadTree(enterpriseId,version)); selectTreeModel.setTitle("工厂建模"); list.add(selectTreeModel); return Result.OK(list); } /** * //根据工厂id查所有子工厂及车间 * * @param pageNo * @param pageSize * @param parentId * @param version * @return */ @GetMapping("/list")//根据工厂id查所有子工厂及车间 public Result list(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, @RequestParam(name="selected",required = false) String selected ){ List ids = new ArrayList<>(); if(selected!=null){ ids = Arrays.asList(selected.split(",")); } Page> page = new Page(pageNo, pageSize); IPage> pageList = factoryModelService.getFactoryList(page,version,parentId,ids); return Result.OK(pageList); } /** * 查所有部门 * * @param * @return */ @GetMapping("/departList") public Result departList(){ return Result.OK(factoryModelService.getDepartList()); } /** * 根据客户id查客户所在公司id * * @param uid * @return */ @GetMapping("/enterprise/{uid}") public Result getEidByUid(@PathVariable("uid") String uid){ return Result.OK(factoryModelService.getEidByUid(uid)); } /** * 表单校验 * * @param name * @param parentId * @param version * @return */ @GetMapping("/check") public Result checkName(@RequestParam(name="name",required = true) String name, @RequestParam(name="version",required = false) Integer version, @RequestParam(name="parentId",required = true) String parentId){ QueryWrapper queryWrapper = new QueryWrapper<>(); if(!StringUtils.isBlank(name)){ queryWrapper.eq("name",name); } if(version!=null){ queryWrapper.eq("version",version); } if(!StringUtils.isBlank(parentId)){ queryWrapper.eq("parent_id",parentId); } queryWrapper.eq("del_flag","0"); return Result.OK(factoryModelService.list(queryWrapper)); } /** * * 查当前生效企业下有无部门历史版本 * */ @Transactional @GetMapping(value = "/getNewVersionPermission") public Result getNewVersionPermission(){ List usableEnterpriseIds = enterpriseService.getUsableIdList(); return Result.OK(factoryModelService.list(new QueryWrapper().in("enterprise_id",usableEnterpriseIds).eq("del_flag",0))); } /** * * 查当前生效企业下有无部门历史版本 * */ @Transactional @GetMapping(value = "/getUpdateVersionPermission") public Result getUpdatePermission(@RequestParam("version") Integer version){ List usableEnterpriseIds = enterpriseService.getUsableIdList(); return Result.OK(factoryModelService.list(new QueryWrapper() .in("enterprise_id",usableEnterpriseIds) .eq("version",version) .eq("del_flag",0))); } /** * 添加 * * @param map * @return */ @AutoLog(value = "工厂建模-添加") @ApiOperation(value="工厂建模-添加", notes="工厂建模-添加") @PostMapping(value = "/add") @Transactional public Result add(@RequestBody Map map) { FactoryModel factoryModel = new FactoryModel(); factoryModel.setCode(String.valueOf(map.get("code"))) .setName(String.valueOf(map.get("name"))) .setVersion(Integer.parseInt(String.valueOf(map.get("version")))) .setParentId(String.valueOf(map.get("parentId"))) .setEnterpriseId(String.valueOf(map.get("enterpriseId"))) .setFactoryElementCategoryId(String.valueOf(map.get("factoryElementCategoryId"))) .setRemark(String.valueOf(map.get("remark"))) .setDepartId(String.valueOf(map.get("departId"))) .setVirtualFlag(Integer.parseInt(String.valueOf(map.get("virtualFlag")))) .setDelFlag(0); factoryModelService.save(factoryModel); QueryWrapper queryWrapper = new QueryWrapper() .eq("code",factoryModel.getCode()) .eq("version",factoryModel.getVersion()) .eq("del_flag",0); FactoryModel selectFactoryModel = factoryModelService.getOne(queryWrapper,true); DataVersion dataVersion = new DataVersion(); dataVersion.setBusinessId(selectFactoryModel.getId()) .setBusinessType("工厂建模") .setVersion(selectFactoryModel.getVersion()) .setVersionStatus(String.valueOf(map.get("versionStatus"))) .setDelFlag(0) .setEffectiveType("0") .setIsLastUsable("0"); dataVersionService.save(dataVersion); QueryWrapper queryWrapper1 = new QueryWrapper() .eq("business_id",selectFactoryModel.getId()).eq("del_flag",0); DataVersion selectDataVersion = dataVersionService.getOne(queryWrapper1,true); selectFactoryModel.setDataVersionId(selectDataVersion.getId()); factoryModelService.saveOrUpdate(selectFactoryModel); return Result.OK("添加成功!"); } /** * 编辑 * * @param factoryModel * @return */ @AutoLog(value = "工厂建模-编辑") @ApiOperation(value="工厂建模-编辑", notes="工厂建模-编辑") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) public Result edit(@RequestBody FactoryModel factoryModel) { factoryModelService.updateById(factoryModel); return Result.OK("编辑成功!"); } /** * 升版 * * @param map * @return */ @PostMapping("/updateVersion") @Transactional public Result updateVersion(@RequestBody Map map){ Integer version = Integer.parseInt((String)map.get("version")); List list = enterpriseService.getUsableIdList(); Integer newVersion =factoryModelService.getVersionList().stream().findFirst().get()+1; list.forEach(id->{ recurrenceUpdata(id,id,version,newVersion); }); return Result.OK("升版成功",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.FactoryModelSetUsableJob"),true); if(ObjectUtils.isNotNull(quartzJob)){ quartzJobService.deleteAndStopJob(quartzJob); } //获取版本号 Integer version = Integer.parseInt((String)map.get("version")); //获取上次生效版本并将其是否上次生效位置置为否 List lastUsableList = factoryModelService.getLastUsableList(null); if(CollectionUtils.isNotEmpty(lastUsableList)){ List lastUsableVersionList = dataVersionService.list( new QueryWrapper() .in("business_id",lastUsableList.stream() .map(FactoryModel::getId) .collect(Collectors.toList())).eq("del_flag",0)); lastUsableVersionList.stream().forEach(dataVersion -> { dataVersion.setIsLastUsable("0"); }); dataVersionService.updateBatchById(lastUsableVersionList); } //获取生效版本及版本信息并将其置为失效 List usableList = factoryModelService.getUsableList(null); if(CollectionUtils.isNotEmpty(usableList)){ List usableDataVersionList = dataVersionService.list(new QueryWrapper() .in("business_id",usableList.stream() .map(FactoryModel::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",factoryModelService .getAllDepartByPid(version) .stream().map(FactoryModel::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) throws ParseException { 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(); System.out.println(time); 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); } } /** * 获取当前生效版本和上一次生效版本的版本号 * * @return */ @GetMapping("/getNowAndLastUsableVersion") public Result getNowAndLastUsableVersion(){ return Result.OK(factoryModelService.getNowAndLastUsableVersion()); } /** * 判断是否有亲子关系 * * @param map * @return */ @PostMapping("/checkPositionInfo") public Result checkPositionInfo(@RequestBody Map map){ String dropedKey=map.get("dropedKey"); String changeKey=map.get("changeKey"); return Result.OK(isChildren(changeKey,dropedKey)||isChildren(dropedKey,changeKey)); } /** * 拖拽节点 * * @param map * @return */ @PostMapping("/dropAndChangeNode") @Transactional public Result dropAndChangeNode(@RequestBody Map map){ String dropedKey=map.get("dropedKey"); String changeKey=map.get("changeKey"); String dropedParentId = map.get("dropedParentId"); String changeParentId = map.get("changeParentId"); FactoryModel dropedFactory = factoryModelService.getById(dropedKey); FactoryModel changeFactory = factoryModelService.getById(changeKey); String dropedCode = dropedFactory.getCode(); String changeCode = changeFactory.getCode(); String status = map.get("status"); if("1".equals(status)||"3".equals(status)){ dropedFactory.setId(changeKey).setParentId(changeParentId).setCode(changeCode); changeFactory.setId(dropedKey).setParentId(dropedParentId).setCode(dropedCode); List list = new ArrayList<>(); list.add(dropedFactory); list.add(changeFactory); factoryModelService.updateBatchById(list); }else if("4".equals(status)){ //互换位置 String finalCode=""; List changeChildList = factoryModelService .list(new QueryWrapper() .eq("parent_id",changeKey) .eq("del_flag",0)); if(CollectionUtils.isNotEmpty(changeChildList)){ TreeSet childIntCodeSet = new TreeSet<>(Comparator.reverseOrder()); changeChildList.stream().forEach(factoryModel -> { String code = factoryModel.getCode(); Integer subCode = Integer.parseInt(code.substring(code.lastIndexOf(".")+1)); childIntCodeSet.add(subCode); }); Integer finalIntSubfix=childIntCodeSet.first()+1; finalCode = changeCode+".0"+finalIntSubfix; } else { finalCode = changeCode+".01"; } dropedFactory.setParentId(changeKey).setCode(finalCode); factoryModelService.updateById(dropedFactory); //重新计算调整位置后各孩子的code changeEveryChildCode(dropedKey,finalCode); }else if("2".equals(status)){ String prefix = changeCode.substring(0,changeCode.lastIndexOf(".")); Integer changeSubfix = Integer.parseInt(changeCode.substring(changeCode.lastIndexOf(".")+1)); List changeChildList = factoryModelService.list(new QueryWrapper() .eq("parent_id",changeParentId) .eq("del_flag",0)); changeChildList.stream().forEach(factoryModel -> { String code = factoryModel.getCode(); String id = factoryModel.getId(); Integer numSubfix = Integer.parseInt(code.substring(code.lastIndexOf(".")+1)); if(numSubfix>changeSubfix){ numSubfix = numSubfix+1; String finalCode = prefix+".0"+numSubfix; factoryModel.setCode(finalCode); changeEveryChildCode(id,finalCode); } }); factoryModelService.saveOrUpdateBatch(changeChildList); Integer numDropedSubfix = changeSubfix+1; String finalDropedCode = prefix+".0"+numDropedSubfix; dropedFactory.setCode(finalDropedCode).setParentId(changeParentId); changeEveryChildCode(dropedKey,finalDropedCode); factoryModelService.saveOrUpdate(dropedFactory); }else if("5".equals(status)){ String prefix = changeCode.substring(0,changeCode.lastIndexOf(".")); Integer changeSubfix = Integer.parseInt(changeCode.substring(changeCode.lastIndexOf(".")+1)); List changeChildList = factoryModelService.list(new QueryWrapper() .eq("parent_id",changeParentId) .eq("del_flag",0)); changeChildList.stream().forEach(factoryModel -> { String code = factoryModel.getCode(); String id = factoryModel.getId(); Integer numSubfix = Integer.parseInt(code.substring(code.lastIndexOf(".")+1)); if(numSubfix>=changeSubfix){ numSubfix = numSubfix+1; String finalCode = prefix+".0"+numSubfix; factoryModel.setCode(finalCode); changeEveryChildCode(id,finalCode); } }); factoryModelService.saveOrUpdateBatch(changeChildList); Integer numDropedSubfix = changeSubfix; String finalDropedCode = prefix+".0"+numDropedSubfix; dropedFactory.setCode(finalDropedCode).setParentId(changeParentId); changeEveryChildCode(dropedKey,finalDropedCode); factoryModelService.saveOrUpdate(dropedFactory); } return Result.OK("树结构调整成功"); } /** * 通过id删除 * * @param id * @return */ @AutoLog(value = "工厂建模-通过id删除") @ApiOperation(value="工厂建模-通过id删除", notes="工厂建模-通过id删除") @DeleteMapping(value = "/delete") public Result delete(@RequestParam(name="id",required=true) String id) { dataVersionService.update(new UpdateWrapper() .set("del_flag",1) .eq("business_id",id)); factoryModelService.update(new UpdateWrapper().eq("id",id).set("del_flag",1)); return Result.OK("删除成功!"); } /** * 批量删除 * * @param ids * @return */ @AutoLog(value = "工厂建模-批量删除") @ApiOperation(value="工厂建模-批量删除", notes="工厂建模-批量删除") //@RequiresPermissions("org.jeecg.modules.demo:mom_base_factory_model:deleteBatch") @DeleteMapping(value = "/deleteBatch") public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) { dataVersionService.update(new UpdateWrapper() .set("del_flag",1) .in("business_id",Arrays.asList(ids.split(",")))); this.factoryModelService.update(new UpdateWrapper() .in("id",Arrays.asList(ids.split(","))) .set("del_flag",1)); return Result.OK("批量删除成功!"); } /** * 通过id查询 * * @param id * @return */ //@AutoLog(value = "工厂建模-通过id查询") @ApiOperation(value="工厂建模-通过id查询", notes="工厂建模-通过id查询") @GetMapping(value = "/queryById") public Result queryById(@RequestParam(name="id",required=true) String id) { FactoryModel factoryModel = factoryModelService.getById(id); if(factoryModel==null) { return Result.error("未找到对应数据"); } return Result.OK(factoryModel); } /** * 导出excel * * @param request * @param factoryModel */ //@RequiresPermissions("org.jeecg.modules.demo:mom_base_factory_model:exportXls") @RequestMapping(value = "/exportXls") public ModelAndView exportXls(HttpServletRequest request, FactoryModel factoryModel) { return super.exportXls(request, factoryModel, FactoryModel.class, "工厂建模"); } /** * 通过excel导入数据 * * @param request * @param response * @return */ //@RequiresPermissions("org.jeecg.modules.demo:mom_base_factory_model:importExcel") @RequestMapping(value = "/importExcel", method = RequestMethod.POST) public Result importExcel(HttpServletRequest request, HttpServletResponse response) { return super.importExcel(request, response, FactoryModel.class); } /*-----------------------------------------------以下为提供方便的api-------------------------------*/ /** * 升版单个树节点并返回升版后新节点Id * @param sourceFactoryModel * @param newParentId * @param newVersion * @return newEnterPriseId * */ public String updataOneNode ( FactoryModel sourceFactoryModel, String newParentId, Integer newVersion ){ //1.取出旧版本信息;2.创建将新版本工厂建模及其版本号并存入数据库 // 1. DataVersion oldDataVersion = dataVersionService .getOne(new QueryWrapper() .eq("business_id",sourceFactoryModel.getId()) .eq("del_flag",0),true); sourceFactoryModel.setId(null) .setParentId(newParentId) .setVersion(newVersion); //2. factoryModelService.save(sourceFactoryModel); FactoryModel newFactoryModel = factoryModelService .getOne(new QueryWrapper() .eq("code",sourceFactoryModel.getCode()) .eq("version",newVersion) .eq("del_flag",0),true); DataVersion newDataVersion = new DataVersion(); newDataVersion .setVersion(newVersion) .setBusinessType("工厂建模") .setBusinessId(newFactoryModel.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(); factoryModelService.update(new UpdateWrapper() .set("data_version_id",newDataVersionId) .eq("id",newFactoryModel.getId())); return newFactoryModel.getId(); } /** * 递归升版多个节点 * @param parentId * @param newParentId * @param version * @param newVersion * @return */ public void recurrenceUpdata(String parentId,String newParentId,Integer version,Integer newVersion){ List childList = factoryModelService .list(new QueryWrapper() .eq("parent_id",parentId) .eq("version",version) .eq("del_flag",0)); if(CollectionUtils.isNotEmpty(childList)){ for(int i=0;i idList = factoryModelService.list(new QueryWrapper() .eq("parent_id",parentId) .eq("del_flag",0)) .stream() .map(FactoryModel::getId) .collect(Collectors.toList()); if(CollectionUtils.isNotEmpty(idList)){ for(String strId:idList){ if(strId.equals(id)){ return true; } else if(!tag){ tag = isChildren(strId,id); } } } return tag; } /** * 递归调整树节点的code * @param parentId * @param prefix * @return */ public void changeEveryChildCode(String parentId,String prefix){ List children = factoryModelService.list(new QueryWrapper() .eq("parent_id",parentId) .eq("del_flag",0)); if(CollectionUtils.isNotEmpty(children)){ for(FactoryModel factoryModel:children){ String id = factoryModel.getId(); String oldCode = factoryModel.getCode(); String subfix = oldCode.substring(oldCode.lastIndexOf(".")+1); String realCode = prefix+"."+subfix; factoryModelService.update(new UpdateWrapper().set("code",realCode).eq("id",id)); changeEveryChildCode(id,realCode); } } } }