package com.chinaztt.mes.quality.service.impl;
|
|
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.util.BooleanUtil;
|
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
import com.chinaztt.ifs.api.feign.IfsFeignClient;
|
import com.chinaztt.mes.basic.dto.LocationIfsMoveDTO;
|
import com.chinaztt.mes.basic.entity.Location;
|
import com.chinaztt.mes.basic.entity.Part;
|
import com.chinaztt.mes.basic.entity.Staff;
|
import com.chinaztt.mes.basic.entity.WorkstationLocation;
|
import com.chinaztt.mes.basic.mapper.LocationMapper;
|
import com.chinaztt.mes.basic.mapper.PartMapper;
|
import com.chinaztt.mes.basic.mapper.StaffMapper;
|
import com.chinaztt.mes.basic.mapper.WorkstationLocationMapper;
|
import com.chinaztt.mes.basic.service.LocationService;
|
import com.chinaztt.mes.basic.util.BigDecimalUtils;
|
import com.chinaztt.mes.basic.util.DictUtils;
|
import com.chinaztt.mes.common.numgen.NumberGenerator;
|
import com.chinaztt.mes.common.oa.OAProcess;
|
import com.chinaztt.mes.common.oa.OAProperty;
|
import com.chinaztt.mes.common.oa.OAResult;
|
import com.chinaztt.mes.common.util.WechatMsgTips;
|
import com.chinaztt.mes.quality.dto.*;
|
import com.chinaztt.mes.quality.entity.Apply;
|
import com.chinaztt.mes.quality.entity.QualityUnqualifiedConfiguration;
|
import com.chinaztt.mes.quality.entity.UnqualifiedProcess;
|
import com.chinaztt.mes.quality.entity.UnqualifiedProcessFile;
|
import com.chinaztt.mes.quality.mapper.ApplyMapper;
|
import com.chinaztt.mes.quality.mapper.ApplyPartMapper;
|
import com.chinaztt.mes.quality.mapper.QualityUnqualifiedConfigurationMapper;
|
import com.chinaztt.mes.quality.mapper.UnqualifiedProcessMapper;
|
import com.chinaztt.mes.quality.service.ApplyService;
|
import com.chinaztt.mes.quality.service.UnqualifiedProcessFileService;
|
import com.chinaztt.mes.quality.service.UnqualifiedProcessService;
|
import com.chinaztt.mes.quality.state.unqualifiedprocess.constant.UnqualifiedprocessStateStringValues;
|
import com.chinaztt.mes.warehouse.dto.StockDTO;
|
import com.chinaztt.mes.warehouse.entity.Stock;
|
import com.chinaztt.mes.warehouse.mapper.StockMapper;
|
import com.chinaztt.mes.warehouse.service.StockService;
|
import com.chinaztt.mes.warehouse.util.StockUtils;
|
import com.chinaztt.ztt.common.core.util.R;
|
import com.chinaztt.ztt.common.oss.OssProperties;
|
import com.chinaztt.ztt.common.oss.service.OssTemplate;
|
import com.chinaztt.ztt.common.security.service.ZttUser;
|
import com.chinaztt.ztt.common.security.util.SecurityUtils;
|
import lombok.AllArgsConstructor;
|
import net.bytebuddy.implementation.bytecode.Throw;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.InputStream;
|
import java.math.BigDecimal;
|
import java.text.SimpleDateFormat;
|
import java.time.LocalDateTime;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* 不合格处理表
|
*
|
* @author cxf
|
* @date 2021-04-16 13:15:30
|
*/
|
@Service
|
@AllArgsConstructor
|
@Transactional(rollbackFor = Exception.class)
|
public class UnqualifiedProcessServiceImpl extends ServiceImpl<UnqualifiedProcessMapper, UnqualifiedProcess> implements UnqualifiedProcessService {
|
private LocationService locationService;
|
private ApplyPartMapper applyPartMapper;
|
private ApplyMapper applyMapper;
|
private PartMapper partMapper;
|
private WorkstationLocationMapper workstationLocationMapper;
|
private StockUtils stockUtils;
|
private IfsFeignClient ifsFeignClient;
|
private LocationMapper locationMapper;
|
private final OssProperties ossProperties;
|
private final OssTemplate minioTemplate;
|
private UnqualifiedProcessFileService processFileService;
|
private OAProperty oaProperty;
|
private NumberGenerator<UnqualifiedProcess> unqualifiedProcessNumberGenerator;
|
private DictUtils dictUtils;
|
|
private ApplyService applyService;
|
|
private StockService stockService;
|
|
private StockMapper stockMapper;
|
|
private StaffMapper staffMapper;
|
|
private QualityUnqualifiedConfigurationMapper qualityUnqualifiedConfigurationMapper;
|
public static final String OA_ERROR_CODE = "999";
|
|
@Override
|
public boolean saveDto(List<UnqualifiedProcessDTO> unqualifiedProcessDTOList) {
|
String mainProcessNo = unqualifiedProcessNumberGenerator.generateNumberWithPrefix(UnqualifiedProcess.DIGIT, "MAIN-" + UnqualifiedProcess.PREFIX, UnqualifiedProcess::getMainProcessNo);
|
for (UnqualifiedProcessDTO unqualifiedProcessDTO : unqualifiedProcessDTOList) {
|
checkProcessNo(unqualifiedProcessDTO);
|
if (StringUtils.isNotBlank(unqualifiedProcessDTO.getProcessResult())) {
|
if (unqualifiedProcessDTO.getProcessResult().equals(UnqualifiedprocessStateStringValues.RESULT_PASS)) {
|
unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.ACCEPTED);
|
} else if (unqualifiedProcessDTO.getProcessResult().equals(UnqualifiedprocessStateStringValues.RESULT_REJECT)) {
|
unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.REJECT);
|
}
|
} else {
|
unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.DRAFT);
|
}
|
unqualifiedProcessDTO.setMainProcessNo(mainProcessNo);
|
baseMapper.insert(unqualifiedProcessDTO);
|
|
|
UnqualifiedProcessDTO process = baseMapper.getById(unqualifiedProcessDTO.getId());
|
//查找审核人
|
List<QualityUnqualifiedConfiguration> qualityUnqualifiedConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.<QualityUnqualifiedConfiguration>lambdaQuery()
|
.eq(QualityUnqualifiedConfiguration::getWorkShop, process.getWorkShop())
|
.eq(QualityUnqualifiedConfiguration::getType, process.getType())
|
.orderByDesc(QualityUnqualifiedConfiguration::getCreateTime));
|
if(CollectionUtil.isNotEmpty(qualityUnqualifiedConfigurationList)){
|
unqualifiedProcessDTO.setExaminer(qualityUnqualifiedConfigurationList.get(0).getExaminer());
|
}
|
baseMapper.updateById(unqualifiedProcessDTO);
|
|
//企业微信通知
|
if(StringUtils.isNotBlank(unqualifiedProcessDTO.getExaminer())) {
|
process.setExaminer(unqualifiedProcessDTO.getExaminer());
|
remindExamine(process, 1);
|
}
|
}
|
return true;
|
}
|
@Override
|
public IPage<List<UnqualifiedProcessDTO>> getPage(Page page, QueryWrapper<UnqualifiedProcessDTO> gen) {
|
//return getBaseMapper().getPage(page, gen);
|
return baseMapper.getPage(page,gen);
|
}
|
|
@Override
|
public boolean updateById(UnqualifiedProcessDTO unqualifiedProcessDTO) {
|
checkProcessNo(unqualifiedProcessDTO);
|
UnqualifiedProcessDTO old = this.getById(unqualifiedProcessDTO.getId());
|
if (old.getState().equals(UnqualifiedprocessStateStringValues.PENDING)||old.getState().equals(UnqualifiedprocessStateStringValues.ACCEPTED)
|
||old.getState().equals(UnqualifiedprocessStateStringValues.EXECUTED) ) {
|
throw new RuntimeException("待审核和退回状态才可以修改");
|
}
|
//查找审核人
|
List<QualityUnqualifiedConfiguration> qualityUnqualifiedConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.<QualityUnqualifiedConfiguration>lambdaQuery()
|
.eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop())
|
.eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType())
|
.orderByDesc(QualityUnqualifiedConfiguration::getCreateTime));
|
if(CollectionUtil.isNotEmpty(qualityUnqualifiedConfigurationList)){
|
unqualifiedProcessDTO.setExaminer(qualityUnqualifiedConfigurationList.get(0).getExaminer());
|
}
|
|
baseMapper.updateById(unqualifiedProcessDTO);
|
// execute(unqualifiedProcess.getId());
|
|
return true;
|
}
|
|
private void checkProcessNo(UnqualifiedProcess unqualifiedProcess) {
|
if (StringUtils.isBlank(unqualifiedProcess.getProcessNo())) {
|
// 1. 自动生成编号
|
unqualifiedProcess.setProcessNo(unqualifiedProcessNumberGenerator.generateNumberWithPrefix(UnqualifiedProcess.DIGIT, UnqualifiedProcess.PREFIX, UnqualifiedProcess::getProcessNo));
|
} else {
|
// 2.判断是否重复
|
List<UnqualifiedProcess> repeatNos = baseMapper.selectList(Wrappers.<UnqualifiedProcess>query().lambda()
|
.eq(UnqualifiedProcess::getProcessNo, unqualifiedProcess.getProcessNo())
|
.ne(UnqualifiedProcess::getId, unqualifiedProcess.getId()));
|
if (CollectionUtil.isNotEmpty(repeatNos)) {
|
throw new RuntimeException("编号重复");
|
}
|
}
|
}
|
|
@Override
|
public boolean deleteById(Long id) throws Exception {
|
UnqualifiedProcess unqualifiedProcess = getBaseMapper().selectById(id);
|
if (unqualifiedProcess.getState().equals("") || unqualifiedProcess.getState().equals("")) {
|
|
}
|
// 删除附件
|
List<UnqualifiedProcess> processes = this.list(Wrappers.<UnqualifiedProcess>lambdaQuery().eq(UnqualifiedProcess::getMainProcessNo, unqualifiedProcess.getMainProcessNo()));
|
if (processes.size() == 1) {
|
List<UnqualifiedProcessFile> fileList = processFileService.list(Wrappers.<UnqualifiedProcessFile>lambdaQuery().eq(UnqualifiedProcessFile::getMainProcessNo, unqualifiedProcess.getMainProcessNo()));
|
if (!fileList.isEmpty()) {
|
for (UnqualifiedProcessFile processFile : fileList) {
|
this.processFileService.delById(processFile.getId());
|
}
|
}
|
}
|
return SqlHelper.retBool(baseMapper.deleteById(id));
|
}
|
|
|
@Override
|
public UnqualifiedProcessDTO getById(Long id) {
|
return getBaseMapper().getById(id);
|
}
|
|
|
@Override
|
public R<Boolean> startOa(Long id) {
|
UnqualifiedProcessOaDTO unqualifiedProcess = getBaseMapper().getOaById(id);
|
if (UnqualifiedprocessStateStringValues.PENDING.equals(unqualifiedProcess.getState())) {
|
return R.failed("当前已发起OA流程,请耐心等待审核结果");
|
}
|
if (UnqualifiedprocessStateStringValues.ACCEPTED.equals(unqualifiedProcess.getState())) {
|
return R.failed("当前流程已通过,无须再发起OA流程");
|
}
|
Map<String, String> mainFields = new LinkedHashMap<>();
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
mainFields.put("lcbh", unqualifiedProcess.getProcessNo()); //流程编号
|
mainFields.put("fkr", SecurityUtils.getUser().getUsername()); //反馈人
|
mainFields.put("fkrq", simpleDateFormat.format(new Date())); //反馈时间
|
mainFields.put("jclx", unqualifiedProcess.getApplyType()); //检测类型
|
mainFields.put("lsh", unqualifiedProcess.getOutBatchNo()); //流水号
|
mainFields.put("ggxh", unqualifiedProcess.getSpecs()); //规格型号
|
mainFields.put("gx", unqualifiedProcess.getOperationName()); //工序
|
mainFields.put("ys", null); //颜色 暂时没有
|
mainFields.put("ph", unqualifiedProcess.getReelNumber()); //盘号
|
mainFields.put("gzh", unqualifiedProcess.getOptaskNo()); //工单编号
|
mainFields.put("bombh", unqualifiedProcess.getPartNo()); //零件号
|
mainFields.put("bomgg", unqualifiedProcess.getPartName()); //零件描述
|
mainFields.put("scjt", unqualifiedProcess.getWorkstationName()); //生产机台
|
mainFields.put("scry", unqualifiedProcess.getStaffName()); //生产人员
|
mainFields.put("scsl", unqualifiedProcess.getProductQty().toString());//生产数量
|
mainFields.put("jcjd", unqualifiedProcess.getApplyType()); //检测阶段
|
mainFields.put("jcr", unqualifiedProcess.getReportPerson()); //检测人
|
if (null != unqualifiedProcess.getReportTime()) { //检测时间
|
mainFields.put("jcsj", simpleDateFormat.format(unqualifiedProcess.getReportTime()));
|
}
|
mainFields.put("bhgms", unqualifiedProcess.getReason()); //不合格描述
|
OAResult oaResult;
|
try {
|
oaResult = OAProcess.start(mainFields, "不合格评审流程", oaProperty.getUnqualifiedProcessId(), SecurityUtils.getUser().getUsername());
|
} catch (Exception e) {
|
return R.failed("发起OA流程失败");
|
}
|
if (OA_ERROR_CODE.equals(oaResult.getErrorCode())) {
|
return R.failed(oaResult.getErrorMsg());
|
} else {
|
if (StringUtils.isNotBlank(oaResult.getAddWorkflowResult())) {
|
unqualifiedProcess.setWorkflowId(Long.parseLong(oaResult.getAddWorkflowResult()));
|
}
|
}
|
unqualifiedProcess.setState(UnqualifiedprocessStateStringValues.PENDING);
|
getBaseMapper().updateById(unqualifiedProcess);
|
return R.ok();
|
}
|
|
@Override
|
public void oaReturnDeal(Long oaWorkId, String isAudit, String processMode) {
|
UnqualifiedProcess unqualifiedProcess = baseMapper.selectOne(Wrappers.<UnqualifiedProcess>lambdaQuery()
|
.eq(UnqualifiedProcess::getWorkflowId, oaWorkId));
|
if (null != unqualifiedProcess) {
|
unqualifiedProcess.setState(isAudit);
|
// unqualifiedProcess.setProcessMode(processMode);
|
baseMapper.updateById(unqualifiedProcess);
|
|
//企业微信消息提醒
|
UnqualifiedProcessDTO processDTO = baseMapper.getById(unqualifiedProcess.getId());
|
if(StringUtils.isNotBlank(processDTO.getHandler())) {
|
remindExamine(processDTO, 2);
|
}
|
// execute(unqualifiedProcess.getId());
|
}
|
}
|
|
@Override
|
public R rfOa(Long id) {
|
UnqualifiedProcessRfOaDTO info = this.baseMapper.getRfOaInfoById(id, SecurityUtils.getUser().getId());
|
if (!UnqualifiedprocessStateStringValues.DRAFT.equals(info.getState())) {
|
return R.failed("当前状态不允许发起OA流程");
|
}
|
|
Map<String, String> mainFields = new LinkedHashMap<>();
|
mainFields.put("sccj", getWorkShopNumber(info.getWorkShop())); //生产车间012
|
mainFields.put("fxgx", info.getOperationName()); //工序名称
|
mainFields.put("cpmc", info.getPartName()); //产品名称
|
mainFields.put("scrq", DateUtil.format(info.getActualFinishDate(), DatePattern.NORM_DATE_PATTERN)); //生产日期
|
mainFields.put("lh", info.getSn()); //缆号
|
mainFields.put("ggxh", StringUtils.isNotBlank(info.getSpecs()) ? info.getSpecs() : ""); //规格型号
|
mainFields.put("cdm", info.getUnqualifiedArrived().toString()); //长度KM
|
mainFields.put("zl", info.getType()); //种类
|
mainFields.put("sqrq", DateUtil.format(new Date(), DatePattern.NORM_DATE_PATTERN)); //申请时间
|
mainFields.put("sqr", info.getUsername()); //申请人
|
mainFields.put("sqbm1", info.getDivisionName()); //申请部门
|
mainFields.put("bhglb", info.getUnqualifiedType()); //不合格类别
|
mainFields.put("sqclfs", info.getProcessMode()); //不合格处理方式
|
mainFields.put("bhgms", info.getUnqualifiedDesc()); //不合格描述
|
|
//不合格描述
|
OAResult oaResult;
|
Long workflowId = null;
|
try {
|
System.out.println(JSONObject.toJSONString(mainFields));
|
oaResult = OAProcess.start(mainFields, "不合格评审流程", oaProperty.getUnqualifiedProcessId(), info.getUsername());
|
} catch (Exception e) {
|
throw new RuntimeException("发起OA流程失败");
|
}
|
if (OA_ERROR_CODE.equals(oaResult.getErrorCode())) {
|
throw new RuntimeException(oaResult.getErrorMsg());
|
} else {
|
if (StringUtils.isNotBlank(oaResult.getAddWorkflowResult())) {
|
workflowId = Long.parseLong(oaResult.getAddWorkflowResult());
|
}
|
}
|
UpdateWrapper<UnqualifiedProcess> wrapper = new UpdateWrapper();
|
this.update(wrapper.lambda().eq(UnqualifiedProcess::getId, id).set(UnqualifiedProcess::getState, UnqualifiedprocessStateStringValues.PENDING).set(UnqualifiedProcess::getWorkflowId, workflowId));
|
return R.ok();
|
}
|
|
|
public Boolean uploadFile(String mainProcessNo, MultipartFile file) throws Exception {
|
String fileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(file.getOriginalFilename());
|
String url = String.format("/mes/unqualifiedProcess/%s/%s", ossProperties.getBucketName(), fileName);
|
minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
|
UnqualifiedProcessFile processFile = new UnqualifiedProcessFile();
|
processFile.setOriginal(file.getOriginalFilename());
|
processFile.setPath(url);
|
processFile.setFileName(fileName);
|
processFile.setMainProcessNo(mainProcessNo);
|
processFileService.save(processFile);
|
return true;
|
}
|
|
@Override
|
public void getFile(String bucket, String fileName, HttpServletResponse response) {
|
try (InputStream inputStream = minioTemplate.getObject(bucket, fileName)) {
|
response.setContentType("application/octet-stream; charset=UTF-8");
|
IoUtil.copy(inputStream, response.getOutputStream());
|
} catch (Exception e) {
|
throw new RuntimeException("文件读取失败");
|
}
|
}
|
|
|
|
@Override
|
public List<UnqualifiedProcessDTO> showDefaultLocation(List<Long> ids){
|
List<UnqualifiedProcessDTO> list = this.baseMapper.getExecuteList(ids);
|
if (list.isEmpty()) {
|
throw new RuntimeException("无可处理数据");
|
}
|
ZttUser currentUser = SecurityUtils.getUser();
|
Staff staff = staffMapper.selectOne(Wrappers.<Staff>lambdaQuery().eq(Staff::getStaffNo, currentUser.getUsername()));
|
for (UnqualifiedProcessDTO unqualifiedProcessDTO:list) {
|
//查找执行人
|
List<QualityUnqualifiedConfiguration> qualityCheckConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.<QualityUnqualifiedConfiguration>lambdaQuery()
|
.eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop())
|
.eq(QualityUnqualifiedConfiguration::getProcessMode, unqualifiedProcessDTO.getProcessMode())
|
.eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType())
|
.orderByDesc(QualityUnqualifiedConfiguration::getCreateTime));
|
//判断是否有执行权限
|
if(CollectionUtil.isNotEmpty(qualityCheckConfigurationList)){
|
if(staff==null){
|
throw new RuntimeException("没有执行权限");
|
}
|
String handler = qualityCheckConfigurationList.get(0).getHandler();
|
boolean b = handler.contains(staff.getStaffName());
|
if(!b){
|
throw new RuntimeException("没有执行权限");
|
}
|
}
|
|
}
|
List<UnqualifiedProcessDTO> returnList = new ArrayList<>();
|
Long defaultLocationId;
|
for (UnqualifiedProcessDTO process : list){
|
UnqualifiedProcessDTO unqualifiedProcessDTO = new UnqualifiedProcessDTO();
|
unqualifiedProcessDTO.setId(process.getId());
|
unqualifiedProcessDTO.setProcessNo(process.getProcessNo());
|
unqualifiedProcessDTO.setProcessMode(process.getProcessMode());
|
unqualifiedProcessDTO.setIsShow(true);
|
// 首检不做移库操作
|
if (StringUtils.equals(process.getApplyType(), Apply.FIRST_APPLY)) {
|
unqualifiedProcessDTO.setIsShow(false);
|
}
|
if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REWORK) || process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REPAIR)) {
|
// 不合格库位移动到检测待处理库位
|
defaultLocationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.PENDING_LOCATION);//检测待处理库位
|
if(defaultLocationId!=null) {
|
Location location = locationMapper.selectById(defaultLocationId);
|
unqualifiedProcessDTO.setDefaultLocation(location.getLocName());
|
}
|
}else if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_ALLOW)){
|
Boolean moveToPreInspection = validateMoveToPreInspection(process);
|
defaultLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(process.getSystemNo()); // 合格库位
|
if (moveToPreInspection) {
|
defaultLocationId =
|
workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(process.getSystemNo());
|
}
|
if(defaultLocationId!=null) {
|
Location location = locationMapper.selectById(defaultLocationId);
|
unqualifiedProcessDTO.setDefaultLocation(location.getLocName());
|
}
|
|
}
|
returnList.add(unqualifiedProcessDTO);
|
|
}
|
return returnList;
|
}
|
|
|
|
@Override
|
public void executeByIds(List<UnqualifiedProcessDTO> unqualifiedProcessDTOList) {
|
List<Long> ids = unqualifiedProcessDTOList.stream().map(UnqualifiedProcessDTO::getId).collect(Collectors.toList());
|
List<UnqualifiedProcessDTO> list = this.baseMapper.getExecuteList(ids);
|
if (list.isEmpty()) {
|
throw new RuntimeException("无可处理数据");
|
}
|
// Map<String, List<UnqualifiedProcessDTO>> collect = list.stream().collect(Collectors.groupingBy(UnqualifiedProcess::getProcessMode));
|
// if (collect.size() > 1) {
|
// throw new RuntimeException("处理方式不一致,无法一起执行");
|
// }
|
LocationIfsMoveDTO ifsResult = new LocationIfsMoveDTO();
|
ifsResult.setRECORD_ID(UUID.randomUUID().toString().replace("-", ""));
|
List<LocationIfsMoveDTO.DataBean> beanList = new ArrayList<>();
|
ifsResult.setBATCH_INFO(beanList);
|
|
for (UnqualifiedProcessDTO process : list) {
|
unqualifiedProcessDTOList.stream().forEach(a->{
|
if(process.getId().equals(a.getId())){
|
process.setTargetLocationId(a.getTargetLocationId());
|
}
|
});
|
|
Long locationId = null;
|
Long toLocationId = null;
|
// 首检不做移库操作,只更新状态为已执行
|
if (StringUtils.equals(process.getApplyType(), Apply.FIRST_APPLY)) {
|
continue;
|
}
|
|
// 报废不变动
|
// 返工
|
if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REWORK) || process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REPAIR)) {
|
// 不合格库位移动到检测待处理库位
|
locationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位
|
if(process.getTargetLocationId()==null) {
|
toLocationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.PENDING_LOCATION);//检测待处理库位
|
if (locationId == null || toLocationId == null) {
|
throw new RuntimeException("该工作站未设置库位,无法执行!");
|
}
|
}else{
|
toLocationId = process.getTargetLocationId();
|
}
|
// 移库
|
stockUtils.localMove(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId);
|
|
} else if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_ALLOW)) {
|
// 当前是工序检或者尾检 如果配置了成品待检库和成品检,则自动生成成品检的检测申请,并且移到成品待检库
|
Boolean moveToPreInspection = validateMoveToPreInspection(process);
|
if (BooleanUtil.isTrue(moveToPreInspection)) {
|
ApplyPartDTO applyPartDTO = new ApplyPartDTO();
|
applyPartDTO.setOutBatchNo(process.getLotBatchNo());
|
applyPartDTO.setPartId(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId());
|
applyPartDTO.setSystemNo(process.getSystemNo());
|
applyPartDTO.setPartName(process.getReplacePartId() == null ? process.getPartDesc() : process.getReplacePartName());
|
applyPartDTO.setPartNo(process.getReplacePartId() == null ? process.getPartNo() : process.getReplacePartNo());
|
applyPartDTO.setCheckLength(process.getCheckLength());
|
ApplyDTO applyDTO = new ApplyDTO();
|
applyDTO.setApplyPartList(Collections.singletonList(applyPartDTO));
|
applyDTO.setApplyType(Apply.PRODUCT_APPLY);
|
applyDTO.setFinishedProductAutoInsp(Boolean.TRUE);
|
applyService.saveDto(applyDTO);
|
}
|
// 不合格品库移动到合格库
|
locationId = workstationLocationMapper.selectBySystemNo(process.getSystemNo(), WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位
|
if(process.getTargetLocationId()==null) {
|
toLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(process.getSystemNo()); // 合格库位
|
if (moveToPreInspection) {
|
toLocationId =
|
workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(process.getSystemNo());
|
}
|
if (locationId == null || toLocationId == null) {
|
throw new RuntimeException("该工作站未设置库位,无法执行!");
|
}
|
}else{
|
toLocationId = process.getTargetLocationId();
|
}
|
// 移库
|
stockUtils.localMove(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId);
|
|
} else {
|
continue;
|
}
|
List<Boolean> stockOperationStatus = stockMapper.getStockOperationStatus(process.getOutBatchNo(),
|
process.getPartId(), process.getSystemNo());
|
Boolean stokOperationStatu = stockOperationStatus.get(0);
|
if (null == stokOperationStatu) {
|
Part part = partMapper.selectById(process.getPartId());
|
if (StringUtils.equals(part.getMaterialType(), "3")) {
|
stokOperationStatu = Boolean.FALSE;
|
}
|
}
|
// 零件计划是A,且不为首检,需要ifs移库
|
if (process.getPlanningMethod() != null && process.getPlanningMethod().equals("A") && !process.getApplyType().equals(Apply.FIRST_APPLY) && BooleanUtil.isFalse(stokOperationStatu)) {
|
Part part = partMapper.selectById(process.getReplacePartId() == null ? process.getPartId() : process.getReplacePartId());
|
LocationIfsMoveDTO.DataBean bean = new LocationIfsMoveDTO.DataBean();
|
|
Location location = locationMapper.selectById(locationId);
|
Location toLocation = locationMapper.selectById(toLocationId);
|
|
bean.setPART_NO(part.getPartNo());
|
if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) {
|
bean.setLOT_BATCH_NO(process.getIfsBatchNo());
|
bean.setWAIV_DEV_REJ_NO(process.getOutBatchNo());
|
} else {
|
bean.setLOT_BATCH_NO("*");
|
bean.setWAIV_DEV_REJ_NO("*");
|
}
|
bean.setMOVE_QTY(process.getUnqualifiedQuantity());
|
bean.setLOCATION_NO(location.getIfsLocation());
|
bean.setTO_LOCATION_NO(toLocation.getIfsLocation());
|
beanList.add(bean);
|
}
|
}
|
|
if (beanList.size() > 0) {
|
R response = locationService.moveIfsLocation(ifsResult);
|
if (response.getCode() == 0) {
|
UpdateWrapper<UnqualifiedProcess> updateWrapper = new UpdateWrapper<>();
|
this.update(updateWrapper.lambda().in(UnqualifiedProcess::getId, ids)
|
.set(UnqualifiedProcess::getIfsNo, ifsResult.getRECORD_ID())
|
.set(UnqualifiedProcess::getState, UnqualifiedprocessStateStringValues.EXECUTED)
|
.set(UnqualifiedProcess::getHandleTime,LocalDateTime.now()));
|
}
|
} else {
|
UpdateWrapper<UnqualifiedProcess> updateWrapper = new UpdateWrapper<>();
|
this.update(updateWrapper.lambda().in(UnqualifiedProcess::getId, ids)
|
.set(UnqualifiedProcess::getState, UnqualifiedprocessStateStringValues.EXECUTED)
|
.set(UnqualifiedProcess::getHandleTime,LocalDateTime.now()));
|
}
|
|
//处理后SN号赋值
|
for (Long id:ids) {
|
baseMapper.updateExecuteSn(id);
|
}
|
|
}
|
|
/**
|
* 判断是否需要移到成品待检库
|
* <p>满足以下条件,则需生成成品检,并且将库存从不合格库移到成品待检库</p>
|
* <p>当前检测是工序检/产出尾检</p>
|
* <P>配置了成品待检库</P>
|
* <p>配置了成品检</p>
|
* @param process
|
* @return
|
*/
|
private Boolean validateMoveToPreInspection(UnqualifiedProcessDTO process) {
|
if (!StringUtils.equals(Apply.OUTPUT_APPLY, process.getApplyType()) && !StringUtils.equals(Apply.PROCESS_APPLY,
|
process.getApplyType())) {
|
return Boolean.FALSE;
|
}
|
if (!applyPartMapper.isConfigFinishedProdTest(process.getSystemNo())) {
|
return Boolean.FALSE;
|
}
|
if (null == workstationLocationMapper.selectFinishToQualifiedLocationIdBySystemNo(process.getSystemNo())) {
|
return Boolean.FALSE;
|
}
|
return Boolean.TRUE;
|
}
|
|
@Override
|
public boolean updateProcessResult(Long id, String processResult) {
|
UnqualifiedProcessDTO old = this.getById(id);
|
if (!old.getState().equals(UnqualifiedprocessStateStringValues.DRAFT)) {
|
throw new RuntimeException("只有草稿状态才能修改");
|
}
|
UnqualifiedProcessDTO update = new UnqualifiedProcessDTO();
|
update.setId(id);
|
update.setProcessResult(processResult);
|
if (processResult.equals(UnqualifiedprocessStateStringValues.RESULT_PASS)) {
|
update.setState(UnqualifiedprocessStateStringValues.ACCEPTED);
|
} else if (processResult.equals(UnqualifiedprocessStateStringValues.RESULT_REJECT)) {
|
update.setState(UnqualifiedprocessStateStringValues.REJECT);
|
}
|
baseMapper.updateById(update);
|
execute(update.getId());
|
return true;
|
}
|
|
public Map<Long, Long> checkLocation(String systemNo) {
|
Map<Long, Long> result = new HashMap<>();
|
Long disqualifiedLocationId = workstationLocationMapper.selectBySystemNo(systemNo, WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位
|
Long pendingLocationId = workstationLocationMapper.selectBySystemNo(systemNo, WorkstationLocation.PENDING_LOCATION);//检测待处理库位
|
Long qualifiedLocationId = workstationLocationMapper.selectQualifiedLocationIdBySystemNo(systemNo);// 合格库位
|
if (disqualifiedLocationId == null || pendingLocationId == null || qualifiedLocationId == null) {
|
throw new RuntimeException("该工作站未设置库位,无法执行!");
|
}
|
result.put(WorkstationLocation.DISQUALIFIED_LOCATION, disqualifiedLocationId);
|
result.put(WorkstationLocation.PENDING_LOCATION, pendingLocationId);
|
result.put(WorkstationLocation.QUALIFIED_LOCATION, qualifiedLocationId);
|
|
return result;
|
}
|
|
public void execute(Long id) {
|
List<UnqualifiedProcessDTO> list = this.baseMapper.getExecuteList(Arrays.asList(id));
|
if (list.isEmpty()) {
|
throw new RuntimeException("无可处理数据");
|
}
|
Map<String, List<UnqualifiedProcessDTO>> collect = list.stream().collect(Collectors.groupingBy(UnqualifiedProcess::getProcessMode));
|
if (collect.size() > 1) {
|
throw new RuntimeException("处理方式不一致,无法一起执行");
|
}
|
|
LocationIfsMoveDTO ifsResult = new LocationIfsMoveDTO();
|
ifsResult.setRECORD_ID(UUID.randomUUID().toString().replace("-", ""));
|
List<LocationIfsMoveDTO.DataBean> beanList = new ArrayList<>();
|
ifsResult.setBATCH_INFO(beanList);
|
|
for (UnqualifiedProcessDTO process : list) {
|
Map<Long, Long> locationMap = checkLocation(process.getSystemNo());
|
Long locationId = null;
|
Long toLocationId = null;
|
|
// 报废不变动
|
// 返工
|
if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REWORK) || process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_REPAIR)) {
|
// 不合格库位移动到检测待处理库位
|
locationId = locationMap.get(WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位
|
toLocationId = locationMap.get(WorkstationLocation.PENDING_LOCATION);//检测待处理库位
|
if (locationId == null || toLocationId == null) {
|
throw new RuntimeException("该工作站未设置库位,无法执行!");
|
}
|
// 移库
|
stockUtils.localMove(process.getPartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId);
|
|
// 让步放行
|
} else if (process.getProcessMode().equals(UnqualifiedprocessStateStringValues.PROCESS_MODE_ALLOW)) {
|
// 不合格品库移动到合格库
|
locationId = locationMap.get(WorkstationLocation.DISQUALIFIED_LOCATION);//产出不合格品库位
|
toLocationId = locationMap.get(WorkstationLocation.QUALIFIED_LOCATION); // 合格库位
|
if (locationId == null || toLocationId == null) {
|
throw new RuntimeException("该工作站未设置库位,无法执行!");
|
}
|
// 移库
|
stockUtils.localMove(process.getPartId(), process.getSystemNo(), process.getLotBatchNo(), new BigDecimal(process.getUnqualifiedArrived()), locationId, toLocationId);
|
|
} else {
|
continue;
|
}
|
List<Boolean> stockOperationStatus = stockMapper.getStockOperationStatus(process.getOutBatchNo(),
|
process.getPartId(), process.getSystemNo());
|
Boolean stokOperationStatu = stockOperationStatus.get(0);
|
if (null == stokOperationStatu) {
|
Part part = partMapper.selectById(process.getPartId());
|
if (StringUtils.equals(part.getMaterialType(), "3")) {
|
stokOperationStatu = Boolean.FALSE;
|
}
|
}
|
// 零件计划是A需要ifs移库
|
if (process.getPlanningMethod() != null && process.getPlanningMethod().equals("A") && BooleanUtil.isFalse(stokOperationStatu)) {
|
Part part = partMapper.selectById(process.getPartId());
|
|
LocationIfsMoveDTO.DataBean bean = new LocationIfsMoveDTO.DataBean();
|
|
Location location = locationMapper.selectById(locationId);
|
Location toLocation = locationMapper.selectById(toLocationId);
|
|
bean.setPART_NO(process.getPartNo());
|
if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) {
|
bean.setLOT_BATCH_NO(process.getIfsBatchNo());
|
bean.setWAIV_DEV_REJ_NO(process.getOutBatchNo());
|
} else {
|
bean.setLOT_BATCH_NO("*");
|
bean.setWAIV_DEV_REJ_NO("*");
|
}
|
bean.setMOVE_QTY(process.getUnqualifiedQuantity());
|
bean.setLOCATION_NO(location.getLocNo());
|
bean.setTO_LOCATION_NO(toLocation.getLocNo());
|
beanList.add(bean);
|
}
|
}
|
|
if (beanList.size() > 0) {
|
R response = locationService.moveIfsLocation(ifsResult);
|
if (response.getCode() == 0) {
|
UpdateWrapper<UnqualifiedProcess> updateWrapper = new UpdateWrapper<>();
|
this.update(updateWrapper.lambda().eq(UnqualifiedProcess::getId, id).set(UnqualifiedProcess::getIfsNo, ifsResult.getRECORD_ID()));
|
}
|
}
|
}
|
|
private String getWorkShopNumber(String workShop) {
|
switch (workShop) {
|
case "漏缆车间" :
|
return "5";
|
case "馈线车间" :
|
return "6";
|
case "信号缆车间" :
|
return "7";
|
case "高温缆车间" :
|
return "8";
|
case "跳线车间" :
|
return "9";
|
case "光电混合缆车间" :
|
return "10";
|
case "机车缆车间" :
|
return "11";
|
}
|
return "";
|
}
|
|
|
@Override
|
public void partDegrade(Long id,Long partId){
|
//零件满足是库存件且非工序库存,处理方式为返工返修,执行操作之后允许进行降级操作
|
UnqualifiedProcessDTO unqualifiedProcessDTO = baseMapper.getById(id);
|
if(!"05executed".equals(unqualifiedProcessDTO.getState())){
|
throw new RuntimeException("执行操作之后才允许进行降级操作");
|
}
|
List<Boolean> stockOperationStateList = stockMapper.getStockOperationStatus(unqualifiedProcessDTO.getLotBatchNo(),
|
unqualifiedProcessDTO.getPartId(),unqualifiedProcessDTO.getSystemNo());
|
Boolean stockOperationState = true;
|
if(CollectionUtils.isNotEmpty(stockOperationStateList)){
|
stockOperationState = stockOperationStateList.get(0);
|
}
|
Part part = partMapper.selectById(unqualifiedProcessDTO.getPartId());
|
if(!"A".equals(part.getPlanningMethod()) || stockOperationState || !"2".equals(unqualifiedProcessDTO.getProcessMode())){
|
throw new RuntimeException("零件需满足是库存件且非工序库存,处理方式为返工返修");
|
}
|
|
//实时库存变更零件
|
List<Stock> stockList = stockMapper.selectList(Wrappers.<Stock>lambdaQuery().eq(Stock::getPartBatchNo, unqualifiedProcessDTO.getLotBatchNo())
|
.eq(Stock::getSystemNo, unqualifiedProcessDTO.getSystemNo())
|
.eq(Stock::getPartId, unqualifiedProcessDTO.getPartId())
|
.gt(Stock::getStockQuantity, BigDecimal.ZERO));
|
if(CollectionUtil.isEmpty(stockList)){
|
throw new RuntimeException("实时库存找不到该条记录");
|
}
|
Stock stock = stockList.get(0);
|
BigDecimal stockQuantityMove = stock.getStockQuantity();
|
//库存事务
|
//库存发放
|
stockUtils.updateById(stock.getId(), stockQuantityMove.negate(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "STOCK");
|
StockDTO issueStockDTO = new StockDTO();
|
BeanUtil.copyProperties(stock,issueStockDTO);
|
List<StockDTO> issueStockDTOList = new ArrayList<>();
|
issueStockDTO.setAdjustType("Issue");
|
issueStockDTO.setAdjustMemo("库存发放");
|
issueStockDTOList.add(issueStockDTO);
|
stockService.inventAdjustForRfcable(issueStockDTOList,"Issue", "R01");
|
//库存调整
|
stock.setPartId(partId);
|
stockMapper.updateById(stock);
|
//库存接收
|
stockUtils.updateById(stock.getId(), stockQuantityMove, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "RECEIVE");
|
StockDTO receiveStockDTO = new StockDTO();
|
BeanUtil.copyProperties(stock,receiveStockDTO);
|
List<StockDTO> receiveStockDTOList = new ArrayList<>();
|
receiveStockDTO.setAdjustType("Issue");
|
receiveStockDTO.setAdjustMemo("库存发放");
|
receiveStockDTOList.add(receiveStockDTO);
|
stockService.inventAdjustForRfcable(receiveStockDTOList,"Issue", "R01");
|
//不合格处理变更零件
|
UnqualifiedProcess updateProcess = new UnqualifiedProcess();
|
updateProcess.setId(id);
|
updateProcess.setDegradePartId(partId);
|
baseMapper.updateById(updateProcess);
|
|
}
|
|
|
@Override
|
public Boolean examineApprove(UnqualifiedProcessDTO unqualifiedProcessDTO) {
|
ZttUser currentUser = SecurityUtils.getUser();
|
Staff staff = staffMapper.selectOne(Wrappers.<Staff>lambdaQuery().eq(Staff::getStaffNo, currentUser.getUsername()));
|
//查找审核人
|
List<QualityUnqualifiedConfiguration> qualityCheckConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.<QualityUnqualifiedConfiguration>lambdaQuery()
|
.eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop())
|
.eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType())
|
.orderByDesc(QualityUnqualifiedConfiguration::getCreateTime));
|
//判断是否有审批权限
|
if(CollectionUtil.isNotEmpty(qualityCheckConfigurationList)){
|
if(staff==null){
|
throw new RuntimeException("没有审批权限");
|
}
|
String examiner = qualityCheckConfigurationList.get(0).getExaminer();
|
boolean b = examiner.contains(staff.getStaffName());
|
if(!b){
|
throw new RuntimeException("没有审批权限");
|
}
|
}
|
|
if (!UnqualifiedprocessStateStringValues.DRAFT.equals(unqualifiedProcessDTO.getState())) {
|
throw new RuntimeException("当前状态无法审批");
|
}
|
if(UnqualifiedprocessStateStringValues.RESULT_PASS.equals(unqualifiedProcessDTO.getProcessResult())){
|
unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.ACCEPTED);
|
}else {
|
unqualifiedProcessDTO.setState(UnqualifiedprocessStateStringValues.DRAFT);
|
unqualifiedProcessDTO.setExamineTime(LocalDateTime.now());
|
baseMapper.updateById(unqualifiedProcessDTO);
|
}
|
//查找执行人
|
List<QualityUnqualifiedConfiguration> qualityUnqualifiedConfigurationList = qualityUnqualifiedConfigurationMapper.selectList(Wrappers.<QualityUnqualifiedConfiguration>lambdaQuery()
|
.eq(QualityUnqualifiedConfiguration::getWorkShop, unqualifiedProcessDTO.getWorkShop())
|
.eq(QualityUnqualifiedConfiguration::getType, unqualifiedProcessDTO.getType())
|
.eq(QualityUnqualifiedConfiguration::getProcessMode, unqualifiedProcessDTO.getProcessMode())
|
.orderByDesc(QualityUnqualifiedConfiguration::getCreateTime));
|
if(CollectionUtil.isNotEmpty(qualityUnqualifiedConfigurationList)){
|
unqualifiedProcessDTO.setHandler(qualityUnqualifiedConfigurationList.get(0).getHandler());
|
}
|
unqualifiedProcessDTO.setExamineTime(LocalDateTime.now());
|
baseMapper.updateById(unqualifiedProcessDTO);
|
|
//企业微信通知
|
UnqualifiedProcessDTO processDTO = baseMapper.getById(unqualifiedProcessDTO.getId());
|
if(StringUtils.isNotBlank(processDTO.getHandler())) {
|
remindExamine(processDTO, 2);
|
}
|
|
return true;
|
}
|
|
|
|
|
//微信消息提醒
|
public Boolean remindExamine(UnqualifiedProcessDTO unqualifiedProcessDTO,Integer type){
|
if("1".equals(unqualifiedProcessDTO.getType())){
|
unqualifiedProcessDTO.setType("半成品");
|
}else if("2".equals(unqualifiedProcessDTO.getType())){
|
unqualifiedProcessDTO.setType("成品");
|
}
|
//type为1发送审核通知,type为2发送执行通知
|
List<String> userNameList = null;
|
String commonString = "";
|
if(type ==1) {
|
userNameList = Arrays.asList(unqualifiedProcessDTO.getExaminer().split(" "));
|
commonString = "您好,以下不合格处理待评审,请及时处理:<br/>";
|
}else if(type ==2){
|
userNameList = Arrays.asList(unqualifiedProcessDTO.getHandler().split(" "));
|
commonString = "您好,以下不合格处理待执行,请及时处理:<br/>";
|
}
|
List<Staff> staffList = staffMapper.selectList(Wrappers.<Staff>lambdaQuery().in(Staff::getStaffName, userNameList));
|
List<String> staffNoList = staffList.stream().map(Staff::getStaffNo).collect(Collectors.toList());
|
StringBuilder builder = new StringBuilder(commonString);
|
builder.append("不合格编号:").append(unqualifiedProcessDTO.getProcessNo()).append("<br/>")
|
.append("种类:").append(unqualifiedProcessDTO.getType()).append("<br/>")
|
.append("车间:").append(unqualifiedProcessDTO.getWorkShop()).append("<br/>")
|
.append("工序:").append(unqualifiedProcessDTO.getOperationName()).append("<br/>")
|
.append("机台:").append(unqualifiedProcessDTO.getWorkstationName()).append("<br/>")
|
.append("零件编号:").append(unqualifiedProcessDTO.getPartNo()).append("<br/>")
|
.append("产品缆号:").append(unqualifiedProcessDTO.getLotBatchNo()).append("<br/>")
|
.append("不合格数量:").append(unqualifiedProcessDTO.getUnqualifiedArrived()).append("<br/>")
|
.append("不合格情况:").append(unqualifiedProcessDTO.getCorrectiveMeasures()).append("<br/>")
|
.append("评审意见:").append(unqualifiedProcessDTO.getExamineIdea()).append("<br/>")
|
.append("发起人:").append(unqualifiedProcessDTO.getStaffName()).append("<br/>")
|
.append("发起时间:").append(unqualifiedProcessDTO.getCreateTime()).append("<br/>");
|
WechatMsgTips.sendOaNotice(staffNoList, builder.toString(), "MES消息提醒:");
|
return true;
|
}
|
|
|
|
|
|
|
}
|