package doumeemes.service.ext.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import doumeemes.biz.system.SystemDictDataBiz;
|
import doumeemes.core.annotation.excel.ExcelExporter;
|
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.redis.RedisUtil;
|
import doumeemes.dao.business.BackOrderDetailMapper;
|
import doumeemes.dao.business.BackorderMapper;
|
import doumeemes.dao.business.dto.CreateMaterialDTO;
|
import doumeemes.dao.business.dto.MaterialListDTO;
|
import doumeemes.dao.business.model.*;
|
import doumeemes.dao.ext.*;
|
import doumeemes.dao.ext.bean.EndCheckApBean;
|
import doumeemes.dao.ext.dto.*;
|
import doumeemes.dao.ext.vo.*;
|
import doumeemes.dao.system.model.SystemDictData;
|
import doumeemes.service.business.WOutboundService;
|
import doumeemes.service.ext.BarcodeParamExtService;
|
import doumeemes.service.ext.DepartmentExtService;
|
import doumeemes.service.ext.WStockRecordExtService;
|
import doumeemes.service.ext.WorkorderRecordExtService;
|
import doumeemes.service.system.SystemDictDataService;
|
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 javax.servlet.http.HttpServletResponse;
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* 工单生产过程记录Service实现
|
* @author 江蹄蹄
|
* @date 2022/04/20 10:56
|
*/
|
@Service
|
public class WorkorderRecordExtServiceImpl implements WorkorderRecordExtService {
|
|
@Autowired
|
private RedisTemplate<String, Object> redisTemplate;
|
@Autowired
|
public SystemDictDataBiz systemDictDataBiz;
|
|
@Autowired
|
private BackOrderDetailMapper backOrderDetailMapper;
|
@Autowired
|
private BackorderMapper backorderMapper;
|
@Autowired
|
private WOutboundDetailExtMapper wOutboundDetailExtMapper;
|
@Autowired
|
private WStockRecordExtService wStockRecordExtService;
|
@Autowired
|
private RouteProcedureExtMapper routeProcedureExtMapper;
|
@Autowired
|
private WStockExtMapper wStockExtMapper;
|
@Autowired
|
private WOutboundRecordExtMapper wOutboundRecordExtMapper;
|
@Autowired
|
private WOutboundService wOutboundService;
|
@Autowired
|
private WorkorderRecordExtMapper workorderRecordExtMapper;
|
@Autowired
|
private WorkorderCheckExtMapper workorderCheckExtMapper;
|
@Autowired
|
private AppliancesExtMapper appliancesExtMapper;
|
@Autowired
|
private PlansExtMapper plansExtMapper;
|
|
@Autowired
|
private CompanyUserExtMapper companyUserExtMapper;
|
@Autowired
|
private DepartmentExtService departmentExtService;
|
@Autowired
|
private PlanHistoryExtMapper planHistoryExtMapper;
|
@Autowired
|
private MaterialDistributeExtMapper materialDistributeExtMapper;
|
@Autowired
|
private WorkorderExtMapper workorderExtMapper;
|
@Autowired
|
private BomDetailExtMapper bomDetailExtMapper;
|
@Autowired
|
private BomExtMapper bomExtMapper;
|
@Autowired
|
private BarcodeParamExtService barcodeParamExtService;
|
@Autowired
|
private SystemDictDataService systemDictDataService;
|
@Autowired
|
private WorkorderHistoryExtMapper workorderHistoryExtMapper;
|
|
@Override
|
public PageData<WorkorderRecordExtListVO> findPage(PageWrap<QueryWorkorderRecordExtDTO> 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());
|
PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
|
|
//数据权限
|
List<Integer> dataPermission = user.getDepartPermissionList();
|
if(dataPermission!=null){
|
pageWrap.getModel().setCreateUser(user.getId());
|
pageWrap.getModel().setDepartIds(dataPermission);
|
/*if(dataPermission.size() == 0){
|
//只能看自己的(生产人员信息)
|
// pageWrap.getModel().setProUserId(user.getId());
|
//需求变更 查看数据权限范围内的数据(走创建人或者生产人员为我数据权限范围内);
|
pageWrap.getModel().setCreateUser(user.getId());
|
}else{
|
//否则走数据权限
|
pageWrap.getModel().setDepartIds(dataPermission);
|
}*/
|
}
|
List<WorkorderRecordExtListVO> result = workorderRecordExtMapper.selectListNew(pageWrap.getModel());
|
if(result!=null){
|
List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class);
|
for(WorkorderRecordExtListVO model : result){
|
//查询生产人员姓名
|
initProUser(user,model,allDepartList);
|
// BigDecimal s =new BigDecimal(Constants.formatIntegerNum(model.getSalary()));
|
// s.divide(new BigDecimal(0),2);
|
// model.setSalary(s.doubleValue());
|
}
|
}
|
return PageData.from(new PageInfo<>(result));
|
}
|
@Override
|
public PageData<SalaryStatisticsListVO> salaryStatistic(PageWrap<QuerySalaryStatisticDTO> 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());
|
PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
|
List<SalaryStatisticsListVO> result = workorderRecordExtMapper.salaryStatistic(pageWrap.getModel());
|
if(result!=null){
|
List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class);
|
for(SalaryStatisticsListVO model : result){
|
//查询生产人员姓名
|
// model.setUserName(initProUser(user,model.getUserId(),allDepartList));
|
model.setUserInfo(initProUser(user,model.getUserId(),allDepartList));
|
model.setJijianSalary(model.getJijianSalary().divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP));
|
model.setJishiSalary(model.getJishiSalary().divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP));
|
model.setTotalSalary(model.getTotalSalary().divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP));
|
}
|
}
|
return PageData.from(new PageInfo<>(result));
|
}
|
@Override
|
public PageData<UserSalaryListVO> userSalaryPage(PageWrap<QueryUserSalaryListDTO> 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());
|
pageWrap.getModel().setRootDepartId(user.getRootDepartment().getId());
|
PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity());
|
|
//数据权限
|
// List<Integer> dataPermission = user.getDepartPermissionList();
|
List<UserSalaryListVO> result = workorderRecordExtMapper.userSalaryPage(pageWrap.getModel());
|
if(result!=null){
|
List<DepartmentExtListVO> allDepartList = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_DEPART_LIST_KEY+user.getCompany().getId(),ArrayList.class);
|
for(UserSalaryListVO model : result){
|
//查询生产人员姓名
|
model.setUserInfo(initProUser(user,model.getUserId(),allDepartList));
|
if(Constants.formatBigdecimal4Float(model.getNum()).compareTo(new BigDecimal(0))>0){
|
model.setRate(Constants.formatBigdecimal4Float(model.getQualifiedNum()).divide(model.getNum(),4).multiply(new BigDecimal(100)));
|
}
|
}
|
}
|
return PageData.from(new PageInfo<>(result));
|
}
|
|
private void initProUser(LoginUserInfo user, WorkorderRecordExtListVO data, List<DepartmentExtListVO> allDepartList) {
|
if(data.getCreateUser() ==null){
|
return;
|
}
|
CompanyUser query=new CompanyUser();
|
query.setUserId(data.getCreateUser());
|
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.setProcedureName(comp.getName()+"-"+dName);
|
}
|
}
|
private UserBaseInfoVO initProUser(LoginUserInfo user, Integer userId, List<DepartmentExtListVO> allDepartList) {
|
if(userId ==null){
|
return null;
|
}
|
|
CompanyUser query=new CompanyUser();
|
query.setUserId(userId);
|
query.setRootDepartId(user.getRootDepartment().getId());
|
query.setDeleted(Constants.ZERO);
|
CompanyUser comp= companyUserExtMapper.selectOne(new QueryWrapper<>(query).last(" limit 1"));
|
if(comp!=null){
|
UserBaseInfoVO userinfo = new UserBaseInfoVO();
|
DepartmentExtListVO d = departmentExtService.getModelById(user.getCompany().getId(),comp.getDepartmentId(),allDepartList);
|
String dName =d==null?"":StringUtils.defaultString(d.getName(),"");
|
userinfo.setNameAndDepart (comp.getName()+"-"+dName);
|
userinfo.setDepartId(d.getId());
|
userinfo.setUserId(userId);
|
userinfo.setUserName(comp.getName());
|
userinfo.setDepartName(d.getName());
|
return userinfo;
|
}
|
return null;
|
}
|
@Override
|
public List<WorkorderRecordExtListVO> findAll(QueryWorkorderRecordExtDTO pageWrap) {
|
LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
|
}
|
pageWrap.setDeleted(Constants.ZERO);
|
//只能查看当前根组织的数据
|
pageWrap.setRootDepartId(user.getRootDepartment().getId());
|
List<WorkorderRecordExtListVO> result = workorderRecordExtMapper.selectListNew(pageWrap);
|
|
List<CategoryExtListVO> clist = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.COM_CATEGORY_KEY+user.getCompany().getId(), ArrayList.class);
|
|
for(int i=0;i<result.size();i++){
|
WorkorderRecordExtListVO w=result.get(i);
|
for(int j=0;j<clist.size();j++){
|
CategoryExtListVO categoryExtListVO=clist.get(j);
|
if(StringUtils.isNotEmpty(w.getCumodelCateBigId())){
|
if(Constants.equalsInteger(Integer.valueOf(w.getCumodelCateBigId()),categoryExtListVO.getId())){
|
w.setCmodel1BigName(categoryExtListVO.getName());
|
}
|
}
|
|
if(StringUtils.isNotEmpty(w.getCumodelCateMiddleId())){
|
if(Constants.equalsInteger(Integer.valueOf(w.getCumodelCateMiddleId()),categoryExtListVO.getId())){
|
w.setCmodel1MiddleName(categoryExtListVO.getName());
|
}
|
}
|
|
if(StringUtils.isNotEmpty(w.getCumodelCateSmallId())){
|
if(Constants.equalsInteger(Integer.valueOf(w.getCumodelCateSmallId()),categoryExtListVO.getId())){
|
w.setCmodel1SmallName(categoryExtListVO.getName());
|
}
|
}
|
|
}
|
}
|
return result;
|
}
|
|
|
|
|
|
|
/**
|
* 工单投料
|
* @param param
|
* @return
|
*/
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
@Override
|
public Integer createMaterial(CreateMaterialDTO param) {
|
LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
|
}
|
//查询并验证工单信息
|
Workorder mp = getOrderAndValid(user,param);
|
//查询全部bom组成数据,如果有BOM配置,按照BOM组成进行投料,如果没有BOM配置,则投料物料为待生产库位的物料本身
|
QueryBomDetailExtDTO bdparam = initBomParam(user,mp);
|
if(mp.getBomModel()!=null&&Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.pull)){
|
//如果是拉式投料,系统根据BOM自动扣减库存,不需要手动投料
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该物料投料方式是扣减库存,无需主动投料!");
|
}
|
//合并并坚持提交物料数据的合法性
|
List<MaterialListDTO> apList = initApParamList(param);
|
//查询全部投料记录(查询是否有重复投料的篮筐)
|
List<WorkorderRecordExtListVO> allRecordList = workorderRecordExtMapper.selectAllList(getAllRecordParam(mp.getId(),Constants.WORKORDER_RECORD_TYPE.materail,apList));
|
if(allRecordList!=null && allRecordList.size()>0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,相同工装器具不能重复投料该工单!");
|
}
|
//根据请求数据,查询全部器具信息
|
List<AppliancesExtListVO> aList = appliancesExtMapper.selectList(initApplianceParam(user,mp.getBackorderId(),apList));
|
if(aList == null || aList.size() ==0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,当前工装装载物料非本次返工返修关联物料");
|
}
|
//带批量插入投料记录集合
|
List<WorkorderRecord> recordList = new ArrayList<>();
|
//待更新数据
|
List<Appliances> appliancesList = new ArrayList<>() ;
|
if(Constants.equalsInteger(mp.getType(),Constants.WORKORDER_TYPE.normal)){
|
//如果是正常单
|
List<BomDetailExtListVO> bomDetailList = null;
|
//如果有bom配置
|
if(bdparam!=null){
|
bomDetailList = bomDetailExtMapper.selectList(bdparam);
|
}
|
for(AppliancesExtListVO amodel : aList){
|
BigDecimal pNum = getNumFromParam(amodel.getId(),apList);
|
//当前计划有bom不需要判断投料时的下一个工序进行对比,只有无BOM需要加这个校验
|
if(bdparam==null && !Constants.equalsInteger(amodel.getNextProcedureId(),mp.getProcedureId())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工装绑定的下一道工序与当前工单工序不一致,不能进行投料!");
|
}
|
if(bdparam!=null) {
|
//如果有bom配置,按bom进行投料
|
//判断器具装载物料数量是否满足提交条件
|
isValideApplianceNum(pNum,user,amodel,mp,bomDetailList);
|
}else {
|
//如果没有bom配置,投生产物料本身
|
//判断器具装载物料数量是否满足提交条件
|
isValideApplianceNum(pNum,user,amodel,mp);
|
}
|
//不更新器具状态和数据
|
//appliancesList.add(initUpdateAppliance(user,pNum,amodel));
|
//初始化投料记录对象
|
recordList.add(getWorkrecordModel(user,amodel,mp,pNum ));
|
}
|
}else{
|
//如果是返工返修申请
|
if(mp.getBackorderId() == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单关联返修申请信息有误,请联系管理员!");
|
}
|
for(AppliancesExtListVO amodel : aList){
|
BigDecimal pNum = getNumFromParam(amodel.getId(),apList);
|
//判断器具装载物料数量是否满足提交条件
|
isValideApplianceNum(pNum,user,amodel,mp);
|
//初始化投料记录对象
|
recordList.add(getWorkrecordModel(user,amodel,mp,pNum ));
|
}
|
}
|
|
//批量插入投料记录
|
workorderRecordExtMapper.insertBatch(recordList);
|
//单添加历史记录(不更新状态)
|
updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.material);
|
/*if(appliancesList.size()>0){
|
for(Appliances ta : appliancesList){
|
//根据id更新器具状态和数量
|
appliancesExtMapper.updateById(ta);
|
}
|
}*/
|
return param.getId();
|
}
|
/**
|
* 工单产出
|
* @param param
|
* @return
|
*/
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
@Override
|
public Integer createProduce(CreateMaterialDTO param) {
|
LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
|
}
|
|
//查询并验证工单信息
|
Workorder mp = getOrderAndValid(user,param);
|
|
//合并并坚持提交物料数据的合法性
|
List<MaterialListDTO> apList = initApParamList(param);
|
//查询全部产出记录(查询是否有重复投放的篮筐)
|
List<WorkorderRecordExtListVO> allRecordList = workorderRecordExtMapper.selectAllList(getAllRecordParam(mp.getId(),Constants.WORKORDER_RECORD_TYPE.produce,apList));
|
if(allRecordList!=null && allRecordList.size()>0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,相同工装器具不能重复投放产出物料!");
|
}
|
//根据请求数据,查询全部器具信息
|
List<AppliancesExtListVO> aList = appliancesExtMapper.selectList(initApplianceParam(user,null,apList));
|
if(aList == null || aList.size() ==0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单物料信息配置有误,请联系管理员!");
|
}
|
//带批量插入投料记录集合
|
List<WorkorderRecord> recordList = new ArrayList<>();
|
initBomParam(user,mp);
|
BomDetail bomDetail = isBomMaterialed(mp);
|
for(AppliancesExtListVO amodel : aList){
|
BigDecimal pNum = getNumFromParam(amodel.getId(),apList);
|
//判断器具装载物料数量是否满足提交条件,返回产出类型 0合格 1不良
|
Integer doneType = isValideAppliance(mp,pNum,user,amodel,bomDetail);
|
//初始化记录对象
|
recordList.add(getWorkrecordProModel(user,amodel.getId(),mp,pNum ,doneType));
|
}
|
|
|
//批量插入投料记录
|
workorderRecordExtMapper.insertBatch(recordList);
|
//单添加历史记录(不更新状态)
|
updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.produce);
|
|
return param.getId();
|
}
|
|
/**
|
* 产出工装是否满足条件,必须为合格工装
|
* @param user
|
* @param amodel
|
*/
|
private Integer isValideAppliance(Workorder mp,BigDecimal pNum,LoginUserInfo user, AppliancesExtListVO amodel, BomDetail bomDetail ) {
|
BarcodeParamExtListVO barCode = barcodeParamExtService.getByCodeId(user.getCompany().getId(),user.getCurComDepartment().getId(),amodel.getBrcode());
|
String pName =barCode==null? "":barCode.getPrefix();
|
if(pNum.compareTo(BigDecimal.ZERO)==0 ){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】提交数据不合法!");
|
}
|
if(amodel.getType() == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】非合格工装,不能投放产出物料!");
|
}
|
SystemDictData type = systemDictDataService.findById(amodel.getType());
|
/* if(type == null || !StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.qualified)){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+*//*pName+*//*amodel.getCode()+"】非合格工装,不能投放产出物料!");
|
}*/
|
if(type == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+ amodel.getCode()+"】工作属性有误,不能投放产出物料!");
|
}
|
if(!Constants.equalsInteger(mp.getType(),Constants.WORKORDER_TYPE.normal)){
|
//如果是返工工单,返工工单只能产出合格/报废属性的工装
|
if(!(StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.scrap)
|
|| StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.qualified))){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装器具【"+amodel.getCode()+"】质量属性不正确,返工工单只能产出合格/报废属性的工装!");
|
}
|
}
|
if(isRouteLastProcudureId(mp.getProcedureId(),mp) && bomDetail ==null){
|
//如果是最后一道工序、并且生产物料不是其他bom的组成,使用混合篮筐
|
if( !(StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.mix)||
|
StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.scrap)||
|
StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.rejects))){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+pName+amodel.getCode()+"】非混合工装,不能投放产出物料!");
|
}
|
}
|
|
if( StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.rejects)){
|
//不良
|
return Constants.ONE;
|
}else if( StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.scrap)){
|
//报废
|
return Constants.TWO;
|
}else if( StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.qualified)) {
|
//合格
|
return Constants.ZERO;
|
// }else if( StringUtils.equals(type.getLabel(),Constants.APPLIANCES_TYPE_LABLE.mix)){
|
}
|
return null;
|
}
|
|
private QueryWorkorderRecordExtDTO getAllRecordParam(Integer workorderId,int type, List<MaterialListDTO> aids) {
|
QueryWorkorderRecordExtDTO rParam = new QueryWorkorderRecordExtDTO();
|
rParam.setDeleted(Constants.ZERO);
|
rParam.setType(type);
|
rParam.setWorkorderId(workorderId);
|
rParam.setApplianceIds(aids);
|
return rParam;
|
}
|
|
/**
|
* 投料删除
|
* @param id
|
* @return
|
*/
|
@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(), "对不起,您无权限进行该操作!");
|
}
|
WorkorderRecord model = new WorkorderRecord();
|
model.setRootDepartId(user.getRootDepartment().getId());
|
model.setId(id);
|
model.setDeleted(Constants.ZERO);
|
//查询投料记录
|
model = workorderRecordExtMapper.selectByModel(model);
|
if(model ==null){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,记录不存在!");
|
}
|
if(!Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.create)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.material)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.producing)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.check)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.done)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!");
|
}
|
WorkorderRecord param = new WorkorderRecord();
|
param.setDeleted(Constants.ONE);
|
param.setId(id);
|
param.setUpdateTime(DateUtil.getCurrentDate());
|
param.setUpdateUser(user.getId());
|
workorderRecordExtMapper.updateById(param);
|
}
|
/**
|
* 投料修改
|
* @param workorderRecord
|
* @return
|
*/
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
@Override
|
public void updateById(WorkorderRecord workorderRecord){
|
LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
|
if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!");
|
}
|
if(Constants.formatBigdecimal(workorderRecord.getNum()).compareTo(new BigDecimal(0)) != 1){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,产品数量必须大于0!");
|
}
|
WorkorderRecord model = new WorkorderRecord();
|
model.setRootDepartId(user.getRootDepartment().getId());
|
model.setId(workorderRecord.getId());
|
model.setDeleted(Constants.ZERO);
|
//查询投料记录
|
model = workorderRecordExtMapper.selectByModel(model);
|
if(model ==null){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,记录不存在!");
|
}
|
if(!Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.create)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.material)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.producing)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.check)
|
&& !Constants.equalsInteger(model.getWorkorderStatus(),Constants.WORKORDER_STATUS.done)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!");
|
}
|
WorkorderRecord param = new WorkorderRecord();
|
param.setNum(workorderRecord.getNum());
|
param.setId(workorderRecord.getId());
|
param.setUpdateTime(DateUtil.getCurrentDate());
|
param.setUpdateUser(user.getId());
|
workorderRecordExtMapper.updateById(param);
|
}
|
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
@Override
|
public Integer comfirmDone(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(), "对不起,该记录不存在!");
|
}
|
/*
|
Plans plans = new Plans();
|
plans.setId(mp.getPlanId());
|
//查询计划已报工数量
|
plans = plansExtMapper.selectOne(new QueryWrapper<>(plans).select("(select sum(workorders.plan_num) from workorders where workorders.plan_id=plans.id and workorders.deleted=0 and workorders.status="+Constants.WORKORDER_STATUS.baogong+") as baogongNum").last(" limit 1"));
|
*/
|
|
param.setPlanId(mp.getPlanId());
|
if(Constants.equalsInteger(mp.getPaused(),Constants.ONE)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工单已暂停!");
|
}
|
//如果需要完工检才能检验
|
if(Constants.equalsInteger(mp.getNeedcheck(),Constants.ZERO)){
|
//只有已完工状态才能确认报工
|
if(!Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.done)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!");
|
}
|
}
|
// //出入库记录集合
|
// List<WOutbound> outboundList = new ArrayList<>();
|
// //出入库明细记录集合
|
List<WOutboundDetail> outboundDetailList = new ArrayList<>();
|
//待更新工装集合投料
|
List<Appliances> updateApplianceList = new ArrayList<>();
|
//待更新工装集合产出
|
List<Appliances> updateApplianceProList = new ArrayList<>();
|
//待更新库存集合
|
List<WStock> stockList = new ArrayList<>();
|
//查询投料和报工记录列表
|
List<WorkorderRecordExtListVO> allRecordList = workorderRecordExtMapper.selectAllList(getQueryRecordParam(param));
|
//检查数据信息
|
// caculateCheckRecord(user, mp,allRecordList);
|
QueryBomDetailExtDTO bdparam = initBomParam(user,mp);
|
if(mp.getBomModel()!=null&&Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.pull)){
|
//如果是拉式投料,系统根据BOM自动扣减库存
|
dealApplianceMateialPull(mp,user,bdparam,updateApplianceList, stockList);
|
}
|
if(allRecordList!=null && allRecordList.size()>0){
|
if(mp.getBomModel()==null||Constants.equalsInteger(mp.getBomModel().getType(),Constants.BOM_TYPE.push)){
|
//如果是推式投料,走正常生产手动投料
|
dealApplianceMateial(mp,user,allRecordList,updateApplianceList, outboundDetailList,stockList);
|
}
|
//处理产出数据
|
dealAppliancePro(mp,user,allRecordList,updateApplianceList,updateApplianceProList, outboundDetailList,stockList);
|
}
|
|
//如果有没bom配置,检查产出(包含检验的不良和报废品)和投料数量是否相等匹配,不一致提示错误
|
if(bdparam==null){
|
//投料数量 和 产出数量不相等
|
if(Constants.formatBigdecimal(mp.getHasMaterialNum()).intValue() != Constants.formatIntegerNum(mp.getHasProduceNum())){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单投料和产出数量不一致,请确认后重试!");
|
}
|
}
|
//更新工单状态为已报工
|
updateOrderInfo(user,mp,Constants.WORKORDER_HISTORY_STATUS.baogong);
|
/*if(updateApplianceList!=null && updateApplianceList.size()>0){
|
//遍历更新工装器具信息
|
for(Appliances a : updateApplianceList){
|
appliancesExtMapper.updateById(a);
|
}
|
}*/
|
//更新工装本身状态数据,以产出报工的工装状态为主,如果既有投料 也有产出的工单,以产出的状态为主进行更新
|
updateApplianceList(updateApplianceList,updateApplianceProList);
|
//批量插入出入库明细记录
|
if(outboundDetailList!=null && outboundDetailList.size()>0){
|
wOutboundDetailExtMapper.insertBatch(outboundDetailList);
|
}
|
if(stockList != null && stockList.size()>0){
|
for(WStock s : stockList){
|
WStock s1 = new WStock();
|
s1.setLocationId(s.getLocationId());
|
s1.setWarehouseId(s.getWarehouseId());
|
s1.setDeleted(Constants.ZERO);
|
s1.setMaterialId(s.getMaterialId());
|
s1.setQualityType(s.getQualityType());
|
s1.setProcedureId(s.getProcedureId());
|
if(StringUtils.isBlank(s.getBatch() )){
|
s1 = wStockExtMapper.selectOne(new QueryWrapper<>(s1).isNull("batch").last(" limit 1"));
|
}else{
|
s1.setBatch(s.getBatch());
|
s1 = wStockExtMapper.selectOne(new QueryWrapper<>(s1).last(" limit 1"));
|
}
|
if(s1 ==null){
|
//如果库存记录不存在,插入数据
|
s.setDeleted(Constants.ZERO);
|
s.setCreateTime(DateUtil.getCurrentDate());
|
s.setCreateUser(user.getId());
|
s.setRootDepartId(mp.getRootDepartId());
|
if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){
|
//如果库存不足
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,仓库余料不足,请联系仓库管理员!");
|
}
|
wStockExtMapper.insert(s);
|
}else{
|
//如果库存记录存在,则更新库存量
|
s.setId(s1.getId());
|
s.setUpdateTime(DateUtil.getCurrentDate());
|
s.setUpdateUser(user.getId());
|
s.setNum(Constants.formatBigdecimal(s1.getNum()).add(Constants.formatBigdecimal(s.getNum())));
|
if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){
|
//如果库存不足
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,仓库余料不足,请联系仓库管理员!!");
|
}
|
wStockExtMapper.updateById(s);
|
}
|
|
}
|
}
|
return param.getId();
|
}
|
|
private QueryWorkorderRecordExtDTO getQueryRecordParam(Workorder param) {
|
QueryWorkorderRecordExtDTO mParam = new QueryWorkorderRecordExtDTO();
|
mParam.setWorkorderId(param.getId());
|
mParam.setDeleted(Constants.ZERO);
|
return mParam;
|
}
|
//更新篮筐信息
|
private void updateApplianceList(List<Appliances> updateApplianceList, List<Appliances> updateApplianceProList) {
|
if(updateApplianceProList!=null){
|
for(Appliances a :updateApplianceProList){
|
//更新产出篮筐信息
|
dealUpdataeAppliance(a);
|
}
|
}
|
if(updateApplianceList!=null){
|
//更新投料篮筐信息
|
for(Appliances a :updateApplianceList){
|
if(existsInProlist(a.getId(),updateApplianceProList)){
|
// 如果既有投料 也有产出的工单,以产出的状态为主进行更新,投料的不管
|
continue;
|
}
|
dealUpdataeAppliance(a);
|
}
|
}
|
}
|
|
private void dealUpdataeAppliance(Appliances a) {
|
LambdaUpdateWrapper<Appliances> updateWrapper = new LambdaUpdateWrapper<>();
|
updateWrapper.eq(Appliances::getId,a.getId());
|
updateWrapper.set(Appliances::getUpdateTime,a.getUpdateTime());
|
updateWrapper.set(Appliances::getUpdateUser,a.getUpdateUser());
|
updateWrapper.set(Appliances::getNum,a.getNum());
|
updateWrapper.set(Appliances::getPositionType,a.getPositionType());
|
updateWrapper.set(Appliances::getStatus,a.getStatus());
|
updateWrapper.set(Appliances::getWorkorderId,a.getWorkorderId());
|
updateWrapper.set(Appliances::getWarehouseId,a.getWarehouseId());
|
updateWrapper.set(Appliances::getMaterialId,a.getMaterialId());
|
updateWrapper.set(Appliances::getCurObjId,a.getCurObjId());
|
updateWrapper.set(Appliances::getCurObjType,a.getCurObjType());
|
updateWrapper.set(Appliances::getLocationId,a.getLocationId());
|
updateWrapper.set(Appliances::getNextProcedureId,a.getNextProcedureId());
|
updateWrapper.set(Appliances::getProcedureId,a.getProcedureId());
|
updateWrapper.set(Appliances::getBatch,a.getBatch());
|
updateWrapper.set(Appliances::getRelobjType,a.getRelobjType());
|
updateWrapper.set(Appliances::getSaleorderId,a.getSaleorderId());
|
updateWrapper.set(Appliances::getBackorderId,a.getBackorderId());
|
updateWrapper.set(Appliances::getQualityType,a.getQualityType());
|
appliancesExtMapper.update(a,updateWrapper);
|
}
|
|
private boolean existsInProlist(Integer id, List<Appliances> updateApplianceProList) {
|
for(Appliances a : updateApplianceProList){
|
if(Constants.equalsInteger(id,a.getId())){
|
return true;
|
}
|
}
|
return false;
|
}
|
|
private Integer getNextProcudureId(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 < rpList.size()-1){
|
return rpList.get(i+1).getProcedureId();
|
}
|
}
|
}
|
}
|
return null;
|
}
|
private boolean isRouteLastProcudureId(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){
|
if(Constants.equalsInteger(rpList.get(rpList.size()-1).getProcedureId(),proceduresId)){
|
//检查是否最后一道工序
|
return true;
|
}
|
}
|
return false;
|
}
|
private void dealAppliancePro(Workorder mp
|
, LoginUserInfo user
|
, List<WorkorderRecordExtListVO> allRecordList
|
, List<Appliances> updateApplianceList
|
, List<Appliances> updateApplianceProList
|
, List<WOutboundDetail> outboundDetailList
|
, List<WStock> stockList) {
|
WOutbound outbound = new WOutbound();
|
outbound.setDeleted(Constants.ZERO);
|
outbound.setCreateTime(DateUtil.getCurrentDate());
|
outbound.setDealDate(outbound.getCreateTime());
|
outbound.setValidDate(outbound.getCreateTime());
|
outbound.setCreateUser(user.getId());
|
outbound.setRootDepartId(mp.getRootDepartId());
|
outbound.setDepartId(mp.getDepartId());
|
outbound.setStatus(Constants.WOUTBOUND_STATUS.dealed);
|
outbound.setType(Constants.WOUTBOUND_TYPE.in);
|
//2022年7月1日14:42:41 加入单据类别
|
outbound.setBillType(Constants.WOUTBOUND_BILLTYPE.workerOrderIn);
|
outbound.setCode(wOutboundService.getNextInCode(user.getCompany().getId()));
|
outbound.setOrigin(Constants.ONE);
|
outbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.produce);
|
outbound.setOriginCode(mp.getCode());
|
outbound.setOriginId(mp.getId());
|
outbound.setPlanDate(DateUtil.getCurrentDate());
|
outbound.setProcedureId(mp.getProcedureId());
|
outbound.setUserId(user.getId());
|
outbound.setWarehouseId(mp.getFinishWarehouseId());
|
wOutboundService.create(outbound);
|
|
List<WOutboundDetail> detailList = new ArrayList<>();
|
List<WOutboundRecord> recordList = new ArrayList<>();
|
for(WorkorderRecordExtListVO tModel :allRecordList){
|
if(Constants.equalsInteger(tModel.getType(),Constants.WORKORDER_RECORD_TYPE.produce)){
|
//如果是产出
|
mp.setHasProduceNum(Constants.formatBigdecimal(tModel.getNum()).intValue()+Constants.formatIntegerNum(mp.getHasProduceNum()));
|
if(tModel.getAmodel() == null){
|
continue;
|
}
|
if(tModel.getDoneType() == null){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装器具【"+tModel.getAmodel().getCode()+"】产出质量属性为空,无法报工!");
|
}
|
if(!Constants.equalsInteger(tModel.getDoneType(),Constants.ZERO)){
|
//如果不良,累计工单的不良产出
|
mp.setUnqualifiedNum(Constants.formatIntegerNum(mp.getUnqualifiedNum())+(Constants.formatBigdecimal(tModel.getNum()).intValue()));
|
// mp.setUnqualifiedNum(mp.getUnqualifiedNum().add(tModel.getNum()));
|
}else{
|
//如果是合格,累计工单的合格数量
|
mp.setQualifiedNum(Constants.formatIntegerNum(mp.getQualifiedNum())+(Constants.formatBigdecimal(tModel.getNum()).intValue()));
|
// mp.setUnqualifiedNum(mp.getQualifiedNum().add(tModel.getNum()));
|
}
|
//检查篮筐是否被作为产出篮筐,如果是,则需要判断该篮筐是否投料余额为0
|
Appliances curUpdateModel = getApplianceFromList(tModel.getAppliancesId(),updateApplianceList);
|
if(curUpdateModel!=null){
|
if(!Constants.equalsInteger(curUpdateModel.getStatus(),Constants.APPLIANCES_STATUS.empty)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装器具【"+tModel.getAmodel().getCode()+"】有工单产出记录,必须清空后才可报工!");
|
}
|
}else{
|
if(!Constants.equalsInteger(tModel.getAmodel().getStatus(),Constants.APPLIANCES_STATUS.empty)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,工装器具【"+tModel.getAmodel().getCode()+"】有工单产出记录,必须清空后才可报工!");
|
}
|
}
|
Appliances aModel = new Appliances();
|
aModel.setId(tModel.getAppliancesId());
|
aModel.setUpdateUser(user.getId());
|
aModel.setUpdateTime(DateUtil.getCurrentDate());
|
aModel.setNum(tModel.getNum());
|
//产出走仓库
|
aModel.setPositionType(Constants.APPLIANCES_POSITION.warehouse);
|
//篮筐有东西
|
aModel.setStatus(Constants.APPLIANCES_STATUS.full);
|
aModel.setWorkorderId(mp.getId());
|
aModel.setMaterialId(mp.getMaterialId());
|
aModel.setCurObjId(tModel.getId());
|
aModel.setCurObjType(Constants.ONE);
|
aModel.setWarehouseId(mp.getFinishWarehouseId());
|
aModel.setLocationId(mp.getFinishWarehouseLocationId());
|
aModel.setRelobjType(Constants.RELOBJ_TYPE.workorder);
|
aModel.setQualityType(tModel.getDoneType());
|
aModel.setBatch(tModel.getBatch());
|
aModel.setProcedureId(tModel.getProcedureId());
|
aModel.setBackProcedureId(null);
|
aModel.setBackorderId(null);
|
aModel.setSaleorderId(null);
|
aModel.setNextProcedureId(getNextProcudureId(tModel.getProcedureId(),mp));
|
|
updateApplianceProList.add(aModel);
|
|
//物料+批次+工序+质量属性去重
|
WOutboundDetail detail =getWoutbondDetailByList(tModel,detailList);
|
if(detail!=null){
|
detail.setNum(Constants.formatBigdecimal(detail.getNum()).add(tModel.getNum()));
|
}else{
|
detail = new WOutboundDetail();
|
detail.setDeleted(Constants.ZERO);
|
detail.setCreateTime(DateUtil.getCurrentDate());
|
detail.setCreateUser(user.getId());
|
detail.setOutboundId(outbound.getId());
|
detail.setRootDepartId(outbound.getRootDepartId());
|
detail.setWarehouseId(outbound.getWarehouseId());
|
detail.setLocationId(mp.getFinishWarehouseLocationId());
|
detail.setNum(tModel.getNum());
|
detail.setStatus(Constants.ONE);
|
detail.setDoneNum(tModel.getNum());
|
detail.setDoneDate(new Date());
|
detail.setUnitId(tModel.getUnitId());
|
detail.setBatch(tModel.getMaterialBatch());
|
detail.setProcedureId(tModel.getMaterialProcedureId());
|
detail.setMaterialId(tModel.getMaterialId());
|
detail.setQualityType(tModel.getMaterialDonetype());
|
detail.setWOutboundRecordInList(new ArrayList<>());
|
detailList.add(detail);
|
}
|
|
WOutboundRecord record = new WOutboundRecord();
|
record.setDeleted(Constants.ZERO);
|
record.setCreateTime(DateUtil.getCurrentDate());
|
record.setCreateUser(user.getId());
|
record.setAppliancesId(tModel.getAppliancesId());
|
record.setBatch(detail.getBatch());
|
record.setRootDepartId(mp.getRootDepartId());
|
record.setNum(tModel.getNum());
|
record.setOutboundId(detail.getOutboundId());
|
record.setUnitId(detail.getUnitId());
|
record.setWarehouseId(detail.getWarehouseId());
|
record.setMaterialId(detail.getMaterialId());
|
record.setProcedureId(detail.getProcedureId());
|
record.setLocationId(detail.getLocationId());
|
record.setQualityType(detail.getQualityType());
|
detail.getWOutboundRecordInList().add(record);
|
|
WStock stock = getFromStockList(mp.getFinishWarehouseLocationId(),detail.getWarehouseId(),detail.getMaterialId(),detail.getBatch(),tModel.getProcedureId(),tModel.getMaterialDonetype(),stockList);
|
if(stock!=null){
|
//如果库存对象已存在,直接增加对应的库存量
|
stock.setNum(Constants.formatBigdecimal(stock.getNum()).add(Constants.formatBigdecimal(tModel.getNum())));
|
}else{
|
stock = new WStock();
|
stock.setMaterialId(detail.getMaterialId());
|
stock.setBatch(detail.getBatch());
|
stock.setWarehouseId(outbound.getWarehouseId());
|
stock.setLocationId(mp.getFinishWarehouseLocationId());
|
stock.setUnitId(detail.getUnitId());
|
stock.setNum(Constants.formatBigdecimal(tModel.getNum()));
|
stock.setProcedureId(tModel.getProcedureId());
|
stock.setQualityType(tModel.getMaterialDonetype());
|
//待更新库存信息
|
stockList.add(stock);
|
}
|
}
|
}
|
for(WOutboundDetail detail : detailList){
|
wOutboundDetailExtMapper.insert(detail);
|
//记录库存变动记录
|
wStockRecordExtService.saveRecord(Constants.ONE,detail.getId(),user);
|
if(detail.getWOutboundRecordInList()!=null){
|
for(WOutboundRecord r : detail.getWOutboundRecordInList()){
|
r.setDetailId(detail.getId());
|
wOutboundRecordExtMapper.insert(r);
|
}
|
}
|
}
|
if(Constants.formatIntegerNum(mp.getHasProduceNum()) >Constants.formatIntegerNum(mp.getPlanNum())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,该工单的产出数量不能大于工单计划数量!");
|
}
|
}
|
|
private WOutboundDetail getWoutbondDetailByList(WorkorderRecordExtListVO tModel, List<WOutboundDetail> detailList) {
|
for(WOutboundDetail detail : detailList){
|
if(Constants.equalsInteger(detail.getProcedureId(),tModel.getMaterialProcedureId())
|
&& StringUtils.equals(detail.getBatch(),tModel.getMaterialBatch())
|
&& Constants.equalsInteger(detail.getMaterialId(),tModel.getMaterialId())
|
&& Constants.equalsInteger(detail.getQualityType(),tModel.getMaterialDonetype())){
|
return detail;
|
}
|
}
|
return null;
|
}
|
|
private Appliances getApplianceFromList(Integer appliancesId, List<Appliances> updateApplianceList) {
|
for(Appliances tModel :updateApplianceList){
|
if(Constants.equalsInteger(appliancesId,tModel.getId())){
|
return tModel;
|
}
|
}
|
|
return null;
|
}
|
|
private void dealApplianceMateialPull(Workorder mp
|
, LoginUserInfo user
|
,QueryBomDetailExtDTO bdparam
|
, List<Appliances> updateApplianceList
|
,List<WStock> stockList) {
|
//记录需要投料的物料和数量
|
List<Integer> tempIds = new ArrayList<>();
|
List<WStock> materialList = new ArrayList<>();
|
//如果有bom配置,查询全部bom组成,进行库存投料
|
if(bdparam!=null){
|
List<BomDetailExtListVO> bomDetailList = bomDetailExtMapper.selectList(bdparam);
|
if(bomDetailList == null || bomDetailList.size()==0){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该生产物料的bom配置有误,请联系管理员!");
|
}
|
for(BomDetailExtListVO d : bomDetailList){
|
//安装物料组成 乘以 生产量,拉式扣减的BOM每行物料数量=产出产品数量×BOM每行物料使用数量;
|
BigDecimal num = Constants.formatBigdecimal(d.getNum()).multiply(new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum())));
|
materialList.add(initMaterialNum(d.getMaterialId(),num));
|
tempIds.add(Constants.formatIntegerNum( d.getMaterialId()));
|
}
|
}else{
|
//投料为自己,1:1投生产物料
|
materialList.add(initMaterialNum(mp.getMaterialId(),new BigDecimal(Constants.formatIntegerNum(mp.getPlanNum()))));
|
tempIds.add(Constants.formatIntegerNum( mp.getMaterialId()));
|
}
|
//根据物料、质量属性(合格)去库存余额,并进行扣减,如果有多条库存余量则按创建时间顺序(正序)扣减;单条余额不够,支持扣多条余额数据;如果存在多仓库扣减,则产生多个出库单;
|
WStock sparam = new WStock();
|
sparam.setDeleted(Constants.ZERO);
|
sparam.setQualityType(Constants.QUALITIY_TYPE.normal);
|
sparam.setRootDepartId(mp.getRootDepartId());
|
//限制只从工单关联设备配置的待生产货位进行投料扣除
|
sparam.setWarehouseId(mp.getProduceWarehouseId());
|
sparam.setLocationId(mp.getProduceWarehouseLocationId());
|
//查询所有合格的符合物料需要的库存记录,按创建时间正序,库存量>0。
|
List<WStock> allList = wStockExtMapper.selectList(new QueryWrapper<>(sparam)
|
.isNull(mp.getProduceWarehouseLocationId()== null,"LOCATION_ID" ).in("MATERIAL_ID",tempIds).gt("NUM",new BigDecimal(0)).orderByAsc("CREATE_TIME"));
|
if(allList!=null && allList.size()>0){
|
List<WOutbound> outboundList = new ArrayList<>();
|
//如果需要投料的物料集合,在库存中寻找投料来源
|
for(WStock model : materialList){
|
for(WStock ts : allList){
|
if(Constants.equalsInteger(model.getMaterialId(),ts.getMaterialId())){
|
//还需要投料数量
|
BigDecimal actNum = Constants.formatBigdecimal(model.getNum()).subtract(Constants.formatBigdecimal(model.getTNum()));
|
if(actNum.compareTo(new BigDecimal(0))==0){
|
//如果已经投料完全,直接跳出
|
break;
|
}
|
boolean isfull =false;
|
if(actNum.compareTo(Constants.formatBigdecimal(ts.getNum())) ==1 ){
|
//如果当前库存不能满足剩余需求量,有多少投多少
|
actNum = Constants.formatBigdecimal(ts.getNum());
|
}else{
|
//如果已经满足剩余需求量
|
isfull =true;
|
}
|
//更新已经投料数量
|
model.setTNum(Constants.formatBigdecimal(model.getTNum()).add(actNum));
|
WOutbound outbound = getFromOutboundList(ts.getWarehouseId(),outboundList);
|
if(outbound==null){
|
outbound = new WOutbound();
|
outbound.setDeleted(Constants.ZERO);
|
outbound.setCreateTime(DateUtil.getCurrentDate());
|
outbound.setDealDate(outbound.getCreateTime());
|
outbound.setValidDate(outbound.getCreateTime());
|
outbound.setCreateUser(user.getId());
|
outbound.setRootDepartId(mp.getRootDepartId());
|
outbound.setDepartId(mp.getDepartId());
|
outbound.setStatus(Constants.WOUTBOUND_STATUS.dealed);
|
outbound.setType(Constants.WOUTBOUND_TYPE.out);
|
//2022年7月1日14:42:41 加入单据类别
|
outbound.setBillType(Constants.WOUTBOUND_BILLTYPE.workerOrderOut);
|
outbound.setCode(wOutboundService.getNextOutCode(user.getCompany().getId()));
|
outbound.setOrigin(Constants.ONE);
|
outbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.produce);
|
outbound.setOriginCode(mp.getCode());
|
outbound.setOriginId(mp.getId());
|
outbound.setPlanDate(DateUtil.getCurrentDate());
|
outbound.setUserId(user.getId());
|
outbound.setWarehouseId(ts.getWarehouseId());
|
wOutboundService.create(outbound);
|
outboundList.add(outbound);
|
}
|
|
WOutboundDetail detail = new WOutboundDetail();
|
detail.setDeleted(Constants.ZERO);
|
detail.setCreateTime(DateUtil.getCurrentDate());
|
detail.setCreateUser(user.getId());
|
detail.setRootDepartId(mp.getRootDepartId());
|
detail.setOutboundId(outbound.getId());
|
detail.setBatch(ts.getBatch());
|
detail.setWarehouseId(outbound.getWarehouseId());
|
detail.setLocationId(ts.getLocationId());
|
detail.setMaterialId(ts.getMaterialId());
|
detail.setNum(actNum);
|
detail.setDoneDate(new Date());
|
detail.setDoneNum(actNum);
|
detail.setStatus(Constants.ONE);
|
detail.setUnitId(ts.getUnitId());
|
detail.setProcedureId(ts.getProcedureId());
|
detail.setQualityType(ts.getQualityType());
|
wOutboundDetailExtMapper.insert(detail);
|
|
//记录库存变动记录
|
wStockRecordExtService.saveRecord(Constants.ZERO,detail.getId(),user);
|
|
WStock s = new WStock();
|
s.setId(ts.getId());
|
s.setUpdateTime(DateUtil.getCurrentDate());
|
s.setUpdateUser(user.getId());
|
s.setNum(Constants.formatBigdecimal(ts.getNum()).subtract(Constants.formatBigdecimal(actNum)));
|
if(Constants.formatBigdecimal(s.getNum()).compareTo(new BigDecimal(0)) == -1){
|
//如果库存不足
|
s.setNum(new BigDecimal(0));
|
}
|
wStockExtMapper.updateById(s);
|
|
/*WStock stock = getFromStockList(ts.getLocationId(),ts.getWarehouseId(),ts.getMaterialId(),ts.getBatch(),ts.getProcedureId(),ts.getQualityType(),stockList);
|
if(stock!=null){
|
//如果库存对象已存在,直接减少对应的库存量
|
stock.setNum(Constants.formatBigdecimal(stock.getNum()).subtract(actNum));
|
}else{
|
stock = new WStock();
|
stock.setMaterialId(ts.getMaterialId());
|
stock.setLocationId(ts.getLocationId());
|
stock.setNum(actNum.multiply(new BigDecimal(-1)));
|
stock.setWarehouseId(ts.getWarehouseId());
|
stock.setUnitId(ts.getUnitId());
|
stock.setBatch(ts.getBatch());
|
stock.setProcedureId(ts.getProcedureId());
|
stock.setQualityType(ts.getQualityType());
|
//待更新库存信息
|
stockList.add(stock);
|
}*/
|
if(isfull){
|
//如果已经满足剩余需求量,终止当前需求物料的库存查询
|
break;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
private WOutbound getFromOutboundList(Integer warehouseId, List<WOutbound> outboundList) {
|
for(WOutbound o : outboundList){
|
if(Constants.equalsInteger(warehouseId,o.getWarehouseId())){
|
return o;
|
}
|
}
|
return null;
|
}
|
|
private WStock initMaterialNum(Integer materialId, BigDecimal num) {
|
WStock s = new WStock();
|
s.setMaterialId(materialId);
|
//1:1投料
|
s.setNum(num);
|
return s;
|
}
|
|
private void dealApplianceMateial(Workorder mp
|
, LoginUserInfo user
|
, List<WorkorderRecordExtListVO> allRecordList
|
, List<Appliances> updateApplianceList
|
, List<WOutboundDetail> outboundDetailList
|
,List<WStock> stockList) {
|
WOutbound outbound = new WOutbound();
|
outbound.setDeleted(Constants.ZERO);
|
outbound.setCreateTime(DateUtil.getCurrentDate());
|
outbound.setDealDate(outbound.getCreateTime());
|
outbound.setValidDate(outbound.getCreateTime());
|
outbound.setCreateUser(user.getId());
|
outbound.setRootDepartId(mp.getRootDepartId());
|
outbound.setDepartId(mp.getDepartId());
|
outbound.setStatus(Constants.WOUTBOUND_STATUS.dealed);
|
outbound.setType(Constants.WOUTBOUND_TYPE.out);
|
//2022年7月1日14:42:41 加入单据类别
|
outbound.setBillType(Constants.WOUTBOUND_BILLTYPE.workerOrderOut);
|
outbound.setCode(wOutboundService.getNextOutCode(user.getCompany().getId()));
|
outbound.setOrigin(Constants.ONE);
|
outbound.setOriginType(Constants.WOUTBOUND_ORIGIN_TYPE.produce);
|
outbound.setOriginId(mp.getId());
|
outbound.setOriginCode(mp.getCode());
|
outbound.setPlanDate(DateUtil.getCurrentDate());
|
outbound.setProcedureId(mp.getProcedureId());
|
outbound.setUserId(user.getId());
|
outbound.setWarehouseId(mp.getProduceWarehouseId());
|
wOutboundService.create(outbound);
|
List<WOutboundDetail> detailList = new ArrayList<>();
|
for(WorkorderRecordExtListVO tModel :allRecordList){
|
if(Constants.equalsInteger(tModel.getType(),Constants.WORKORDER_RECORD_TYPE.materail)){
|
//如果是投料
|
mp.setHasMaterialNum(Constants.formatBigdecimal(tModel.getNum()).add(Constants.formatBigdecimal(mp.getHasMaterialNum())));
|
if(tModel.getAmodel()==null){
|
continue;
|
}
|
if(!Constants.equalsInteger(tModel.getAmodel().getLocationId(),mp.getProduceWarehouseLocationId())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+tModel.getAmodel().getCode()+"】装载物料信息必须来自工单待生产机台货位!");
|
}
|
//剩余数量
|
BigDecimal aNum = Constants.formatBigdecimal(tModel.getAmodel().getNum()).subtract(Constants.formatBigdecimal(tModel.getNum()));
|
Appliances aModel = new Appliances();
|
aModel.setId(tModel.getAppliancesId());
|
aModel.setUpdateUser(user.getId());
|
aModel.setUpdateTime(DateUtil.getCurrentDate());
|
if(aNum.compareTo(new BigDecimal(0)) < 0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+tModel.getAmodel().getCode()+"】内数量小于投料数量!");
|
}
|
aModel.setNum(aNum);
|
//投料走车间
|
aModel.setPositionType(Constants.APPLIANCES_POSITION.workshop);
|
if(aNum.compareTo(new BigDecimal(0)) == 0){
|
//如果剩余数量为0,清空篮筐
|
aModel.setStatus(Constants.APPLIANCES_STATUS.empty);
|
aModel.setWorkorderId(null);
|
aModel.setMaterialId(null);
|
aModel.setProcedureId(null);
|
aModel.setCurObjId(null);
|
aModel.setCurObjType(null);
|
aModel.setWarehouseId(null);
|
aModel.setLocationId(null);
|
aModel.setQualityType(null);
|
aModel.setNextProcedureId(null);
|
aModel.setSaleorderId(null);
|
aModel.setBackorderId(null);
|
aModel.setRelobjType(null);
|
if(Constants.equalsInteger(mp.getType(),Constants.WORKORDER_TYPE.normal)){
|
//正常工单,清楚批次号
|
aModel.setBatch(null);
|
}
|
}else{
|
aModel.setProcedureId(tModel.getAmodel().getProcedureId());
|
aModel.setStatus(tModel.getAmodel().getStatus());
|
aModel.setWorkorderId(tModel.getAmodel().getWorkorderId());
|
aModel.setMaterialId(tModel.getAmodel().getMaterialId());
|
aModel.setCurObjId(tModel.getAmodel().getCurObjId());
|
aModel.setCurObjType(tModel.getAmodel().getCurObjType());
|
aModel.setWarehouseId(tModel.getAmodel().getWarehouseId());
|
aModel.setLocationId(tModel.getAmodel().getLocationId());
|
aModel.setQualityType(tModel.getAmodel().getQualityType());
|
aModel.setNextProcedureId(tModel.getAmodel().getNextProcedureId());
|
aModel.setBatch(tModel.getAmodel().getBatch());
|
aModel.setPositionType(tModel.getAmodel().getPositionType());
|
aModel.setSaleorderId(tModel.getAmodel().getSaleorderId());
|
aModel.setBackorderId(tModel.getAmodel().getBackorderId());
|
aModel.setRelobjType(tModel.getAmodel().getRelobjType());
|
|
//2022年8月19日18:14:14 修改加入 原有生产工序
|
aModel.setProcedureId(tModel.getAmodel().getProcedureId());
|
}
|
updateApplianceList.add(aModel);
|
//物料+批次+工序+质量属性去重
|
WOutboundDetail detail =getWoutbondDetailByList(tModel,detailList);
|
if(detail!=null){
|
detail.setNum(Constants.formatBigdecimal(detail.getNum()).add(tModel.getNum()));
|
}else{
|
detail = new WOutboundDetail();
|
detail.setDeleted(Constants.ZERO);
|
detail.setCreateTime(DateUtil.getCurrentDate());
|
detail.setCreateUser(user.getId());
|
detail.setRootDepartId(mp.getRootDepartId());
|
detail.setOutboundId(outbound.getId());
|
detail.setWarehouseId(outbound.getWarehouseId());
|
detail.setLocationId(mp.getProduceWarehouseLocationId());
|
detail.setNum(tModel.getNum());
|
detail.setDoneDate(new Date());
|
detail.setDoneNum(tModel.getNum());
|
detail.setStatus(Constants.ONE);
|
detail.setUnitId(tModel.getUnitId());
|
detail.setMaterialId(tModel.getMaterialId());
|
detail.setBatch(tModel.getMaterialBatch());
|
detail.setProcedureId(tModel.getMaterialProcedureId());
|
detail.setQualityType(tModel.getMaterialDonetype());
|
detail.setWOutboundRecordInList(new ArrayList<>());
|
detailList.add(detail);
|
}
|
|
|
WOutboundRecord record = new WOutboundRecord();
|
/* WOutboundDetail detail = new WOutboundDetail();
|
detail.setDeleted(Constants.ZERO);
|
detail.setCreateTime(DateUtil.getCurrentDate());
|
detail.setCreateUser(user.getId());
|
detail.setRootDepartId(mp.getRootDepartId());
|
detail.setOutboundId(outbound.getId());
|
detail.setWarehouseId(outbound.getWarehouseId());
|
detail.setLocationId(mp.getProduceWarehouseLocationId());
|
detail.setNum(tModel.getNum());
|
detail.setStatus(Constants.ONE);
|
detail.setUnitId(tModel.getUnitId());
|
detail.setMaterialId(tModel.getMaterialId());
|
detail.setBatch(tModel.getMaterialBatch());
|
detail.setProcedureId(tModel.getMaterialProcedureId());
|
detail.setQualityType(tModel.getMaterialDonetype());
|
// outboundDetailList.add(detail);
|
wOutboundDetailExtMapper.insert(detail);*/
|
record.setDeleted(Constants.ZERO);
|
record.setCreateTime(DateUtil.getCurrentDate());
|
record.setCreateUser(user.getId());
|
record.setAppliancesId(tModel.getAppliancesId());
|
record.setBatch(detail.getBatch());
|
record.setDetailId(detail.getId());
|
record.setRootDepartId(mp.getRootDepartId());
|
record.setNum(tModel.getNum());
|
record.setOutboundId(detail.getOutboundId());
|
record.setUnitId(detail.getUnitId());
|
record.setWarehouseId(detail.getWarehouseId());
|
record.setMaterialId(detail.getMaterialId());
|
record.setProcedureId(detail.getProcedureId());
|
record.setQualityType(detail.getQualityType());
|
record.setLocationId(detail.getLocationId());
|
detail.getWOutboundRecordInList().add(record);
|
// wOutboundRecordExtMapper.insert(record);
|
WStock stock = getFromStockList(mp.getProduceWarehouseLocationId(),detail.getWarehouseId(),detail.getMaterialId(),detail.getBatch(),tModel.getAmodel().getProcedureId(),tModel.getAmodel().getQualityType(),stockList);
|
if(stock!=null){
|
//如果库存对象已存在,直接减少对应的库存量
|
stock.setNum(Constants.formatBigdecimal(stock.getNum()).subtract(Constants.formatBigdecimal(tModel.getNum())));
|
}else{
|
stock = new WStock();
|
stock.setMaterialId(detail.getMaterialId());
|
stock.setLocationId(mp.getProduceWarehouseLocationId());
|
stock.setNum(Constants.formatBigdecimal(tModel.getNum()).multiply(new BigDecimal(-1)));
|
stock.setWarehouseId(outbound.getWarehouseId());
|
stock.setUnitId(detail.getUnitId());
|
stock.setBatch(detail.getBatch());
|
stock.setProcedureId(tModel.getAmodel().getProcedureId());
|
stock.setQualityType(tModel.getAmodel().getQualityType());
|
//待更新库存信息
|
stockList.add(stock);
|
}
|
}
|
}
|
for(WOutboundDetail detail : detailList){
|
wOutboundDetailExtMapper.insert(detail);
|
//记录库存变动记录
|
wStockRecordExtService.saveRecord(Constants.ZERO,detail.getId(),user);
|
if(detail.getWOutboundRecordInList()!=null){
|
for(WOutboundRecord r : detail.getWOutboundRecordInList()){
|
r.setDetailId(detail.getId());
|
wOutboundRecordExtMapper.insert(r);
|
}
|
}
|
}
|
}
|
|
private WStock getFromStockList(Integer produceWarehouseLocationId, Integer warehouseId, Integer mId,String batch,Integer procedureId,Integer qtype,List<WStock> stockList) {
|
for(WStock s : stockList){
|
if(Constants.equalsInteger(produceWarehouseLocationId,s.getLocationId())
|
&& Constants.equalsInteger(procedureId,s.getProcedureId())
|
&& Constants.equalsInteger(qtype,s.getQualityType())
|
&& Constants.equalsInteger(warehouseId,s.getWarehouseId())
|
&& StringUtils.equals(batch,s.getBatch())
|
&& Constants.equalsInteger(mId,s.getMaterialId())){
|
return s;
|
}
|
}
|
return null;
|
}
|
|
|
private int caculateCheckRecord(LoginUserInfo user
|
, Workorder mp
|
,List<WorkorderRecordExtListVO> allRecordList ) {
|
if(Constants.equalsInteger(mp.getIscalculate(),Constants.ONE)){
|
//如果不需要报工计算不合格品,不作任何处理
|
return 0;
|
}
|
//否则查询检验数据
|
int cNum=0;
|
WorkorderCheck cParam = new WorkorderCheck();
|
cParam.setWorkorderId(mp.getId());
|
cParam.setDeleted(Constants.ZERO);
|
//查询工单全部检验记录
|
List<WorkorderCheck> checkList = workorderCheckExtMapper.selectGroupList(cParam);
|
if(checkList!= null && checkList.size()>0){
|
for(WorkorderCheck wc : checkList){
|
//不合格数量(包含不良和报废品数量)
|
cNum+= Constants.formatIntegerNum(wc.getUnqualifiedNum());
|
if(Constants.formatIntegerNum(wc.getUnqualifiedNum())>0){
|
//如果有报废或者不合格,走工单报工
|
WorkorderRecord r = getWorkrecordProModel(user,wc.getQualifiedApplianceId(),mp,new BigDecimal(Constants.formatIntegerNum(wc.getUnqualifiedNum())) ,Constants.ONE);
|
// checkRecordList.add(r);
|
//插入产出数据
|
workorderRecordExtMapper.insert(r);
|
WorkorderRecordExtListVO r1 = new WorkorderRecordExtListVO();
|
BeanUtils.copyProperties(r,r1);
|
r1.setAmodel(appliancesExtMapper.selectById(r1.getAppliancesId()));
|
if(allRecordList == null){
|
allRecordList = new ArrayList<>();
|
}
|
//附加到全部产品记录中
|
allRecordList.add(r1);
|
}
|
}
|
}
|
return cNum;
|
}
|
|
private void updateOrderInfo(LoginUserInfo user, Workorder mp,int status) {
|
|
List<WorkorderHistory> whList = new ArrayList<>();
|
//工单历史数据
|
Workorder order = new Workorder();
|
order.setId(mp.getId());
|
order.setUpdateTime(DateUtil.getCurrentDate());
|
order.setUpdateUser(user.getId());
|
order.setRootDepartId(mp.getRootDepartId());
|
order.setDepartId(mp.getDepartId());
|
whList.add(WorkorderExtServiceImpl.initHistoryByModel(order,user.getId(),status));
|
if(status == Constants.WORKORDER_HISTORY_STATUS.baogong){
|
order.setStatus(Constants.WORKORDER_STATUS.baogong);
|
order.setQualifiedNum(mp.getQualifiedNum());
|
order.setUnqualifiedNum(mp.getUnqualifiedNum());
|
/* if(order.getHasProduceNum()>=Constants.formatIntegerNum(mp.getTotalPlanNum())){
|
//如果计划数量已经完成,则更新计划的数据状态
|
Plans model = new Plans();
|
model.setId(mp.getPlanId());
|
//检查数据有效性
|
model.setUpdateTime(DateUtil.getCurrentDate());
|
model.setUpdateUser(user.getId());
|
model.setStatus(Constants.PLAN_STATUS.publish);
|
model.setRootDepartId(mp.getRootDepartId());
|
model.setDepartId(mp.getDepartId());
|
//更新计划数据
|
plansExtMapper.updateById(model);
|
//历史数据,关闭
|
planHistoryExtMapper.insert(PlansExtServiceImpl.initHistoryByModel(model,user.getId(),Constants.PLANHISTORY_TYPE.done));
|
|
}*/
|
}else if(status ==Constants.WORKORDER_HISTORY_STATUS.readyMaterial){
|
order.setStatus(Constants.WORKORDER_STATUS.material);
|
}else if(status ==Constants.WORKORDER_HISTORY_STATUS.done){
|
order.setStatus(Constants.WORKORDER_STATUS.done);
|
}else if(status ==Constants.WORKORDER_HISTORY_STATUS.produce){
|
//投料操作
|
if(Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create)
|
||Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.material)){
|
//如果是已创建或者已备料状态的工单,修改其状态为【生产中】
|
order.setStatus(Constants.WORKORDER_STATUS.producing);
|
}
|
}
|
workorderExtMapper.updateById(order);
|
workorderHistoryExtMapper.insertBatch(whList);
|
}
|
|
/**
|
* 投料批量删除
|
* @param idList
|
* @return
|
*/
|
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
|
@Override
|
public void deleteByIdInBatch(List<Integer> idList){
|
for(Integer id : idList){
|
this.deleteById(id);
|
}
|
}
|
|
/**
|
* 如果没有bom配置 直接投自己,只能从工单上设备关联的待生产机台货位投料
|
* @param user
|
* @param amodel
|
* @param mp
|
*/
|
private void isValideApplianceNum(BigDecimal pNum,LoginUserInfo user,AppliancesExtListVO amodel, Workorder mp) {
|
// BarcodeParamExtListVO barCode = barcodeParamExtService.getByCodeId(user.getCompany().getId(),user.getCurComDepartment().getId(),amodel.getBrcode());
|
// String pName =barCode==null? "":barCode.getPrefix();
|
if(pNum.compareTo(BigDecimal.ZERO)==0 || pNum.compareTo(Constants.formatBigdecimal(amodel.getNum()))>0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】提交数据不合法!");
|
}
|
if(!Constants.equalsInteger(amodel.getMaterialId(),mp.getMaterialId())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】装载物料信息不符合工单投料要求!");
|
}
|
if(!Constants.equalsInteger(amodel.getLocationId(),mp.getProduceWarehouseLocationId())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】装载物料信息必须来自工单待生产机台货位!");
|
}
|
}
|
|
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;
|
}
|
private BomDetail isBomMaterialed( Workorder mp) throws BusinessException{
|
BomDetail bom = new BomDetail();
|
bom.setDeleted(Constants.ZERO);
|
bom.setMaterialId(mp.getMaterialId());
|
return bomDetailExtMapper.selectOne(new QueryWrapper<>(bom).exists(" select c.id from bom_version b left join bom c on b.bom_id=c.id where bom_detail.bom_id=b.id and c.status=1 and c.deleted=0 limit 1").last(" limit 1"));
|
}
|
private WorkorderRecord getWorkrecordModel(LoginUserInfo user, AppliancesExtListVO amodel, Workorder mp,BigDecimal pNum) {
|
WorkorderRecord wrModel = new WorkorderRecord();
|
wrModel.setWorkorderId(mp.getId());
|
wrModel.setDeleted(Constants.ZERO);
|
wrModel.setRootDepartId(mp.getRootDepartId());
|
wrModel.setMaterialId(amodel.getMaterialId());
|
wrModel.setDepartId(mp.getDepartId());
|
wrModel.setCreateTime(DateUtil.getCurrentDate());
|
wrModel.setCreateUser(user.getId());
|
wrModel.setAppliancesId(amodel.getId());
|
wrModel.setMaterialBatch(amodel.getBatch());
|
wrModel.setType(Constants.WORKORDER_RECORD_TYPE.materail);
|
wrModel.setFactoryId(mp.getFactoryId());
|
wrModel.setProcedureId(mp.getProcedureId());
|
wrModel.setBatch(mp.getBatch());
|
wrModel.setUnitId(amodel.getMdmodel().getUnitId());
|
wrModel.setPlanId(mp.getPlanId());
|
wrModel.setMaterialDonetype(amodel.getQualityType());
|
wrModel.setMaterialProcedureId(amodel.getProcedureId());
|
wrModel.setNum(pNum);
|
wrModel.setRelobjType(amodel.getRelobjType());
|
wrModel.setRelobjId(amodel.getWorkorderId());
|
return wrModel;
|
}
|
private WorkorderRecord getWorkrecordProModel(LoginUserInfo user, Integer applianceId, Workorder mp,BigDecimal pNum,Integer doneType ) {
|
WorkorderRecord wrModel = new WorkorderRecord();
|
wrModel.setWorkorderId(mp.getId());
|
wrModel.setDeleted(Constants.ZERO);
|
wrModel.setMaterialId(mp.getMaterialId());
|
wrModel.setRootDepartId(mp.getRootDepartId());
|
wrModel.setDepartId(mp.getDepartId());
|
wrModel.setCreateTime(DateUtil.getCurrentDate());
|
wrModel.setCreateUser(user.getId());
|
wrModel.setAppliancesId(applianceId);
|
wrModel.setProcedureId(mp.getProcedureId());
|
if(Constants.equalsInteger(mp.getType(),Constants.WORKORDER_TYPE.repair)){
|
//如果是返工返修工单,工序为返工返修申请的产生工序
|
Backorder order = backorderMapper.selectById(mp.getBackorderId());
|
if(order !=null){
|
wrModel.setProcedureId(order.getProcedureId());
|
}
|
}
|
wrModel.setMaterialBatch(mp.getBatch());
|
wrModel.setType(Constants.WORKORDER_RECORD_TYPE.produce);
|
wrModel.setFactoryId(mp.getFactoryId());
|
wrModel.setBatch(mp.getBatch());
|
wrModel.setUnitId(mp.getUnitId());
|
wrModel.setPlanId(mp.getPlanId());
|
wrModel.setNum(pNum);
|
wrModel.setProDate(mp.getPlanDate());
|
wrModel.setDoneType(doneType);
|
wrModel.setMaterialProcedureId(mp.getProcedureId());
|
wrModel.setMaterialDonetype(doneType);
|
return wrModel;
|
}
|
|
private void updateOrderInfo2(LoginUserInfo user, Workorder mp) {
|
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.setStatus(Constants.WORKORDER_STATUS.material);
|
/*if(Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.create)){
|
//如果当前状态为已分配,则更新为已投料
|
workorderExtMapper.updateById(order);
|
}*/
|
whList.add(WorkorderExtServiceImpl.initHistoryByModel(order,user.getId(),Constants.WORKORDER_HISTORY_STATUS.material));
|
workorderHistoryExtMapper.insertBatch(whList);
|
}
|
|
private QueryAppliancesExtDTO initApplianceParam(LoginUserInfo user,Integer backorderId, List<MaterialListDTO> apList) {
|
QueryAppliancesExtDTO appliancesExtDTO = new QueryAppliancesExtDTO();
|
appliancesExtDTO.setDeleted(Constants.ZERO);
|
appliancesExtDTO.setRootDepartId(user.getRootDepartment().getId());
|
appliancesExtDTO.setDepartId(user.getComDepartment().getId());
|
appliancesExtDTO.setBackorderId(backorderId);
|
appliancesExtDTO.setRecordList(apList);
|
return appliancesExtDTO;
|
|
}
|
|
private Workorder getOrderAndValid(LoginUserInfo user, CreateMaterialDTO param) throws BusinessException{
|
if(param.getId()== null||param.getRecordList()==null || param.getRecordList().size()==0){
|
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)
|
&& !Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.material)
|
&& !Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.producing)
|
&& !Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.check)
|
&& !Constants.equalsInteger(mp.getStatus(),Constants.WORKORDER_STATUS.done)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,该工单状态已流转,不能进行该操作!");
|
}
|
return mp;
|
}
|
|
private void isValideApplianceNum(BigDecimal pNum, LoginUserInfo user, AppliancesExtListVO amodel, Workorder mp, List<BomDetailExtListVO> bomDetailList) throws BusinessException {
|
// BarcodeParamExtListVO barCode = barcodeParamExtService.getByCodeId(user.getCompany().getId(),user.getCurComDepartment().getId(),amodel.getBrcode());
|
// String pName =barCode==null? "":barCode.getPrefix();
|
if(pNum.compareTo(BigDecimal.ZERO)==0 || pNum.compareTo(Constants.formatBigdecimal(amodel.getNum()))>0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】提交数据不合法!");
|
}
|
if(!Constants.equalsInteger(amodel.getLocationId(),mp.getProduceWarehouseLocationId())){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】装载物料信息必须来自工单待生产机台货位!");
|
}
|
//获取该物料的组成部分
|
BomDetailExtListVO detial =getBomMaterial(amodel.getMaterialId(),bomDetailList);
|
if(detial == null){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+/*pName+*/amodel.getCode()+"】装载物料非BOM组成物料!");
|
}
|
|
/*
|
//如果bom需求数量已经满足,不需求再投料
|
if(detial.getNum().compareTo(pNum.add(detial.getWorkorderNum()))<0){
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,器具【"+pName+amodel.getCode()+"】装载投料数量已超出需求!");
|
}*/
|
}
|
|
private BomDetailExtListVO getBomMaterial(Integer materialId, List<BomDetailExtListVO> bomDetailList) {
|
for(BomDetailExtListVO d : bomDetailList){
|
if(Constants.equalsInteger(materialId,d.getMaterialId())){
|
return d;
|
}
|
}
|
return null;
|
}
|
|
/**
|
* 获取工作器具提交的投料数量
|
* @param id
|
* @param apList
|
* @return
|
*/
|
private BigDecimal getNumFromParam(Integer id, List<MaterialListDTO> apList) {
|
for(MaterialListDTO l : apList){
|
if(Constants.equalsInteger(id,l.getApplianceId())){
|
return l.getNum();
|
}
|
}
|
return BigDecimal.ZERO;
|
}
|
|
/**
|
* 初始化请求数据
|
* @param param
|
* @return
|
*/
|
private List<MaterialListDTO> initApParamList(CreateMaterialDTO param ) {
|
List<MaterialListDTO> list = new ArrayList<>();
|
for(MaterialListDTO l : param.getRecordList()){
|
|
MaterialListDTO temp = existsInlist(l.getApplianceId(),list);
|
if(temp == null){
|
list.add(l);
|
}else{
|
//如果扫码重复,则累加数量
|
temp.setNum( temp.getNum().add(l.getNum()));
|
}
|
}
|
return list;
|
}
|
|
private MaterialListDTO existsInlist(Integer applianceId, List<MaterialListDTO> list) {
|
for(MaterialListDTO l : list){
|
if(Constants.equalsInteger(applianceId,l.getApplianceId())){
|
return l;
|
}
|
}
|
return null;
|
}
|
|
|
@Override
|
public EndCheckApBean getWOutboundRecordAp(String workOrderId , String appliancesId ){
|
EndCheckApBean endCheckApBean = wOutboundRecordExtMapper.getWOutboundRecordAp(workOrderId,appliancesId);
|
if(Objects.isNull(endCheckApBean)){
|
throw new BusinessException(ResponseStatus.OBJECT_EMP.getCode(), "对不起,未查询到产出记录!");
|
}
|
return endCheckApBean;
|
}
|
|
|
@Override
|
public void exportUserSalary(PageWrap<QueryUserSalaryListDTO> pageWrap, HttpServletResponse response) {
|
List<UserSalaryListVO> result=this.userSalaryPage(pageWrap).getRecords();
|
for(UserSalaryListVO model : result) {
|
if(model.getUserInfo()!=null){
|
model.setUserName(model.getUserInfo().getUserName());
|
model.setDepartName(model.getUserInfo().getDepartName());
|
model.setNum(Constants.formatBigdecimalFloat(model.getNum(),2));
|
model.setQualifiedNum(Constants.formatBigdecimalFloat(model.getQualifiedNum(),2));
|
model.setUnQualifiedNum(Constants.formatBigdecimalFloat(model.getUnQualifiedNum(),2));
|
model.setRate(Constants.formatBigdecimalFloat(model.getRate(),2));
|
}
|
}
|
ExcelExporter.build(UserSalaryListVO.class).export(result, "员工绩效明细"+System.currentTimeMillis(), response);
|
}
|
@Override
|
public void exportSalaryStatistics(PageWrap<QuerySalaryStatisticDTO> pageWrap, HttpServletResponse response){
|
List<SalaryStatisticsListVO> result=this.salaryStatistic(pageWrap).getRecords();
|
for(SalaryStatisticsListVO model : result) {
|
if(model.getUserInfo()!=null){
|
model.setUserName(model.getUserInfo().getUserName());
|
model.setDepartName(model.getUserInfo().getDepartName());
|
}
|
}
|
ExcelExporter.build(SalaryStatisticsListVO.class).export(result, "工资报表"+System.currentTimeMillis(), response);
|
|
}
|
@Override
|
public void exportExcel(PageWrap<QueryWorkorderRecordExtDTO> pageWrap, HttpServletResponse response) {
|
List<WorkorderRecordExtListVO> result=this.findPage(pageWrap).getRecords();
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
List<WorkorderRecordExportExtListVO> list=new ArrayList<>();
|
for(int i=0;i<result.size();i++) {
|
WorkorderRecordExtListVO re = result.get(i);
|
WorkorderRecordExportExtListVO wreev = new WorkorderRecordExportExtListVO();
|
if (re.getOmodel() != null) {
|
wreev.setWorkordercode(re.getOmodel().getCode());
|
if (re.getOmodel().getStatus() != null) {
|
String status = Constants.WORKORDER_STATUS.getTitleByStatus(null, re.getOmodel().getStatus());
|
wreev.setStatus(status);
|
}
|
}
|
if (re.getMmodel() != null) {
|
wreev.setMaterialcode(re.getMmodel().getCode());
|
wreev.setMaterialname(re.getMmodel().getName());
|
}
|
|
wreev.setBatch(re.getBatch());
|
if (re.getPromodel() != null) {
|
wreev.setProceduresname(re.getPromodel().getName());
|
}
|
|
String unintname = "";
|
if (re.getUmodel() != null) {
|
unintname = re.getUmodel().getName();
|
}
|
if (re.getPmodel() != null) {
|
BigDecimal pmodelnum = re.getNum() != null ? re.getNum() : new BigDecimal("0");
|
// wreev.setPlanNum( new BigDecimal(pmodelnum).stripTrailingZeros().toPlainString() + unintname);
|
wreev.setPlanNum( re.getNum().stripTrailingZeros().toPlainString()+unintname);
|
}
|
wreev.setProcedureName(re.getProcedureName());
|
wreev.setUnintname(unintname);
|
if(re.getNum()!=null){
|
wreev.setAppliancenum(re.getNum().stripTrailingZeros().toPlainString()+unintname );
|
}
|
|
|
if (re.getAmodel() != null) {
|
wreev.setAppliancecode(re.getAmodel().getCode());
|
}
|
|
wreev.setDeviceCode(re.getDeviceCode()+"|"+re.getDeviceName());
|
wreev.setCreateTime(format.format(re.getCreateTime()));
|
wreev.setQualifiedNum( (Objects.nonNull(re.getQualifiedNum()) ? re.getQualifiedNum() : 0)+unintname);
|
wreev.setUnqualifiedNum((Objects.nonNull(re.getUnqualifiedNum()) ? re.getUnqualifiedNum() : 0)+unintname);
|
Integer duration = re.getDuration();
|
if (Objects.nonNull(duration)){
|
Integer h = duration/3600;
|
Integer m = (duration%3600)/60;
|
Integer s = ((duration%3600)%60);
|
wreev.setDuration(h+"小时"+m+"分钟"+s+"秒");
|
}else {
|
wreev.setDuration("-");
|
}
|
wreev.setSalaryType(re.getSalaryType());
|
wreev.setSalaryPrice(re.getSalaryYuan());
|
list.add(wreev);
|
|
}
|
ExcelExporter.build(WorkorderRecordExportExtListVO.class).export(list, "生产产出明细"+System.currentTimeMillis(), response);
|
|
// EasyExcelUtil.exportExcel(list, "工单生产过程记录","工单生产过程记录",WorkorderRecordExportExtListVO.class,"工单生产过程记录"+System.currentTimeMillis()+".xls", response);
|
}
|
|
@Override
|
public void exportExcel2(PageWrap<QueryWorkorderRecordExtDTO> pageWrap, HttpServletResponse response) {
|
|
List<WorkorderRecordExtListVO> result=this.findPage(pageWrap).getRecords();
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
List<WorkorderRecordBathExportExtListVO> list=new ArrayList<>();
|
for(int i=0;i<result.size();i++) {
|
WorkorderRecordExtListVO re = result.get(i);
|
WorkorderRecordBathExportExtListVO wreev = new WorkorderRecordBathExportExtListVO();
|
if (re.getOmodel() != null) {
|
wreev.setWorkordercode(re.getOmodel().getCode());
|
if (re.getOmodel().getStatus() != null) {
|
String status = Constants.WORKORDER_STATUS.getTitleByStatus(null, re.getOmodel().getStatus());
|
wreev.setStatus(status);
|
}
|
}
|
if (re.getMmodel() != null) {
|
wreev.setMaterialcode(re.getMmodel().getCode());
|
wreev.setMaterialname(re.getMmodel().getName());
|
}
|
|
wreev.setBatch(re.getBatch());
|
if (re.getPromodel() != null) {
|
wreev.setProceduresname(re.getPromodel().getName());
|
}
|
|
String unintname = "";
|
if (re.getUmodel() != null) {
|
unintname = re.getUmodel().getName();
|
}
|
if (re.getNum() != null) {
|
BigDecimal pmodelnum = re.getNum() != null ? re.getNum() : new BigDecimal("0");
|
// wreev.setPlanNum( new BigDecimal(pmodelnum).stripTrailingZeros().toPlainString() + unintname);
|
wreev.setNum( pmodelnum.stripTrailingZeros().toPlainString()+unintname);
|
}
|
wreev.setProcedureName(re.getProcedureName());
|
wreev.setUnintname(unintname);
|
if(re.getOmodel().getPlanNum() != null){
|
wreev.setPlanNum(re.getOmodel().getPlanNum().toString() );
|
}
|
wreev.setMaterialDonetype(re.getMaterialDonetype());
|
wreev.setDeviceCode(re.getDeviceCode()+"|"+re.getDeviceName());
|
wreev.setCreateTime(format.format(re.getCreateTime()));
|
list.add(wreev);
|
|
}
|
ExcelExporter.build(WorkorderRecordBathExportExtListVO.class).export(list, "生产投料明细"+System.currentTimeMillis(), response);
|
|
}
|
}
|