111
k94314517
2023-08-17 533fd0d843792fc886771993a0d45b4e5876011c
111
已修改6个文件
240 ■■■■ 文件已修改
server/src/main/java/doumeemes/api/ext/WorkorderRecordExtController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/dto/AutoWorkReportDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/WorkorderRecordStandardService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/PlansExtServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/mappers/PlansExtMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/ext/WorkorderRecordExtController.java
@@ -8,6 +8,7 @@
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.core.utils.Constants;
import doumeemes.dao.business.dto.AutoWorkReportDTO;
import doumeemes.dao.business.dto.CreateMaterialDTO;
import doumeemes.dao.business.dto.DealWorkorderRecordDTO;
import doumeemes.dao.business.model.Workorder;
@@ -83,19 +84,30 @@
        return ApiResponse.success(id);
    }
    @PreventRepeat
    @ApiOperation("确认报工")
    @ApiOperation(value = "确认报工" ,notes = "1.0.2更新")
    @PostMapping("/comfirmDoneStandard")
    @RequiresPermissions("ext:workorderrecordext:create")
    public ApiResponse comfirmDoneStandard(@RequestBody Workorder param) {
        Integer id =workorderRecordStandardService.comfirmDone(param);
    public ApiResponse comfirmDoneStandard(@RequestBody AutoWorkReportDTO autoWorkReportDTO) {
        Workorder workorder =workorderRecordStandardService.comfirmDoneNew(autoWorkReportDTO,true);
        //发送消息队列处理分享操作
        workorderExtService.statisticNum(param);
        workorderExtService.statisticNum(workorder);
        return ApiResponse.success("操作成功");
    }
//    @PreventRepeat
//    @ApiOperation("确认报工(弃用)")
//    @PostMapping("/comfirmDoneStandard")
//    @RequiresPermissions("ext:workorderrecordext:create")
//    public ApiResponse comfirmDoneStandard(@RequestBody Workorder param) {
//        Integer id =workorderRecordStandardService.comfirmDone(param,true);
//        //发送消息队列处理分享操作
//        workorderExtService.statisticNum(param);
//        RocketMessageProducer.producerMsg(Constants.MQ_TAG.statistics,null, JSONObject.toJSONString(param));
//        rabbitTemplate.convertAndSend(Constants.MqTopicKeys.TOPIC_STATISTIC_NUM, Constants.MqTopicKeys.TOPIC_STATISTIC_NUM, JSONObject.toJSONString(param));
        return ApiResponse.success(id);
    }
//        return ApiResponse.success("");
//    }
    @PreventRepeat
    @ApiOperation("新建产出")
