blade-service/blade-mdm/pom.xml
@@ -80,6 +80,11 @@ <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springblade</groupId> <artifactId>blade-core-test</artifactId> <scope>test</scope> </dependency> <!--<dependency> <groupId>org.springblade</groupId> <artifactId>blade-starter-transaction</artifactId> blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/vo/IdsVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package org.springblade.mdm.commons.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import java.util.Date; @Setter @Getter public class IdsVO { @Schema(description = "idæ°ç»") private Long[] ids; } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/DispatchController.java
@@ -6,12 +6,16 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.TaskService; import org.flowable.task.api.Task; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.excution.StartDispatcher; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.flow.vo.TaskAssignVO; import org.springblade.mdm.program.service.ProcessProgRefService; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +24,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; import java.util.Map; @Slf4j @@ -34,6 +40,9 @@ private TaskService taskService; @Autowired private ProcessProgRefService processProgRefService; @Autowired private ApproveRecordService approveRecordService; /** * æ°å¢ */ @@ -61,9 +70,12 @@ //å å ¥å®¡æ¹ç¨æ· variables.put("approveUserNickName",AuthUtil.getNickName()); if(variables.containsKey("assignee")){ addApproveRecord(taskId,processInstanceId,comment,programIds,variables); //æå®äºä¸ä¸æ¥æ§è¡äºº taskService.complete(taskId, variables); return R.success("æµç¨æäº¤æå"); }else { // 宿任å¡,ç»é»è®¤ç¨æ· @@ -71,4 +83,30 @@ } } void addApproveRecord(String taskId, String processInstanceId, String comment,String programIds,Map<String, Object> variables){ List<Long> programIdList = new ArrayList<>(); if(programIds != null){ programIdList = Func.toLongList(programIds); }else{ programIdList.add(null); } Task task = taskService.createTaskQuery() .taskId(taskId) .singleResult(); for(Long programId : programIdList){ ApproveRecord rec = new ApproveRecord(); rec.setTaskName(task.getName()); rec.setComment(comment); rec.setNcProgramId(programId); rec.setOperateResult(variables.get("approve")+"");//审æ¹ç»æ rec.setOperateTime(DateUtil.now()); rec.setProcessInstanceId(processInstanceId); rec.setUserId(AuthUtil.getUserId()); rec.setUserNickname(AuthUtil.getNickName()); approveRecordService.save(rec); } } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
@@ -17,6 +17,7 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.mdm.basesetting.machine.vo.MachineExcelVO; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.flow.service.FlowBusinessService; import org.springblade.mdm.flow.vo.FlowVO; import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO; @@ -42,6 +43,7 @@ @Autowired private HistoryService historyService; @GetMapping("overtime-list") @ApiOperationSupport(order = 3) @@ -71,7 +73,7 @@ } @Operation(summary = "æµç¨è½¨è¿¹", description = "æµç¨è½¨è¿¹") @Operation(summary = "æµç¨æ§è¡è½¨è¿¹", description = "æµç¨æ§è¡è½¨è¿¹") @GetMapping("process-trace") public R<List<TaskTraceVO>> processTrace(String processInstanceId){ List<TaskTraceVO> result = new ArrayList<>(); blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ package org.springblade.mdm.flow.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Getter; import lombok.Setter; import org.springblade.core.mp.base.BizEntity; import java.time.LocalDate; import java.util.Date; /** * æ°æ§ç¨åºå®¡æ¹è®°å½ */ @Setter @Getter @TableName("mdm_approve_record") public class ApproveRecord extends BizEntity { private String processInstanceId; /** * ä»»å¡åç§° */ private String taskName; /** * 夿³¨ */ private String comment; /** * æ°æ§ç¨åºidï¼è¿ä¸ªå¯è½ä¸éè¦ï¼å¯ä»¥æ ¹æ®å ³è表mdm_process_prog_refæ¥è·å */ private Long ncProgramId; private Long userId; /** * 审æ¹ç¨æ·å§å */ private String userNickname; /** * è¿ææ¥æ */ private Date operateTime; /** * èç¹ç±»åï¼åå ¸ */ private String operateResult; } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java
@@ -50,7 +50,7 @@ vars.put("partNo",startVO.getPartNo()); vars.put("partNoEdition",startVO.getPartNoEdition()); vars.put("planLockDays",startVO.getPlanLockDays()); vars.put("productModel",startVO.getProductModel()); //é¶ç»ä»¶ä»£ç String partNo = generatePartNo(startVO); vars.put("partNo",partNo); blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package org.springblade.mdm.flow.mapper; import org.springblade.core.mp.mapper.BladeMapper; import org.springblade.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.vo.ApproveRecordVO; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.vo.NcNodeVO; import java.util.List; public interface ApproveRecordMapper extends BladeMapper<ApproveRecord> { List<ApproveRecordVO> listByNcProgramId(Long ncProgramId); } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/mapper/ApproveRecordMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.springblade.mdm.flow.mapper.ApproveRecordMapper"> <resultMap id="BaseResultMap" type="org.springblade.mdm.flow.entity.ApproveRecord"> <id column="id" property="id"/> <result column="status" property="status"/> <result column="create_time" property="createTime"/> <result column="update_time" property="updateTime"/> <result column="is_deleted" property="isDeleted"/> </resultMap> <sql id="all_columns">id,tenant_id,nc_program_id,process_instances_id,operate_time,operate_result,user_id,user_nickname,status,create_dept,is_deleted,create_time,create_user,update_time,update_user</sql> <select id="listByNcProgramId" resultType="org.springblade.mdm.flow.vo.ApproveRecordVO"> select <include refid="all_columns"/> FROM mdm_approve_record WHERE nc_program_id = ${ncProgramId} and is_deleted = 0 order by create_time desc </select> </mapper> blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package org.springblade.mdm.flow.service; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BizServiceImpl; import org.springblade.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.mapper.ApproveRecordMapper; import org.springblade.mdm.flow.vo.ApproveRecordVO; import org.springframework.stereotype.Service; import java.util.List; /** * 审æ¹è®°å½ï¼ç¨äºæ¥è¯¢æ§è¡è½¨è¿¹ * * @author yangys */ @Slf4j @Service @AllArgsConstructor public class ApproveRecordService extends BizServiceImpl<ApproveRecordMapper, ApproveRecord> { public List<ApproveRecordVO> listByNcProgramId(Long ncProgramId) { return this.getBaseMapper().listByNcProgramId(ncProgramId); } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/CureFlowService.java
@@ -48,12 +48,12 @@ */ public void start(long programId){ Map<String, Object> vars = new HashMap<>(); //NcProgram prog = ncProgramService.getById(programId); NcProgram prog = ncProgramService.getById(programId); NcNode progNode = ncNodeService.getById(programId); Machine machine = machineService.getByCode(progNode.getMachineCode()); vars.put("machineCode",machine.getCode()); vars.put("machineMode",machine.getName()); vars.put("processEdition",progNode.getProcessEdition()); vars.put("processEdition",prog.getProcessEdition()); vars.put("programId",programId); vars.put("program",progNode); blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveRecordVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package org.springblade.mdm.flow.vo; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import org.springblade.core.mp.base.BizEntity; import org.springblade.mdm.commons.vo.BaseVO; import java.util.Date; /** * æ°æ§ç¨åºå®¡æ¹è®°å½ */ @Setter @Getter public class ApproveRecordVO extends BaseVO { private String processInstanceId; /** * æ°æ§ç¨åºid */ @Schema(description = "æ°æ§ç¨åºid") private Long ncProgramId; @Schema(description = "ç¨æ·id") private Long userId; @Schema(description = "审æ¹ç¨æ·å§å") private String userNickname; @Schema(description = "å®¡æ¹æ¥æ") private Date operateTime; @Schema(description = "审æ¹ç»æ") private String operateResult; } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/TaskAssignVO.java
@@ -17,7 +17,8 @@ private String processNo; @Schema(description = "å·¥åºåç§°") private String processName; @Schema(description = "产ååå·") private String productModel; @Schema(description = "å·¥åºç次") private String processEdition; @@ -37,4 +38,5 @@ private LocalDate planStartTime; @Schema(description = "主å¶å工表ID") private long producePlanId; } blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/DncSendBackController.java
@@ -42,7 +42,7 @@ */ @PostMapping("upload") @ApiOperationSupport(order = 1) @Operation(summary = "ä¸ä¼ æä»¶", description = "ä¸ä¼ DNCåä¼ æä»¶") @Operation(summary = "DNCåä¼ æä»¶å¯¼å ¥ï¼ä¸ä¼ æä»¶", description = "ä¸ä¼ DNCåä¼ æä»¶") public R<Void> dncSendBackUpload(@RequestParam MultipartFile file) { try { ncProgramExchangeService.dncSendBackUpload(file); blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramController.java
@@ -7,17 +7,25 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.task.Comment; import org.flowable.task.api.history.HistoricTaskInstance; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.flow.vo.ApproveRecordVO; import org.springblade.mdm.flow.vo.TaskTraceVO; import org.springblade.mdm.program.entity.NcProgram; import org.springblade.mdm.program.service.NcProgramService; import org.springblade.mdm.program.service.ProcessProgRefService; import org.springblade.mdm.program.vo.NcNodeProgramQueryVO; import org.springblade.mdm.program.vo.NcProgramUploadVO; import org.springblade.mdm.program.vo.NcProgramVO; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; /** @@ -35,6 +43,9 @@ private final NcProgramService ncProgramService; private final ProcessProgRefService ncProcessProgRefService; private final ApproveRecordService approveRecordService; @PostMapping("/upload") @Operation(summary = "ä¸ä¼ æä»¶", description = "ä¸ä¼ ç¨åº/éä»¶æä»¶") public R<Boolean> upload(NcProgramUploadVO uploadVO) { @@ -92,4 +103,12 @@ public R<List<NcProgramVO>> listByProcess(@Parameter(description="æå±èç¹ID")@RequestParam String processInstanceId) { return R.data(ncProcessProgRefService.listByProcess(processInstanceId)); } @Operation(summary = "æä½æ¥å¿", description = "ç¨åºæä½æ¥å¿ï¼å³å®¡æ¹è®°å½ï¼å¨ä¸»é¡µç¹å»æä¸ä¸ªç¨åºåç䏿¹æ ç¾æ¾ç¤º") @GetMapping("approve-records") public R<List<ApproveRecordVO>> processTrace1(@Parameter(description = "ç¨åºid") Long ncProgramId){ List<TaskTraceVO> result = new ArrayList<>(); return R.data(approveRecordService.listByNcProgramId(ncProgramId)); } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExchangeController.java
ÎļþÒÑɾ³ý blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
@@ -3,22 +3,24 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.mdm.commons.vo.IdsVO; import org.springblade.mdm.program.service.NcProgramApprovedService; import org.springblade.mdm.program.service.NcProgramService; import org.springblade.mdm.program.vo.NcNodeProgramQueryVO; import org.springblade.mdm.program.vo.NcProgramExportDncPageVO; import org.springblade.mdm.program.vo.NcProgramExportDncQueryVO; import org.springblade.mdm.program.vo.NcProgramVO; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import java.io.IOException; /** * ç¨åºæ¶å¯ç½-å·¥æ§ç½äº¤æ¢æ¥å£ @@ -44,9 +46,17 @@ @PostMapping("/export-dnc") @Operation(summary = "æ°æ§ç¨åºå¯¼åºdnc", description = "æ°æ§ç¨åºå¯¼åºå°å·¥æ§ç½") public void exportDnc(Long nodeId, HttpServletResponse response) { public void exportDnc(@RequestBody @Parameter(description = "审æ¹è¡¨idæ°ç»") IdsVO vo, HttpServletResponse response) { if(vo.getIds() == null || vo.getIds().length == 0) { throw new ServiceException("æªéæ©æä»¶å¯¼åº"); } try { ncProgramApprovedService.exportDnc(vo.getIds(),response.getOutputStream()); } catch (IOException e) { log.error("导åºDNCå¼å¸¸", e); throw new RuntimeException(e); } //return R.<Boolean>status(true); } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcNode.java
@@ -34,12 +34,12 @@ /** * å·¥åºç次 */ private String processEdition; //private String processEdition; /** * å·¥èºç次 */ private String craftEdition; //private String craftEdition; /** * é¶ç»ä»¶å·/å¾å· */ @@ -47,7 +47,7 @@ /** * å¾å·ç次 */ private String partNoEdition; //private String partNoEdition; /** * æ¯å¦åºå @@ -56,11 +56,11 @@ /** * è¿ææ¥æ */ private LocalDate expireDate; //private LocalDate expireDate; /** * æ¯å¦éå® */ private Integer isLocked; //private Integer isLocked; /** * èç¹ç±»åï¼åå ¸ */ blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramApprovedService.java
@@ -1,18 +1,41 @@ package org.springblade.mdm.program.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.compress.archivers.zip.ZipUtil; import org.apache.commons.lang3.StringUtils; import org.springblade.core.mp.base.BizEntity; import org.springblade.core.mp.base.BizServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.oss.OssTemplate; import org.springblade.core.tool.utils.Func; import org.springblade.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.entity.NcProgram; import org.springblade.mdm.program.entity.NcProgramApproved; import org.springblade.mdm.program.mapper.NcProgramApprovedMapper; import org.springblade.mdm.program.vo.DncSendBackData; import org.springblade.mdm.program.vo.NcProgramExportDncPageVO; import org.springblade.mdm.program.vo.NcProgramExportDncQueryVO; import org.springblade.mdm.utils.CustomBinaryWriter; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * ä¸å/åä¼ ç¨åºç»è®¡ @@ -23,8 +46,10 @@ @Service @AllArgsConstructor public class NcProgramApprovedService extends BizServiceImpl<NcProgramApprovedMapper, NcProgramApproved> { private final NcProgramService progService; private final OssTemplate ossTemplate; private final ApproveRecordService approvedService; private final NcNodeService ncNodeService; /** * å页æ¥è¯¢ * @param query æ¥è¯¢åæ° @@ -37,5 +62,191 @@ return page; } /** * 导åºdnc * @param approvedIdArr å¾ å¯¼åºå®¡æ¹è¡¨idæ°ç» */ public void exportDnc(Long[] approvedIdArr, OutputStream os) throws IOException { ZipOutputStream zipOut = new ZipOutputStream(os); ArrayList<Long> programIdList = new ArrayList<Long>(); for (Long approvedId : approvedIdArr) { NcProgramApproved approved = this.getById(approvedId); programIdList.add(approved.getNcProgramId()); NcProgram prog = progService.getById(approved.getNcProgramId()); String filename = prog.getOssName(); InputStream inputStream = ossTemplate.statFileStream(filename); addInputStreamToZip(zipOut, inputStream, prog.getName()); } addDataJson(zipOut, programIdList); } /** * å¯¼å ¥æ°æ®æä»¶ * @param zipOut */ void addDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException { addProgramDataJson(zipOut, programIdList); addApproveRecordDataJson(zipOut, programIdList); addNcNodeDataJson(zipOut, programIdList); } /** * å¯¼å ¥ç¨åºè®°å½ * @param zipOut * @param programIdList */ void addProgramDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException { LambdaQueryWrapper<NcProgram> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(NcProgram::getId, programIdList); List<NcProgram> programList = progService.list(queryWrapper); JSONArray jsonArray = new JSONArray(); for(NcProgram program : programList){ JSONObject recObj = new JSONObject(); recObj.put("id", program.getId()); recObj.put("code", program.getCode()); recObj.put("ossName",program.getOssName()); recObj.put("isTextFile",program.getIsTextFile()); recObj.put("category",program.getCategory()); recObj.put("description",program.getDescription()); recObj.put("name",program.getName()); recObj.put("partNo",program.getPartNo()); recObj.put("ncNodeId",program.getNcNodeId()); recObj.put("url",program.getUrl()); recObj.put("isCured",program.getIsCured()); recObj.put("isLocked",program.getIsLocked()); recObj.put("isTest",program.getIsTest()); recObj.put("machineCode",program.getMachineCode()); recObj.put("processEdition",program.getProcessEdition()); recObj.put("taskAssignTime",program.getTaskAssignTime()); addSuperProperties(recObj,program); jsonArray.add(recObj); } addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_nc_program.json"); } /** * å¯¼å ¥å®¡æ¹è®°å½ * @param zipOut * @param programIdList */ void addApproveRecordDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException { LambdaQueryWrapper<ApproveRecord> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(ApproveRecord::getNcProgramId, programIdList); List<ApproveRecord> records = approvedService.list(queryWrapper); JSONArray jsonArray = new JSONArray(); for(ApproveRecord record : records){ JSONObject recObj = new JSONObject(); recObj.put("id", record.getId()); recObj.put("comment", record.getComment()); recObj.put("userId",record.getUserId()); recObj.put("userNickname",record.getUserNickname()); recObj.put("operateTime",record.getOperateTime()); recObj.put("operateResult",record.getOperateResult()); recObj.put("taskName",record.getTaskName()); recObj.put("ncProgramId",record.getNcProgramId()); recObj.put("processInstanceId",record.getProcessInstanceId()); addSuperProperties(recObj,record); jsonArray.add(recObj); } addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_approve_record.json"); } /** * å¯¼å ¥èç¹ * @param zipOut * @param programIdList */ void addNcNodeDataJson(ZipOutputStream zipOut, List<Long> programIdList) throws IOException { LambdaQueryWrapper<NcProgram> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(NcProgram::getId, programIdList); List<NcProgram> programs = progService.list(queryWrapper); JSONArray jsonArray = new JSONArray(); ArrayList<Long> exportNodeIdList = new ArrayList<>(); for(NcProgram program : programs){ JSONObject recObj = new JSONObject(); if(!exportNodeIdList.contains(program.getNcNodeId())){ exportNodeIdList.add(program.getNcNodeId()); } NcNode ncNode = ncNodeService.getById(program.getNcNodeId()); if(StringUtils.isNotEmpty(ncNode.getParentIds())){ List<Long> pids = Func.toLongList(ncNode.getParentIds()); for(Long nodeId : pids){ if(!exportNodeIdList.contains(nodeId)){ exportNodeIdList.add(nodeId); } } } } LambdaQueryWrapper<NcNode> nodeQueryWrapper = new LambdaQueryWrapper<>(); nodeQueryWrapper.in(NcNode::getId, exportNodeIdList); List<NcNode> nodeList =ncNodeService.list(nodeQueryWrapper); for(NcNode node : nodeList){ JSONObject recObj = new JSONObject(); recObj.put("id", node.getId()); recObj.put("nodeType", node.getNodeType()); recObj.put("machineCode",node.getMachineCode()); recObj.put("parentId",node.getParentId()); recObj.put("description",node.getDescription()); recObj.put("name",node.getName()); recObj.put("remark",node.getRemark()); recObj.put("partNo",node.getPartNo()); recObj.put("parentIds",node.getParentIds()); recObj.put("processName",node.getProcessName()); addSuperProperties(recObj,node); jsonArray.add(recObj); } addInputStreamToZip(zipOut,new ByteArrayInputStream(jsonArray.toJSONString().getBytes(StandardCharsets.UTF_8)),"exp_mdm_nc_node.json"); } void addSuperProperties(JSONObject recObj, BizEntity entity){ recObj.put("tenantId",entity.getTenantId()); recObj.put("createTime",entity.getCreateTime()); recObj.put("updateTime",entity.getUpdateTime()); recObj.put("createUser",entity.getCreateUser()); recObj.put("updateUser",entity.getUpdateUser()); recObj.put("status",entity.getStatus()); recObj.put("createDept",entity.getCreateDept()); } public void addInputStreamToZip(ZipOutputStream zipOut, InputStream inputStream, String entryName) throws IOException { // å建æ°ç ZIP æ¡ç® ZipEntry zipEntry = new ZipEntry(entryName); zipOut.putNextEntry(zipEntry); // å°è¾å ¥æµåå ¥ ZIP è¾åºæµ byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) >= 0) { zipOut.write(buffer, 0, length); } // å ³éå½åæ¡ç® zipOut.closeEntry(); } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExchangeService.java
@@ -11,21 +11,25 @@ import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.utils.FileUtil; import org.springblade.mdm.basesetting.machine.vo.MachineVO; import org.springblade.mdm.program.entity.NcProgramExchange; import org.springblade.mdm.program.mapper.NcProgramExchangeMapper; import org.springblade.mdm.program.vo.DncSendBackData; import org.springblade.mdm.utils.CustomBinaryReader; import org.springblade.mdm.utils.FileExchangeUtil; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; /** * ä¸å/åä¼ ç¨åºç»è®¡ * ç¨åºäº¤æ¢ï¼dncå¯¼å ¥/导åºï¼ * * @author yangys */ @@ -36,16 +40,16 @@ /** * dncåä¼ æä»¶ä¸ä¼ * @param file * @param file æä»¶ * @return */ public void dncSendBackUpload(MultipartFile file) { List<DncSendBackData> list=new ArrayList<>(); public List<DncSendBackData> dncSendBackUpload(MultipartFile file) { List<DncSendBackData> list ; try { String fileName = file.getOriginalFilename(); InputStream fileInputStream = file.getInputStream(); byte[] bytes = FileUtil.copyToByteArray(fileInputStream); //InputStream fileInputStream = file.getInputStream(); InputStream zipFileInputStream = FileExchangeUtil.convertFileToZip(file.getInputStream()); byte[] bytes = FileUtil.copyToByteArray(zipFileInputStream); list = parseDncZipFromByteArray(bytes); for(DncSendBackData dncSendBackData:list){ NcProgramExchange exchange=new NcProgramExchange(); @@ -57,10 +61,36 @@ } catch (IOException e) { log.error("ä¸ä¼ dncæä»¶å¤±è´¥",e); list = Collections.emptyList(); } return list; } InputStream convertFileToZip(InputStream inputStream) throws IOException { File tempFile = createTempFile(); FileOutputStream fos = new FileOutputStream(tempFile); CustomBinaryReader.read(inputStream,fos); FileInputStream dInstream = new FileInputStream(tempFile); return dInstream; } /** * å建ä¸ä¸ªä¸´æ¶æä»¶ * @return * @throws IOException */ File createTempFile() throws IOException { Path tempDir = Paths.get(System.getProperty("java.io.tmpdir")); // å¨ä¸´æ¶ç®å½ä¸å建æä»¶ String tfilename = "t"+System.currentTimeMillis(); Path tempFile = Files.createTempFile(tempDir, tfilename, ".tmp"); System.out.println("å建çä¸´æ¶æä»¶: " + tempFile); return tempFile.toFile(); } public static List<DncSendBackData> parseDncZipFromByteArray(byte[] zipData) throws IOException { //List<DncSendBackData> datas = new ArrayList<>(); List<DncSendBackData> datas = ZipFileDirectoryScanner.getFilesInDirectoryRecursive(zipData, ""); @@ -107,6 +137,7 @@ * @param query æ¥è¯¢åæ° * @return */ public IPage<DncSendBackData> dncSendBackPageQuery(Query query) { IPage<DncSendBackData> page = this.getBaseMapper().dncSendBackpageQuery(Condition.getPage(query),query); blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryReader.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package org.springblade.mdm.utils; import java.io.*; import java.util.Arrays; public class CustomBinaryReader { /** * ä»è¾å ¥æµè¯»åæ°æ®å°è¾åºæµ * @param inputStream * @param os * @throws IOException */ public static void read(InputStream inputStream, OutputStream os) throws IOException { byte[] buffer = new byte[1024]; try (DataInputStream in = new DataInputStream( new BufferedInputStream(inputStream))) { // 读åå¹¶éªè¯Magic Number byte[] magic = new byte[4]; in.readFully(magic); if (!Arrays.equals(magic, CustomBinaryWriter.MAGIC_NUMBER)) { throw new RuntimeException("䏿¯ææçèªå®ä¹æä»¶æ ¼å¼"); } // 读åçæ¬å· short version = in.readShort(); if (version > CustomBinaryWriter.VERSION) { throw new RuntimeException("䏿¯æççæ¬: " + version); } while(in.read(buffer) != -1){ os.write(buffer); } } } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/CustomBinaryWriter.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package org.springblade.mdm.utils; import java.io.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class CustomBinaryWriter { static final byte[] MAGIC_NUMBER = {'M', 'D', 'M', '1'}; static final short VERSION = 1; /** * å°è¾å ¥æµä¸çå 容åå ¥è¾åºæµ * @param outputStream * @param ins * @throws IOException */ public static void write(OutputStream outputStream, InputStream ins) throws IOException { byte[] buffer = new byte[1024]; try (DataOutputStream out = new DataOutputStream(outputStream)) { // åå ¥æä»¶å¤´ out.write(MAGIC_NUMBER); out.writeShort(VERSION); while(ins.read(buffer) != -1) { out.write(buffer); } } } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/utils/FileExchangeUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,30 @@ package org.springblade.mdm.utils; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FileExchangeUtil { public static InputStream convertFileToZip(InputStream inputStream) throws IOException { File tempFile = createTempFile(); FileOutputStream fos = new FileOutputStream(tempFile); CustomBinaryReader.read(inputStream,fos); FileInputStream dInstream = new FileInputStream(tempFile); return dInstream; } public static File createTempFile() throws IOException { Path tempDir = Paths.get(System.getProperty("java.io.tmpdir")); // å¨ä¸´æ¶ç®å½ä¸å建æä»¶ String tfilename = "t"+System.currentTimeMillis(); Path tempFile = Files.createTempFile(tempDir, tfilename, ".tmp"); System.out.println("å建çä¸´æ¶æä»¶: " + tempFile); return tempFile.toFile(); } } blade-service/blade-mdm/src/main/resources/processesbpmn/dispatch.bpmn20.xml
@@ -3,10 +3,14 @@ <process id="dispatch" name="任塿´¾å·¥" isExecutable="true"> <startEvent id="start" name="å¼å§"/> <sequenceFlow id="sid-c1619263-d1ff-4106-9315-f9ab9a3bee71" sourceRef="start" targetRef="teamLeaderTask"/> <userTask id="teamLeaderTask" name="ä¸ä¸ç»é¿" flowable:assignee="${teamLeader}"/> <userTask id="programmingTask" name="ç¼å¶" flowable:assignee="${assignee}"/> <userTask id="check" name="æ ¡å¯¹" flowable:assignee="${assignee}"/> <userTask id="approveTask" name="é«å¸å®¡æ¹" flowable:assignee="${assignee}"/> <userTask id="teamLeaderTask" name="ä»»å¡åæ´¾" flowable:assignee="${teamLeader}"> <documentation>ä¸ä¸ç»é¿ä»»å¡åæ´¾</documentation> </userTask> <userTask id="programmingTask" name="æ°æ§ç¨åºç¼å" flowable:assignee="${assignee}"/> <userTask id="check" name="æ°æ§ç¨åºæ ¡å¯¹" flowable:assignee="${assignee}"/> <userTask id="approveTask" name="æ°æ§ç¨åºå®¡æ¹" flowable:assignee="${assignee}"> <documentation>é«å¸æ°æ§ç¨åºå®¡æ¹</documentation> </userTask> <endEvent id="approveEnd" name="审æ¹å®æ"> <extensionElements> <flowable:executionListener expression="${dispatchFinishListener.handle(execution)}" event="end"/> blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryReaderTest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,17 @@ package org.springblade.mdm.utils; import org.junit.jupiter.api.Test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CustomBinaryReaderTest { //@Test public void testRead() throws IOException { FileInputStream fis = new FileInputStream("d:/myd.bin"); FileOutputStream fos = new FileOutputStream("d:/ddddreadout.zip"); CustomBinaryReader.read(fis,fos); } } blade-service/blade-mdm/src/test/java/org/springblade/mdm/utils/CustomBinaryWriterTest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package org.springblade.mdm.utils; import org.junit.jupiter.api.Test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CustomBinaryWriterTest { //@Test public void testWrite() throws IOException { FileOutputStream fos = new FileOutputStream("d:/myd.bin"); FileInputStream fis = new FileInputStream("d:/dddd.zip"); CustomBinaryWriter.write(fos,fis); } } doc/sql/mdm/mdm.mysql.all.create.sql
@@ -74,7 +74,7 @@ `description` varchar(100) NOT NULL COMMENT 'æè¿°', `remark` varchar(200) NOT NULL COMMENT '夿³¨', `parent_id` bigint DEFAULT NULL COMMENT 'ä¸çº§èç¹ID', `parent_ids` varchar(100) DEFAULT NULL COMMENT 'ä¸çº§èç¹IDéåï¼idéå·åé', `parent_ids` varchar(200) DEFAULT NULL COMMENT 'ä¸çº§èç¹IDéåï¼idéå·åé', `node_type` varchar(20) DEFAULT NULL COMMENT 'èç¹ç±»åï¼ä¸å¡åå ¸å®ä¹', `status` int DEFAULT NULL COMMENT 'ä¸å¡ç¶æ', `create_dept` bigint DEFAULT NULL COMMENT 'å建åä½', @@ -111,13 +111,16 @@ `code` varchar(100) NULL COMMENT 'ç¨åºç¼å·', `name` varchar(100) NOT NULL COMMENT 'ç¨åºåç§°', `oss_name` varchar(100) NULL COMMENT 'ossä¸çæä»¶å', `category` varchar(2) NULL COMMENT 'æä»¶åç±»', `category` varchar(20) NULL COMMENT 'æä»¶åç±»', `process_name` varchar(20) NULL COMMENT 'å·¥åºåç§°', `remark` varchar(100) NULL COMMENT '夿³¨', `is_text_file` int DEFAULT NULL COMMENT 'æ¯å¦ææ¬æä»¶', `url` varchar(400) NOT NULL COMMENT 'æä»¶å°å', `machine_code` varchar(100) DEFAULT NULL COMMENT '设å¤ç¼å·/æºåºç¼å·', `part_no` varchar(100) NULL COMMENT 'é¶ç»ä»¶ç¼å·/å¾å·', `part_no_edition` varchar(100) NULL COMMENT 'å¾å·ç次', `craft_edition` varchar(20) NULL COMMENT 'è®¾è®¡çæ¬¡', `description` varchar(100) NULL COMMENT 'æè¿°', `is_cured` int DEFAULT NULL COMMENT 'æ¯å¦åºå,1æ¯;0å¦', `expire_date` date DEFAULT NULL COMMENT 'å°ææ¶é´,æ ¹æ®ææææ¶é¿è®¡ç®èæ¥', `process_edition` varchar(40) DEFAULT NULL COMMENT 'å·¥åºç次ï¼åçå°±æ¯åæ´æ¹è¯¥å段ï¼éè¦ä¿çåå²è®°å½', @@ -135,15 +138,38 @@ PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='æ°æ§ç¨åº'; /** æµç¨å®¡æ¹è®°å½è¡¨ï¼å®¡æ¹è¿ç¨ä¸è®°å½ */ DROP TABLE IF EXISTS `mdm_approve_record`; CREATE TABLE `mdm_approve_record` ( `id` bigint NOT NULL, `tenant_id` varchar(6) DEFAULT NULL COMMENT 'æå±ç§æ·', `nc_program_id` bigint NULL COMMENT 'ç¨åºidãæªéæ©ç¨åºä¹åæ¯null', `process_instance_id` varchar(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾id', `task_name` varchar(100) DEFAULT NULL COMMENT 'ä»»å¡åç§°', `operate_time` datetime DEFAULT NULL COMMENT 'å®¡æ¹æ¶é´', `operate_result` varchar(20) DEFAULT NULL COMMENT '审æ¹ç»æ', `user_id` bigint NOT NULL COMMENT '审æ¹ç¨æ·id', `user_nickname` varchar(100) NOT NULL COMMENT '审æ¹ç¨æ·å§å', `comment` varchar(100) NOT NULL COMMENT '审æ¹å¤æ³¨', `status` int DEFAULT NULL COMMENT 'ä¸å¡ç¶æ', `create_dept` bigint DEFAULT NULL COMMENT 'å建åä½', `is_deleted` int DEFAULT NULL, `create_time` datetime DEFAULT NULL COMMENT 'å建æ¶é´', `create_user` bigint DEFAULT NULL COMMENT 'å建人', `update_time` datetime DEFAULT NULL COMMENT 'æ´æ°æ¶é´', `update_user` bigint DEFAULT NULL COMMENT 'æ´æ°äºº', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='æ°æ§ç¨åºå®¡æ¹è®°å½'; DROP TABLE IF EXISTS `mdm_nc_program_approved`; CREATE TABLE `mdm_nc_program_approved` ( `id` bigint NOT NULL, `tenant_id` varchar(6) DEFAULT NULL COMMENT 'æå±ç§æ·', `program_name` varchar(100) NOT NULL COMMENT 'ç¨åºåç§°', `program_id` bigint NOT NULL COMMENT 'ç¨åºid,æåææ°çç¨åºè®°å½', `nc_program_id` bigint NOT NULL COMMENT 'ç¨åºid,æåææ°çç¨åºè®°å½', `status` int DEFAULT NULL COMMENT 'ä¸å¡ç¶æ', `exchange_type` int DEFAULT NULL COMMENT '交æ¢ç±»å,1:ä¸å;2:åºå(dncåä¼ )', `create_dept` bigint DEFAULT NULL COMMENT 'å建åä½', `is_deleted` int DEFAULT NULL, `create_time` datetime DEFAULT NULL COMMENT 'å建æ¶é´',