package doumeemes.service.ext.impl; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 
 | 
import com.github.pagehelper.PageHelper; 
 | 
import com.github.pagehelper.PageInfo; 
 | 
import doumeemes.biz.system.SystemDictDataBiz; 
 | 
import doumeemes.core.constants.ResponseStatus; 
 | 
import doumeemes.core.exception.BusinessException; 
 | 
import doumeemes.core.model.ApiResponse; 
 | 
import doumeemes.core.model.LoginUserInfo; 
 | 
import doumeemes.core.model.PageData; 
 | 
import doumeemes.core.model.PageWrap; 
 | 
import doumeemes.core.utils.Constants; 
 | 
import doumeemes.core.utils.DateUtil; 
 | 
import doumeemes.core.utils.redis.RedisUtil; 
 | 
import doumeemes.dao.business.*; 
 | 
import doumeemes.dao.business.model.*; 
 | 
import doumeemes.dao.ext.*; 
 | 
import doumeemes.dao.ext.bean.*; 
 | 
import doumeemes.dao.ext.dto.*; 
 | 
import doumeemes.dao.ext.vo.*; 
 | 
import doumeemes.service.business.WOutboundService; 
 | 
import doumeemes.service.business.WTransferService; 
 | 
import doumeemes.service.ext.*; 
 | 
import doumeemes.service.system.SystemUserService; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.apache.shiro.SecurityUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.context.annotation.Lazy; 
 | 
import org.springframework.data.redis.core.RedisTemplate; 
 | 
import org.springframework.scheduling.annotation.Async; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.util.*; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 工单信息Service实现 
 | 
 * @author 江蹄蹄 
 | 
 * @date 2022/04/20 10:56 
 | 
 */ 
 | 
@Service 
 | 
public class WorkorderExtServiceImpl implements WorkorderExtService { 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    @Lazy 
 | 
    private PlanHistoryExtMapper planHistoryExtMapper; 
 | 
    @Autowired 
 | 
    private BomExtMapper bomExtMapper; 
 | 
    @Autowired 
 | 
    private BomMapper bomMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private DeviceExtMapper deviceExtMapper ; 
 | 
    @Autowired 
 | 
    private RedisTemplate<String, Object> redisTemplate; 
 | 
    @Autowired 
 | 
    private UserDeviceExtMapper userDeviceExtMapper; 
 | 
    @Autowired 
 | 
    private BarcodeParamExtService barcodeParamExtService; 
 | 
    @Autowired 
 | 
    private CompanyUserExtMapper companyUserExtMapper; 
 | 
    @Autowired 
 | 
    private DepartmentExtService departmentExtService; 
 | 
    @Autowired 
 | 
    private SystemUserService systemUserService; 
 | 
  
 | 
    @Autowired 
 | 
    private BomDetailExtMapper bomDetailExtMapper; 
 | 
    @Autowired 
 | 
    private WorkorderExtMapper workorderExtMapper; 
 | 
    @Autowired 
 | 
    private BackorderMapper backorderMapper; 
 | 
    @Autowired 
 | 
    private WorkorderMapper workorderMapper; 
 | 
    @Autowired 
 | 
    private WorkorderHistoryExtMapper workorderHistoryExtMapper; 
 | 
    @Autowired 
 | 
    private WorkorderRecordExtMapper workorderRecordExtMapper; 
 | 
    @Autowired 
 | 
    private WorkorderUserExtMapper workorderUserExtMapper; 
 | 
    @Autowired 
 | 
    private WTransferService wTransferService; 
 | 
    @Autowired 
 | 
    private WTransferExtService wTransferExtService; 
 | 
    @Autowired 
 | 
    private WTransferExtMapper wTransferExtMapper; 
 | 
    @Autowired 
 | 
    private WTransferDetailExtMapper wTransferDetailExtMapper; 
 | 
    @Autowired 
 | 
    private AppliancesExtMapper appliancesExtMapper; 
 | 
    @Autowired 
 | 
    private AppliancesMapper appliancesMapper; 
 | 
    @Autowired 
 | 
    private PlansExtMapper plansExtMapper; 
 | 
    @Autowired 
 | 
    private DeviceMapper deviceMapper; 
 | 
    @Autowired 
 | 
    private DepartmentExtMapper departmentExtMapper; 
 | 
    @Autowired 
 | 
    private SystemDictDataBiz systemDictDataBiz; 
 | 
    @Autowired 
 | 
    private WOutboundExtMapper wOutboundExtMapper; 
 | 
    @Autowired 
 | 
    private WOutboundService wOutboundService; 
 | 
    @Autowired 
 | 
    private WOutboundDetailExtMapper wOutboundDetailExtMapper; 
 | 
    @Autowired 
 | 
    private WarehouseMapper warehouseMapper; 
 | 
    @Autowired 
 | 
    private WStockMapper wStockMapper; 
 | 
    @Autowired 
 | 
    private WOutboundRecordExtMapper wOutboundRecordExtMapper; 
 | 
    @Autowired 
 | 
    private ProceduresMapper proceduresMapper; 
 | 
    @Autowired 
 | 
    private NoticesExtService noticesExtService; 
 | 
    @Autowired 
 | 
    private CompanyUserMapper companyUserMapper; 
 | 
    @Autowired 
 | 
    private RouteProcedureExtMapper routeProcedureExtMapper; 
 | 
    @Autowired 
 | 
    private BackOrderDetailMapper backOrderDetailMapper; 
 | 
    @Autowired 
 | 
    private WHistoryMapper wHistoryMapper; 
 | 
    @Autowired 
 | 
    private WorkPlansExtMapper workPlansExtMapper; 
 | 
    @Autowired 
 | 
    private PlansMapper plansMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private WStockRecordExtService wStockRecordExtService; 
 | 
  
 | 
    public static WorkorderHistory initHistoryByModel(WorkorderExtListVO p,int userId, int status) { 
 | 
            WorkorderHistory h = new WorkorderHistory(); 
 | 
            h.setDeleted(Constants.ZERO); 
 | 
            h.setCreateTime(DateUtil.getCurrentDate()); 
 | 
            h.setCreateUser(userId); 
 | 
            h.setDepartId(p.getDepartId()); 
 | 
            h.setRootDepartId(p.getRootDepartId()); 
 | 
            h.setOrderId(p.getId()); 
 | 
            h.setTitle(Constants.WORKORDER_STATUS.getTitleByStatus(p,status)); 
 | 
            h.setType(status); 
 | 
            h.setInfo(Constants.WORKORDER_STATUS.getInfoByStatus(p,status)); 
 | 
            return h; 
 | 
    } 
 | 
  
 | 
    public static PlanHistory initPlanHistoryByModel(WorkPlans p, Integer userId, int status ) { 
 | 
        PlanHistory h = new PlanHistory(); 
 | 
        h.setDeleted(Constants.ZERO); 
 | 
        h.setCreateTime(DateUtil.getCurrentDate()); 
 | 
        h.setCreateUser(userId); 
 | 
        h.setDepartId(p.getDepartId()); 
 | 
        h.setRootDepartId(p.getRootDepartId()); 
 | 
        h.setPlanId(p.getId()); 
 | 
        h.setRootDepartId(p.getRootDepartId()); 
 | 
        h.setDepartId(p.getDepartId()); 
 | 
        h.setTitle(Constants.WORKPLANHISTORY_TYPE.getTitleByStatus(p,status)); 
 | 
        h.setType(status); 
 | 
        h.setInfo(Constants.WORKPLANHISTORY_TYPE.getInfoByStatus(p,status)); 
 | 
        h.setType(status); 
 | 
  
 | 
        return h; 
 | 
    } 
 | 
  