server/src/main/java/doumeemes/dao/business/dto/AutoWorkReportDTO.java
@@ -17,7 +17,7 @@
public class AutoWorkReportDTO {
    @ApiModelProperty(value = "工序计划主键")
    @ApiModelProperty(value = "工序计划主键(一键报工)")
    private Integer plansId;
    @ApiModelProperty(value = "设备主键", example = "1")
server/src/main/java/doumeemes/service/ext/WorkorderRecordStandardService.java
@@ -3,6 +3,7 @@
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.model.PageData;
import doumeemes.core.model.PageWrap;
import doumeemes.dao.business.dto.AutoWorkReportDTO;
import doumeemes.dao.business.dto.CreateMaterialDTO;
import doumeemes.dao.business.dto.CreateWorkorderRecordDTO;
import doumeemes.dao.business.dto.DealWorkorderRecordDTO;
@@ -27,7 +28,10 @@
    List<WStockExtListForWorkorderVO> findAllForStandard(QueryWorkorderRecordExtDTO pageWrap);
    Integer comfirmDone(Workorder param);
    Integer comfirmDone(Workorder param,Boolean needCheck);
    Workorder comfirmDoneNew(AutoWorkReportDTO autoWorkReportDTO, Boolean needCheck);
    WorkorderRecord dealWorkorderRecord(DealWorkorderRecordDTO dealWorkorderRecordDTO, LoginUserInfo loginUserInfo);
server/src/main/java/doumeemes/service/ext/impl/PlansExtServiceImpl.java
@@ -1585,6 +1585,12 @@
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    @Override
    public void autoWorkReport(LoginUserInfo user, AutoWorkReportDTO autoWorkReportDTO){
        if(Objects.isNull(autoWorkReportDTO)
            || Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO())
            || Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum())|| autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum().compareTo(BigDecimal.ZERO) < Constants.ZERO
            || Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO().getQualifiedNum())|| autoWorkReportDTO.getCreateWorkorderRecordDTO().getQualifiedNum().compareTo(BigDecimal.ZERO) < Constants.ZERO){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //查询工工序计划状态
        Plans plans = plansExtMapper.selectById(autoWorkReportDTO.getPlansId());
        if(Objects.isNull(plans)){
@@ -1597,7 +1603,7 @@
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"工序计划已暂停,无法操作");
        }
        if(Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"参数错误:产出数据");
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"参数错误:产出数据");
        }
        //查询工序计划已分配数量
        List<Workorder> workorderList = workorderMapper.selectList(new QueryWrapper<Workorder>().eq("PLAN_ID",plans.getId())
@@ -1620,7 +1626,7 @@
        param.setProUserList(autoWorkReportDTO.getProUserList());
        param.setPlanNum(num.intValue());
        //生成工单信息
        Workorder workorder = this.distributeDone(user,param,plans.getNum());
        Workorder workorder = this.distributeDone(user,param,num.intValue());
        //工单投料记录
        CreateMaterialDTO createMaterialDTO = new CreateMaterialDTO();
        if(!Objects.isNull(autoWorkReportDTO.getRecordList())&&autoWorkReportDTO.getRecordList().size()>Constants.ZERO){
@@ -1632,7 +1638,7 @@
        autoWorkReportDTO.getCreateWorkorderRecordDTO().setWorkorderId(workorder.getId());
        WorkorderRecord workorderRecord = workorderRecordStandardService.createWorkorderRecord(autoWorkReportDTO.getCreateWorkorderRecordDTO(),user);
        //工单报工
        workorderRecordStandardService.comfirmDone(workorder);
        workorderRecordStandardService.comfirmDone(workorder,false);
        //更新工单状态
        if(num.compareTo(BigDecimal.valueOf(surplusNum))==Constants.ZERO){
            plans.setStatus(Constants.PLAN_STATUS.done);
@@ -1642,6 +1648,8 @@
            }
        }
        plansExtMapper.updateById(plans);
        //发送消息队列处理分享操作
        workorderExtService.statisticNum(workorder);
        //存储报工不良项数据
        if(autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum().compareTo(BigDecimal.ZERO)<=Constants.ZERO){
            if(!Objects.isNull(autoWorkReportDTO.getCreateUnqualifiedDTOList())&&autoWorkReportDTO.getCreateUnqualifiedDTOList().size()>Constants.ZERO){
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java
@@ -17,10 +17,8 @@
import doumeemes.dao.business.BackOrderDetailMapper;
import doumeemes.dao.business.BackorderMapper;
import doumeemes.dao.business.SalaryParamMapper;
import doumeemes.dao.business.dto.CreateMaterialDTO;
import doumeemes.dao.business.dto.CreateWorkorderRecordDTO;
import doumeemes.dao.business.dto.DealWorkorderRecordDTO;
import doumeemes.dao.business.dto.MaterialListDTO;
import doumeemes.dao.business.UnqualifiedRecordMapper;
import doumeemes.dao.business.dto.*;
import doumeemes.dao.business.model.*;
import doumeemes.dao.ext.*;
import doumeemes.dao.ext.bean.EndCheckApBean;
@@ -87,6 +85,8 @@
    private PlansExtMapper plansExtMapper;
    @Autowired
    private DeviceExtMapper deviceExtMapper;
    @Autowired
    private UnqualifiedRecordMapper unqualifiedRecordMapper;
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    @Override
@@ -360,7 +360,7 @@
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    @Override
    public  Integer comfirmDone(Workorder param){
    public  Integer comfirmDone(Workorder param,Boolean needCheck){
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
@@ -388,7 +388,7 @@
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!");
        }
        //如果需要完工检才能检验
        if(Constants.equalsInteger(mp.getNeedcheck(),Constants.ZERO)){
        if(Constants.equalsInteger(mp.getNeedcheck(),Constants.ZERO)&&needCheck){
            //只有已完工状态才能确认报工
            if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.done)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!");
@@ -493,6 +493,167 @@
//        }
        return param.getId();
    }
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    @Override
    public  Workorder comfirmDoneNew(AutoWorkReportDTO autoWorkReportDTO, Boolean needCheck){
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
        }
        if(Objects.isNull(autoWorkReportDTO)
                || Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO())
                || Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum())|| autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum().compareTo(BigDecimal.ZERO) < Constants.ZERO
                || Objects.isNull(autoWorkReportDTO.getCreateWorkorderRecordDTO().getQualifiedNum())|| autoWorkReportDTO.getCreateWorkorderRecordDTO().getQualifiedNum().compareTo(BigDecimal.ZERO) < Constants.ZERO){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(autoWorkReportDTO.getCreateWorkorderRecordDTO().getWorkorderId()== null ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请按要求填写和选择提交数据!");
        }
        Workorder mp = new Workorder();
        mp.setDeleted(Constants.ZERO);
        mp.setId(autoWorkReportDTO.getCreateWorkorderRecordDTO().getWorkorderId());
        mp.setRootDepartId(user.getRootDepartment().getId());
        mp = workorderExtMapper.selectOne(mp);
        if(mp== null){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!");
        }
        Workorder param = new Workorder();
        param.setPlanId(mp.getPlanId());
        if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!");
        }
        //如果需要完工检才能检验
        if(Constants.equalsInteger(mp.getNeedcheck(),Constants.ZERO)&&needCheck){
            //只有已完工状态才能确认报工
            if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.done)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!");
            }
        }
        //出入库明细记录集合
        List<WOutboundDetail> outboundDetailList = new ArrayList<>();
        //待更新工装集合投料
        List<Appliances> updateApplianceList = new ArrayList<>();
        //待更新工装集合产出
        List<Appliances> updateApplianceProList = new ArrayList<>();
        //待更新库存集合
        List<WStock> stockList = new ArrayList<>();
        //查询投料和报工记录列表
        List<WorkorderRecordExtListVO>  allRecordList = workorderRecordExtMapper.selectAllList(getQueryRecordParam(param));
        if(Objects.isNull(allRecordList)||allRecordList.size()==Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未查询投料和报工记录!");
        }
        //处理产出数据
        WorkorderRecord workorderRecord = this.createWorkorderRecord(autoWorkReportDTO.getCreateWorkorderRecordDTO(),user);
        //检查数据信息
