package doumeemes.service.ext.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.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.excel.EasyExcelUtil; import doumeemes.core.utils.redis.RedisUtil; import doumeemes.dao.business.PlansMapper; import doumeemes.dao.business.model.*; import doumeemes.dao.ext.*; import doumeemes.dao.ext.dto.*; import doumeemes.dao.ext.vo.*; import doumeemes.service.ext.*; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 生产计划Service实现 * @author 江蹄蹄 * @date 2022/04/20 11:01 */ @Service public class PlansExtServiceImpl implements PlansExtService { @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private RedisTemplate redisTemplate; @Autowired private BarcodeParamExtService barcodeParamExtService; @Autowired private PlansExtMapper plansExtMapper; @Autowired private WorkorderExtService workorderExtService; @Autowired private WorkorderExtMapper workorderExtMapper; @Autowired private WorkorderUserExtMapper workorderUserExtMapper; @Autowired private WorkorderHistoryExtMapper workorderHistoryExtMapper; @Autowired private WorkorderRecordExtMapper workorderRecordExtMapper; @Autowired private RouteProcedureExtMapper routeProcedureExtMapper; @Autowired private PlansMapper plansMapper; @Autowired private UserDeviceExtMapper userDeviceExtMapper; @Autowired private PlanHistoryExtMapper planHistoryExtMapper; @Autowired private PlanImportExtMapper planImportExtMapper; @Autowired private ProceduresExtMapper proceduresExtMapper; @Autowired private DepartmentExtService departmentExtService; @Autowired private DeviceExtMapper deviceExtMapper ; @Autowired private BomExtMapper bomExtMapper; @Autowired private MaterialDistributeExtMapper materialDistributeExtMapper; @Autowired private WStockExtService wStockExtService; @Override public PlansExtListVO findById(Integer id){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(id==null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请求参数不正确!"); } QueryPlansExtDTO pageWrap = new QueryPlansExtDTO(); pageWrap.setDeleted(Constants.ZERO); pageWrap.setId(id); //只能查看当前根组织的数据 pageWrap.setRootDepartId(user.getRootDepartment().getId()); // if(!Constants.equalsInteger(user.getCurComDepartment().getId(),user.getRootDepartment().getId())){ //如果当前选择的公司级组织非根组织信息,只能查看当前选择公司级组织数据 pageWrap.setDepartId(user.getCurComDepartment().getId()); // } //数据权限 List dataPermission = user.getDepartPermissionList(); if(dataPermission!=null){ if(dataPermission.size() == 0){ //只能看自己的 pageWrap.setUserId(user.getId()); }else{ //否则走数据权限 pageWrap.setDepartIds(dataPermission); } } if(user.getProcedureIds()!=null){ pageWrap.setProcedureIds(user.getProcedureIds()); }else{ pageWrap.setUserId(user.getId()); } List result = plansExtMapper.selectList(pageWrap); if(result==null||result.size()==0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,计划信息不存在"); } PlansExtListVO plan = result.get(0); initPlanStatisticInfo(plan); // plan.setDistributNum(Constants.formatIntegerNum(plan.getDistributNum())); // QueryWorkorderExtDTO param = new QueryWorkorderExtDTO(); // param.setPlanId(plan.getId()); // param.setDeleted(Constants.ZERO); // //统计已分配数量 // plan.setDistributNum(workorderExtMapper.sumOrderNum(param)); // //统计已完工数量 // param.setStatus(Constants.WORKORDER_STATUS.done); // plan.setDoneNum(workorderExtMapper.sumOrderNum(param)); return plan; } @Override public PlansExtListH5VO findByIdH5(Integer id){ PlansExtListVO t = findById(id); initPlanStatisticInfo(t); PlansExtListH5VO plan = new PlansExtListH5VO(); BeanUtils.copyProperties(t,plan); plan.setWorkorderList(workorderExtService.findByPlanId(plan,true)); return plan; } @Override public PageData findPage(PageWrap pageWrap) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } pageWrap.getModel().setDeleted(Constants.ZERO); //只能查看当前根组织的数据 pageWrap.getModel().setRootDepartId(user.getRootDepartment().getId()); // if(!Constants.equalsInteger(user.getCurComDepartment().getId(),user.getRootDepartment().getId())){ //如果当前选择的公司级组织非根组织信息,只能查看当前选择公司级组织数据 pageWrap.getModel().setDepartId(user.getCurComDepartment().getId()); // } //数据权限 List dataPermission = user.getDepartPermissionList(); if(dataPermission!=null){ //只能看自己的 pageWrap.getModel().setCreateUser(user.getId()); //否则走数据权限 pageWrap.getModel().setDepartIds(dataPermission); /* if(dataPermission.size() == 0){ //只能看自己的 pageWrap.getModel().setCreateUser(user.getId()); }else{ }*/ } if(user.getProcedureIds()!=null){ pageWrap.getModel().setProcedureIds(user.getProcedureIds()); }else{ // pageWrap.getModel().setUserId(user.getId()); pageWrap.getModel().setCreateUser(user.getId()); } PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity()); List result = plansExtMapper.selectList(pageWrap.getModel()); if(result!=null){ for(PlansExtListVO p : result){ initPlanStatisticInfo(p); // PlansExtListH5VO tp = new PlansExtListH5VO(); // tp.setId(p.getId()); // //统计功能已分配数量和完工数量 // tp.setNum(p.getNum()); // workorderExtService.findByPlanId(tp,false); // p.setDistributNum(tp.getDistributNum()); // p.setDoneNum(tp.getDoneNum()); p.setIsStock(wStockExtService.isStockForPlan(p)); } } return PageData.from(new PageInfo<>(result)); } @Override public List getListByWorkPlan(Integer workPlanId){ QueryPlansExtDTO queryPlansExtDTO = new QueryPlansExtDTO(); queryPlansExtDTO.setWorkPlanId(workPlanId); List result = plansExtMapper.selectList(queryPlansExtDTO); if(result!=null){ for(PlansExtListVO p : result){ initPlanStatisticInfo(p); p.setIsStock(wStockExtService.isStockForPlan(p)); } } return result; } private void initPlanStatisticInfo(PlansExtListVO p) { p.setDistributNum(0); p.setDistributNoDoneNum(0); p.setDoneNum(0); p.setQulifiedNum(0); p.setUnqulifiedNum(0); try { JSONObject json = JSONObject.parseObject(p.getStatisticInfo()); p.setDistributNum(Constants.formatIntegerNum(json.getInteger(Constants.STATISTIC.distribute))); p.setDistributNoDoneNum(Constants.formatIntegerNum(json.getInteger(Constants.STATISTIC.distributeNoDone))); p.setDoneNum(Constants.formatIntegerNum(json.getInteger(Constants.STATISTIC.done))); p.setQulifiedNum(Constants.formatIntegerNum(json.getInteger(Constants.STATISTIC.qulified))); p.setUnqulifiedNum(Constants.formatIntegerNum(json.getInteger(Constants.STATISTIC.unqulified))); }catch (Exception e){ } } @Override public PlansExtListCountVO pageCount(QueryPlansExtDTO param){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } param.setDeleted(Constants.ZERO); //只能查看当前根组织的数据 param.setRootDepartId(user.getRootDepartment().getId()); // if(!Constants.equalsInteger(user.getCurComDepartment().getId(),user.getRootDepartment().getId())){ //如果当前选择的公司级组织非根组织信息,只能查看当前选择公司级组织数据 param.setDepartId(user.getCurComDepartment().getId()); // } //数据权限 List dataPermission = user.getDepartPermissionList(); if(dataPermission!=null){ if(dataPermission.size() == 0){ //只能看自己的 param.setCreateUser(user.getId()); }else{ //否则走数据权限 param.setDepartIds(dataPermission); } } if(user.getProcedureIds()!=null){ param.setProcedureIds(user.getProcedureIds()); }else{ param.setCreateUser(user.getId()); } PlansExtListCountVO result = new PlansExtListCountVO(); //全部数量 result.setAllNum(plansExtMapper.selectCount(param)); param.setStatusList(new ArrayList<>()); param.getStatusList().add(Constants.PLAN_STATUS.create); //未完成数量 result.setStartNum(plansExtMapper.selectCount(param)); param.setStatusList(new ArrayList<>()); param.getStatusList().add(Constants.PLAN_STATUS.distribute); param.getStatusList().add(Constants.PLAN_STATUS.publish); //进行中数量 result.setIngNum(plansExtMapper.selectCount(param)); param.setStatusList(new ArrayList<>()); param.getStatusList().add(Constants.PLAN_STATUS.done); param.getStatusList().add(Constants.PLAN_STATUS.instock); param.getStatusList().add(Constants.PLAN_STATUS.cancel); param.getStatusList().add(Constants.PLAN_STATUS.close); //进行中数量 result.setEndNum(plansExtMapper.selectCount(param)); return result; } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public Integer create(Plans p) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } //检查数据有效性 p.setCreateTime(DateUtil.getCurrentDate()); p.setCreateUser(user.getId()); p.setDeleted(Constants.ZERO); p.setDepartId(user.getCurComDepartment().getId()); p.setRootDepartId(user.getRootDepartment().getId()); p.setUserId(user.getId()); p.setOrigin(Constants.PLAS_ORIGIN.user); p.setStatus(Constants.PLAN_STATUS.create); p.setType(Constants.PLAN_TYPE.normal); checkData(p,user); //插入数据 plansExtMapper.insert(p); //历史数据 planHistoryExtMapper.insert(initHistoryByModel(p,user.getId(),Constants.PLANHISTORY_TYPE.create)); return p.getId(); } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public Integer insertForWorkPlan(Plans p) { //插入数据 plansExtMapper.insert(p); return p.getId(); } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public Integer createDirect(Plans p) { //插入数据 plansExtMapper.insert(p); //历史数据 planHistoryExtMapper.insert(initHistoryByModel(p,p.getCreateUser(),Constants.PLANHISTORY_TYPE.create)); return p.getId(); } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void autoClose(){ //插入数据 QueryPlansExtDTO param = new QueryPlansExtDTO(); param.setDeleted(Constants.ZERO); //已分配 param.setStatus(Constants.PLAN_STATUS.distribute); //查询全部已分配未关闭数据 List planList = plansExtMapper.selectList(param); if(planList!=null && planList.size()>0){ for(PlansExtListVO model : planList){ //遍历全部计划,针对已分配状态的计划,当前计划的(合格数量+不良数量,按照现在统计的结果)+同物料同批次号前置工序的报废数量(工单状态为已报工) >=计划当前计划数量, // 系统自动关闭计划,将计划状态置为【已关闭】状态; initPlanStatisticInfo(model); //合格数量 int hgNum = Constants.formatIntegerNum(model.getQulifiedNum()); //不良数量 int blNum = Constants.formatIntegerNum(model.getUnqulifiedNum()); //前置工序计划的报废数量 int bfNum = getScrapProNum(model); if(hgNum+blNum+bfNum >= Constants.formatIntegerNum(model.getNum())){ Plans p = new Plans(); p.setId(model.getId()); //检查数据有效性 p.setUpdateTime(DateUtil.getCurrentDate()); // p.setUpdateUser(user.getId()); p.setStatus(Constants.PLAN_STATUS.close); p.setRootDepartId(model.getRootDepartId()); p.setDepartId(model.getDepartId()); //更新计划数据 plansExtMapper.updateById(p); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(p,null,Constants.PLANHISTORY_TYPE.close,"系统自动关闭")); } } } } private int getScrapProNum(PlansExtListVO model) { /* QueryBomExtDTO bb = new QueryBomExtDTO(); bb.setDepartId(model.getDepartId()); bb.setDeleted(Constants.ZERO); bb.setRootDepartId(model.getRootDepartId()); bb.setMaterialId(model.getMaterialId()); bb.setProcedureId(model.getProcedureId()); BomExtListVO versionBom = bomExtMapper.selectByModel( bb);*/ Bom bb = new Bom(); bb.setDepartId(model.getDepartId()); bb.setDeleted(Constants.ZERO); bb.setRootDepartId(model.getRootDepartId()); bb.setMaterialId(model.getMaterialId()); Bom versionBom = bomExtMapper.selectOne(new QueryWrapper<>(bb).exists("select route.id from route where bom.route_id=route.id and route.depart_id="+model.getFactoryId()).last("limit 1") ); if(versionBom == null || StringUtils.isBlank(versionBom.getVersion()) || versionBom.getRouteId() == null){ //如果没有bom或者没有绑定工艺路线 return 0; } //如果有bom,根据bom的工艺路线查询全部前置工序数据 RouteProcedure rp = new RouteProcedure(); rp.setDeleted(Constants.ZERO); rp.setDepartId(model.getFactoryId()); rp.setRouteId(versionBom.getRouteId()); List rpList = routeProcedureExtMapper.selectList(new QueryWrapper<>(rp).orderByAsc("SORTNUM")); List producreIds = null; boolean isValid = false; if(rpList!=null && rpList.size()>0){ for(int i=0;i(); } producreIds.add(r.getProcedureId()); } } if(!isValid){ //如果计划工序未配置在工艺路线中,不做处理 producreIds = null; } if(producreIds!= null && producreIds.size()>0){ WorkorderRecord wr = new WorkorderRecord(); wr.setDeleted(Constants.ZERO); wr.setRootDepartId(model.getRootDepartId()); wr.setType(Constants.WORKORDER_RECORD_TYPE.produce); wr.setMaterialDonetype(Constants.QUALITIY_TYPE.scrap); List rList = workorderRecordExtMapper.selectList(new QueryWrapper<>(wr) .exists("select workorder.id from workorder where workorder_record.WORKORDER_ID=workorder.id and workorder.status in(4,5)") .in("PROCEDURE_ID",producreIds) ); if(rList !=null){ BigDecimal num = new BigDecimal(0); for(WorkorderRecord r : rList){ num = num.add(Constants.formatBigdecimal(r.getNum())); } return num.intValue(); } } return 0; } @Override public List getPlansList(QueryWrapper queryWrapper){ return plansMapper.selectList(queryWrapper); } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void updateById(Plans p){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(p.getId()== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(p.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(mp)); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); } //检查数据有效性 p.setUpdateTime(DateUtil.getCurrentDate()); p.setUpdateUser(user.getId()); p.setDeleted(Constants.ZERO); p.setStatus(null);//状态不能改 p.setDepartId(user.getComDepartment().getId()); p.setRootDepartId(user.getRootDepartment().getId()); p.setUserId(user.getId()); checkData(p,user); //更新数据 plansExtMapper.updateById(p); } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void updateForPlan(Plans p){ plansExtMapper.updateById(p); } /** * 将计划行、计划分配和相关工单状态全部置为“已关闭”,终止该计划行的一切生产操作,但不影响已生产的入库操作; * @param p */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void closeById(Plans p){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(p.getId()== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(p.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(mp)); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); } if(!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.distribute)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划状态已流转,当前不能关闭!"); } /* if(Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.close)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划已关闭!"); }*/ Plans model = new Plans(); model.setId(p.getId()); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setStatus(Constants.PLAN_STATUS.close); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.close)); /* QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); qw.setPlanId(p.getId()); qw.setDeleted(Constants.ZERO); List ids = new ArrayList<>(); List whList = new ArrayList<>(); List orderList = workorderExtMapper.selectList(qw); if(orderList != null){ for(WorkorderExtListVO w : orderList){ if(Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.instock)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该计划不满足关闭条件!"); } if(!Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.instock) &&!Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.done) &&!Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.close) &&!Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.check) ){ whList.add(WorkorderExtServiceImpl.initHistoryByModel(w,user.getId(),Constants.WORKORDER_HISTORY_STATUS.close)); //操作集合 ids.add(w.getId()); } } } //关闭全部相关工单 if(ids.size()>0){ Workorder order = new Workorder(); order.setPlanId(p.getId()); order.setUpdateTime(model.getUpdateTime()); order.setUpdateUser(model.getUpdateUser()); order.setIds(ids); order.setStatus(Constants.WORKORDER_STATUS.close); //关闭工单 workorderExtMapper.updateByPlan(order); workorderHistoryExtMapper.insertBatch(whList); }*/ } /** * 分配工单 * @param param */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void distributeById(Workorder param ){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } distributeDone(user, param,param.getPlanNum()); } private void distributeDone(LoginUserInfo user, Workorder param,int thisPlanNum) { if(param.getPlanId()== null ||param.getPlanDate() == null || param.getProGroupId()==null || param.getProUserList()==null || param.getProUserList().size()==0 || Constants.formatIntegerNum(param.getPlanNum())<=0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,请按要求填写和选择提交数据!"); } QueryPlansExtDTO mpp = new QueryPlansExtDTO(); mpp.setDeleted(Constants.ZERO); mpp.setId(param.getPlanId()); mpp.setRootDepartId(user.getRootDepartment().getId()); PlansExtListVO mp = plansExtMapper.selectByModel(mpp); initPlanStatisticInfo(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.formatIntegerNum(mp.getDistributNum())+thisPlanNum > Constants.formatIntegerNum(mp.getNum())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,累计分配数量大于计划数量!"); } if(!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.publish)&&!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.distribute)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划非待分配状态!"); } Plans model = new Plans(); model.setId(mp.getId()); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setStatus(Constants.PLAN_STATUS.distribute); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.distribute)); List whList = new ArrayList<>(); Workorder order = new Workorder(); order.setCreateTime(DateUtil.getCurrentDate()); order.setCreateUser(user.getId()); order.setDeleted(Constants.ZERO); order.setStatus(Constants.WORKORDER_STATUS.create); order.setPlanId(mp.getId()); order.setRootDepartId(mp.getRootDepartId()); order.setDepartId(mp.getDepartId()); order.setPaused(Constants.ZERO); // order.set //正常工单 order.setType(mp.getType()); order.setMaterialId(mp.getMaterialId()); order.setProcedureId(mp.getProcedureId()); order.setCode(param.getCode()); order.setPlanDate(param.getPlanDate()); order.setPlanNum(param.getPlanNum()); order.setUnitId(mp.getUnitId()); order.setBatch(mp.getBatch()); order.setUrgent(mp.getUrgent()); order.setFactoryId(mp.getFactoryId()); order.setBackorderId(mp.getBackorderId()); order.setOriginId(systemDictDataBiz.queryByCode(Constants.WORKORDER_SOURCE,Constants.WORKORDER_SOURCE_PLAN).getId()); //工单编码 order.setCode(workorderExtService.getNextCode(user.getCompany().getId())); order.setUserDeivceId(param.getUserDeivceId()); order.setQrcodeId(barcodeParamExtService.getByType(user.getCompany().getId(),mp.getDepartId(),Constants.BARCODEPARAM_TYPE.workorder)); order.setProUserList(param.getProUserList()); order.setProGroupId(param.getProGroupId()); //查询生产班组和人员是否合法 checkUserAndGroup(order,mp,user); workorderExtMapper.insert(order); //工单历史数据 whList.add(WorkorderExtServiceImpl.initHistoryByModel(order,user.getId(),Constants.WORKORDER_HISTORY_STATUS.create)); workorderHistoryExtMapper.insertBatch(whList); //插入生产人员分配关联表 for( WorkorderUser wu :order.getWorkorderUserList()){ wu.setWorkorderId(order.getId()); //生产人员记录 workorderUserExtMapper.insert(wu); } } private void checkUserAndGroup(Workorder param, PlansExtListVO model,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(model.getDepartId()); //查询用户设备关联关系 List 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 userList = new ArrayList<>(); for(UserDeviceExtListVO uModel : ulist){ WorkorderUser u = new WorkorderUser(); u.setProUserId(uModel.getUserId()); u.setPlanId(model.getId()); u.setCreateUser(user.getId()); u.setDeleted(Constants.ZERO); u.setCreateTime(DateUtil.getCurrentDate()); u.setRootDepartId(model.getRootDepartId()); u.setDepartId(model.getDepartId()); userList.add(u); } param.setWorkorderUserList(userList); } private void checkUserAndGroupOld(Workorder param, PlansExtListVO model,LoginUserInfo user) throws BusinessException{ QueryUserDeviceExtDTO ud = new QueryUserDeviceExtDTO(); ud.setDeleted(Constants.ZERO); ud.setId(param.getUserDeivceId()); //查询用户设备关联关系 UserDeviceExtListVO uModel = userDeviceExtMapper.selectByModel( ud ); if(uModel == null || uModel.getUmodel() == null){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,生产人员及设备信息不正确,请刷新页面重试!"); } //查询人员部门信息 DepartmentExtListVO depart = departmentExtService.getModelById(user.getCompany().getId(),uModel.getUmodel().getDepartmentId()); if(depart == null){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,生产人员班组信息不存在,请刷新页面重试!"); } /* if(!Constants.equalsInteger(depart.getType(),Constants.DEPART_TYPE.group)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,选择班组错误,请刷新页面重试!"); }*/ //查询班组的公司级部门编码和计划公司级编码是否一致,不一致则报错 Integer comDepartId = departmentExtService.getComDepartId(depart); if(!Constants.equalsInteger(comDepartId,model.getDepartId())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,班组非计划所属公司组织,请刷新页面重试!"); } //生产班组(设备) param.setProGroupId(uModel.getDeviceId()); //生产人员 param.setProUserId(uModel.getUmodel().getUserId()); } /** * 取消计划 * @param p */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void cancelById(Plans p){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(p.getId()== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(p.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(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.PLAN_STATUS.cancel)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划已取消!"); } if(!(Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.create) ||Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.publish) ||Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.distribute))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划状态已流转,不能取消!"); }*/ //已分配状态支持取消操作 if(!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.distribute)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划状态已流转,不能进行该操作!"); } /*QueryWorkorderRecordExtDTO qr = new QueryWorkorderRecordExtDTO(); qr.setPlanId(p.getId()); qr.setDeleted(Constants.ZERO); qr.setType(Constants.WORKORDER_RECORD_TYPE.materail); if(workorderRecordExtMapper.selectOne(new QueryWrapper(qr)) !=null){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划已有工单进行投料,不能取消!"); }*/ Plans model = new Plans(); model.setId(p.getId()); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setStatus(Constants.PLAN_STATUS.cancel); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.close)); QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); qw.setPlanId(p.getId()); qw.setDeleted(Constants.ZERO); qw.setCheckTouliao(Constants.ONE); List ids = new ArrayList<>(); List whList = new ArrayList<>(); List orderList = workorderExtMapper.selectList(qw); if(orderList != null){ for(WorkorderExtListVO w : orderList){ /*if(Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.instock)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划不满足关闭条件!"); }*/ //工单为已创建、已备料状态,且无投料记录,工单状态改为取消,已有投料记录往后状态工单状态不变 if(( Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.create) ||Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.material)) && w.getTouliaoId()==null ){ whList.add(WorkorderExtServiceImpl.initHistoryByModel(w,user.getId(),Constants.WORKORDER_HISTORY_STATUS.cancel)); //操作集合 ids.add(w.getId()); } } } //取消相关工单 if(ids.size()>0){ Workorder order = new Workorder(); order.setPlanId(p.getId()); order.setUpdateTime(model.getUpdateTime()); order.setUpdateUser(model.getUpdateUser()); order.setIds(ids); order.setStatus(Constants.WORKORDER_STATUS.cancel); //关闭工单 workorderExtMapper.updateByPlan(order); workorderHistoryExtMapper.insertBatch(whList); } } /** * 批量发布计划 * @param idList */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void publishByIdInBatch(List idList) { if (CollectionUtils.isEmpty(idList)) { return; } for(Integer id : idList){ Plans p = new Plans(); p.setId(id); publishById(p); } } /** * 批量删除计划 * @param idList */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void deleteByIdInBatch(List idList) { if (CollectionUtils.isEmpty(idList)) { return; } for(Integer id : idList){ deleteById(id); } } /** * 批量撤回计划 * @param idList */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void backByIdInBatch(List idList) { if (CollectionUtils.isEmpty(idList)) { return; } for(Integer id : idList){ Plans p = new Plans(); p.setId(id); backById(p); } } /** * 撤回计划,“已发布”和“已分配”可以使用,点击后先询问用户是否撤回,确认后,删除发布和分配记录,计划状态置为“已生成” * @param p */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void backById(Plans p){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(p.getId()== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(p.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(mp)); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,计划不存在!"); } if( Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.cancel) ){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划状态已撤回,无需重复操作!"); } if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,计划已暂停!"); } Plans model = new Plans(); model.setId(p.getId()); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setStatus(Constants.PLAN_STATUS.create); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.create)); QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); qw.setPlanId(p.getId()); qw.setDeleted(Constants.ZERO); List ids = new ArrayList<>(); List whList = new ArrayList<>(); List orderList = workorderExtMapper.selectList(qw); if(orderList != null){ for(WorkorderExtListVO w : orderList){ if(!(Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.create)|| Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.cancel))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该计划不满足撤回条件!"); } whList.add(WorkorderExtServiceImpl.initHistoryByModel(w,user.getId(),Constants.WORKORDER_HISTORY_STATUS.cancel)); //操作集合 ids.add(w.getId()); } } //取消全部相关工单 if(ids.size()>0){ Workorder order = new Workorder(); order.setPlanId(p.getId()); order.setUpdateTime(model.getUpdateTime()); order.setUpdateUser(model.getUpdateUser()); order.setIds(ids); order.setStatus(Constants.WORKORDER_STATUS.cancel); //取消工单 workorderExtMapper.updateByPlan(order); workorderHistoryExtMapper.insertBatch(whList); } } /** * 暂停计划 计划已经发布并且未取消、未撤回、未关闭 暂停成功,对应工单也暂停投料,已投料的可以继续完成报工 * @param p */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void pauseById(Plans p){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(p.getId()== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(p.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(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(), "对不起,该计划已暂停,无需重复操作!"); } Plans model = new Plans(); model.setId(p.getId()); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setPaused(Constants.ONE); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.pause)); QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); qw.setPlanId(p.getId()); qw.setDeleted(Constants.ZERO); List ids = new ArrayList<>(); List whList = new ArrayList<>(); List orderList = workorderExtMapper.selectList(qw); if(orderList != null){ for(WorkorderExtListVO w : orderList){ if( Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.create)|| Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.material)|| Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.baogong) ){ //已创建、已投料和已报工的工单暂停 whList.add(WorkorderExtServiceImpl.initHistoryByModel(w,user.getId(),Constants.WORKORDER_HISTORY_STATUS.pause)); //操作集合 ids.add(w.getId()); } } } //暂停全部相关工单 if(ids.size()>0){ Workorder order = new Workorder(); order.setPlanId(p.getId()); order.setUpdateTime(model.getUpdateTime()); order.setUpdateUser(model.getUpdateUser()); order.setIds(ids); order.setPaused(Constants.ONE); //取消工单 workorderExtMapper.updateByPlan(order); workorderHistoryExtMapper.insertBatch(whList); } } /** * 恢复计划 * @param p */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void regainById(Plans p){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(p.getId()== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(p.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(mp)); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,计划不存在!"); } //已暂停的计划不需重复操作 if(!Constants.equalsInteger(mp.getPaused(),Constants.ONE) ){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该计划已恢复,无需重复操作!"); } Plans model = new Plans(); model.setId(p.getId()); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setPaused(Constants.ZERO); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.reagain)); QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); qw.setPlanId(p.getId()); qw.setDeleted(Constants.ZERO); //查询全部已暂停的工单数据 qw.setPaused(Constants.ONE); List ids = new ArrayList<>(); List whList = new ArrayList<>(); List orderList = workorderExtMapper.selectList(qw); if(orderList != null){ for(WorkorderExtListVO w : orderList){ if( Constants.equalsInteger(w.getPaused(),Constants.ONE) ){ //已暂停的工单全部恢复 whList.add(WorkorderExtServiceImpl.initHistoryByModel(w,user.getId(),Constants.WORKORDER_HISTORY_STATUS.reagain)); //操作集合 ids.add(w.getId()); } } } //暂停全部相关工单 if(ids.size()>0){ Workorder order = new Workorder(); order.setPlanId(p.getId()); order.setUpdateTime(model.getUpdateTime()); order.setUpdateUser(model.getUpdateUser()); order.setIds(ids); order.setPaused(Constants.ZERO); //取消工单 workorderExtMapper.updateByPlan(order); workorderHistoryExtMapper.insertBatch(whList); } } /** * 删除计划 * @param id */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void deleteById(Integer id){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } if(id== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(id); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(mp)); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,计划不存在!"); } //已暂停的计划不需重复操作 if(!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.create) &&!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.publish) ){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该计划状态已流转,不能删除!"); } Plans model = new Plans(); model.setId(id); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setDeleted(Constants.ONE); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.delete)); } /** * 恢复计划 * @param orders */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void distributeByBatch(List orders){ if(orders == null || orders.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(), "对不起,您无权限进行该操作!"); } for(Workorder order : orders){ distributeDone(user, order,getThisPlanNum(order.getPlanId(),orders)); } } private int getThisPlanNum(Integer planId, List orders) { int num = 0; for(Workorder order : orders){ if(Constants.equalsInteger(planId,order.getPlanId())){ num += Constants.formatIntegerNum(order.getPlanNum()); } } return num; } /** * 发布计划,只有已生成和已撤回的计划可以发布 * @param p */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void publishById(Plans p){ LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!" ); } if(p.getId()== null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,记录不存在!"); } Plans mp = new Plans(); mp.setDeleted(Constants.ZERO); mp.setId(p.getId()); mp.setRootDepartId(user.getRootDepartment().getId()); mp = plansExtMapper.selectOne(new QueryWrapper<>(mp)); if(mp== null){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该记录不存在!"); } if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,计划已暂停!"); } //只有已生成和已撤回的计划可以发布 if(!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.create) &&!Constants.equalsInteger(mp.getStatus(),Constants.PLAN_STATUS.back)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该计划状态已流转,不能进行发布!"); } Plans model = new Plans(); model.setId(p.getId()); //检查数据有效性 model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(user.getId()); model.setPublishDate(DateUtil.getCurrentDate()); model.setStatus(Constants.PLAN_STATUS.publish); model.setRootDepartId(mp.getRootDepartId()); model.setDepartId(mp.getDepartId()); //更新计划数据 plansExtMapper.updateById(model); //历史数据,关闭 planHistoryExtMapper.insert(initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.publish)); } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void importPlans(MultipartFile file) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } //解析excel List plansList = EasyExcelUtil.importExcel(file, 1, 1, Plans.class); if(plansList == null || plansList.size()==0){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!"); } PlanImport ip = new PlanImport(); ip.setDeleted(Constants.ZERO); ip.setCreateTime(DateUtil.getCurrentDate()); ip.setCreateUser(user.getId()); ip.setFileName(file.getOriginalFilename()); ip.setRootDepartId(user.getRootDepartment().getId()); ip.setDepartId(user.getComDepartment().getId()); //计划文件上传记录 planImportExtMapper.insert(ip); int index = 1; List historyList = new ArrayList<>(); for(Plans p : plansList){ p.setType(Constants.PLAN_TYPE.normal); p.setCreateTime(DateUtil.getCurrentDate()); p.setCreateUser(user.getId()); p.setDeleted(Constants.ZERO); p.setDepartId(user.getCurComDepartment().getId()); p.setRootDepartId(ip.getRootDepartId()); p.setImportId(ip.getId()); p.setStatus(Constants.PLAN_STATUS.create); p.setOrigin(Constants.PLAS_ORIGIN.imports); p.setUserId(user.getId()); // p.setFactoryId(user.getDepartment().getId()); //检查数据有效性 checkData(p,index,user); plansExtMapper.insert(p); historyList.add(initHistoryByModel(p,user.getId(),Constants.PLANHISTORY_TYPE.create)); index++; } //批量导入计划数据 //plansExtMapper.insertBatch(plansList); planHistoryExtMapper.insertBatch(historyList); } public static PlanHistory initHistoryByModel(Plans p,Integer userId,int status,String remark) { 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.PLANHISTORY_TYPE.getTitleByStatus(p,status)); h.setType(status); h.setInfo(Constants.PLANHISTORY_TYPE.getInfoByStatus(p,status)); h.setRemark(remark); return h; } public static PlanHistory initHistoryByModel(Plans 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.PLANHISTORY_TYPE.getTitleByStatus(p,status)); h.setType(status); h.setInfo(Constants.PLANHISTORY_TYPE.getInfoByStatus(p,status)); return h; } /** * 数据有效性检查 * @param p * @param index * @param user * @throws BusinessException */ private void checkData(Plans p, int index,LoginUserInfo user) throws BusinessException{ if(Constants.formatIntegerNum(p.getNum())<=0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【计划生产数量】数据错误!"); } if(p.getPlanDate() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【计划日期】数据错误,正确格式为:yyyy-MM-dd(如2022-06-07)!"); } if(StringUtils.isBlank(p.getMaterialCode())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【产品编码】数据错误!"); } if(p.getFactoryName() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【生产工厂】数据错误!"); } if(p.getBatch() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【生产批次】数据错误!"); } if(p.getProcedureCode() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【生产工序】数据错误!"); } Date pDate = DateUtil.getDateFromString(DateUtil.getShortTime(p.getPlanDate()) +" 00:00:00"); Date nDate = DateUtil.getDateFromString(DateUtil.getShortTime(DateUtil.getCurrentDate()) +" 00:00:00"); if( nDate.getTime() > pDate.getTime()){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,计划生产日期必须为今天以后的日期!"); } p.setMaterialCode(p.getMaterialCode().trim()); p.setFactoryName(p.getFactoryName().trim()); p.setProcedureCode(p.getProcedureCode().trim()); p.setBatch(p.getBatch().trim()); Procedures t = new Procedures(); t.setDeleted(Constants.ZERO); t.setName(p.getProcedureCode()); t.setRootDepartId(p.getRootDepartId()); t.setDepartId(p.getDepartId()); //查询工序信息 t = proceduresExtMapper.selectOne(new QueryWrapper<>(t).last(" limit 1")); if(t == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【生产工序】数据不存在!"); } p.setProcedureId(t.getId()); QueryMaterialDistributeExtDTO d = new QueryMaterialDistributeExtDTO(); d.setDeleted(Constants.ZERO); d.setMmodelCode(p.getMaterialCode()); d.setRootDepartId(p.getRootDepartId()); d.setDepartId(p.getDepartId()); //查询产品信息 MaterialDistributeExtListVO mm = materialDistributeExtMapper.selectByModel(d); if(mm == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【产品编码】数据不存在!"); } if(Constants.equalsInteger(mm.getStatus(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【产品】已失效,无法进行生产!"); } //存储物料分配表主键 p.setMaterialId(mm.getId()); //单位编码 p.setUnitId(mm.getUnitId()); if(Constants.equalsInteger(mm.getStatus(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【产品编码】不能安排生产计划!"); } Bom bom = new Bom(); bom.setDeleted(Constants.ZERO); bom.setMaterialId(mm.getId()); bom.setRootDepartId(mm.getRootDepartId()); bom = bomExtMapper.selectOne(new QueryWrapper<>(bom).last(" limit 1")); if(bom == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【产品】BOM未配置数据!"); } if(!Constants.equalsInteger(bom.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【产品】BOM已失效,无法进行生产!"); } DepartmentExtListVO f = departmentExtService.getModelByName(user.getCompany().getId(),p.getFactoryName()); if(f==null || !Constants.equalsInteger(f.getType(),Constants.DEPART_TYPE.factory) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【生产工厂】数据非工厂组织,请检查!"); } if(Constants.equalsInteger(f.getStatus(),Constants.ONE) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【生产工厂】当前状态不正确!"); } if(!Constants.equalsInteger(p.getDepartId(),departmentExtService.getComDepartId(f))){ //如果工厂与公司级组织不对应 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+(index+2)+"】行【生产工厂】数据非当前公司组织,请检查!"); } p.setFactoryId(f.getId()); } /** * 数据有效性检查 * @param p * @param user * @throws BusinessException */ private void checkData(Plans p, LoginUserInfo user) throws BusinessException{ if(Constants.formatIntegerNum(p.getNum())<=0 ||p.getPlanDate() == null ||StringUtils.isBlank(p.getBatch()) ||p.getFactoryId() == null ||p.getMaterialId() == null ||p.getProcedureId() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请按要求填写提交数据!"); } Date pDate = DateUtil.getDateFromString(DateUtil.getShortTime(p.getPlanDate()) +" 00:00:00"); Date nDate = DateUtil.getDateFromString(DateUtil.getShortTime(DateUtil.getCurrentDate()) +" 00:00:00"); if( nDate .getTime() > pDate.getTime()){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,计划生产日期必须为今天以后的日期!"); } Procedures t = new Procedures(); t.setDeleted(Constants.ZERO); t.setId(p.getProcedureId()); t.setRootDepartId(p.getRootDepartId()); t.setDepartId(p.getDepartId()); //查询工序信息 t = proceduresExtMapper.selectOne(new QueryWrapper<>(t)); if(t == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,生产工序不存在!"); } QueryMaterialDistributeExtDTO d = new QueryMaterialDistributeExtDTO(); d.setDeleted(Constants.ZERO); d.setId(p.getMaterialId()); d.setRootDepartId(p.getRootDepartId()); d.setDepartId(p.getDepartId()); //查询产品信息 MaterialDistributeExtListVO mm = materialDistributeExtMapper.selectByModel(d); if(mm == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,产品编码数据不存在!"); } if(Constants.equalsInteger(mm.getStatus(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,产品已失效,无法进行生产!"); } //单位编码 p.setUnitId(mm.getUnitId()); if(Constants.equalsInteger(mm.getStatus(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,产品编码当前不能安排生产计划!"); } Bom bom = new Bom(); bom.setDeleted(Constants.ZERO); bom.setMaterialId(mm.getId()); bom.setRootDepartId(mm.getRootDepartId()); bom = bomExtMapper.selectOne(new QueryWrapper<>(bom).last(" limit 1")); if(bom == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,产品BOM未配置数据!"); } if(!Constants.equalsInteger(bom.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,产品BOM已失效,无法进行生产!"); } DepartmentExtListVO f = departmentExtService.getModelById(user.getCompany().getId(),p.getFactoryId()); if(!Constants.equalsInteger(f.getType(),Constants.DEPART_TYPE.factory)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,生产工厂数据非工厂组织,请检查!"); } if(Constants.equalsInteger(f.getStatus(),Constants.ONE) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,生产工厂当前状态不正确!"); } if(!Constants.equalsInteger(p.getDepartId(),departmentExtService.getComDepartId(f))){ //如果工厂与公司级组织不对应 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起, 生产工厂数据非当前公司组织,请检查!"); } } @Override public synchronized String getNextCode(Integer comId ){ String prefix = DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; Integer countNum = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.COM_PLANS_CODE_KEY+comId,Integer.class); countNum = Constants.formatIntegerNum(countNum)+1; //更新缓存 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_PLANS_CODE_KEY+comId,countNum); String nextIndex =Integer.toString( countNum); return prefix + StringUtils.leftPad(nextIndex,4,"0"); } @Override public synchronized String getNextBatch(Integer comId ){ String prefix = "FX-"+ DateUtil.getDate(new Date(),"yyyyMMdd") +"-"; Integer countNum = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.COM_PLAN_BATCH_KEY+comId,Integer.class); countNum = Constants.formatIntegerNum(countNum)+1; //更新缓存 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.COM_PLAN_BATCH_KEY+comId,countNum); String nextIndex =Integer.toString( countNum); return prefix + StringUtils.leftPad(nextIndex,4,"0"); } @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void pauseByIdForStandard(Plans model,LoginUserInfo userInfo){ model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(userInfo.getId()); model.setPaused(Constants.ONE); //更新计划数据 plansExtMapper.updateById(model); QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); qw.setPlanId(model.getId()); qw.setDeleted(Constants.ZERO); List ids = new ArrayList<>(); List whList = new ArrayList<>(); List orderList = workorderExtMapper.selectList(qw); if(orderList != null){ for(WorkorderExtListVO w : orderList){ if( Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.create)|| Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.material)|| Constants.equalsInteger(w.getStatus(),Constants.WORKORDER_STATUS.baogong) ){ //已创建、已投料和已报工的工单暂停 whList.add(WorkorderExtServiceImpl.initHistoryByModel(w,userInfo.getId(),Constants.WORKORDER_HISTORY_STATUS.pause)); //操作集合 ids.add(w.getId()); } } } //暂停全部相关工单 if(ids.size()>0){ Workorder order = new Workorder(); order.setPlanId(model.getId()); order.setUpdateTime(model.getUpdateTime()); order.setUpdateUser(model.getUpdateUser()); order.setIds(ids); order.setPaused(Constants.ONE); //取消工单 workorderExtMapper.updateByPlan(order); workorderHistoryExtMapper.insertBatch(whList); } } /** * 恢复计划 * @param p */ @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @Override public void regainByIdForStandard(Plans model,LoginUserInfo userInfo){ model.setUpdateTime(DateUtil.getCurrentDate()); model.setUpdateUser(userInfo.getId()); model.setPaused(Constants.ZERO); //更新计划数据 plansExtMapper.updateById(model); QueryWorkorderExtDTO qw = new QueryWorkorderExtDTO(); qw.setPlanId(model.getId()); qw.setDeleted(Constants.ZERO); //查询全部已暂停的工单数据 qw.setPaused(Constants.ONE); List ids = new ArrayList<>(); List whList = new ArrayList<>(); List orderList = workorderExtMapper.selectList(qw); if(orderList != null){ for(WorkorderExtListVO w : orderList){ if( Constants.equalsInteger(w.getPaused(),Constants.ONE) ){ //已暂停的工单全部恢复 whList.add(WorkorderExtServiceImpl.initHistoryByModel(w,userInfo.getId(),Constants.WORKORDER_HISTORY_STATUS.reagain)); //操作集合 ids.add(w.getId()); } } } //暂停全部相关工单 if(ids.size()>0){ Workorder order = new Workorder(); order.setPlanId(model.getId()); order.setUpdateTime(model.getUpdateTime()); order.setUpdateUser(model.getUpdateUser()); order.setIds(ids); order.setPaused(Constants.ZERO); //取消工单 workorderExtMapper.updateByPlan(order); workorderHistoryExtMapper.insertBatch(whList); } } }