 | 
    public static WorkorderHistory initHistoryByModel(Workorder p, int userId, int status) { 
 | 
            WorkorderHistory h = new WorkorderHistory(); 
 | 
            h.setDeleted(Constants.ZERO); 
 | 
            h.setCreateTime(DateUtil.getCurrentDate()); 
 | 
            h.setCreateUser(userId); 
 | 
            h.setDepartId(p.getDepartId()); 
 | 
            h.setRootDepartId(p.getRootDepartId()); 
 | 
            h.setOrderId(p.getId()); 
 | 
            h.setTitle(Constants.WORKORDER_HISTORY_STATUS.getTitleByStatus(null,status)); 
 | 
            h.setType(status); 
 | 
            h.setInfo(Constants.WORKORDER_HISTORY_STATUS.getInfoByStatus(null,status)); 
 | 
            return h; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public PageData<WorkorderExtListVO> findPage(PageWrap<QueryWorkorderExtDTO> pageWrap) { 
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); 
 | 
        } 
 | 
        //只能查看当前根组织的数据 
 | 
        pageWrap.getModel().setRootDepartId(user.getRootDepartment().getId()); 
 | 
//        if(!Constants.equalsInteger(user.getCurComDepartment().getId(),user.getRootDepartment().getId())){ 
 | 
            //如果当前选择的公司级组织非根组织信息,只能查看当前选择公司级组织数据 
 | 
            pageWrap.getModel().setDepartId(user.getCurComDepartment().getId()); 
 | 
//        } 
 | 
        //数据权限 
 | 
//        pageWrap.getModel().setCreateUser(user.getId()); 
 | 
        List<Integer> dataPermission = user.getDepartPermissionList(); 
 | 
        if(dataPermission!=null){ 
 | 
            pageWrap.getModel().setDepartIds(dataPermission); 
 | 
            pageWrap.getModel().setCreateUser(user.getId()); 
 | 
           /* if(dataPermission.size() == 0){ 
 | 
                //只能看自己的(生产人员信息) 
 | 
                //  pageWrap.getModel().setProUserId(user.getId()); 
 | 
                //需求变更 查看数据权限范围内的数据(走创建人或者生产人员为我数据权限范围内); 
 | 
                pageWrap.getModel().setCreateUser(user.getId()); 
 | 
            }else{ 
 | 
                //否则走数据权限 
 | 
                pageWrap.getModel().setDepartIds(dataPermission); 
 | 
            }*/ 
 | 
        } 
 | 
        pageWrap.getModel().setDeleted(Constants.ZERO); 
 | 
        PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity()); 
 | 
        List<WorkorderExtListVO> result = workorderExtMapper.selectList(pageWrap.getModel()); 
 | 
        if(result!=null){ 
 | 
            List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class); 
 | 
            for(WorkorderExtListVO w : result){ 
 | 
                if(w.getOriginId()!=null){ 
 | 
                    w.setOriginName( systemDictDataBiz.queryCodeById(w.getOriginId())); 
 | 
                } 
 | 
//                BarcodeParamExtListVO code =barcodeParamExtService.getByCodeId(user.getCompany().getId(),user.getCurComDepartment().getId(),w.getQrcodeId()); 
 | 
//                String prex = code!=null? code.getPrefix():""; 
 | 
//                w.setCode(prex+w.getCode()); 
 | 
//                initProUser(user,w,allDepartList); 
 | 
                initProUserList(user,w,allDepartList); 
 | 
                //根据工单查询BOM下一个工序 
 | 
                /** 
 | 
                 * BOM上的工序是投料工序,表示这个BOM在哪个工序上使用; 
 | 
                 * 我要查询工单上的生产工序的后续工序: 
 | 
                 * 1. 先用工单的物料+工厂去查BOM表,找到工艺路线; 
 | 
                 * 2. 用工单的生产工序,比对工艺路线,找到后续的工序(此过程跟BOM主表上的工序没有任何关系); 
 | 
                 */ 
 | 
                Bom b = bomExtMapper.selectOne(new QueryWrapper<Bom>() 
 | 
                        .eq("MATERIAL_ID",w.getMaterialId()) 
 | 
                        .eq("DEPART_ID",w.getDepartId()) 
 | 
                        .eq("DELETED",Constants.ZERO) 
 | 
                        .eq("STATUS",Constants.ONE) 
 | 
                ); 
 | 
                w.setPapercode(b.getPapercode()); 
 | 
  
 | 
              /*  RouteProcedure currentRouteProcedure   = routeProcedureExtMapper.selectOne(new QueryWrapper<RouteProcedure>() 
 | 
                        .eq("ROUTE_ID",b.getRouteId()) 
 | 
                        .eq("PROCEDURE_ID",b.getProcedureId()) 
 | 
                        .last(" limit 1 ") 
 | 
                );*/ 
 | 
  
 | 
                RouteProcedure currentRouteProcedure   = routeProcedureExtMapper.selectOne(new QueryWrapper<RouteProcedure>() 
 | 
                        .eq("ROUTE_ID",b.getRouteId()) 
 | 
                        .eq("PROCEDURE_ID",w.getProcedureId()) 
 | 
                        .last(" limit 1 ") 
 | 
                ); 
 | 
                if(currentRouteProcedure!=null){ 
 | 
                    QueryRouteProcedureExtDTO queryrp=new QueryRouteProcedureExtDTO(); 
 | 
                    queryrp.setRouteId(b.getRouteId()); 
 | 
                    queryrp.setSortnum(currentRouteProcedure.getSortnum()); 
 | 
                    // queryrp.setDepartId(w.getDepartId()); 
 | 
                    queryrp.setDeleted(Constants.ZERO); 
 | 
                    List<RouteProcedureExtListVO> routeProcedureList   = routeProcedureExtMapper.selectListByNext(queryrp); 
 | 
                    w.setRouteProcedureList(routeProcedureList); 
 | 
                } 
 | 
                StringBuffer sbf = new StringBuffer(); 
 | 
                List<WorkorderUserExtListVO> proUserList = w.getProUserList(); 
 | 
                if(!Objects.isNull(proUserList)&&proUserList.size()>Constants.ZERO){ 
 | 
                    proUserList.forEach(i->{ 
 | 
                        sbf.append(i.getProUserDepartName()+";"); 
 | 
                    }); 
 | 
                } 
 | 
                w.setProUserListStr(sbf.toString()); 
 | 
            } 
 | 
        } 
 | 
        return PageData.from(new PageInfo<>(result)); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    private void initProUser(LoginUserInfo user, WorkorderExtListVO data, List<DepartmentExtListVO> allDepartList) { 
 | 
        if(data.getProUserId() ==null){ 
 | 
            return; 
 | 
        } 
 | 
        CompanyUser query=new CompanyUser(); 
 | 
        query.setUserId(data.getProUserId()); 
 | 
        query.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        query.setDeleted(Constants.ZERO); 
 | 
        CompanyUser comp= companyUserExtMapper.selectOne(new QueryWrapper<>(query).last(" limit 1")); 
 | 
        if(comp!=null){ 
 | 
            DepartmentExtListVO d = departmentExtService.getModelById(user.getCompany().getId(),comp.getDepartmentId(),allDepartList); 
 | 
            String dName =d==null?"":StringUtils.defaultString(d.getName(),""); 
 | 
            data.setProUserDepartName(dName); 
 | 
        } 
 | 
    } 
 | 
    private void initProUserOld(LoginUserInfo user, WorkorderExtListVO data, List<DepartmentExtListVO> allDepartList) { 
 | 
        if(data.getProUserId() ==null){ 
 | 
            return; 
 | 
        } 
 | 
        CompanyUser query=new CompanyUser(); 
 | 
        query.setUserId(data.getProUserId()); 
 | 
        query.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        query.setDeleted(Constants.ZERO); 
 | 
        CompanyUser comp= companyUserExtMapper.selectOne(new QueryWrapper<>(query).last(" limit 1")); 
 | 
        if(comp!=null){ 
 | 
            DepartmentExtListVO d = departmentExtService.getModelById(user.getCompany().getId(),comp.getDepartmentId(),allDepartList); 
 | 
            String dName =d==null?"":StringUtils.defaultString(d.getName(),""); 
 | 
            data.setProUserDepartName(dName); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public WorkorderExtListCountVO pageCount(QueryWorkorderExtDTO param){ 
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); 
 | 
        } 
 | 
        //只能查看当前根组织的数据 
 | 
        param.setRootDepartId(user.getRootDepartment().getId()); 
 | 
//        if(!Constants.equalsInteger(user.getCurComDepartment().getId(),user.getRootDepartment().getId())){ 
 | 
        //如果当前选择的公司级组织非根组织信息,只能查看当前选择公司级组织数据 
 | 
        param.setDepartId(user.getCurComDepartment().getId()); 
 | 
//        } 
 | 
        //数据权限 
 | 
//        param.setCreateUser(user.getId()); 
 | 
        List<Integer> dataPermission = user.getDepartPermissionList(); 
 | 
        if(dataPermission!=null){ 
 | 
            param.setCreateUser(user.getId()); 
 | 
            //否则走数据权限 
 | 
            param.setDepartIds(dataPermission); 
 | 
           /* if(dataPermission.size() == 0){ 
 | 
                //只能看自己的(生产人员信息) 
 | 
                  param.setProUserId(user.getId()); 
 | 
                //需求变更 查看数据权限范围内的数据(走创建人或者生产人员为我数据权限范围内); 
 | 
            }else{ 
 | 
                //否则走数据权限 
 | 
                param.setDepartIds(dataPermission); 
 | 
            }*/ 
 | 
        } 
 | 
        WorkorderExtListCountVO result = new WorkorderExtListCountVO(); 
 | 
        //全部数量 
 | 
        result.setAllNum(workorderExtMapper.selectCount(param)); 
 | 
        param.setStatusList(new ArrayList<>()); 
 | 
        param.getStatusList().add(Constants.WORKORDER_STATUS.create); 
 | 
        param.getStatusList().add(Constants.WORKORDER_STATUS.material); 
 | 
        //未完成数量 
 | 
        result.setStartNum(workorderExtMapper.selectCount(param)); 
 | 
        param.setStatusList(new ArrayList<>()); 
 | 
        param.getStatusList().add(Constants.WORKORDER_STATUS.done); 
 | 
        param.getStatusList().add(Constants.WORKORDER_STATUS.check); 
 | 
        //进行中数量 
 | 
        result.setIngNum(workorderExtMapper.selectCount(param)); 
 | 
        param.setStatusList(new ArrayList<>()); 
 | 
        param.getStatusList().add(Constants.WORKORDER_STATUS.baogong); 
 | 
        param.getStatusList().add(Constants.WORKORDER_STATUS.instock); 
 | 
        param.getStatusList().add(Constants.WORKORDER_STATUS.cancel); 
 | 
        //进行中数量 
 | 
        result.setEndNum(workorderExtMapper.selectCount(param)); 
 | 
        return result; 
 | 
    } 
 | 
    @Override 
 | 
    public List<WorkorderListModelVO> findByPlanId(PlansExtListH5VO plan,boolean isWorkorderList){ 
 | 
  
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); 
 | 
        } 
 | 
        QueryWorkorderExtDTO pageWrap = new QueryWorkorderExtDTO(); 
 | 
        pageWrap.setDeleted(Constants.ZERO); 
 | 
        pageWrap.setPlanId(plan.getId()); 
 | 
        List<WorkorderExtListVO> result = workorderExtMapper.selectList(pageWrap ); 
 | 
        QueryWorkorderRecordExtDTO rParam = new QueryWorkorderRecordExtDTO(); 
 | 
        rParam.setPlanId(pageWrap.getId()); 
 | 
        rParam.setDeleted(Constants.ZERO); 
 | 
        //已完工数量 
 | 
        plan.setDoneNum(0); 
 | 
        //已分配数量 
 | 
        plan.setDistributNum(0); 
 | 
        //查询全部投料和产出 
 | 
        List<WorkorderRecordExtListVO> recordList = workorderRecordExtMapper.selectAllList(rParam); 
 | 
        List<WorkorderListModelVO> list = new ArrayList<>(); 
 | 
        if(result!=null){ 
 | 
            List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class); 
 | 
            for(WorkorderExtListVO w : result){ 
 | 
                //②计划完工数量=已报工工单(已报工、已入库)的完工数量(包括:合格、不良、报废); 
 | 
                //①计划分配数量=已报工工单(已报工、已入库)的完工数量(包括:合格、不良、报废)+未报工工单(已创建、已备料、已检验、已完工)的已分配数量; 
 | 
                if(Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.baogong) || Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.instock)){ 
 | 
                    plan.setDoneNum(Constants.formatIntegerNum(w.getUnqualifiedNum()) + Constants.formatIntegerNum(w.getQualifiedNum()) + plan.getDoneNum()); 
 | 
                    plan.setDistributNum(Constants.formatIntegerNum(w.getUnqualifiedNum()) + Constants.formatIntegerNum(w.getQualifiedNum()) + plan.getDistributNum()); 
 | 
                }else{ 
 | 
                    plan.setDistributNum(Constants.formatIntegerNum(w.getPlanNum()) + plan.getDistributNum()); 
 | 
                } 
 | 
                initProUserList(user,w,allDepartList); 
 | 
                if(isWorkorderList){ 
 | 
                    List<WorkorderRecordExtListVO> rList = getRecordListById(w.getId(),recordList); 
 | 
                    WorkorderListModelVO tModle = new WorkorderListModelVO(); 
 | 
                    tModle.setId(w.getId()); 
 | 
                    BarcodeParamExtListVO pCode = barcodeParamExtService.getByCodeId(user.getCompany().getId(),user.getCurComDepartment().getId(),w.getQrcodeId()); 
 | 
                    String prex =pCode!=null?pCode.getPrefix(): ""; 
 | 
                    tModle.setCode(prex+w.getCode()); 
 | 
                    tModle.setCreateTime(w.getCreateTime()); 
 | 
                    tModle.setDistributeDate(w.getCreateTime()); 
 | 
                    tModle.setPaused(w.getPaused()); 
 | 
                    tModle.setProUserList(w.getProUserList()); 
 | 
                    tModle.setStatus(w.getStatus()); 
 | 
                    tModle.setPlanDate(w.getPlanDate()); 
 | 
                    tModle.setPlanNum(w.getPlanNum()); 
 | 
                    tModle.setMaterialList(new ArrayList<>()); 
 | 
                    tModle.setPlanNum(w.getPlanNum()); 
 | 
                    tModle.setUrgent(w.getUrgent()); 
 | 
                    tModle.setUpdateTime(w.getUpdateTime()); 
 | 
                    tModle.setRemark(w.getRemark()); 
 | 
                    tModle.setQualifiedNum(0); 
 | 
                    tModle.setUnqualifiedNum(0); 
 | 
                    tModle.setProUserId(w.getProUserId()); 
 | 
                    tModle.setProUserName(w.getProUserName()); 
 | 
                    if(w.getProUserId()!=null){ 
 | 
                        //查询班组信息 
 | 
                        QueryCompanyUserExtDTO queryCompanyUserExtDTO = new QueryCompanyUserExtDTO(); 
 | 
                        queryCompanyUserExtDTO.setUserId(w.getProUserId()); 
 | 
                        queryCompanyUserExtDTO.setRootDepartId(w.getRootDepartId()); 
 | 
                        CompanyUserExtListVO uModel = companyUserExtMapper.selectModel(queryCompanyUserExtDTO); 
 | 
                        if(uModel!=null && uModel.getDmodel()!=null){ 
 | 
                            tModle.setProUserDepart(uModel.getDmodel().getName()); 
 | 
                        } 
 | 
                    } 
 | 
  
 | 
                    if(rList!=null){ 
 | 
                        for (WorkorderRecordExtListVO r : rList){ 
 | 
                            if(Constants.equalsInteger(r.getType(),Constants.WORKORDER_RECORD_TYPE.materail)){ 
 | 
                                if(tModle.getMaterialDate()==null){ 
 | 
                                    tModle.setMaterialDate(r.getCreateTime()); 
 | 
                                } 
 | 
                                MaterialModelVo m = getMaterialModelFromList(tModle.getMaterialList(),r.getMaterialId()); 
 | 
                                if(m != null){ 
 | 
                                    //如果已经存在,分组统计累计数量 
 | 
                                    m.setNum(m.getNum().add(Constants.formatBigdecimal(r.getNum()))); 
 | 
                                }else{ 
 | 
                                    //如果不存,添加新的分组 
 | 
                                    m = new MaterialModelVo(); 
 | 
                                    m.setUnitName(r.getUmodel()!=null?r.getUmodel().getName():""); 
 | 
                                    m.setNum(Constants.formatBigdecimal(r.getNum())); 
 | 
                                    m.setId(r.getMaterialId()); 
 | 
                                    m.setName(r.getMmodel()!=null?r.getMmodel().getName():""); 
 | 
                                    tModle.getMaterialList().add(m); 
 | 
                                } 
 | 
  
 | 
                            }else  if(Constants.equalsInteger(r.getType(),Constants.WORKORDER_RECORD_TYPE.produce)){ 
 | 
                                if(tModle.getProduceDate()==null){ 
 | 
                                    //产出日期 
 | 
                                    tModle.setProduceDate(r.getCreateTime()); 
 | 
                                } 
 | 
                                if(Constants.equalsInteger(r.getDoneType(),Constants.ZERO)){ 
 | 
                                    //如果是合格产出 
 | 
                                    tModle.setQualifiedNum(tModle.getQualifiedNum()+Constants.formatBigdecimal(r.getNum()).intValue()); 
 | 
                                }else{ 
 | 
                                    //如果是不良品 
 | 
                                    tModle.setUnqualifiedNum(tModle.getUnqualifiedNum()+Constants.formatBigdecimal(r.getNum()).intValue()); 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                    } 
 | 
                    list.add(tModle); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        plan.setLessDistributNum(plan.getNum()-plan.getDistributNum());//待分配数量 
 | 
        return  list; 
 | 
    } 
 | 
  
 | 
    private MaterialModelVo getMaterialModelFromList(List<MaterialModelVo> materialList, Integer materialId) { 
 | 
        if(materialList != null){ 
 | 
           for (MaterialModelVo m : materialList){ 
 | 
               if(Constants.equalsInteger(m.getId(),materialId)){ 
 | 
                   return  m; 
 | 
               } 
 | 
           } 
 | 
        } 
 | 
        return  null; 
 | 
    } 
 | 
  
 | 
    private List<WorkorderRecordExtListVO> getRecordListById(Integer id, List<WorkorderRecordExtListVO> recordList) { 
 | 
        if(recordList==null  ){ 
 | 
            return null; 
 | 
        } 
 | 
        List<WorkorderRecordExtListVO> list = null; 
 | 
        for(WorkorderRecordExtListVO r : recordList){ 
 | 
            if(Constants.equalsInteger(r.getWorkorderId(),id)){ 
 | 
                if(list == null){ 
 | 
                    list = new ArrayList<>(); 
 | 
                } 
 | 
                list.add(r); 
 | 
            } 
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public  WorkorderExtListVO findById(Integer id){ 
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); 
 | 
        } 
 | 
        QueryWorkorderExtDTO pageWrap = new QueryWorkorderExtDTO(); 
 | 
  
 | 
        //只能查看当前根组织的数据 
 | 
        pageWrap.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        pageWrap.setId(id); 
 | 
//        if(!Constants.equalsInteger(user.getCurComDepartment().getId(),user.getRootDepartment().getId())){ 
 | 
            //如果当前选择的公司级组织非根组织信息,只能查看当前选择公司级组织数据 
 | 
//            pageWrap.setDepartId(user.getCurComDepartment().getId()); 
 | 
//        } 
 | 
        //数据权限 
 | 
//        List<Integer> dataPermission = user.getDepartPermissionList(); 
 | 
//        if(dataPermission!=null){ 
 | 
//            if(dataPermission.size() == 0){ 
 | 
//                //只能看自己的(生产人员信息) 
 | 
//                pageWrap.setProUserId(user.getId()); 
 | 
//            }else{ 
 | 
//                //否则走数据权限 
 | 
//                pageWrap.setDepartIds(dataPermission); 
 | 
//            } 
 | 
//        } 
 | 
        WorkorderExtListVO result = workorderExtMapper.selectByModel(pageWrap); 
 | 
        if(result == null){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,查询记录不存在!"); 
 | 
        } 
 | 
        if(result.getOriginId()!=null){ 
 | 
            result.setOriginName( systemDictDataBiz.queryCodeById(result.getOriginId())); 
 | 
        } 
 | 
        BarcodeParamExtListVO code =barcodeParamExtService.getByCodeId(user.getCompany().getId(),user.getCurComDepartment().getId(),result.getQrcodeId()); 
 | 
        String prex = code!=null? code.getPrefix():""; 
 | 
        result.setCode(prex+result.getCode()); 
 | 
       //查詢生产人员信息 
 | 
        initProUserList(user,result, RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class)); 
 | 
  
 | 
        QueryBomExtDTO bb = new QueryBomExtDTO(); 
 | 
        bb.setDepartId(result.getDepartId()); 
 | 
        bb.setDeleted(Constants.ZERO); 
 | 
        bb.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        bb.setMaterialId(result.getMaterialId()); 
 | 
        bb.setProcedureId(result.getProcedureId()); 
 | 
        BomExtListVO versionBom = bomExtMapper.selectByModel( bb); 
 | 
        if(versionBom == null || StringUtils.isBlank(versionBom.getVersion()) || versionBom.getBomVersionId() == null){ 
 | 
            result.setHasBom(Constants.ZERO); 
 | 
        }else { 
 | 
            result.setBomType(Constants.formatIntegerNum(versionBom.getType())); 
 | 
            result.setHasBom(Constants.ONE); 
 | 
        } 
 | 
        return  result; 
 | 
    } 
 | 
  
 | 
    private void initProUserList(LoginUserInfo user, WorkorderExtListVO result, List<DepartmentExtListVO> allDepartList ) { 
 | 
        QueryWorkorderUserExtDTO u = new QueryWorkorderUserExtDTO(); 
 | 
        u.setWorkorderId(result.getId()); 
 | 
        u.setDeleted(Constants.ZERO); 
 | 
        //查询全部生产人员数据 
 | 
        List<WorkorderUserExtListVO> uList = workorderUserExtMapper.selectListByOrder(u); 
 | 
        if(uList!=null && uList.size()>0){ 
 | 
//            List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class); 
 | 
            for(WorkorderUserExtListVO uu : uList){ 
 | 
                initProUserNew(user,uu,allDepartList); 
 | 
            } 
 | 
        } 
 | 
        result.setProUserList(uList); 
 | 
    } 
 | 
  
 | 
    private void initProUserNew(LoginUserInfo user, WorkorderUserExtListVO data, List<DepartmentExtListVO> allDepartList) { 
 | 
        if(data.getProUserId() ==null){ 
 | 
            return; 
 | 
        } 
 | 
        CompanyUser query=new CompanyUser(); 
 | 
        query.setUserId(data.getProUserId()); 
 | 
        query.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        query.setDeleted(Constants.ZERO); 
 | 
        CompanyUser comp= companyUserExtMapper.selectOne(new QueryWrapper<>(query).last(" limit 1")); 
 | 
        if(comp!=null){ 
 | 
            DepartmentExtListVO d = departmentExtService.getModelById(user.getCompany().getId(),comp.getDepartmentId(),allDepartList); 
 | 
            String dName =d==null?"":StringUtils.defaultString(d.getName(),""); 
 | 
            data.setProUserDepartName(comp.getName()+"-"+dName); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public void distributeById(Workorder param) { 
 | 
        if(param.getId()== null 
 | 
                ||param.getPlanDate() == null 
 | 
                || param.getProGroupId()==null 
 | 
                || param.getProUserList()==null 
 | 
                || param.getProUserList().size()==0  ){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请按要求填写和选择提交数据!"); 
 | 
        } 
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); 
 | 
        } 
 | 
        Workorder mp = new Workorder(); 
 | 
        mp.setDeleted(Constants.ZERO); 
 | 
        mp.setId(param.getId()); 
 | 
        mp.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        mp = workorderExtMapper.selectOne(mp); 
 | 
        if(mp== null){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); 
 | 
        } 
 | 
        if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!"); 
 | 
        } 
 | 
        if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!"); 
 | 
        } 
 | 
        List<WorkorderHistory> whList = new ArrayList<>(); 
 | 
        Workorder order = new Workorder(); 
 | 
        order.setUpdateTime(DateUtil.getCurrentDate()); 
 | 
        order.setUpdateUser(user.getId()); 
 | 
        order.setId(param.getId()); 
 | 
        order.setRootDepartId(mp.getRootDepartId()); 
 | 
        order.setDepartId(mp.getDepartId()); 
 | 
        order.setPlanDate(param.getPlanDate()); 
 | 
        order.setUserDeivceId(param.getUserDeivceId()); 
 | 
        order.setPlanId(mp.getPlanId()); 
 | 
        order.setProGroupId(param.getProGroupId()); 
 | 
        order.setProUserList(param.getProUserList()); 
 | 
        //查询生产班组和人员是否合法 
 | 
        checkUserAndGroup(order,user); 
 | 