//        caculateCheckRecord(user, mp,allRecordList);
        QueryBomDetailExtDTO bdparam = initBomParam(user,mp);
        if(mp.getBomModel()!=null&&Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.pull)){
            //如果是拉式投料,系统根据BOM自动扣减库存
            dealApplianceMateialPull(mp,user,bdparam,updateApplianceList, stockList);
        }
        if(allRecordList!=null && allRecordList.size()>0){
            if(mp.getBomModel()==null||Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.push)){
                //如果是推式投料,走正常生产手动投料
                dealApplianceMateial(mp,user,bdparam,allRecordList,updateApplianceList, outboundDetailList,stockList);
            }
            //处理产出数据
            dealAppliancePro(mp,user,allRecordList,updateApplianceList,updateApplianceProList, outboundDetailList,stockList);
        }
        //如果有没bom配置,检查产出(包含检验的不良和报废品)和投料数量是否相等匹配,不一致提示错误
        if(bdparam==null){
            //投料数量 和 产出数量不相等
            if(Constants.formatBigdecimal(mp.getHasMaterialNum()).intValue() != Constants.formatIntegerNum(mp.getHasProduceNum())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单投料和产出数量不一致,请确认后重试!");
            }
        }
        //更新工单状态为已报工
        updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.baogong);
        //批量插入出入库明细记录
        if(outboundDetailList!=null && outboundDetailList.size()>0){
            wOutboundDetailExtMapper.insertBatch(outboundDetailList);
        }
        if(stockList != null && stockList.size()>0){
            for(WStock s : stockList){
                WStock s1 = new WStock();
                s1.setLocationId(s.getLocationId());
                s1.setWarehouseId(s.getWarehouseId());
                s1.setDeleted(Constants.ZERO);
                s1.setMaterialId(s.getMaterialId());
                s1.setQualityType(s.getQualityType());
                s1.setProcedureId(s.getProcedureId());
                if(StringUtils.isBlank(s.getBatch() )){
                    s1 = wStockExtMapper.selectOne(new QueryWrapper<>(s1).isNull("batch").last(" limit 1"));
                }else{
                    s1.setBatch(s.getBatch());
                    s1 = wStockExtMapper.selectOne(new QueryWrapper<>(s1).last(" limit 1"));
                }
                if(s1 ==null){
                    //如果库存记录不存在,插入数据
                    s.setDeleted(Constants.ZERO);
                    s.setCreateTime(DateUtil.getCurrentDate());
                    s.setCreateUser(user.getId());
                    s.setRootDepartId(mp.getRootDepartId());
                    if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){
                        //如果库存不足
                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,仓库余料不足,请联系仓库管理员!");
                    }
                    wStockExtMapper.insert(s);
                }else{
                    //如果库存记录存在,则更新库存量
                    s.setId(s1.getId());
                    s.setUpdateTime(DateUtil.getCurrentDate());
                    s.setUpdateUser(user.getId());
                    s.setNum(Constants.formatBigdecimal(s1.getNum()).add(Constants.formatBigdecimal(s.getNum())));
                    if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){
                        //如果库存不足
                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,仓库余料不足,请联系仓库管理员!!");
                    }
                    wStockExtMapper.updateById(s);
                }
            }
        }
        //存储报工不良项数据
        if(autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum().compareTo(BigDecimal.ZERO)<=Constants.ZERO){
            if(!Objects.isNull(autoWorkReportDTO.getCreateUnqualifiedDTOList())&&autoWorkReportDTO.getCreateUnqualifiedDTOList().size()>Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"不良项错误:请检查不良项数据");
            }
        }else{
            List<CreateUnqualifiedDTO> createUnqualifiedDTOList = autoWorkReportDTO.getCreateUnqualifiedDTOList();
            BigDecimal unqualified = createUnqualifiedDTOList.stream().map(s -> s.getUnQualifiedNum()).reduce(BigDecimal.ZERO, BigDecimal::add);
            if(unqualified.compareTo(autoWorkReportDTO.getCreateWorkorderRecordDTO().getUnQualifiedNum())!=Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"不良项错误:请检查不良项数据");
            }
            for (CreateUnqualifiedDTO createUnqualifiedDTO:createUnqualifiedDTOList) {
                if(createUnqualifiedDTO.getUnQualifiedNum().compareTo(BigDecimal.ZERO)==Constants.ZERO
                        ||Objects.isNull(createUnqualifiedDTO.getCategoryId())){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"不良项错误:请检查不良项数据");
                }
                UnqualifiedRecord unqualifiedRecord = new UnqualifiedRecord();
                unqualifiedRecord.setDeleted(Constants.ZERO);
                unqualifiedRecord.setCreateUser(user.getId());
                unqualifiedRecord.setCreateTime(new Date());
                unqualifiedRecord.setRootDepartId(mp.getRootDepartId());
                unqualifiedRecord.setDepartId(mp.getDepartId());
                unqualifiedRecord.setWorkorderId(mp.getId());
                unqualifiedRecord.setRecordId(workorderRecord.getId());
                unqualifiedRecord.setCategoryId(createUnqualifiedDTO.getCategoryId());
                unqualifiedRecord.setUnqualifiedNum(createUnqualifiedDTO.getUnQualifiedNum());
                unqualifiedRecordMapper.insert(unqualifiedRecord);
            }
        }
        return param;
    }
    private QueryWorkorderRecordExtDTO getQueryRecordParam(Workorder param) {
        QueryWorkorderRecordExtDTO mParam = new QueryWorkorderRecordExtDTO();
@@ -1006,7 +1167,7 @@
        record.setAppliancesId(tModel.getAppliancesId());
        record.setBatch(detail.getBatch());
        record.setRootDepartId(mp.getRootDepartId());
        record.setNum(tModel.getNum());
        record.setNum(detail.getNum());
        record.setOutboundId(detail.getOutboundId());
        record.setUnitId(detail.getUnitId());
        record.setWarehouseId(detail.getWarehouseId());
@@ -1017,10 +1178,10 @@
        detail.getWOutboundRecordInList().add(record);
        WStock stock = getFromStockList(mp.getFinishWarehouseLocationId(),detail.getWarehouseId(),detail.getMaterialId(),detail.getBatch(),
                tModel.getProcedureId(),tModel.getDoneType(),stockList);
                tModel.getProcedureId(),doneType,stockList);
        if(stock!=null){
            //如果库存对象已存在,直接增加对应的库存量
            stock.setNum(Constants.formatBigdecimal(stock.getNum()).add(Constants.formatBigdecimal(tModel.getNum())));
            stock.setNum(Constants.formatBigdecimal(stock.getNum()).add(Constants.formatBigdecimal(detail.getNum())));
        }else{
            stock = new WStock();
            stock.setMaterialId(detail.getMaterialId());
@@ -1028,9 +1189,9 @@
            stock.setWarehouseId(outbound.getWarehouseId());
            stock.setLocationId(mp.getFinishWarehouseLocationId());
            stock.setUnitId(detail.getUnitId());
            stock.setNum(Constants.formatBigdecimal(tModel.getNum()));
            stock.setNum(Constants.formatBigdecimal(detail.getNum()));
            stock.setProcedureId(tModel.getProcedureId());
            stock.setQualityType(tModel.getDoneType());
            stock.setQualityType(doneType);
            //待更新库存信息
            stockList.add(stock);
        }
