yangys
2025-09-07 d34d3c83500d5a68715a280eee3d930c88291d71
增加新编程序统计;固化程序统计
已添加10个文件
已修改7个文件
764 ■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/UserCommonService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowVariableContants.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/execute/TryFlowCompleteService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/controller/CuredProgramController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/controller/NewProgrammingController.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/CuredProgramStatService.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/DeptRelationConfig.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/NewProgrammingStatService.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/CuredProgramQueryVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/CuredProgramVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/DeptWorkshop.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/NewProgrammingQueryVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/NewProgrammingVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-qinzhesync/src/main/java/org/springblade/qinzhesync/controller/SyncController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-qinzhesync/src/main/java/org/springblade/qinzhesync/service/QinzheSyncService.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/UserCommonService.java
@@ -28,6 +28,9 @@
     * @return
     */
    public String getUserNameById(Long userId){
        if(userId == null){
            return null;
        }
        R<User> programmerResult = userClient.userInfoById(userId);
        if(programmerResult.isSuccess()) {
            return programmerResult.getData().getName();
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/constants/FlowVariableContants.java
@@ -15,4 +15,12 @@
     * å®žé™…的编程人员(上传文件的人),不是主管工艺
     */
    public static final String ACT_PROGRAMMER = "actProgrammer";
    /**
     * å®žé™…校对人id
     */
    public static final String ACT_CHECKER = "actChecker";
    /**
     * å®žé™…审批高师id
     */
    public static final String ACT_SENIOR = "actSenior";
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowCommonService.java
@@ -124,6 +124,9 @@
        programProperties.setProgramNo(Func.toStr(vars.get(FlowContants.PROGRAM_NO)));
        programProperties.setActProgrammerId(Func.toLong(vars.get(FlowVariableContants.ACT_PROGRAMMER)));
        programProperties.setActCheckerId(Func.toLong(vars.get(FlowVariableContants.ACT_CHECKER)));
        programProperties.setActSeniorId(Func.toLong(vars.get(FlowVariableContants.ACT_SENIOR)));
        programProperties.setProgrammerName(Func.toStr(vars.get("programmerName")));
    }
    /**
     * æµç¨‹æ˜¯å¦åœ¨è¿›è¡Œ
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowProgramProperties.java
@@ -82,4 +82,10 @@
    @Schema(description = "数控程序编号")
    private String programNo;
    @Schema(description = "实际编程员姓名")
    private String programmerName;
    @Schema(description = "实际校对姓名")
    private Long actCheckerId;
    @Schema(description = "实际校对姓名")
    private Long actSeniorId;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/execute/TryFlowCompleteService.java
@@ -59,22 +59,25 @@
        if(task.getTaskDefinitionKey().equals("programmingTask") ) {//编制节点
            //记录实际编程员
            variables.put(FlowVariableContants.ACT_PROGRAMMER,Func.toStr(AuthUtil.getUserId()));
            if(this.needUploadProgramFile(props.getMachineCode())) {
            String programOnMachine = Func.toStr(variables.getOrDefault("programOnMachine",FlowContants.N));//是否现场编程
            if(this.needUploadProgramFile(props.getMachineCode()) && programOnMachine.equals(FlowContants.N)) {
                flowProgramFileService.checkProgramFiles(processInstanceId, FlowContants.Y.equals(operateResult));
            }
        }else if(task.getTaskDefinitionKey().equals("teamLeaderTask")){
            if(FlowContants.Y.equals(operateResult)) {
                runtimeService.setVariable(task.getExecutionId(),FlowContants.PROGRAMMER_NAME,userCommonService.getUserNameById(Func.toLong(variables.get("assignee"))));
            }
        }else if(task.getTaskDefinitionKey().equals("check")){
            runtimeService.setVariable(task.getExecutionId(),FlowVariableContants.ACT_CHECKER,Func.toLong(variables.get("assignee")));
        }else if(task.getTaskDefinitionKey().equals("approveTask")){
            runtimeService.setVariable(task.getExecutionId(),FlowVariableContants.ACT_SENIOR,Func.toLong(variables.get("assignee")));
        }
        variables.remove("programOnMachine");//其他节点,忽略现场编程标记
        if (StringUtil.isNoneBlank(processInstanceId, comment)) {
            taskService.addComment(taskId, processInstanceId, comment);
        }
        variables.put(FlowContants.LAST_STEP_USER_NICKNAME, AuthUtil.getNickName());
        addApproveRecord(taskId,comment,variables);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/controller/CuredProgramController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package org.springblade.mdm.statreport.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.statreport.service.CuredProgramStatService;
import org.springblade.mdm.statreport.service.DeptRelationConfig;
import org.springblade.mdm.statreport.service.NewProgrammingStatService;
import org.springblade.mdm.statreport.vo.CuredProgramQueryVO;
import org.springblade.mdm.statreport.vo.CuredProgramVO;
import org.springblade.mdm.statreport.vo.NewProgrammingQueryVO;
import org.springblade.mdm.statreport.vo.NewProgrammingVO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * å›ºåŒ–程序统计
 */
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/statreport/cureprogram")
@Tag(name = "新编程序统计", description = "新编程序统计")
public class CuredProgramController {
    private final CuredProgramStatService curedProgramStatService;
    private final ParamService paramService;
    private final MdmDeptService mdmDeptService;
    private final DeptRelationConfig deptRelationConfig;
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @Operation(summary = "固化程序列表", description = "固化程序列表")
    public R<IPage<CuredProgramVO>> page(CuredProgramQueryVO query) {
        if(query.getDeptIds() == null || query.getDeptIds().isEmpty()){
            //没有传入deptIds,查询用户对应的所有deptId
            String userRole = AuthUtil.getUserRole();//角色别名,多个角色逗号分隔
            List<String> userRoleAliasList = Func.toStrList(",", userRole);
            String managerRole = paramService.getProgramManagerRoleAlias();
            if(!userRoleAliasList.contains(managerRole) && !AuthUtil.isAdministrator() && !AuthUtil.isAdmin()){
                //非数控管理员角色、管理员,限制未只能导出自己的程序
                query.setDeptIds(Func.toLongList(AuthUtil.getDeptId()));
            }
        }
        IPage<CuredProgramVO> pages = curedProgramStatService.pageQuery(query);
        return R.data(pages);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/controller/NewProgrammingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
package org.springblade.mdm.statreport.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
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.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.UrlUtil;
import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.flow.entity.TaskDispatch;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.flow.service.TaskDispatchService;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springblade.mdm.statreport.service.ConfirmTablePrintService;
import org.springblade.mdm.statreport.service.DeptRelationConfig;
import org.springblade.mdm.statreport.service.NewProgrammingStatService;
import org.springblade.mdm.statreport.vo.NewProgrammingQueryVO;
import org.springblade.mdm.statreport.vo.NewProgrammingVO;
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 java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * æ–°ç¼–程序统计
 */
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/statreport/newprogramming")
@Tag(name = "新编程序统计", description = "新编程序统计")
public class NewProgrammingController {
    private NewProgrammingStatService newProgrammingStatService;
    private final HistoryService hisService;
    private final ParamService paramService;
    private final MdmDeptService mdmDeptService;
    private final DeptRelationConfig deptRelationConfig;
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @Operation(summary = "新编程序列表", description = "新编程序列表")
    public R<IPage<NewProgrammingVO>> page(NewProgrammingQueryVO query) {
        if(query.getDeptIds() == null || query.getDeptIds().isEmpty()){
            //没有传入deptIds,查询用户对应的所有deptId
            String userRole = AuthUtil.getUserRole();//角色别名,多个角色逗号分隔
            List<String> userRoleAliasList = Func.toStrList(",", userRole);
            String managerRole = paramService.getProgramManagerRoleAlias();
            if(!userRoleAliasList.contains(managerRole) && !AuthUtil.isAdministrator() && !AuthUtil.isAdmin()){
                //非数控管理员角色、管理员,限制未只能导出自己的程序
                query.setDeptIds(Func.toLongList(AuthUtil.getDeptId()));
            }
        }
        IPage<NewProgrammingVO> pages = newProgrammingStatService.pageQuery(query);
        return R.data(pages);
    }
    @GetMapping("/deptsData")
    @ApiOperationSupport(order = 3)
    @Operation(summary = "部门下拉数据", description = "部门下拉数据")
    public R<List<Map<String,String>>> deptIdsData() {
        String userRole = AuthUtil.getUserRole();//角色别名,多个角色逗号分隔
        List<String> userRoleAliasList = Func.toStrList(",", userRole);
        List<Map<String,String>> result = new ArrayList<>();
        String managerRole = paramService.getProgramManagerRoleAlias();
        if(!userRoleAliasList.contains(managerRole) && !AuthUtil.isAdministrator() && !AuthUtil.isAdmin()){
            //非数控管理员角色、管理员,限制未只能下拉自己的部门
            List<Long> deptIds = Func.toLongList(AuthUtil.getDeptId());
            for(Long deptId : deptIds){
                MdmDept dept = mdmDeptService.getById(deptId);
                if(dept != null){
                    /*Map<String,String> item = new HashMap<>();
                    item.put("label",dept.getDeptName());
                    item.put("value",dept.getId()+"");
*/
                    result.add(deptToMap(dept));
                }
            }
        }else{
            //全部部门的下拉
            Map<Long,Long> relMap = deptRelationConfig.getDeptWorkshopMap();
            //所有专业组id
            List<MdmDept> deptList = mdmDeptService.listByIds(relMap.keySet().stream().toList());
            for (MdmDept dept : deptList) {
            /*    Map<String,String> item = new HashMap<>();
                item.put("label",dept.getDeptName());
                item.put("value",dept.getId()+"");
*/
                result.add(deptToMap(dept));
            }
        }
        return R.data(result);
    }
    Map<String,String> deptToMap(MdmDept dept){
        Map<String,String> item = new HashMap<>();
        item.put("label",dept.getDeptName());
        item.put("value",dept.getId()+"");
        return item;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/CuredProgramStatService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
package org.springblade.mdm.statreport.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
import org.springblade.mdm.commons.service.UserCommonService;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.statreport.vo.CuredProgramQueryVO;
import org.springblade.mdm.statreport.vo.CuredProgramVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
 * æµç¨‹ä¸šåŠ¡å®žçŽ°ç±»
 *
 * @author Chill
 */
@Service
@AllArgsConstructor
public class CuredProgramStatService {
    private final FlowCommonService flowCommonService;
    private final HistoryService historyService;
    private final MachineService machineService;
    private final MdmDeptService mdmDeptService;
    private final UserCommonService userCommonService;
    private final DeptRelationConfig deptRelationConfig;
    public IPage<CuredProgramVO> pageQuery(CuredProgramQueryVO queryVO) {
        //固化里路村官
        HistoricProcessInstanceQuery query = this.historyService.createHistoricProcessInstanceQuery().finished().processDefinitionKey(FlowContants.CURE_PROCESS_KEY).includeProcessVariables();
            //.finished() // åªæŸ¥è¯¢å·²å®Œæˆçš„æµç¨‹.unfinished() // æŸ¥è¯¢æœªå®Œæˆçš„æµç¨‹
        query.variableNotExists(FlowContants.EXCEPTION);//非异常流程
        if(queryVO.getEndMonth()!=null){
            queryVO.setEndTimeBegin(queryVO.getEndMonth().withDayOfMonth(1));
            queryVO.setEndTimeEnd(queryVO.getEndMonth().with(TemporalAdjusters.lastDayOfMonth()));
        }
        if(queryVO.getEndTimeBegin()!=null) {
            query.finishedAfter(DateUtil.toDate(queryVO.getEndTimeBegin()));
        }
        if(queryVO.getEndTimeEnd()!=null) {
            query.finishedBefore(DateUtil.toDate(queryVO.getEndTimeEnd()));
        }
        if(queryVO.getDeptIds()!=null && !queryVO.getDeptIds().isEmpty()) {
            //将专业组id,根据映射提取车间id
            List<Long> workshopList = new ArrayList<>();
            Map<Long,Long> relMap = deptRelationConfig.getDeptWorkshopMap();
            for(Long deptId : queryVO.getDeptIds()){
                workshopList.add(relMap.get(deptId));
            }
            //根据车间id,查询所有的下级部门:主要应该是工段
            List<Long> allMachineDeptIds = new ArrayList<>(workshopList);
            for(Long workshopId : workshopList){
                MdmDept workshop = this.mdmDeptService.getById(workshopId);
                if(workshop!=null){
                    String gongduanAncestors =workshop.getAncestors()+","+workshopId;//车间下
                    allMachineDeptIds.addAll(mdmDeptService.lambdaQuery()
                        .likeRight(MdmDept::getAncestors,gongduanAncestors)
                        .list().stream().map(MdmDept::getId).toList());
                }
            }
            List<Machine> machines = this.machineService.lambdaQuery().in(Machine::getOwnerDept,allMachineDeptIds).list();
            if(!machines.isEmpty()) {
                query.or();
                for(Machine machine : machines){
                    query.variableValueEquals(FlowContants.MACHINE_CODE, machine.getCode());
                }
                query.endOr();
            }else{
                //没找到机床,就应该查不到数据
                query.variableNotExists(FlowContants.MACHINE_CODE);
            }
        }
        query.orderByProcessInstanceEndTime().desc(); // æŒ‰ç»“束时间降序排列
        IPage<CuredProgramVO> page = new Page<>();
        long firstResult = (page.getCurrent()-1) * page.getSize();
        List<HistoricProcessInstance> processes = query.listPage((int)firstResult,(int)queryVO.getSize());
        page.setTotal(query.count());
        List<CuredProgramVO> records = new LinkedList<>();
        for(HistoricProcessInstance processInstance : processes) {
            CuredProgramVO vo = new CuredProgramVO();
            FlowProgramProperties props = flowCommonService.getProgramPropertiesFromHis(processInstance.getId());
            BeanUtils.copyProperties(props, vo);
            vo.setEndTime(processInstance.getEndTime());
            vo.setActProgrammerName(props.getProgrammerName());
            if(props.getActCheckerId() == 0){
                vo.setActCheckerName(this.userCommonService.getUserNameById(props.getCheckerId()) );
            }else{
                vo.setActCheckerName(this.userCommonService.getUserNameById(props.getActCheckerId()) );
            }
            if(props.getActCheckerId() == 0) {
                vo.setActSeniorName(this.userCommonService.getUserNameById(props.getSeniorId()));
            }else{
                vo.setActSeniorName(this.userCommonService.getUserNameById(props.getActSeniorId()));
            }
            records.add(vo);
        }
        page.setRecords(records);
        return page;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/DeptRelationConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package org.springblade.mdm.statreport.service;
import lombok.Data;
import lombok.Setter;
import org.springblade.mdm.statreport.vo.DeptWorkshop;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
import java.util.Map;
@Configuration
@ConfigurationProperties(prefix = "deptrelation")
@Data
public class DeptRelationConfig {
    //private List<DeptWorkshop> deptworkshop;
    private Map<Long,Long> deptWorkshopMap;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/service/NewProgrammingStatService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,145 @@
package org.springblade.mdm.statreport.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.basesetting.producedivision.entity.MdmDept;
import org.springblade.mdm.basesetting.producedivision.service.MdmDeptService;
import org.springblade.mdm.commons.contants.DictBizConstants;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.commons.service.UserCommonService;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.entity.TaskDispatch;
import org.springblade.mdm.flow.service.FlowCommonService;
import org.springblade.mdm.flow.service.FlowProgramFileService;
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springblade.mdm.statreport.utils.WordReplaceUtil;
import org.springblade.mdm.statreport.vo.NewProgrammingQueryVO;
import org.springblade.mdm.statreport.vo.NewProgrammingVO;
import org.springblade.system.feign.IDictBizClient;
import org.springblade.system.feign.IUserClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
/**
 * æµç¨‹ä¸šåŠ¡å®žçŽ°ç±»
 *
 * @author Chill
 */
@Service
@AllArgsConstructor
public class NewProgrammingStatService {
    private final FlowCommonService flowCommonService;
    private final HistoryService historyService;
    private final MachineService machineService;
    private final MdmDeptService mdmDeptService;
    private final UserCommonService userCommonService;
    private final DeptRelationConfig deptRelationConfig;
    public IPage<NewProgrammingVO> pageQuery(NewProgrammingQueryVO queryVO) {
        //固化里路村官
        HistoricProcessInstanceQuery query = this.historyService.createHistoricProcessInstanceQuery().finished().processDefinitionKey(FlowContants.TRY_PROCESS_KEY).includeProcessVariables();
            //.finished() // åªæŸ¥è¯¢å·²å®Œæˆçš„æµç¨‹.unfinished() // æŸ¥è¯¢æœªå®Œæˆçš„æµç¨‹
        query.variableNotExists(FlowContants.EXCEPTION);//非异常流程
        query.variableValueEquals(FlowContants.HAS_CURED_PROGRAM,FlowContants.N);//无固化程序
        if(queryVO.getEndMonth()!=null){
            queryVO.setEndTimeBegin(queryVO.getEndMonth().withDayOfMonth(1));
            queryVO.setEndTimeEnd(queryVO.getEndMonth().with(TemporalAdjusters.lastDayOfMonth()));
        }
        if(queryVO.getEndTimeBegin()!=null) {
            query.finishedAfter(DateUtil.toDate(queryVO.getEndTimeBegin()));
        }
        if(queryVO.getEndTimeEnd()!=null) {
            query.finishedBefore(DateUtil.toDate(queryVO.getEndTimeEnd()));
        }
        if(queryVO.getDeptIds()!=null && !queryVO.getDeptIds().isEmpty()) {
            //将专业组id,根据映射提取车间id
            List<Long> workshopList = new ArrayList<>();
            Map<Long,Long> relMap = deptRelationConfig.getDeptWorkshopMap();
            for(Long deptId : queryVO.getDeptIds()){
                workshopList.add(relMap.get(deptId));
            }
            //根据车间id,查询所有的下级部门:主要应该是工段
            List<Long> allMachineDeptIds = new ArrayList<>(workshopList);
            for(Long workshopId : workshopList){
                MdmDept workshop = this.mdmDeptService.getById(workshopId);
                if(workshop!=null){
                    String gongduanAncestors =workshop.getAncestors()+","+workshopId;//车间下
                    allMachineDeptIds.addAll(mdmDeptService.lambdaQuery()
                        .likeRight(MdmDept::getAncestors,gongduanAncestors)
                        .list().stream().map(MdmDept::getId).toList());
                }
            }
            List<Machine> machines = this.machineService.lambdaQuery().in(Machine::getOwnerDept,allMachineDeptIds).list();
            if(!machines.isEmpty()) {
                query.or();
                for(Machine machine : machines){
                    query.variableValueEquals(FlowContants.MACHINE_CODE, machine.getCode());
                }
                query.endOr();
            }else{
                //没找到机床,就应该查不到数据
                query.variableNotExists(FlowContants.MACHINE_CODE);
            }
        }
        query.orderByProcessInstanceEndTime().desc(); // æŒ‰ç»“束时间降序排列
        IPage<NewProgrammingVO> page = new Page<>();
        long firstResult = (page.getCurrent()-1) * page.getSize();
        List<HistoricProcessInstance> processes = query.listPage((int)firstResult,(int)queryVO.getSize());
        page.setTotal(query.count());
        List<NewProgrammingVO> records = new LinkedList<>();
        for(HistoricProcessInstance processInstance : processes) {
            NewProgrammingVO vo = new NewProgrammingVO();
            FlowProgramProperties props = flowCommonService.getProgramPropertiesFromHis(processInstance.getId());
            BeanUtils.copyProperties(props, vo);
            vo.setEndTime(processInstance.getEndTime());
            vo.setActProgrammerName(props.getProgrammerName());
            if(props.getActCheckerId() == 0){
                vo.setActCheckerName(this.userCommonService.getUserNameById(props.getCheckerId()) );
            }else{
                vo.setActCheckerName(this.userCommonService.getUserNameById(props.getActCheckerId()) );
            }
            if(props.getActCheckerId() == 0) {
                vo.setActSeniorName(this.userCommonService.getUserNameById(props.getSeniorId()));
            }else{
                vo.setActSeniorName(this.userCommonService.getUserNameById(props.getActSeniorId()));
            }
            records.add(vo);
        }
        page.setRecords(records);
        return page;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/CuredProgramQueryVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package org.springblade.mdm.statreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.springblade.core.mp.support.Query;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.util.List;
/**
 * åˆ†é¡µæŸ¥è¯¢å‚æ•°
 */
@Schema(description = "新编程序统计查询对象")
@Setter
@Getter
public class CuredProgramQueryVO extends Query {
    @Schema(description = "程序名称")
    private String programName;
    @Schema(description = "完成时间月份-实际参数有时间部分")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endMonth;
    @Schema(description = "完成时间开始")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endTimeBegin;
    @Schema(description = "完成时间截止")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endTimeEnd;
    @Schema(description = "部门id集合,非管理员指定该id,只能查询自己部门的记录")
    private List<Long> deptIds;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/CuredProgramVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package org.springblade.mdm.statreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
@Schema(description = "新编程序统计")
public class CuredProgramVO {
    @Schema(description = "流程实例id")
    private String processInstanceId;
    @Schema(description = "零组件号")
    private String drawingNo;
    @Schema(description = "图号版次/设计版次")
    private String drawingNoEdition;
    @Schema(description = "工序号")
    private String processNo;
    @Schema(description = "工序名称")
    private String processName;
    @Schema(description = "产品型号")
    private String productModel;
    @Schema(description = "工序版次")
    private String processEdition;
    @Schema(description = "工艺版次")
    private String craftEdition;
    @Schema(description = "设备编号")
    private String machineCode;
    @Schema(description = "编制人员姓名")
    private String actProgrammerName;
    @Schema(description = "校对人员姓名")
    private String actCheckerName;
    @Schema(description = "审核人员姓名")
    private String actSeniorName;
    @Schema(description = "审核结束时间")
    private Date endTime;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/DeptWorkshop.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package org.springblade.mdm.statreport.vo;
import lombok.Data;
/**
 * ä¸“业组部门id与车间id对应
 */
@Data
public class DeptWorkshop {
    private Long deptId;
    private Long workshopID;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/NewProgrammingQueryVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package org.springblade.mdm.statreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.springblade.core.mp.support.Query;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * åˆ†é¡µæŸ¥è¯¢å‚æ•°
 */
@Schema(description = "新编程序统计查询对象")
@Setter
@Getter
public class NewProgrammingQueryVO extends Query {
    @Schema(description = "程序名称")
    private String programName;
    @Schema(description = "完成时间月份-实际参数有时间部分")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endMonth;
    @Schema(description = "完成时间开始")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endTimeBegin;
    @Schema(description = "完成时间截止")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endTimeEnd;
    @Schema(description = "部门id集合,非管理员指定该id,只能查询自己部门的记录")
    private List<Long> deptIds;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/statreport/vo/NewProgrammingVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package org.springblade.mdm.statreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springblade.mdm.flow.constants.FlowContants;
import java.time.LocalDate;
import java.util.Date;
@Data
@Schema(description = "新编程序统计")
public class NewProgrammingVO {
    @Schema(description = "流程实例id")
    private String processInstanceId;
    @Schema(description = "零组件号")
    private String drawingNo;
    @Schema(description = "图号版次/设计版次")
    private String drawingNoEdition;
    @Schema(description = "工序号")
    private String processNo;
    @Schema(description = "工序名称")
    private String processName;
    @Schema(description = "产品型号")
    private String productModel;
    @Schema(description = "工序版次")
    private String processEdition;
    @Schema(description = "工艺版次")
    private String craftEdition;
    @Schema(description = "设备编号")
    private String machineCode;
    @Schema(description = "编制人员姓名")
    private String actProgrammerName;
    @Schema(description = "校对人员姓名")
    private String actCheckerName;
    @Schema(description = "审核人员姓名")
    private String actSeniorName;
    @Schema(description = "审核结束时间")
    private Date endTime;
}
blade-service/blade-qinzhesync/src/main/java/org/springblade/qinzhesync/controller/SyncController.java
@@ -32,15 +32,4 @@
        return R.<Boolean>status(true);
    }
    @GetMapping("/exists")
    @Operation(summary = "图号存在判断", description = "图号存在判断")
    public R<Boolean> exists(String drawingNo) {
        try {
            return R.data(service.drawingNoExists(drawingNo));
        }catch (Exception e) {
            log.error("exist失败", e);;
            return R.fail(e.getMessage());
        }
    }
}
blade-service/blade-qinzhesync/src/main/java/org/springblade/qinzhesync/service/QinzheSyncService.java
@@ -2,26 +2,19 @@
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springblade.qinzhesync.entity.ProduceDivision;
import org.springblade.qinzhesync.utils.SnowflakeIdGenerator;
import org.springblade.system.feign.ISysClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.commons.util.IdUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * å‹¤å“²ä¸»åˆ¶åˆ†å·¥è¡¨æ•°æ®åŒæ­¥çš„æœåŠ¡
@@ -48,7 +41,7 @@
    /**
     * æ‰¹é‡æ’入数据数量
     */
    static final int BATCH_SIZE = 4;//5000;
    static final int BATCH_SIZE = 2000;//5000;
    @Transactional
    public void syncData(){
@@ -63,24 +56,6 @@
        saveQinzheFgb();
    }
    /**
     * å›¾å·æ˜¯å¦å­˜åœ¨äºŽMDM分工表
     * @param drawingNo
     * @return å­˜åœ¨ä¸Žå¦
     */
    public boolean drawingNoExists(String drawingNo){
        Long cnt = mdmJdbcTemplate.queryForObject("select count(*) from mdm_produce_division where drawing_no=?",Long.class,drawingNo);
        return cnt > 0;
    }
    /**
     * æ¸…除mdm分工表内从勤哲导入的、且未经过修改的数据
     */
    void cleanQinzheDataInDivision(){
        //update_user =-1 æ­¤æ ‡å¿—为勤哲同步数据且未修改过。
        mdmJdbcTemplate.update("delete from mdm_produce_division where create_user=-1 and update_user=-1");
    }
    /**
     * å°†å‹¤å“²ç³»ç»Ÿçš„æ•°æ®å…ˆä¸€æ¬¡æ€§å¯¼å…¥mdm系统数据库临时表
     */
@@ -108,42 +83,7 @@
        //updateProduceDivision(fgbList);
    }
    /**
     * //qingzhe  - mdm
     *    ä¸»ç®¡å·¥è‰º - ä¸“业组长
     *     ç¼–制,校对,高师(目前高师总共6个人)也都没有.目前只匹配专业组长即可,编制校对在mdm中维护
     * æ›´æ–°mdm主制分工表数据,
     */
    void updateProduceDivision(List<QinzheZzFgb> fgbList){
        String sql = "insert into mdm_produce_division (id,drawing_no,team_leader_id,create_user,update_user,create_time,update_time,status,is_deleted) values (?,?,?,-1,-1,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,1,0)";
        String ljh,zggy;
        for(QinzheZzFgb fgb : fgbList){
            if(drawingNoExists(fgb.getLjh())){
                //图号已存在,说明mdm系统中已经录入过了
                continue;
            }
            Long zuzhangId = getUserIdByName(fgb.getZggy());
            mdmJdbcTemplate.update(sql, new Object[]{idGen.nextId(),fgb.getLjh(),zuzhangId});
        }
    }
    void insertProduceDivision(String drawingNo,Long zuzhangId){
        String sql = "insert into mdm_produce_division () values ";
    }
    Long getUserIdByName(String zuzhangName){
        String sql = "select id from blade_user where name=? and is_deleted=0 order by update_time limit 1";
        List<Long> idList = this.mdmJdbcTemplate.queryForList(sql,Long.class,zuzhangName);
        if(idList.isEmpty()){
            return null;
        }else{
            return idList.get(0);
        }
    }
    /**
     * æ¸…除本地临时表数据
     */
@@ -156,7 +96,7 @@
     * @param fgbList
     */
    private void insertToLocalTable(List<QinzheZzFgb> fgbList) {
        String insSql = "insert into mdm_qinzhe_fgb (cph,ljh,ljmc,zz,zzgd,zggy,fg,cjjhy,jhy,update_time) values (?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP)";
        String insSql = "insert into mdm_qinzhe_fgb (cph,ljh,ljmc,zz,zzgd,zggy,fg,cjjhy,jhy,source,update_time) values (?,?,?,?,?,?,?,?,?,'QZ',CURRENT_TIMESTAMP)";
        QinzheZzFgb fgb;
        List<Object[]> args = new ArrayList<>();
@@ -176,6 +116,10 @@
        }
    }
    /**
     * æ ¹æ®é…ç½®èŽ·å–å‹¤å“²æŸ¥è¯¢sql(参数管理里可配置)
     * @return
     */
    String getQuerySql(){
        String querySql = DEFAULT_QUERY_SQL;
        R<String> sqlResult = sysClient.getParamValue(QINZHE_QUERY_KEY);