//        order.setProGroupId(null); 
 | 
        order.setPlanId(null); 
 | 
        order.setProUserList(null); 
 | 
        workorderExtMapper.updateById(order); 
 | 
        //工单历史数据 
 | 
        whList.add(WorkorderExtServiceImpl.initHistoryByModel(order,user.getId(),Constants.WORKORDER_HISTORY_STATUS.redistribute)); 
 | 
        workorderHistoryExtMapper.insertBatch(whList); 
 | 
  
 | 
        UpdateWrapper updateWrapper = new UpdateWrapper(); 
 | 
        updateWrapper.eq("WORKORDER_ID",param.getId()); 
 | 
        updateWrapper.eq("DELETED",Constants.ZERO); 
 | 
        updateWrapper.set("DELETED",Constants.ONE); 
 | 
        updateWrapper.set("UPDATE_TIME",DateUtil.getCurrentDate()); 
 | 
        updateWrapper.set("UPDATE_USER",user.getId()); 
 | 
        //删除原有的工单分配人员信息(逻辑删除) 
 | 
        workorderUserExtMapper.update(null,updateWrapper); 
 | 
        //插入生产人员分配关联表 
 | 
        for( WorkorderUser wu :order.getWorkorderUserList()){ 
 | 
            wu.setWorkorderId(order.getId()); 
 | 
            //生产人员记录 
 | 
            workorderUserExtMapper.insert(wu); 
 | 
        } 
 | 
      /*  WorkorderUser wu =new WorkorderUser(); 
 | 
        wu.setWorkorderId(order.getId()); 
 | 
        wu.setDeleted(Constants.ZERO); 
 | 
        wu.setCreateTime(DateUtil.getCurrentDate()); 
 | 
        wu.setCreateUser(user.getId()); 
 | 
        wu.setDepartId(mp.getDepartId()); 
 | 
        wu.setRootDepartId(mp.getRootDepartId()); 
 | 
        wu.setPlanId(mp.getPlanId()); 
 | 
        wu.setProUserId(order.getProUserId()); 
 | 
        //历史生产人员记录 
 | 
        workorderUserExtMapper.insert(wu);*/ 
 | 
    } 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public void closeById(Workorder param) { 
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); 
 | 
        } 
 | 
        if(param.getId()== null){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请按要求填写和选择提交数据!"); 
 | 
        } 
 | 
        Workorder mp = new Workorder(); 
 | 
        mp.setDeleted(Constants.ZERO); 
 | 
        mp.setId(param.getId()); 
 | 
        mp.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        mp = workorderExtMapper.selectOne(mp); 
 | 
        if(mp== null){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); 
 | 
        } 
 | 
        /* if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!"); 
 | 
        }*/ 
 | 
        if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!"); 
 | 
        } 
 | 
        List<WorkorderHistory> whList = new ArrayList<>(); 
 | 
        Workorder order = new Workorder(); 
 | 
        order.setUpdateTime(DateUtil.getCurrentDate()); 
 | 
        order.setUpdateUser(user.getId()); 
 | 
        order.setRootDepartId(mp.getRootDepartId()); 
 | 
        order.setDepartId(mp.getDepartId()); 
 | 
        order.setPlanDate(param.getPlanDate()); 
 | 
        //已关闭 
 | 
        order.setStatus(Constants.WORKORDER_STATUS.cancel); 
 | 
        order.setId(param.getId()); 
 | 
        order.setUserDeivceId(param.getUserDeivceId()); 
 | 
        workorderExtMapper.updateById(order); 
 | 
        //工单历史数据 
 | 
        whList.add(WorkorderExtServiceImpl.initHistoryByModel(order,user.getId(),Constants.WORKORDER_HISTORY_STATUS.close)); 
 | 
        workorderHistoryExtMapper.insertBatch(whList); 
 | 
    } 
 | 
    @Override 
 | 
    @Transactional(rollbackFor = {BusinessException.class,Exception.class}) 
 | 
    public void cancelById(Workorder param) { 
 | 
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); 
 | 
        if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); 
 | 
        } 
 | 
        if(param.getId()== null){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请按要求填写和选择提交数据!"); 
 | 
        } 
 | 
        Workorder mp = new Workorder(); 
 | 
        mp.setDeleted(Constants.ZERO); 
 | 
        mp.setId(param.getId()); 
 | 
        mp.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        mp = workorderExtMapper.selectOne(mp); 
 | 
        if(mp== null){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); 
 | 
        } 
 | 
        //返回controller层,发送计划统计数据 
 | 
        param.setPlanId(mp.getPlanId()); 
 | 
        WorkorderRecord wr = new WorkorderRecord(); 
 | 
        wr.setWorkorderId(mp.getId()); 
 | 
        wr.setDeleted(Constants.ZERO); 
 | 
        if(workorderRecordExtMapper.selectCount(new QueryWrapper<>(wr)) >0){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已经有投料或产出记录,不能取消!"); 
 | 
        } 
 | 
        /* if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!"); 
 | 
        }*/ 
 | 
        if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create) 
 | 
                &&!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.material)){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!"); 
 | 
        } 
 | 
        List<WorkorderHistory> whList = new ArrayList<>(); 
 | 
        Workorder order = new Workorder(); 
 | 
        order.setUpdateTime(DateUtil.getCurrentDate()); 
 | 
        order.setUpdateUser(user.getId()); 
 | 
        order.setRootDepartId(mp.getRootDepartId()); 
 | 
        order.setDepartId(mp.getDepartId()); 
 | 
        order.setPlanDate(param.getPlanDate()); 
 | 
        //已关闭 
 | 
        order.setStatus(Constants.WORKORDER_STATUS.cancel); 
 | 
        order.setUserDeivceId(param.getUserDeivceId()); 
 | 
        order.setId(mp.getId()); 
 | 
        workorderExtMapper.updateById(order); 
 | 
        //工单历史数据 
 | 
        whList.add(WorkorderExtServiceImpl.initHistoryByModel(order,user.getId(),Constants.WORKORDER_HISTORY_STATUS.cancel)); 
 | 
        workorderHistoryExtMapper.insertBatch(whList); 
 | 
    } 
 | 
  
 | 
    /** 1.计划统计 
 | 
     * 已分配未报工数量=未报工工单(工单状态:已创建、已备料、已检验、已完工)的计划生产数量之和; 
 | 
     * 合格数量=已报工工单(工单状态:已报工、已入库)产出为合格的数量之和; 
 | 
     * 不良数量=已报工工单(工单状态:已报工、已入库)产出为不良的数量之和; 
 | 
     * 
 | 
     * 2.工单统计 
 | 
     * @param param 
 | 
     */ 
 | 
    @Override 
 | 
    @Async 
 | 
    public void statisticNum(Workorder param){ 
 | 
        if(param.getPlanId()== null){ 
 | 
            if(param.getId()== null){ 
 | 
                return; 
 | 
            } 
 | 
            Workorder wModel = new Workorder(); 
 | 
            wModel.setDeleted(Constants.ZERO); 
 | 
            wModel.setId(param.getId()); 
 | 
            wModel = workorderExtMapper.selectOne(wModel); 
 | 
            if(wModel== null){ 
 | 
                return; 
 | 
            } 
 | 
            param.setPlanId(wModel.getPlanId()); 
 | 
        } 
 | 
        Plans plan = plansExtMapper.selectById(param.getPlanId()); 
 | 
        if(plan == null){ 
 | 
            return; 
 | 
        } 
 | 
        JSONObject json = new JSONObject(); 
 | 
        QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); 
 | 
        qw.setPlanId(param.getPlanId()); 
 | 
        qw.setDeleted(Constants.ZERO); 
 | 
        //查询全部工单数据 
 | 
        List<WorkorderExtListVO> orderList = workorderExtMapper.selectList(qw); 
 | 
        //已完工数量 
 | 
        int doneNum=0; 
 | 
        //已分配数量 
 | 
        //已报工工单(包括工单状态:已报工、已入库)的完工数量(包括:合格、不良、报废) 
 | 
        //+未报工工单(包括工单状态:已创建、已备料、已检验、已完工)的已分配数量 
 | 
        int distributNum=0; 
 | 
        //已分配未报工数量=未报工工单(工单状态:已创建、已备料、已检验、已完工)的计划生产数量之和; 
 | 
        int distributeNoDoneNum=0; 
 | 
        //合格数量=已报工工单(工单状态:已报工、已入库)产出为合格的数量之和; 
 | 
        int qulifiedNum=0; 
 | 
        //不良数量=已报工工单(工单状态:已报工、已入库)产出为不良的数量之和; 
 | 
        int unqulifiedNum =0; 
 | 
        int allOrderNum =0; 
 | 
        if(orderList!=null && orderList.size()>0){ 
 | 
            QueryWorkorderRecordExtDTO rw = new QueryWorkorderRecordExtDTO(); 
 | 
            rw.setPlanId(param.getPlanId()); 
 | 
            rw.setDeleted(Constants.ZERO); 
 | 
            //查询全部工单产出和投料数据 
 | 
            List<WorkorderRecordExtListVO> allRecordList = workorderRecordExtMapper.selectListNew(rw); 
 | 
            for(WorkorderExtListVO order : orderList){ 
 | 
                if(Constants.equalsInteger(order.getStatus(),Constants.WORKORDER_STATUS.cancel)){ 
 | 
                    //取消的工单不累计数量 
 | 
                    continue; 
 | 
                } 
 | 
                if(Constants.equalsInteger(order.getStatus(),Constants.WORKORDER_STATUS.create) 
 | 
                ||Constants.equalsInteger(order.getStatus(),Constants.WORKORDER_STATUS.material) 
 | 
                ||Constants.equalsInteger(order.getStatus(),Constants.WORKORDER_STATUS.check) 
 | 
                ||Constants.equalsInteger(order.getStatus(),Constants.WORKORDER_STATUS.done)){ 
 | 
                    //统计已分配未报工数量 
 | 
                    distributeNoDoneNum += Constants.formatIntegerNum(order.getPlanNum()); 
 | 
                } 
 | 
                if(Constants.equalsInteger(order.getStatus(),Constants.WORKORDER_STATUS.baogong) 
 | 
                        || Constants.equalsInteger(order.getStatus(),Constants.WORKORDER_STATUS.instock)){ 
 | 
                   doneNum += Constants.formatIntegerNum(order.getUnqualifiedNum()) + Constants.formatIntegerNum(order.getQualifiedNum()); 
 | 
                   int tNum =Constants.formatIntegerNum(order.getUnqualifiedNum()) + Constants.formatIntegerNum(order.getQualifiedNum()); 
 | 
                   distributNum += tNum; 
 | 
                   allOrderNum += tNum; 
 | 
                }else { 
 | 
                    distributNum += Constants.formatIntegerNum(order.getPlanNum()); 
 | 
                } 
 | 
  
 | 
                List<WorkorderRecordExtListVO> rList = getRecordListById(order.getId(),allRecordList); 
 | 
                if(rList!=null){ 
 | 
                   for(WorkorderRecordExtListVO item : rList){ 
 | 
                        if(Constants.equalsInteger(item.getType(),Constants.WORKORDER_RECORD_TYPE.produce) 
 | 
                            && item.getOmodel()!=null 
 | 
                            && (Constants.equalsInteger(item.getOmodel().getStatus() ,Constants.WORKORDER_STATUS.baogong) 
 | 
                            ||Constants.equalsInteger(item.getOmodel().getStatus() ,Constants.WORKORDER_STATUS.instock))){ 
 | 
                            //如果是产出 
 | 
                            if(Constants.equalsInteger(item.getDoneType(),Constants.ZERO)){ 
 | 
                                //如果是合格产出,累计数量 
 | 
                                qulifiedNum += Constants.formatBigdecimal(item.getNum()).intValue(); 
 | 
                            }else{ 
 | 
                                //如果是不良产出,累计数量 
 | 
                                unqulifiedNum += Constants.formatBigdecimal(item.getNum()).intValue(); 
 | 
                            } 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        json.put(Constants.STATISTIC.distributeNoDone,distributeNoDoneNum); 
 | 
        json.put(Constants.STATISTIC.done,doneNum); 
 | 
        json.put(Constants.STATISTIC.distribute,distributNum); 
 | 
        json.put(Constants.STATISTIC.qulified,qulifiedNum); 
 | 
        json.put(Constants.STATISTIC.unqulified,unqulifiedNum); 
 | 
  
 | 
        UpdateWrapper updateWrapper = new UpdateWrapper(); 
 | 
        Plans p = new Plans(); 
 | 
        p.setId(param.getPlanId()); 
 | 
        p.setStatisticInfo(json.toJSONString()); 
 | 
        p.setUpdateTime(DateUtil.getCurrentDate()); 
 | 
        if( Constants.formatIntegerNum(plan.getNum())  <= allOrderNum){ 
 | 
            //如果满足计划已完工,更新计划状态 
 | 
            p.setStatus(Constants.PLAN_STATUS.done); 
 | 
            if(!Objects.isNull(plan.getWorkPlansId())){ 
 | 
                //更新主订单数据信息 
 | 
               if(plansMapper.selectCount(new QueryWrapper<Plans>() 
 | 
                        .in("STATUS",0,1,4) 
 | 
                        .eq("DELETED",Constants.ZERO) 
 | 
                        .ne("id",p.getId()) 
 | 
                        .eq("WORK_PLANS_ID",plan.getWorkPlansId()))<=Constants.ZERO){ 
 | 
                   WorkPlans  workPlans = workPlansExtMapper.selectById(plan.getWorkPlansId()); 
 | 
                   if(!Objects.isNull(workPlans)){ 
 | 
                       workPlans.setStatus(Constants.WORKPLANHISTORY_TYPE.done); 
 | 
                       workPlans.setUpdateTime(new Date()); 
 | 
                       workPlansExtMapper.updateById(workPlans); 
 | 
                       planHistoryExtMapper.insert(initPlanHistoryByModel(workPlans,null,Constants.WORKPLANHISTORY_TYPE.done)); 
 | 
                   } 
 | 
               }; 
 | 
            } 
 | 
            // 
 | 
            plan.getWorkPlansId(); 
 | 
  
 | 
            updateWrapper.set("STATUS",p.getStatus()); 
 | 
            if(Constants.equalsInteger(plan.getStatus(),Constants.PLAN_STATUS.distribute)){ 
 | 
              //如果已分配 
 | 
              planHistoryExtMapper.insertBatch(Arrays.asList(PlansExtServiceImpl.initHistoryByModel(plan,null,Constants.PLANHISTORY_TYPE.done))); 
 | 
          } 
 | 
//          planHistoryService.create(PlansExtServiceImpl.initHistoryByModel(plan,null,Constants.PLANHISTORY_TYPE.done)); 
 | 
        } 
 | 
        //更新统计信息 
 | 
//        plansExtMapper.updateById(p); 
 | 
        updateWrapper.eq("ID",param.getPlanId()); 
 | 
        updateWrapper.set("STATISTIC_INFO",json.toJSONString()); 
 | 
        updateWrapper.set("UPDATE_TIME",DateUtil.getCurrentDate()); 
 | 
        plansExtMapper.update(null,updateWrapper); 
 | 
//        Workorder order = new Workorder(); 
 | 
//        order.setUpdateTime(DateUtil.getCurrentDate()); 
 | 
//        //已关闭 
 | 
//        order.setId(param.getId()); 
 | 
//        workorderExtMapper.updateById(order); 
 | 
  
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 检测数据有效性 
 | 
     * @param param 
 | 
     * @param user 
 | 
     * @throws BusinessException 
 | 
     */ 
 | 
    private void checkUserAndGroup(Workorder param, LoginUserInfo user) throws BusinessException{ 
 | 
        QueryDeviceExtDTO ud = new QueryDeviceExtDTO(); 
 | 
        ud.setDeleted(Constants.ZERO); 
 | 
        ud.setId(param.getProGroupId()); 
 | 
        ud.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        //查询用户设备关联关系 
 | 
        DeviceExtListVO d = deviceExtMapper.selectByModel( ud ); 
 | 
        if(d == null){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,生产设备信息不正确,请刷新页面重试!"); 
 | 
        } 
 | 
  
 | 
        QueryUserDeviceExtDTO t = new QueryUserDeviceExtDTO(); 
 | 
        t.setDeleted(Constants.ZERO); 
 | 
        t.setUserIdList(param.getProUserList()); 
 | 
        t.setDeviceId(param.getProGroupId()); 
 | 
        //查询班组的公司级部门编码和计划公司级编码一致 
 | 
        t.setUmodelComDepartId(param.getDepartId()); 
 | 
        //查询用户设备关联关系 
 | 
        List<UserDeviceExtListVO> ulist = userDeviceExtMapper.selectList( t ); 
 | 
        if(ulist == null){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,生产人员信息不正确,请刷新页面重试!"); 
 | 
        } 
 | 
        if(ulist.size() < param.getProUserList().size()){ 
 | 
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,存在生产人员信息不正确,请刷新页面重试!"); 
 | 
        } 
 | 
        List<WorkorderUser> userList = new ArrayList<>(); 
 | 
        for(UserDeviceExtListVO uModel : ulist){ 
 | 
            WorkorderUser u = new WorkorderUser(); 
 | 
            u.setProUserId(uModel.getUserId()); 
 | 
            u.setPlanId(param.getId()); 
 | 
            u.setCreateUser(user.getId()); 
 | 
            u.setDeleted(Constants.ZERO); 
 | 
            u.setCreateTime(DateUtil.getCurrentDate()); 
 | 
            u.setRootDepartId(param.getRootDepartId()); 
 | 
            u.setDepartId(param.getDepartId()); 
 | 
            userList.add(u); 
 | 
        } 
 | 
        param.setWorkorderUserList(userList); 
 | 
    } 
 | 
    /** 
 | 
     * 检测数据有效性 
 | 
     * @param param 
 | 
     * @param user 
 | 
     * @throws BusinessException 
 | 
     */ 
 | 
    private void checkUserAndGroupOld(Workorder param, LoginUserInfo user) throws BusinessException{ 
 | 
        QueryUserDeviceExtDTO ud = new QueryUserDeviceExtDTO(); 
 | 
        ud.setDeleted(Constants.ZERO); 
 | 
        ud.setId(param.getUserDeivceId()); 
 | 
        //查询用户设备关联关系 
 | 
        UserDeviceExtListVO uModel = userDeviceExtMapper.selectByModel( ud ); 
 | 
        if(uModel == null){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,生产人员及设备信息不正确,请刷新页面重试!"); 
 | 
        } 
 | 
        //查询人员部门信息 
 | 
        DepartmentExtListVO depart = departmentExtService.getModelById(user.getCompany().getId(),uModel.getUmodel().getDepartmentId()); 
 | 
        if(depart == null){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,生产人员班组信息不存在,请刷新页面重试!"); 
 | 
        } 
 | 
        /* if(!Constants.equalsInteger(depart.getType(),Constants.DEPART_TYPE.group)){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,选择班组错误,请刷新页面重试!"); 
 | 
        }*/ 
 | 
        //查询班组的公司级部门编码和计划公司级编码是否一致,不一致则报错 
 | 
        Integer comDepartId = departmentExtService.getComDepartId(depart); 
 | 
        if(!Constants.equalsInteger(comDepartId,param.getDepartId())){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,班组非计划所属公司组织,请刷新页面重试!"); 
 | 
        } 
 | 
        //生产班组(设备) 
 | 
        param.setProGroupId(uModel.getDeviceId()); 
 | 
        //生产人员 
 | 
        param.setProUserId(uModel.getUserId()); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse preparationWTransfer(String ids, LoginUserInfo userInfo){ 
 | 
        //根据 工单 查询所有工单需要生成转库单 
 | 
        List<WTransferBean> wTransferBeanList = wTransferExtMapper.selectListByWorkorder(ids,userInfo.getId()); 
 | 
        if(wTransferBeanList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询转换转库单信息!"); 
 | 
        } 
 | 
  
 | 
        //根据工单查询所有工单生产需要备料 物料信息 
 | 
        List<WTransferDetailForWOrderBean> wTransferDetailBeanList = wTransferDetailExtMapper.selectListByWorkorder(ids); 
 | 
        if(wTransferDetailBeanList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到需要备料物料!"); 
 | 
        } 
 | 
        List<WTransferDetailForWOrderBean> saveBeanList = new ArrayList<>(); 
 | 
        for (WTransferBean i:wTransferBeanList ) { 
 | 
            //如果是正常工单,分有BOM 和无BOM组成的情况 
 | 
            if(StringUtils.isBlank(i.getWorkorderId())){ 
 | 
                //排除工单编码为空的情况 
 | 
                continue; 
 | 
            } 
 | 
            List<WTransferDetailBean> wTransferDetailBeans = new ArrayList<>(); 
 | 
            if(i.getBackOrderId() !=null){ 
 | 
                //如果是返工返修工单,根据其申请篮筐数据进行备料,(按照篮筐的物料编码和工序编码去重备料) 
 | 
                Backorder backorder  = new Backorder(); 
 | 
                backorder.setId(i.getBackOrderId()); 
 | 
                backorder=  backorderMapper.selectByModel(backorder); 
 | 
                if(backorder == null){ 
 | 
                    throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,查询关联返修申请单有误,请联系管理员!"); 
 | 
                } 
 | 
                String[] orderIds = i.getWorkorderId().split(","); 
 | 
                int tnum = 0; 
 | 
                for(String s : orderIds){ 
 | 
                    //查询全部工单,统计数据 
 | 
                    Workorder mp = new Workorder(); 
 | 
                    mp.setDeleted(Constants.ZERO); 
 | 
                    mp.setId(Integer.parseInt(s)); 
 | 
                    mp.setRootDepartId(userInfo.getRootDepartment().getId()); 
 | 
                    mp = workorderExtMapper.selectOne(mp); 
 | 
                    tnum += Constants.formatIntegerNum(mp.getPlanNum()); 
 | 
                } 
 | 
                WTransferDetailBean wTransferDetailBean = new WTransferDetailBean(); 
 | 
                wTransferDetailBean.setOutPlanNum(new BigDecimal(tnum)); 
 | 
                wTransferDetailBean.setInWarehouseId(i.getInWarehouseId()); 
 | 
                wTransferDetailBean.setInLocationId(i.getInLocationId()); 
 | 
                wTransferDetailBean.setOutWarehouseId(i.getOutWarehouseId()); 
 | 
                wTransferDetailBean.setInUserId(i.getInUserId()); 
 | 
                wTransferDetailBean.setProcedureId(backorder.getProcedureId()); 
 | 
                wTransferDetailBean.setMaterialId(backorder.getMaterialId()); 
 | 
                wTransferDetailBean.setUnitId(backorder.getUnitId()); 
 | 
                wTransferDetailBean.setQualityType(Constants.ONE); 
 | 
                wTransferDetailBeans.add(wTransferDetailBean); 
 | 
            }else{ 
 | 
                String[] orderIds = i.getWorkorderId().split(","); 
 | 
                List<WTransferDetailBean> tempBomList = new ArrayList<>(); 
 | 
                List<WTransferDetailBean> tempNoBomList = new ArrayList<>(); 
 | 
                for(String s : orderIds){ 
 | 
                    //遍历工单查询工单的明细,生成转库明细 
 | 
                    //查询全部bom组成数据,如果有BOM配置,按照BOM组成进行投料,如果没有BOM配置,则投料物料为待生产库位的物料本身 
 | 
                    Workorder mp = new Workorder(); 
 | 
                    mp.setDeleted(Constants.ZERO); 
 | 
                    mp.setId(Integer.parseInt(s)); 
 | 
                    mp.setRootDepartId(userInfo.getRootDepartment().getId()); 
 | 
                    mp = workorderExtMapper.selectOne(mp); 
 | 
                    QueryBomDetailExtDTO bdparam = initBomParam(userInfo,mp); 
 | 
                    if(bdparam!=null){ 
 | 
                        //如果有bom配置,安装物料组成进行备料 
 | 
                        List<BomDetailExtListVO> bomDetailList  = bomDetailExtMapper.selectList(bdparam); 
 | 
                        if(bomDetailList!=null && bomDetailList.size()>0){ 
 | 
                            for(BomDetailExtListVO dm : bomDetailList){ 
 | 
                                // 如果物料和工序都相同,产生一条转出库明细 
 | 
                                WTransferDetailBean tBean = getExistedDateFromList(dm.getMaterialId(),null,tempBomList); 
 | 
                                if(tBean ==null){ 
 | 
                                    WTransferDetailBean wTransferDetailBean = new WTransferDetailBean(); 
 | 
                                    wTransferDetailBean.setOutPlanNum(Constants.formatBigdecimal(dm.getNum()).multiply(new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum())))); 
 | 
                                    wTransferDetailBean.setInWarehouseId(i.getInWarehouseId()); 
 | 
                                    wTransferDetailBean.setInLocationId(i.getInLocationId()); 
 | 
                                    wTransferDetailBean.setOutWarehouseId(i.getOutWarehouseId()); 
 | 
                                    wTransferDetailBean.setInUserId(i.getInUserId()); 
 | 
                                    wTransferDetailBean.setMaterialId(dm.getMaterialId()); 
 | 
                                    this.dealProcedure(wTransferDetailBean); 
 | 
//                                    wTransferDetailBean.setProceduresId(dm.getProcedureId()); 
 | 
                                    wTransferDetailBean.setUnitId(dm.getUnitId()); 
 | 
                                    wTransferDetailBean.setQualityType(Constants.ZERO); 
 | 
                                    tempBomList.add(wTransferDetailBean); 
 | 
                                }else{ 
 | 
                                    tBean.setOutPlanNum(tBean.getOutPlanNum().add(Constants.formatBigdecimal(dm.getNum()).multiply(new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum()))))); 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                    }else{ 
 | 
                        //如果没有bom,进行上一道工序的物料备料 
 | 
                        Integer lastPId = getLastProcudureId(mp.getProcedureId(),mp); 
 | 
                        if(lastPId==null){ 
 | 
                            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到生产物料上一道工序数据"); 
 | 
                        } 
 | 
                        // 如果物料和工序都相同,产生一条转出库明细 
 | 
                        WTransferDetailBean tBean = getExistedDateFromList(mp.getMaterialId(),lastPId,tempNoBomList); 
 | 
                        if(tBean ==null){ 
 | 
                            WTransferDetailBean wTransferDetailBean = new WTransferDetailBean(); 
 | 
                            wTransferDetailBean.setOutPlanNum(new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum()))); 
 | 
                            wTransferDetailBean.setInWarehouseId(i.getInWarehouseId()); 
 | 
                            wTransferDetailBean.setInLocationId(i.getInLocationId()); 
 | 
                            wTransferDetailBean.setOutWarehouseId(i.getOutWarehouseId()); 
 | 
                            wTransferDetailBean.setInUserId(i.getInUserId()); 
 | 
                            wTransferDetailBean.setProcedureId(lastPId); 
 | 
                            wTransferDetailBean.setMaterialId(mp.getMaterialId()); 
 | 
                            wTransferDetailBean.setUnitId(mp.getUnitId()); 
 | 
                            wTransferDetailBean.setQualityType(Constants.ZERO); 
 | 
                            tempNoBomList.add(wTransferDetailBean); 
 | 
                        }else{ 
 | 
                            tBean.setOutPlanNum(tBean.getOutPlanNum().add(Constants.formatBigdecimal(new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum()))))); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
                if(tempBomList.size()>0){ 
 | 
                    wTransferDetailBeans.addAll(tempBomList); 
 | 
                } 
 | 
                if(tempNoBomList.size()>0){ 
 | 
                    wTransferDetailBeans.addAll(tempNoBomList); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            i.setOrigin(Constants.ZERO); 
 | 
            i.setOriginType(Constants.ONE); 
 | 
            i.setOriginId(i.getWorkorderId()); 
 | 
            i.setOriginCode(i.getWorkorderCode()); 
 | 
            i.setWTransferDetailBeanList(wTransferDetailBeans); 
 | 
            wTransferService.saveBean(i,userInfo); 
 | 
            saveBeanList.clear(); 
 | 
        }; 
 | 
        //更新工单状态 
 | 
        List<WorkorderHistory> whList = new ArrayList<>(); 
 | 
        for (String s:ids.split(",")) { 
 | 
            Workorder workorder = new Workorder(); 
 | 
            workorder.setId(Integer.parseInt(s)); 
 | 
            workorder.setUpdateUser(userInfo.getId()); 
 | 
            workorder.setUpdateTime(DateUtil.getCurrentDate()); 
 | 
            workorder.setStatus(Constants.WORKORDER_STATUS.material); 
 | 
            //工单历史数据 
 | 
            whList.add(WorkorderExtServiceImpl.initHistoryByModel(workorder,userInfo.getId(),Constants.WORKORDER_HISTORY_STATUS.material)); 
 | 
            workorderMapper.updateById(workorder); 
 | 
        } 
 | 
        if(whList.size()>0){ 
 | 
            workorderHistoryExtMapper.insertBatch(whList); 
 | 
        } 
 | 
  
 | 
        return ApiResponse.success("创建成功"); 
 | 
    } 
 | 
  
 | 
    private Integer getLastProcudureId(Integer proceduresId, Workorder mp) { 
 | 
        List<RouteProcedure> rpList = null; 
 | 
        if (mp.getBomModel() != null && mp.getBomModel().getRouteId() != null) { 
 | 
            // 
 | 
            if (mp.getBomModel().getRouteId() != null) { 
 | 
                RouteProcedure rp = new RouteProcedure(); 
 | 
                rp.setDeleted(Constants.ZERO); 
 | 
                rp.setRouteId(mp.getBomModel().getRouteId()); 
 | 
                rp.setDepartId(mp.getFactoryId()); 
 | 
                rpList = routeProcedureExtMapper.selectList(new QueryWrapper<>(rp).orderByAsc("SORTNUM")); 
 | 
            } 
 | 
        } else { 
 | 
            //没有bom的情况 
 | 
            RouteProcedure rp = new RouteProcedure(); 
 | 
            rp.setDeleted(Constants.ZERO); 
 | 
            rp.setDepartId(mp.getFactoryId()); 
 | 
            rpList = routeProcedureExtMapper.selectList(new QueryWrapper<>(rp).exists("select bom.id from bom where bom.material_id=" + mp.getMaterialId() + " and bom.route_id =route_procedure.route_id and bom.deleted=0").orderByAsc("SORTNUM")); 
 | 
  
 | 
        } 
 | 
        if (rpList != null && rpList.size() > 0) { 
 | 
            for (int i = 0; i < rpList.size(); i++) { 
 | 
                RouteProcedure r = rpList.get(i); 
 | 
                if (Constants.equalsInteger(r.getProcedureId(), proceduresId)) { 
 | 
                    //如果工序相同,找下一工序 
 | 
                    if (i >0) { 
 | 
                        return rpList.get(i - 1).getProcedureId(); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    return null; 
 | 
    } 
 | 
  
 | 
    private QueryBomDetailExtDTO initBomParam(LoginUserInfo user, Workorder mp)  throws BusinessException{ 
 | 
        QueryBomExtDTO bb = new QueryBomExtDTO(); 
 | 
        bb.setDepartId(mp.getDepartId()); 
 | 
        bb.setDeleted(Constants.ZERO); 
 | 
        bb.setRootDepartId(user.getRootDepartment().getId()); 
 | 
        bb.setMaterialId(mp.getMaterialId()); 
 | 
        bb.setProcedureId(mp.getProcedureId()); 
 | 
        BomExtListVO versionBom = bomExtMapper.selectByModel( bb); 
 | 
        if(versionBom == null || StringUtils.isBlank(versionBom.getVersion()) || versionBom.getBomVersionId() == null){ 
 | 
            return  null; 
 | 
            // throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该工单物料BOM信息配置有误,请联系管理员!"); 
 | 
        } 
 | 
        mp.setBomModel(versionBom); 
 | 
        QueryBomDetailExtDTO  bom = new QueryBomDetailExtDTO(); 
 | 
        bom.setDeleted(Constants.ZERO); 
 | 
        bom.setBomId(versionBom.getBomVersionId()); 
 | 
//        bom.setProcedureId(mp.getProcedureId()); 
 | 
        bom.setWorkorderId(mp.getId()); 
 | 
        return bom; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 如果物料和工序都相同,产生一条转出库明细 
 | 
     * @param mId 
 | 
     * @param tempList 
 | 
     * @return 
 | 
     */ 
 | 
    private WTransferDetailBean getExistedDateFromList(Integer mId,Integer pId, List<WTransferDetailBean> tempList) { 
 | 
        for(WTransferDetailBean tBean : tempList){ 
 | 
            if((pId!=null && Constants.equalsInteger(tBean.getProcedureId(),pId))&& Constants.equalsInteger(mId,tBean.getMaterialId())){ 
 | 
                return tBean; 
 | 
            } 
 | 
            if(pId==null && Constants.equalsInteger(mId,tBean.getMaterialId())){ 
 | 
                return tBean; 
 | 
            } 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
    //    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse preparationWTransferOld(String ids, LoginUserInfo userInfo){ 
 | 
        List<Workorder> workorderList = workorderMapper.selectList(new QueryWrapper<Workorder>() 
 | 
                .apply(" 1 = 1 and  find_in_set( workorder.id ,'"+ids+"') and status = 0  ") 
 | 
        ); 
 | 
        if(workorderList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到工单信息!"); 
 | 
        } 
 | 
        //根据 工单 查询所有工单需要生成转库单 
 | 
        List<WTransferBean> wTransferBeanList = wTransferExtMapper.selectListByWorkorder(ids,userInfo.getId()); 
 | 
        if(wTransferBeanList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询转换转库单信息!"); 
 | 
        } 
 | 
        //判断是否存在多个转出仓库 
 | 
        if(this.verifyProceduresId(wTransferBeanList)){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,当前备料工序存在多个!"); 
 | 
        }; 
 | 
        //根据工单查询所有工单生产需要备料 物料信息 
 | 
        List<WTransferDetailForWOrderBean> wTransferDetailBeanList = wTransferDetailExtMapper.selectListByWorkorder(ids); 
 | 
        if(wTransferDetailBeanList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到需要备料物料!"); 
 | 
        } 
 | 
        List<WTransferDetailForWOrderBean> saveBeanList = new ArrayList<>(); 
 | 
        for (WTransferBean i:wTransferBeanList ) { 
 | 
            StringBuffer sbf_id = new StringBuffer(); 
 | 
            StringBuffer sbf_code = new StringBuffer(); 
 | 
  
 | 
            for (Workorder j:workorderList) { 
 | 
                    sbf_id.append(","+j.getId()); 
 | 
                    sbf_code.append(","+j.getCode()); 
 | 
            } 
 | 
  
 | 
            List<WTransferDetailBean> wTransferDetailBeans = new ArrayList<>(); 
 | 
            for (WTransferDetailForWOrderBean j:wTransferDetailBeanList) { 
 | 
                if(Objects.equals(i.getInUserId(),j.getInUserId())&&Objects.equals(i.getInWarehouseId(),j.getInWarehouseId())&&Objects.equals(i.getInLocationId(),j.getInLocationId())){ 
 | 
                    WTransferDetailBean wTransferDetailBean = new WTransferDetailBean(); 
 | 
                    wTransferDetailBean.setOutPlanNum(j.getOutPlanNum()); 
 | 
                    wTransferDetailBean.setInWarehouseId(j.getInWarehouseId()); 
 | 
                    wTransferDetailBean.setInLocationId(j.getInLocationId()); 
 | 
                    wTransferDetailBean.setOutWarehouseId(j.getOutWarehouseId()); 
 | 
                    wTransferDetailBean.setInUserId(j.getInUserId()); 
 | 
                    wTransferDetailBean.setProceduresId(j.getProceduresId()); 
 | 
                    //查询出对象数据 转换 
 | 
                    if(Objects.isNull(j.getMaterialId())){ 
 | 
                        wTransferDetailBean.setMaterialId(j.getWorkorderMaterialId()); 
 | 
                        wTransferDetailBean.setUnitId(j.getWorkorderUnitlId()); 
 | 
                        //根据工单生产物料 查询BOM 获取工艺路线  配合当前工单工序 查询到上一个工序 
 | 
                        this.dealProcedureId(wTransferDetailBean); 
 | 
                    }else{ 
 | 
                        wTransferDetailBean.setMaterialId(j.getMaterialId()); 
 | 
                        wTransferDetailBean.setUnitId(j.getUnitId()); 
 | 
//                        wTransferDetailBean.setProcedureId(j.getProceduresId()); 
 | 
                    } 
 | 
                    if(j.getType() == Constants.ZERO){ 
 | 
                        wTransferDetailBean.setQualityType(Constants.ZERO); 
 | 
                    }else{ 
 | 
                        wTransferDetailBean.setQualityType(Constants.ONE); 
 | 
                    } 
 | 
                    wTransferDetailBeans.add(wTransferDetailBean); 
 | 
                } 
 | 
            } 
 | 
            i.setOrigin(Constants.ZERO); 
 | 
            i.setOriginType(Constants.ONE); 
 | 
            i.setOriginId(sbf_id.toString().substring(1,sbf_id.length())); 
 | 
            i.setOriginCode(sbf_code.toString().substring(1,sbf_code.length())); 
 | 
            i.setWTransferDetailBeanList(wTransferDetailBeans); 
 | 
            wTransferService.saveBean(i,userInfo); 
 | 
            saveBeanList.clear(); 
 | 
        }; 
 | 
        //更新工单状态 
 | 
        for (Workorder j:workorderList) { 
 | 
             j.setStatus(Constants.ONE); 
 | 
             workorderMapper.updateById(j); 
 | 
        } 
 | 
  
 | 
        return ApiResponse.success("创建成功"); 
 | 
    } 
 | 
  
 | 
  
 | 
    public void dealProcedureId(WTransferDetailBean wTransferDetailBean){ 
 | 
        Bom b = bomExtMapper.selectOne(new QueryWrapper<Bom>() 
 | 
                .eq("MATERIAL_ID",wTransferDetailBean.getMaterialId()) 
 | 
                .eq("DELETED",Constants.ZERO) 
 | 
                .eq("STATUS",Constants.ONE) 
 | 
        ); 
 | 
        if(Objects.isNull(b)){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到生产物料BOM数据"); 
 | 
        } 
 | 
        RouteProcedure currentRouteProcedure   = routeProcedureExtMapper.selectOne(new QueryWrapper<RouteProcedure>() 
 | 
                .eq("ROUTE_ID",b.getRouteId()) 
 | 
                .eq("PROCEDURE_ID",wTransferDetailBean.getProceduresId()) 
 | 
                .last(" limit 1 ") 
 | 
        ); 
 | 
  
 | 
        if(Objects.isNull(currentRouteProcedure)){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "未查询到生产物料工艺路线数据"); 
 | 
        } 
 | 
        RouteProcedure  previousRouteProcedure = routeProcedureExtMapper.selectOne(new QueryWrapper<RouteProcedure>() 
 | 
                .eq("ROUTE_ID",b.getRouteId()) 
 | 
                .apply(" SORTNUM <  "+currentRouteProcedure.getSortnum()+" ") 
 | 
                .orderByDesc(" SORTNUM ") 
 | 
                .last(" limit 1 ") 
 | 
        ); 
 | 
        wTransferDetailBean.setProcedureId(previousRouteProcedure.getProcedureId()); 
 | 
  
 | 
  
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public synchronized  String  getNextCode(Integer comId ){ 
 | 
        String prefix =   DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; 
 | 
        Integer countNum  = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.COM_WORKORDER_CODE_KEY+comId,Integer.class); 
 | 
        countNum = Constants.formatIntegerNum(countNum)+1; 
 | 
        //更新缓存 
 | 
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_WORKORDER_CODE_KEY+comId,countNum); 
 | 
        String nextIndex =Integer.toString( countNum); 
 | 
        return prefix + StringUtils.leftPad(nextIndex,4,"0"); 
 | 
    } 
 | 
  
 | 
    public Boolean verifyProceduresId(List<WTransferBean> wTransferBenaList){ 
 | 
        Boolean flag = false; 
 | 
        String proceduresId = ""; 
 | 
        Integer type = Constants.ZERO ; 
 | 
        for (WTransferBean w:wTransferBenaList) { 
 | 
            if(proceduresId.contains(w.getProceduresId()+"")){ 
 | 
                continue; 
 | 
            }else{ 
 | 
                proceduresId+=Constants.formatIntegerNum(w.getProceduresId())+","; 
 | 
                type = type + Constants.ONE; 
 | 
            } 
 | 
        } 
 | 
        if(type > Constants.ONE){ 
 | 
            flag = true; 
 | 
        } 
 | 
        return flag; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 
 | 
     * @param deviceIds 设备主键 ,分割 
 | 
     * @param inIds  入库单主键 ,分割 
 | 
     * @param userInfo 用户信息 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public ApiResponse<FinishedInBean> finishedDetail(String deviceIds,String inIds,LoginUserInfo userInfo){ 
 | 
        //根据设备主键获取设备信息 
 | 
        List<Device> deviceList = deviceMapper.selectList( 
 | 
                new QueryWrapper<Device>() 
 | 
                        .eq("deleted",Constants.ZERO) 
 | 
                        .apply(" find_in_set(id,'"+deviceIds+"') ") 
 | 
        ); 
 | 
        if(deviceList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到设备信息!"); 
 | 
        } 
 | 
        CompanyUser companyUser  = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                .eq("USER_ID",userInfo.getId()) 
 | 
                .eq("ROOT_DEPART_ID",userInfo.getRootDepartment().getId()) 
 | 
                .eq("deleted",0) 
 | 
        ); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工信息"); 
 | 
        } 
 | 
        Department department = departmentExtMapper.selectById(companyUser.getDepartmentId()); 
 | 
        if(Objects.isNull(department)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工班组信息"); 
 | 
        } 
 | 
  
 | 
        //待生产货位 
 | 
        StringBuffer produceLocationIds = new StringBuffer(); 
 | 
        //已完工货位 
 | 
        StringBuffer finishLocationIds = new StringBuffer(); 
 | 
        //全部货位 
 | 
        StringBuffer allIds = new StringBuffer(); 
 | 
        for (int i = 0; i < deviceList.size(); i++) { 
 | 
            if(i==Constants.ZERO){ 
 | 
                allIds.append(deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                allIds.append(","+deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
                produceLocationIds.append(deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                finishLocationIds.append(deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
            }else{ 
 | 
                allIds.append(","+deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                allIds.append(","+deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
                produceLocationIds.append(","+deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                finishLocationIds.append(","+deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
            } 
 | 
        } 
 | 
        FinishedInBean finishedInBean = new FinishedInBean(); 
 | 
        finishedInBean.setWorker(companyUser.getName()); 
 | 
        finishedInBean.setGroupName(department.getName()); 
 | 
        finishedInBean.setDeviceList(deviceList); 
 | 
        finishedInBean.setFinishedQualified( 
 | 
                appliancesExtMapper.getTypeNumByLocationId(finishLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.qualified,null,null)); 
 | 
        finishedInBean.setFinishedUndesirable( 
 | 
                appliancesExtMapper.getTypeNumByLocationId(finishLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.rejects,null,null)); 
 | 
        finishedInBean.setFinishedScrap( 
 | 
                appliancesExtMapper.getTypeNumByLocationId(finishLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.scrap,null,null)); 
 | 
        finishedInBean.setQualified( 
 | 
                appliancesExtMapper.getTypeNumByLocationId(produceLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.qualified,null,inIds)); 
 | 
        finishedInBean.setUndesirable( 
 | 
                appliancesExtMapper.getTypeNumByLocationId(produceLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.rejects,null,inIds)); 
 | 
        finishedInBean.setSurplus(appliancesExtMapper.getNumByInIds(inIds)); 
 | 
        List<AppliancesMaterialBean> appliancesMaterialBeanList = appliancesExtMapper.getMaterialByLocationId(allIds.toString()); 
 | 
        for (AppliancesMaterialBean appliancesMaterialBean:appliancesMaterialBeanList) { 
 | 
            appliancesMaterialBean.setFinishedQualified( 
 | 
                    appliancesExtMapper.getTypeNumUnitByLocationId(finishLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.qualified,appliancesMaterialBean.getMaterialId(),null)); 
 | 
            appliancesMaterialBean.setFinishedUndesirable( 
 | 
                    appliancesExtMapper.getTypeNumUnitByLocationId(finishLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.rejects,appliancesMaterialBean.getMaterialId(),null)); 
 | 
            appliancesMaterialBean.setFinishedScrap( 
 | 
                    appliancesExtMapper.getTypeNumUnitByLocationId(finishLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.scrap,appliancesMaterialBean.getMaterialId(),null)); 
 | 
            appliancesMaterialBean.setQualified( 
 | 
                    appliancesExtMapper.getTypeNumUnitByLocationId(produceLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.qualified,appliancesMaterialBean.getMaterialId(),inIds)); 
 | 
            appliancesMaterialBean.setUndesirable( 
 | 
                    appliancesExtMapper.getTypeNumUnitByLocationId(produceLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.rejects,appliancesMaterialBean.getMaterialId(),inIds)); 
 | 
        } 
 | 
        finishedInBean.setAppliancesMaterialBeanList(appliancesMaterialBeanList); 
 | 
        if(StringUtils.isNotBlank(inIds)){ 
 | 
            List<FinishedInBillBean> finishedInBillBeanList = wOutboundExtMapper.finishedInBill(null,inIds); 
 | 
            for (FinishedInBillBean finishedInBillBean:finishedInBillBeanList) { 
 | 
                List<AppliancesMaterialBean>  appliancesMaterialBeans =  appliancesExtMapper.getMaterialByInIdLocationIds(finishedInBillBean.getId(),produceLocationIds.toString()); 
 | 
                for (AppliancesMaterialBean appliancesMaterialBean:appliancesMaterialBeans) { 
 | 
                    appliancesMaterialBean.setQualified(appliancesExtMapper.getMaterialNumTypeByInIdLocationIds(finishedInBillBean.getId(),produceLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.qualified,appliancesMaterialBean.getMaterialId())); 
 | 
                    appliancesMaterialBean.setUndesirable(appliancesExtMapper.getMaterialNumTypeByInIdLocationIds(finishedInBillBean.getId(),produceLocationIds.toString(),Constants.APPLIANCES_TYPE_LABLE.rejects,appliancesMaterialBean.getMaterialId())); 
 | 
                } 
 | 
                finishedInBillBean.setAppliancesMaterialBeanList(appliancesMaterialBeans); 
 | 
            } 
 | 
            finishedInBean.setFinishedInBillBeanList(finishedInBillBeanList); 
 | 
        } 
 | 
        finishedInBean.setProduceLocationIds(produceLocationIds.toString()); 
 | 
  
 | 
        return ApiResponse.success(finishedInBean); 
 | 
    } 
 | 
  
 | 
  
 | 
    @Override 
 | 
    @Transactional 
 | 
    public ApiResponse<Integer> dataToWtWO(String deviceIds,String inIds,LoginUserInfo userInfo){ 
 | 
        //根据设备主键获取设备信息 
 | 
        List<Device> deviceList = deviceMapper.selectList( 
 | 
                new QueryWrapper<Device>() 
 | 
                        .select( " * , ( select w.WAREHOUSE_ID from warehouse_location w where w.id = device.PRODUCE_WAREHOUSE_LOCATION_ID limit 1  ) as produceWarehouseId ,  ( select w.WAREHOUSE_ID  from warehouse_location w where w.id = device.FINISH_WAREHOUSE_LOCATION_ID limit 1  ) as finishWarehouseId  " ) 
 | 
                        .eq("deleted",Constants.ZERO) 
 | 
                        .apply(" find_in_set(id,'"+deviceIds+"') ") 
 | 
        ); 
 | 
        if(deviceList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到设备信息!"); 
 | 
        } 
 | 
        CompanyUser companyUser  = companyUserExtMapper.selectOne( 
 | 
                new QueryWrapper<CompanyUser>() 
 | 
                        .eq("USER_ID",userInfo.getId()) 
 | 
                        .eq("root_depart_id",userInfo.getRootDepartment().getId()) 
 | 
                        .eq("DELETED",Constants.ZERO) 
 | 
        ); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工信息"); 
 | 
        } 
 | 
        Department department = departmentExtMapper.selectById(companyUser.getDepartmentId()); 
 | 
        if(Objects.isNull(department)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工班组信息"); 
 | 
        } 
 | 
        Integer produceId = null; 
 | 
        //待生产货位 
 | 
        StringBuffer produceLocationIds = new StringBuffer(); 
 | 
        //已完工货位 
 | 
        StringBuffer finishLocationIds = new StringBuffer(); 
 | 
        //全部货位 
 | 
        StringBuffer allIds = new StringBuffer(); 
 | 
        //全部仓库 
 | 
        Set<Integer> allWareHouse = new HashSet<>(); 
 | 
        for (int i = 0; i < deviceList.size(); i++) { 
 | 
            allWareHouse.add(deviceList.get(i).getFinishWarehouseId()); 
 | 
            allWareHouse.add(deviceList.get(i).getProduceWarehouseId()); 
 | 
            if(i==Constants.ZERO){ 
 | 
                produceId = deviceList.get(i).getProcedureId(); 
 | 
                allIds.append(deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                allIds.append(","+deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
                produceLocationIds.append(deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                finishLocationIds.append(deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
            }else{ 
 | 
                allIds.append(","+deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                allIds.append(","+deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
                produceLocationIds.append(","+deviceList.get(i).getProduceWarehouseLocationId()); 
 | 
                finishLocationIds.append(","+deviceList.get(i).getFinishWarehouseLocationId()); 
 | 
            } 
 | 
        } 
 | 
        List<AppliancesFroWTransferBean> appliancesFroWTransferBeanList = 
 | 
                appliancesExtMapper.getDataToWTransferNew(produceId,allIds.toString(),inIds); 
 | 
                //appliancesExtMapper.getDataToWTransfer(produceId,produceLocationIds.toString(),finishLocationIds.toString(),inIds,Constants.APPLIANCES_TYPE_LABLE.qualified,Constants.APPLIANCES_TYPE_LABLE.rejects,Constants.APPLIANCES_TYPE_LABLE.scrap); 
 | 
        if(appliancesFroWTransferBeanList.size() == Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到转库数据信息!"); 
 | 
        } 
 | 
        //创建转库单 w_transfer 
 | 
        WTransfer wTransfer = new WTransfer(); 
 | 
        wTransfer.setOrigin(Constants.ONE); 
 | 
//        wTransfer.setOriginType(Constants.TWO); 
 | 
        wTransfer.setRootDepartId(userInfo.getRootDepartment().getId()); 
 | 
        wTransfer.setOutDepartId(userInfo.getCurComDepartment().getId()); 
 | 
        wTransfer.setInDepartId(userInfo.getCurComDepartment().getId()); 
 | 
        wTransfer.setOutWarehouseId(appliancesFroWTransferBeanList.get(Constants.ZERO).getOutWarehouseId()); 
 | 
//        wTransfer.setInWarehouseId(appliancesFroWTransferBeanList.get(Constants.ZERO).getInWarehouseId()); 
 | 
        wTransfer.setOutUserId(userInfo.getId()); 
 | 
        //根据工序 得到入库仓库 
 | 
        Procedures procedures = proceduresMapper.selectById(produceId); 
 | 
        if(Objects.isNull(procedures)){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到工序信息(创建转库单)!"); 
 | 
        } 
 | 
        Warehouse warehouseForIn = warehouseMapper.selectById(procedures.getProduceWarehouseId()); 
 | 
        if(Objects.isNull(warehouseForIn)){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到入库仓库信息(创建转库单)!"); 
 | 
        } 
 | 
        wTransfer.setInUserId(warehouseForIn.getManagerId()); 
 | 
        wTransfer.setOutPlandate(new Date()); 
 | 
        wTransfer.setInPlandate(new Date()); 
 | 
        wTransfer.setType(4); 
 | 
        wTransfer.setOutActdate(new Date()); 
 | 
        wTransfer.setCreateTime(new Date()); 
 | 
        wTransfer.setCreateUser(userInfo.getId()); 
 | 
        wTransfer.setCode(wTransferService.getNextCode(userInfo.getCompany().getId())); 
 | 
        wTransfer.setValidDate(new Date()); 
 | 
        wTransfer.setStatus(Constants.ONE); 
 | 
        wTransferExtMapper.insert(wTransfer); 
 | 
  
 | 
        //创建转库单明细 w_transfer_detail 
 | 
        for (AppliancesFroWTransferBean appliancesFroWTransferBean:appliancesFroWTransferBeanList) { 
 | 
            WTransferDetail wTransferDetail = new WTransferDetail(); 
 | 
            wTransferDetail.setUnitId(appliancesFroWTransferBean.getUnitId()); 
 | 
            wTransferDetail.setMaterialId(appliancesFroWTransferBean.getMaterialId()); 
 | 
            if(StringUtils.isNotBlank(appliancesFroWTransferBean.getBatch())){ 
 | 
                wTransferDetail.setBatch(appliancesFroWTransferBean.getBatch()); 
 | 
            } 
 | 
            wTransferDetail.setOutPlannum(appliancesFroWTransferBean.getOutNum()); 
 | 
            wTransferDetail.setOutActnum(appliancesFroWTransferBean.getOutNum()); 
 | 
            wTransferDetail.setOutWarehouseId(appliancesFroWTransferBean.getOutWarehouseId()); 
 | 
            wTransferDetail.setInWarehouseId(appliancesFroWTransferBean.getInWarehouseId()); 
 | 
            wTransferDetail.setCreateUser(userInfo.getId()); 
 | 
            wTransferDetail.setRootDepartId(userInfo.getRootDepartment().getId()); 
 | 
            wTransferDetail.setTransferId(wTransfer.getId()); 
 | 
            wTransferDetail.setOutDepartId(wTransfer.getOutDepartId()); 
 | 
            wTransferDetail.setInDepartId(wTransfer.getInDepartId()); 
 | 
            wTransferDetail.setOutLocationId(appliancesFroWTransferBean.getOutLocationId()); 
 | 
            wTransferDetail.setOutActdate(new Date()); 
 | 
            wTransferDetail.setQualityType(appliancesFroWTransferBean.getQualityType()); 
 | 
            if(Constants.equalsInteger(wTransferDetail.getQualityType(),Constants.QUALITIY_TYPE.scrap)){ 
 | 
                wTransferDetail.setInWarehouseId(appliancesFroWTransferBean.getInScrapWarehouseId()); 
 | 
            }else if(Constants.equalsInteger(wTransferDetail.getQualityType(),Constants.QUALITIY_TYPE.unqulified)){ 
 | 
                wTransferDetail.setInWarehouseId(appliancesFroWTransferBean.getInBadWarehouseId()); 
 | 
            } else{ 
 | 
                wTransferDetail.setInWarehouseId(appliancesFroWTransferBean.getInWarehouseId()); 
 | 
            } 
 | 
            wTransferDetail.setProcedureId(appliancesFroWTransferBean.getProcedureId()); 
 | 
            wTransferDetailExtMapper.insert(wTransferDetail); 
 | 
        } 
 | 
  
 | 
        //转库单操作记录 
 | 
        WHistory wHistoryTransfer = wTransfer.toWHistory(userInfo); 
 | 
        wHistoryMapper.insert(wHistoryTransfer); 
 | 
  
 | 
        List<Appliances> outWarehouseIdList = appliancesMapper.selectList(new QueryWrapper<Appliances>() 
 | 
                .select(" WAREHOUSE_ID as warehouseId ") 
 | 
                .apply(" find_in_set( LOCATION_ID , '"+allIds+"' ) " + 
 | 
                        " and   not exists ( select 1  from w_outbound_record r inner join appliances ap " + 
 | 
                        "      on r.APPLIANCES_ID = ap.ID " + 
 | 
                        "      where 1 = 1 and  FIND_IN_SET(r.OUTBOUND_ID, '"+inIds+"' ) " + 
 | 
                        "      and ap.id  = appliances.id  ) ") 
 | 
                .apply("    not exists (  select 1 from workorder wo inner join workorder_record wr on wo.id = wr.WORKORDER_ID " + 
 | 
                        " where wo.status in ( 0 , 1 , 3 ) and wr.TYPE = 0 and wr.APPLIANCES_ID = appliances.id and  wr.DELETED = 0 )  ") 
 | 
                .groupBy(" WAREHOUSE_ID ") 
 | 
        ); 
 | 
  
 | 
        List<Appliances> outDetailList = appliancesMapper.selectList(new QueryWrapper<Appliances>() 
 | 
                .select(" WAREHOUSE_ID as warehouseId  , LOCATION_ID as locationId , MATERIAL_ID as materialId , " + 
 | 
                        " ( select m.UNIT_ID from material_distribute m where m.id = appliances.MATERIAL_ID limit 1  ) as unitId ," + 
 | 
                        " ifNull(sum(appliances.NUM),0) as num , BATCH , PROCEDURE_ID , QUALITY_TYPE ") 
 | 
                .apply(" find_in_set( LOCATION_ID , '"+allIds+"' ) " + 
 | 
                        " and   not exists ( select 1  from w_outbound_record r inner join appliances ap " + 
 | 
                        "      on r.APPLIANCES_ID = ap.ID " + 
 | 
                        "      where 1 = 1 and  FIND_IN_SET(r.OUTBOUND_ID, '"+inIds+"' ) " + 
 | 
                        "      and ap.id  = appliances.id   ) ") 
 | 
                .apply("    not exists (  select 1 from workorder wo inner join workorder_record wr on wo.id = wr.WORKORDER_ID " + 
 | 
                        " where wo.status in ( 0 , 1 , 3 ) and wr.TYPE = 0 and wr.APPLIANCES_ID = appliances.id and  wr.DELETED = 0  )  ") 
 | 
                .groupBy(" WAREHOUSE_ID ,LOCATION_ID , MATERIAL_ID , WORKORDER_ID ,PROCEDURE_ID , QUALITY_TYPE ,BATCH ") 
 | 
        ); 
 | 
  
 | 
        List<Appliances> appliancesList = appliancesMapper.selectList(new QueryWrapper<Appliances>() 
 | 
                .apply(" find_in_set( LOCATION_ID , '"+allIds+"' ) " + 
 | 
                        " and   not exists ( select 1  from w_outbound_record r inner join appliances ap " + 
 | 
                        "      on r.APPLIANCES_ID = ap.ID " + 
 | 
                        "      where 1 = 1 and  FIND_IN_SET(r.OUTBOUND_ID, '"+inIds+"' ) " + 
 | 
                        "      and ap.id  = appliances.id   ) ") 
 | 
                .apply("    not exists (  select 1 from workorder wo inner join workorder_record wr on wo.id = wr.WORKORDER_ID " + 
 | 
                        " where wo.status in ( 0 , 1 , 3 ) and wr.TYPE = 0 and wr.APPLIANCES_ID = appliances.id  and  wr.DELETED = 0 )  ") 
 | 
        ); 
 | 
  
 | 
        for (Appliances i:outWarehouseIdList) { 
 | 
            //生成出库单单头 
 | 
            WOutbound wOutbound = new WOutbound(); 
 | 
            wOutbound.setCreateUser(userInfo.getId()); 
 | 
            wOutbound.setCreateTime(new Date()); 
 | 
            wOutbound.setRootDepartId(userInfo.getRootDepartment().getId()); 
 | 
            wOutbound.setBillType(Constants.WOUTBOUND_BILLTYPE.finish); 
 | 
            wOutbound.setDepartId(userInfo.getComDepartment().getId()); 
 | 
            wOutbound.setCode(wOutboundService.getNextOutCode(userInfo.getCompany().getId())); 
 | 
            wOutbound.setOrigin(Constants.ONE); 
 | 
            wOutbound.setValidDate(new Date()); 
 | 
            wOutbound.setType(Constants.ZERO); 
 | 
            wOutbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.transfer); 
 | 
            wOutbound.setOriginCode(wTransfer.getCode()); 
 | 
            wOutbound.setOriginId(wTransfer.getId()); 
 | 
            wOutbound.setUserId(userInfo.getId()); 
 | 
            wOutbound.setWarehouseId(i.getWarehouseId()); 
 | 
            wOutbound.setDealDate(new Date()); 
 | 
            wOutbound.setStatus(Constants.ONE); 
 | 
            wOutbound.setPlanDate(wTransfer.getOutPlandate()); 
 | 
            //TODO 工序编码 wOutbound.setProcedureId(); 
 | 
            wOutboundExtMapper.insert(wOutbound); 
 | 
            //获取仓库信息 
 | 
            Warehouse warehouse = warehouseMapper.selectById(i.getWarehouseId()); 
 | 
            if(Objects.isNull(warehouse)){ 
 | 
                throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库数据【" + i.getId() + "】"); 
 | 
            } 
 | 
            for (Appliances j:outDetailList) { 
 | 
                if(Objects.equals(j.getWarehouseId(),i.getWarehouseId())){ 
 | 
                    //更新库存 
 | 
                    List<WStock> wStockList = wStockMapper.selectList(new QueryWrapper<WStock>() 
 | 
                            .eq("ROOT_DEPART_ID", wOutbound.getRootDepartId()) 
 | 
                            .eq("MATERIAL_ID", j.getMaterialId()) 
 | 
                            .eq("WAREHOUSE_ID", i.getWarehouseId()) 
 | 
                            .eq(j.getProcedureId()!= null,"PROCEDURE_ID", j.getProcedureId()) 
 | 
                            .eq(j.getQualityType()!= null,"QUALITY_TYPE", j.getQualityType()) 
 | 
                            .eq(!StringUtils.isBlank(j.getBatch()),"BATCH", j.getBatch()) 
 | 
                            .isNull(j.getProcedureId()== null,"PROCEDURE_ID" ) 
 | 
                            .isNull(j.getQualityType()== null,"QUALITY_TYPE" ) 
 | 
                            .isNull(StringUtils.isBlank(j.getBatch()),"BATCH" ) 
 | 
                            .eq("DELETED",Constants.ZERO) 
 | 
                            .eq(warehouse.getUseLocation()==Constants.ONE,"LOCATION_ID", j.getLocationId()) 
 | 
                    ); 
 | 
                    if (wStockList.size()<=Constants.ZERO) { 
 | 
                        throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到仓库/货位库存信息【" + i.getWarehouseId() + "】"); 
 | 
                    }else if(wStockList.size()>1){ 
 | 
                        throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "库存数据异常,存在多条库存信息,请检查库存数据【" + i.getWarehouseId() + "】"); 
 | 
                    } 
 | 
                    WStock wStock = wStockList.get(0); 
 | 
                    if (wStock.getNum().compareTo(j.getNum()) < Constants.ZERO) { 
 | 
                        throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "当前货位库存数量不足;剩余数量【" + wStock.getNum() + "】;出库数量【" + j.getNum() + "】"); 
 | 
                    } 
 | 
                    WOutboundDetail wOutboundDetail = new WOutboundDetail(); 
 | 
                    wOutboundDetail.setCreateUser(userInfo.getId()); 
 | 
                    wOutboundDetail.setCreateTime(new Date()); 
 | 
                    wOutboundDetail.setRootDepartId(userInfo.getRootDepartment().getId()); 
 | 
                    wOutboundDetail.setOutboundId(wOutbound.getId()); 
 | 
                    wOutboundDetail.setMaterialId(j.getMaterialId()); 
 | 
                    wOutboundDetail.setUnitId(j.getUnitId()); 
 | 
                    wOutboundDetail.setNum(j.getNum()); 
 | 
                    wOutboundDetail.setBatch(j.getBatch()); 
 | 
                    wOutboundDetail.setDoneDate(new Date()); 
 | 
                    wOutboundDetail.setWarehouseId(j.getWarehouseId()); 
 | 
                    wOutboundDetail.setLocationId(j.getLocationId()); 
 | 
                    wOutboundDetail.setStatus(Constants.ONE); 
 | 
                    wOutboundDetail.setDoneNum(j.getNum()); 
 | 
                    wOutboundDetail.setQualityType(j.getQualityType()); 
 | 
                    wOutboundDetail.setProcedureId(j.getProcedureId()); 
 | 
                    wOutboundDetailExtMapper.insert(wOutboundDetail); 
 | 
  
 | 
                    //记录库存变动记录 
 | 
                    wStockRecordExtService.saveRecord(Constants.ZERO,wOutboundDetail.getId(),userInfo); 
 | 
  
 | 
                    for (Appliances k:appliancesList ) { 
 | 
                        if(Objects.equals(j.getLocationId(),k.getLocationId()) 
 | 
                                &&Objects.equals(j.getMaterialId(), k.getMaterialId()) 
 | 
                                &&Objects.equals( j.getBatch(), k.getBatch()) 
 | 
                                &&Objects.equals(j.getQualityType(),k.getQualityType()) 
 | 
                                &&Objects.equals(j.getProcedureId(),k.getProcedureId()) 
 | 
                        ){ 
 | 
                            k.setWarehouseId(null); 
 | 
                            k.setLocationId(null); 
 | 
                            k.setCurObjId(wOutbound.getId()); 
 | 
                            k.setCurObjType(0); 
 | 
                            appliancesExtMapper.updateById(k); 
 | 
                            WOutboundRecord wOutboundRecord = wOutboundDetail.toRecord(k,userInfo); 
 | 
                            wOutboundRecordExtMapper.insert(wOutboundRecord); 
 | 
                        } 
 | 
                    } 
 | 
                    wStock.setNum(wStock.getNum().subtract(j.getNum())); 
 | 
                    wStockMapper.updateById(wStock); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            WHistory wHistory = wOutbound.toWHistory(userInfo.getId()); 
 | 
            wHistoryMapper.insert(wHistory); 
 | 
        } 
 | 
  
 | 
        //发送通知 
 | 
        Notices notices = new Notices(); 
 | 
        CompanyUser cUser = companyUserMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                .eq("USER_ID",warehouseForIn.getManagerId()) 
 | 
                .eq("DELETED",0) 
 | 
                .eq("ROOT_DEPART_ID",wTransfer.getRootDepartId()) 
 | 
        ); 
 | 
        Constants.Notices_Type_Transfer  noticesTypeTransfer=  Constants.Notices_Type_Transfer.title4; 
 | 
        notices.setCompanyUserId(cUser.getId()); 
 | 
        notices.setType(noticesTypeTransfer.getNoticeInType()); 
 | 
        notices.setContent("【"+wTransfer.getCode()+"】" + noticesTypeTransfer.getContent().replace("{optType}","入库")); 
 | 
        notices.setObjId(wTransfer.getId()); 
 | 
        notices.setTitle(noticesTypeTransfer.getTitle()); 
 | 
        notices.setUrl(Constants.getNoticeUrl(userInfo.getCompany(),Constants.DINGDING_NOTICE_URL.in).replace("{id}",wTransfer.getId().toString())); 
 | 
//        notices.setUrl(systemDictDataBiz.queryByCode(Constants.ROUTE_CONFIG,Constants.IN_TYPE_URL).getCode().replace("{id}",wTransfer.getId().toString())); 
 | 
        noticesExtService.sendNotice(notices); 
 | 
  
 | 
        return ApiResponse.success(wTransfer.getId()); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    @Override 
 | 
    public ApiResponse<FinishedInNewBean> finishedDetailNew(String deviceIds,String inIds,LoginUserInfo userInfo){ 
 | 
        //根据设备主键获取设备信息 
 | 
        List<Device> deviceList = deviceMapper.selectList( 
 | 
                new QueryWrapper<Device>() 
 | 
                        .eq("deleted",Constants.ZERO) 
 | 
                        .apply(" find_in_set(id,'"+deviceIds+"') ") 
 | 
        ); 
 | 
        if(deviceList.size()==Constants.ZERO){ 
 | 
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,未查询到设备信息!"); 
 | 
        } 
 | 
        CompanyUser companyUser  = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>() 
 | 
                .eq("USER_ID",userInfo.getId()) 
 | 
                .eq("ROOT_DEPART_ID",userInfo.getRootDepartment().getId()) 
 | 
                .eq("deleted",0) 
 | 
        ); 
 | 
        if(Objects.isNull(companyUser)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工信息"); 
 | 
        } 
 | 
        Department department = departmentExtMapper.selectById(companyUser.getDepartmentId()); 
 | 
        if(Objects.isNull(department)){ 
 | 
            throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "未查询到操作员工班组信息"); 
 | 
        } 
 | 
  
 | 
        FinishedInNewBean finishedInBean = new FinishedInNewBean(); 
 | 
        finishedInBean.setWorker(companyUser.getName()); 
 | 
        finishedInBean.setGroupName(department.getName()); 
 | 
        finishedInBean.setDeviceList(deviceList); 
 | 
  
 | 
        List<Integer> produceLocationIds = deviceList.stream().map(x -> x.getProduceWarehouseLocationId()).collect(Collectors.toList()); 
 | 
        List<Integer> allIds = deviceList.stream().map(x -> x.getFinishWarehouseLocationId()).collect(Collectors.toList()); 
 | 
        allIds.addAll(produceLocationIds); 
 | 
        finishedInBean.setQualifiedBeanList( 
 | 
                wTransferDetailExtMapper.wTransferConfirmDetailNew(allIds,Integer.toString(Constants.QUALITIY_TYPE.normal),inIds,produceLocationIds) 
 | 
        ); 
 | 
        finishedInBean.setRejectsBeanList( 
 | 
                wTransferDetailExtMapper.wTransferConfirmDetailNew(allIds,Integer.toString(Constants.QUALITIY_TYPE.unqulified),inIds,produceLocationIds) 
 | 
        ); 
 | 
        finishedInBean.setScrapBeanList( 
 | 
                wTransferDetailExtMapper.wTransferConfirmDetailNew(allIds,Integer.toString(Constants.QUALITIY_TYPE.scrap),inIds,produceLocationIds) 
 | 
        ); 
 | 
  
 | 
        finishedInBean.setProduceLocationIds(produceLocationIds); 
 | 
        if(StringUtils.isNotBlank(inIds)){ 
 | 
            List<FinishedInBillBean> finishedInBillBeanList = wOutboundExtMapper.finishedInBill(null,inIds); 
 | 
            for (FinishedInBillBean finishedInBillBean:finishedInBillBeanList) { 
 | 
                finishedInBillBean.setReserveMaterialBeanList(appliancesExtMapper.reserveMaterialBeanList(finishedInBillBean.getId(),produceLocationIds)); 
 | 
            } 
 | 
            finishedInBean.setFinishedInBillBeanList(finishedInBillBeanList); 
 | 
        } 
 | 
  
 | 
        return ApiResponse.success(finishedInBean); 
 | 
    } 
 | 
  
 | 
  
 | 
    //查询物料是否存在bom 存在bom为提供的数据绑定返回工艺路线的最后一道工序 
 | 
    public void dealProcedure(WTransferDetailBean tBean){ 
 | 
        Bom bom = bomMapper.selectOne(new QueryWrapper<Bom>() 
 | 
                .eq("MATERIAL_ID",tBean.getMaterialId()) 
 | 
                .eq("DELETED",Constants.ZERO) 
 | 
                .eq("TYPE",0) 
 | 
        ); 
 | 
        if(Objects.isNull(bom)){ 
 | 
            tBean.setProcedureId(null); 
 | 
        }else{ 
 | 
            RouteProcedure routeProcedure = routeProcedureExtMapper.selectOne(new QueryWrapper<RouteProcedure>() 
 | 
                    .eq("DELETED",Constants.ZERO) 
 | 
                    .eq("ROUTE_ID",bom.getRouteId()) 
 | 
                    .orderByDesc(" SORTNUM ").last(" limit 1  ") 
 | 
            ); 
 | 
            tBean.setProcedureId(routeProcedure.getProcedureId()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
} 
 |