@@ -1355,9 +1516,7 @@
        //计算工资信息
        SalaryParam salaryParam = salaryParamMapper.selectOne(new QueryWrapper<SalaryParam>().eq("DELETED",Constants.ZERO).eq("MATERIAL_ID",workorderRecord.getMaterialId())
                .eq("DEPART_ID",workorderRecord.getFactoryId()).eq("PROCEDURE_ID",workorderRecord.getProcedureId()).last(" limit 1  "));
        if(Objects.isNull(salaryParam)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未配置工资绩效配置!");
        }
        if(!Objects.isNull(salaryParam)){
        workorderRecord.setSalaryPrice(salaryParam.getSalary());
        workorderRecord.setSalaryType(salaryParam.getType());
        workorderRecord.setSalaryUnqualified(salaryParam.getUnqualified());
@@ -1367,7 +1526,8 @@
            workorderRecord.setSalary(salaryParam.getSalary().multiply(salaryParam.getUnqualified()==Constants.ONE?num:createWorkorderRecordDTO.getQualifiedNum()));
        }else{
            workorderRecord.setDuration(createWorkorderRecordDTO.getDuration());
            workorderRecord.setSalary(BigDecimal.valueOf(createWorkorderRecordDTO.getDuration()).multiply(salaryParam.getSalary()).divide(new BigDecimal(3600)));
                workorderRecord.setSalary(BigDecimal.valueOf(createWorkorderRecordDTO.getDuration()).multiply(salaryParam.getSalary()).divide(new BigDecimal(3600),BigDecimal.ROUND_HALF_UP));
            }
        }
        //插入工单操作记录,并且判断是否更改为工单的状态【生产中】
        updateOrderInfo(loginUserInfo,workorder,Constants.WORKORDER_HISTORY_STATUS.produce);
server/src/main/resources/mappers/PlansExtMapper.xml
@@ -123,7 +123,7 @@
  <select id="selectByModel" parameterType="doumeemes.dao.ext.dto.QueryPlansExtDTO" resultMap="PlansExtListVO">
  SELECT
  `a`.*
    ,ifnull((  SELECT sum( b.PLAN_NUM ) FROM  workorder b  WHERE b.deleted = 0 AND b.PLAN_ID = a.id and b.status not in (7,8) ),0) AS workorderDistributNum
    ,ifnull((  SELECT sum( b.PLAN_NUM ) FROM  workorder b  WHERE b.deleted = 0 AND b.PLAN_ID = a.id and b.status = 4 ),0) AS workorderDistributNum
    from plans a
    <where>
    <if test="id != null">