Merge branch 'merge-yili' into 'master'

feat: 儀器校驗任務

See merge request industry-solutions/industry-solutions-division/iep/iep-qms!13
This commit is contained in:
林益立 2024-04-12 01:00:46 +00:00
commit af6f67b11d
25 changed files with 715 additions and 27 deletions

View File

@ -0,0 +1,15 @@
package com.foreverwin.iep.qms.dto;
import com.foreverwin.iep.qms.entity.QmsInspecAttachment;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.web.multipart.MultipartFile;
@Data
@EqualsAndHashCode(callSuper = true)
public class QmsInspecAttachmentDTO extends QmsInspecAttachment {
private MultipartFile file;
private byte[] bytes;
}

View File

@ -1,5 +1,6 @@
package com.foreverwin.iep.qms.dto;
import com.foreverwin.iep.qms.entity.QmsInspecAttachment;
import com.foreverwin.iep.qms.entity.QmsInspecDetail;
import com.foreverwin.iep.qms.entity.QmsInspecResult;
import io.swagger.annotations.ApiModelProperty;
@ -46,4 +47,6 @@ public class QmsInspecDetailDTO extends QmsInspecDetail {
private List<QmsInspecFactorDTO> factorList;
private List<QmsInspecResultDTO> inspecResultList = new ArrayList<>();
private List<QmsInspecAttachment> attachmentList;
}

View File

@ -50,4 +50,8 @@ public class QmsInspecJobDTO extends QmsInspecJob {
private String inspectLevel;
private String supplierBatch;
private String currentResponsible;
private String groupName;
private String groupNo;
private String calibrationType;
}

View File

@ -13,4 +13,9 @@ public class QmsQcPlanTargetDTO extends QmsQcPlanTarget {
private String userGroup;
private String qcPlanDesc;
private List<QmsQcPlanTarget> qmsQcPlanTargets;
private String resourceBo;
private String qcPlanBo;
private String calibrationFreq;
private List<String> freq;
}

View File

@ -0,0 +1,63 @@
package com.foreverwin.iep.qms.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
/**
* 检验单单身-附件
*
* @author mom code generator
* @date 2024-03-12 16:58:15
*/
@Data
@TableName("qms_inspec_attachment")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "检验单单身-附件")
public class QmsInspecAttachment extends Model<QmsInspecAttachment> {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(type = IdType.INPUT)
@ApiModelProperty(value = "主键")
private String sid;
/**
* 检验单主键
*/
@ApiModelProperty(value = "检验单主键")
private String inspecJobBo;
/**
* 检验单单身主键
*/
@ApiModelProperty(value = "检验单单身主键")
private String inspecDetailBo;
/**
* 类型
*/
@ApiModelProperty(value = "类型")
private String type;
/**
* 文件名
*/
@ApiModelProperty(value = "文件名")
private String fileName;
/**
* 创建日期
*/
@ApiModelProperty(value = "创建日期")
private LocalDateTime dateCreate;
/**
* 创建人员
*/
@ApiModelProperty(value = "创建人员")
private String creator;
}

View File

@ -0,0 +1,50 @@
package com.foreverwin.iep.qms.controller;
import com.foreverwin.iep.qms.dto.QmsInspecAttachmentDTO;
import com.foreverwin.iep.qms.service.QmsInspecAttachmentService;
import com.foreverwin.mom.common.core.util.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
* 检验单单身-附件
*
* @author mom code generator
* @date 2024-03-12 16:58:15
*/
@RestController
@AllArgsConstructor
@RequestMapping("/inspec-attachment")
@Api(value = "inspec-attachment", tags = "检验单单身-附件管理")
public class QmsInspecAttachmentController {
private final QmsInspecAttachmentService qmsInspecAttachmentService;
@ApiOperation(value = "附件查詢", notes = "附件查詢")
@GetMapping("/{inspecDetailBo}/list")
public R getList(@PathVariable("inspecDetailBo") String inspecDetailBo) {
return R.ok(qmsInspecAttachmentService.getDetailAttachment(inspecDetailBo));
}
@ApiOperation(value = "附件上傳", notes = "附件上傳")
@PostMapping
public R upload(QmsInspecAttachmentDTO dto) {
return R.ok(qmsInspecAttachmentService.save(dto));
}
@ApiOperation(value = "附件下載", notes = "附件下載")
@GetMapping("/{sid}")
public R download(@PathVariable("sid") String sid) {
return R.ok(qmsInspecAttachmentService.get(sid));
}
@ApiOperation(value = "附件刪除", notes = "附件刪除")
@DeleteMapping("/{sid}")
public R delete(@PathVariable("sid") String sid) {
qmsInspecAttachmentService.delete(sid);
return R.ok();
}
}

View File

@ -65,7 +65,7 @@ public class QmsInspecJobController {
@ApiOperation(value = "收料单号開窗", notes = "收料单号開窗")
@GetMapping("/receiptNo/page")
public R getReceiptNo(FrontPage page,
@RequestParam(value = "receiptNo", required = false) String receiptNo) {
@RequestParam(value = "receiptNo", required = false) String receiptNo) {
return R.ok(qmsInspecJobService.getReceiptNo(page, receiptNo));
}
@ -101,6 +101,12 @@ public class QmsInspecJobController {
return R.ok(qmsInspecDetailService.getIQCDetailResult(inspecDetailBo));
}
@ApiOperation(value = "儀器校驗檢驗任務明細-檢驗項目查詢", notes = "IQC檢驗任務明細-檢驗項目查詢")
@GetMapping("/instrument/detail/result/{inspecDetailBo}")
public R getInstrumentDetailResult(@PathVariable("inspecDetailBo") String inspecDetailBo) {
return R.ok(qmsInspecDetailService.getInstrumentDetailResult(inspecDetailBo));
}
@ApiOperation(value = "檢驗任務明細-檢驗項目結果保存", notes = "檢驗任務明細-檢驗項目結果保存")
@PostMapping("/detail/result")
public R saveDetailResult(@RequestBody QmsInspecDetailDTO dto) {
@ -156,6 +162,14 @@ public class QmsInspecJobController {
return R.ok();
}
@GlobalTransactional
@ApiOperation(value = "儀器校驗判定", notes = "儀器校驗判定")
@PostMapping("/instrumentJudge")
public R instrumentJudge(@RequestBody InspecJob inspecJob) {
qmsInspecJobService.instrumentJudge(inspecJob);
return R.ok();
}
@ApiOperation(value = "檢驗任務-自動開立", notes = "檢驗任務-自動開立")
@Inner
@PostMapping("/api/auto")

View File

@ -40,22 +40,17 @@ public class QmsQcPlanController {
@ApiOperation(value = "分页查询", notes = "分页查询")
@GetMapping("/page")
public R getQmsQcPlanPage(FrontPage page, QmsQcPlan qmsQcPlan) {
IPage<QmsQcPlan> iPage = qmsQcPlanService.page(page.genOrders(), Wrappers.<QmsQcPlan>lambdaQuery()
.eq(StrUtil.isNotBlank(qmsQcPlan.getInspecType()), QmsQcPlan::getInspecType, qmsQcPlan.getInspecType())
.like(StrUtil.isNotBlank(qmsQcPlan.getQcPlan()), QmsQcPlan::getQcPlan, qmsQcPlan.getQcPlan())
.eq(StrUtil.isNotBlank(qmsQcPlan.getUserGroup()), QmsQcPlan::getUserGroup, qmsQcPlan.getUserGroup())
.eq(StrUtil.isNotBlank(qmsQcPlan.getCurrentRevision()), QmsQcPlan::getCurrentRevision, qmsQcPlan.getCurrentRevision())
.eq(StrUtil.isNotBlank(qmsQcPlan.getInspecType()), QmsQcPlan::getInspecType, qmsQcPlan.getInspecType())
.eq(QmsQcPlan::getSite, TenantContextHolder.getTenantId())
.orderByAsc(QmsQcPlan::getQcPlan));
iPage.getRecords().forEach(qcPlan -> {
qcPlan.setInspecFreqNo(HandleBoProcessor.trimHandle(qcPlan.getInspecFreqBo()));
});
iPage.getRecords().forEach(qcPlan -> qcPlan.setInspecFreqNo(HandleBoProcessor.trimHandle(qcPlan.getInspecFreqBo())));
return R.ok(iPage);
}
/**
* 通过id查询检验计划
*

View File

@ -33,4 +33,16 @@ public class JobMethod {
log.info("End autoCreateJobService.dailyFixedTime");
}
}
@XxlJob("InspecInstrument")
public void instrument() {
String param = XxlJobHelper.getJobParam();
if (StrUtil.isNotBlank(param) && JSONUtil.isTypeJSON(param)) {
JSONObject object = JSONObject.parseObject(param);
String site = object.getString("site");
log.info("Starting autoCreateJobService.instrument");
autoCreateJobService.instrument(site);
log.info("End autoCreateJobService.instrument");
}
}
}

View File

@ -7,4 +7,6 @@ public interface AutoCreateJobService {
void invoke(AutoCreateJobRequest autoCreateJobRequest);
void dailyFixedTime(String site);
void instrument(String site);
}

View File

@ -0,0 +1,23 @@
package com.foreverwin.iep.qms.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.foreverwin.iep.qms.dto.QmsInspecAttachmentDTO;
import com.foreverwin.iep.qms.dto.QmsInspecDetailDTO;
import com.foreverwin.iep.qms.entity.QmsInspecAttachment;
/**
* 检验单单身-附件
*
* @author mom code generator
* @date 2024-03-12 16:58:15
*/
public interface QmsInspecAttachmentService extends IService<QmsInspecAttachment> {
QmsInspecDetailDTO getDetailAttachment(String inspecDetailBo);
QmsInspecAttachmentDTO get(String sid);
QmsInspecAttachment save(QmsInspecAttachmentDTO dto);
void delete(String sid);
}

View File

@ -23,4 +23,8 @@ public interface QmsInspecDetailService extends IService<QmsInspecDetail> {
QmsInspecDetailDTO getIQCDetailResult(String inspecDetailBo);
void saveIQCResult(QmsInspecDetailDTO dto);
QmsInspecDetailDTO getInstrumentDetailResult(String inspecDetailBo);
QmsInspecDetailDTO getDetail(String inspecDetailBo);
}

View File

@ -25,7 +25,7 @@ public interface QmsInspecJobService extends IService<QmsInspecJob> {
IPage<Resource> getResrce(FrontPage page, String resrce, String operation);
IPage<ReceiptInfo> getReceiptNo( FrontPage page, String receiptNo);
IPage<ReceiptInfo> getReceiptNo(FrontPage page, String receiptNo);
IPage<QmsInspecJobDTO> selectAll(FrontPage page, QmsInspecJobDTO dto);
@ -50,4 +50,6 @@ public interface QmsInspecJobService extends IService<QmsInspecJob> {
void iqcJudge(InspecJob inspecJob);
void closeByTargetBo(String targetBo);
void instrumentJudge(InspecJob inspecJob);
}

View File

@ -20,4 +20,5 @@ public interface QmsQcPlanTargetService extends IService<QmsQcPlanTarget> {
List<QmsQcPlanTargetDTO> getByTargetBoAndInspectLevel(String targetBo, String inspectLevel);
List<QmsQcPlanTargetDTO> getTargetByInstrumentGroup(String site);
}

View File

@ -19,6 +19,7 @@ import com.foreverwin.iep.qms.constant.Freq;
import com.foreverwin.iep.qms.domain.AutoCreateJobRequest;
import com.foreverwin.iep.qms.domain.ChkInfo;
import com.foreverwin.iep.qms.domain.InspecJob;
import com.foreverwin.iep.qms.dto.QmsQcPlanTargetDTO;
import com.foreverwin.iep.qms.entity.*;
import com.foreverwin.iep.qms.mapper.AutoCreateJobMapper;
import com.foreverwin.iep.qms.service.*;
@ -216,6 +217,64 @@ public class AutoCreateJobServiceImpl implements AutoCreateJobService {
});
}
@Transactional(rollbackFor = Exception.class)
@Override
public void instrument(String site) {
TenantContextHolder.setTenantId(site);
LocalDateTime now = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59);
LocalDateTime before = now.plusDays(-7).withHour(0).withMinute(0).withSecond(0);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMdd");
String immediately = now.format(dtf);
String after = now.plusDays(7).format(dtf);
List<QmsQcPlanTargetDTO> targets = qmsQcPlanTargetService.getTargetByInstrumentGroup(site)
.stream()
.filter(filters -> {
List<String> freq = new ArrayList<>(Arrays.asList(filters.getCalibrationFreq().split(",")));
filters.setFreq(freq.stream()
.filter(date -> date.compareTo(immediately) >= 0 && date.compareTo(after) <= 0)
.collect(Collectors.toList()));
return !filters.getFreq().isEmpty();
})
.collect(Collectors.toList());
if (targets.isEmpty()) {
return;
}
targets.forEach(target -> {
String resourceBO = target.getResourceBo();
String qcPlan = target.getQcPlan();
List<String> exist = qmsInspecJobService.list(Wrappers.lambdaQuery(QmsInspecJob.class)
.eq(QmsInspecJob::getQcPlanBo, target.getQcPlanBo())
.eq(QmsInspecJob::getTargetBo, target.getResourceBo())
.in(QmsInspecJob::getQcFreq, target.getFreq())
.le(QmsInspecJob::getDateCreate, now)
.ge(QmsInspecJob::getDateCreate, before))
.stream()
.map(QmsInspecJob::getQcFreq)
.collect(Collectors.toList());
List<String> freq = target.getFreq()
.stream()
.filter(date -> !exist.contains(date))
.collect(Collectors.toList());
freq.forEach(date -> {
InspecJob inspecJob = new InspecJob();
inspecJob.setTargetBo(resourceBO);
inspecJob.setQcFreq(date);
inspecJob.setQcPlan(qcPlan);
inspecJob.setUser(ADMIN);
inspecJob.setInspecType("3");
inspecJob.setPopulationQty(BigDecimal.ONE);
inspecJob.setNextNumberType("QMS_CAL_INSPEC_JOB");
qmsInspecJobService.createJob(inspecJob);
});
});
}
public String chkFirstSfc(Map<String, List<LotBasis>> shopOrderBoMap) {
AtomicInteger count = new AtomicInteger(0);
shopOrderBoMap.forEach((shopOrderBo, lotBasisList) -> {

View File

@ -0,0 +1,220 @@
package com.foreverwin.iep.qms.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.foreverwin.iep.common.file.domain.SmbFileInfo;
import com.foreverwin.iep.common.utils.ConfigUtils;
import com.foreverwin.iep.common.utils.SidUtils;
import com.foreverwin.iep.common.utils.SmbUtils;
import com.foreverwin.iep.qms.dto.QmsInspecAttachmentDTO;
import com.foreverwin.iep.qms.dto.QmsInspecDetailDTO;
import com.foreverwin.iep.qms.entity.QmsInspecAttachment;
import com.foreverwin.iep.qms.entity.QmsInspecJob;
import com.foreverwin.iep.qms.mapper.QmsInspecAttachmentMapper;
import com.foreverwin.iep.qms.service.QmsInspecAttachmentService;
import com.foreverwin.iep.qms.service.QmsInspecDetailService;
import com.foreverwin.iep.qms.service.QmsInspecJobService;
import com.foreverwin.mom.admin.api.dto.SysRoleDTO;
import com.foreverwin.mom.admin.api.feign.RemoteRoleService;
import com.foreverwin.mom.common.core.constant.SecurityConstants;
import com.foreverwin.mom.common.core.exception.BusinessException;
import com.foreverwin.mom.common.core.util.I18nUtil;
import com.foreverwin.mom.common.core.util.R;
import com.foreverwin.mom.common.security.util.SecurityUtils;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 检验单单身-附件
*
* @author mom code generator
* @date 2024-03-12 16:58:15
*/
@Service
@AllArgsConstructor
public class QmsInspecAttachmentServiceImpl extends ServiceImpl<QmsInspecAttachmentMapper, QmsInspecAttachment> implements QmsInspecAttachmentService {
private final QmsInspecJobService qmsInspecJobService;
private final QmsInspecDetailService qmsInspecDetailService;
private final RemoteRoleService remoteRoleService;
@Override
public QmsInspecDetailDTO getDetailAttachment(String inspecDetailBo) {
QmsInspecDetailDTO inspecDetail = qmsInspecDetailService.getDetail(inspecDetailBo);
inspecDetail.setAttachmentList(list(Wrappers.lambdaQuery(QmsInspecAttachment.class)
.eq(QmsInspecAttachment::getInspecDetailBo, inspecDetailBo)));
return inspecDetail;
}
@Override
public QmsInspecAttachmentDTO get(String sid) {
Map<String, String> config = ConfigUtils.getFileServerConfig();
QmsInspecAttachment attachment = super.getById(sid);
if (ObjectUtil.isNull(attachment)) {
return new QmsInspecAttachmentDTO();
}
String url = config.get("FILE_SERVER_URL");
String path = config.get("FILE_SERVER_PATH");
String username = config.get("FILE_SERVER_ID");
String password = config.get("FILE_SERVER_PW");
SmbFileInfo smbFileInfo = new SmbFileInfo();
smbFileInfo.setHost(url);
smbFileInfo.setUsername(username);
smbFileInfo.setPassword(password);
smbFileInfo.setPath(getPath(attachment.getInspecJobBo(), attachment.getInspecDetailBo(), path));
smbFileInfo.setFileName(attachment.getFileName());
smbFileInfo = SmbUtils.downloadFile(smbFileInfo);
QmsInspecAttachmentDTO dto = new QmsInspecAttachmentDTO();
BeanUtils.copyProperties(attachment, dto);
dto.setBytes(smbFileInfo.getBytes());
return dto;
}
@Override
public QmsInspecAttachment save(QmsInspecAttachmentDTO dto) {
Map<String, String> config = ConfigUtils.getFileServerConfig();
MultipartFile multipartFile = dto.getFile();
if (multipartFile == null) {
return null;
}
String fileName = new String(multipartFile.getOriginalFilename()
.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
if (super.count(Wrappers.lambdaQuery(QmsInspecAttachment.class)
.eq(QmsInspecAttachment::getInspecDetailBo, dto.getInspecDetailBo())
.eq(QmsInspecAttachment::getFileName, fileName)) > 0) {
throw BusinessException.build(I18nUtil.getI18nText("qms.attachment.error1", fileName));
}
valid(config);
String url = config.get("FILE_SERVER_URL");
String path = config.get("FILE_SERVER_PATH");
String username = config.get("FILE_SERVER_ID");
String password = config.get("FILE_SERVER_PW");
SmbFileInfo smbFileInfo = new SmbFileInfo();
smbFileInfo.setHost(url);
smbFileInfo.setUsername(username);
smbFileInfo.setPassword(password);
smbFileInfo.setPath(getPath(dto.getInspecJobBo(), dto.getInspecDetailBo(), path));
smbFileInfo.setFileName(fileName);
smbFileInfo.setMultipartFile(multipartFile);
SmbUtils.uploadFile(smbFileInfo);
QmsInspecAttachment attachment = new QmsInspecAttachment();
BeanUtils.copyProperties(dto, attachment);
attachment.setSid(SidUtils.genSid());
attachment.setCreator(SecurityUtils.getUserName());
attachment.setDateCreate(LocalDateTime.now());
attachment.setFileName(fileName);
super.save(attachment);
return attachment;
}
@Override
public void delete(String sid) {
Map<String, String> config = ConfigUtils.getFileServerConfig();
QmsInspecAttachment attachment = super.getById(sid);
if (ObjectUtil.isNull(attachment)) {
return;
}
valid(attachment, config);
String url = config.get("FILE_SERVER_URL");
String path = config.get("FILE_SERVER_PATH");
String username = config.get("FILE_SERVER_ID");
String password = config.get("FILE_SERVER_PW");
SmbFileInfo smbFileInfo = new SmbFileInfo();
smbFileInfo.setHost(url);
smbFileInfo.setUsername(username);
smbFileInfo.setPassword(password);
smbFileInfo.setPath(getPath(attachment.getInspecJobBo(), attachment.getInspecDetailBo(), path));
smbFileInfo.setFileName(attachment.getFileName());
SmbUtils.deleteFile(smbFileInfo);
super.removeById(sid);
}
private void valid(Map<String, String> config) {
valid(null, config);
}
private void valid(QmsInspecAttachment attachment, Map<String, String> config) {
if (StrUtil.isBlank(config.get("FILE_SERVER_URL"))) {
throw BusinessException.build(I18nUtil.getI18nText("qms.global.error1"));
}
if (StrUtil.isBlank(config.get("FILE_SERVER_PATH"))) {
throw BusinessException.build(I18nUtil.getI18nText("qms.global.error4"));
}
if (StrUtil.isBlank(config.get("FILE_SERVER_ID"))) {
throw BusinessException.build(I18nUtil.getI18nText("qms.global.error2"));
}
if (StrUtil.isBlank(config.get("FILE_SERVER_PW"))) {
throw BusinessException.build(I18nUtil.getI18nText("qms.global.error3"));
}
if (ObjectUtil.isNotNull(attachment)) {
String user = SecurityUtils.getUserName();
String creator = attachment.getCreator();
R<List<SysRoleDTO>> resp = remoteRoleService.findRolesByUser(Arrays.asList(user, creator), SecurityConstants.FROM_IN);
List<SysRoleDTO> roleList = resp.getData();
Map<String, List<SysRoleDTO>> roleMap = roleList.stream()
.collect(Collectors.groupingBy(SysRoleDTO::getUsername));
List<String> userRoles = roleMap.get(user).stream()
.map(SysRoleDTO::getRoleCode)
.collect(Collectors.toList());
List<String> creatorRoles = roleMap.get(creator).stream()
.map(SysRoleDTO::getRoleCode)
.collect(Collectors.toList());
boolean flag = false;
for (String role : userRoles) {
if (creatorRoles.contains(role)) {
flag = true;
break;
}
}
if (!flag) {
throw BusinessException.build(I18nUtil.getI18nText("qms.attachment.error2"));
}
}
}
private String getPath(String inspecJobBo,
String inspecDetailBo,
String path) {
QmsInspecJob qmsInspecJob = qmsInspecJobService.getById(inspecJobBo);
QmsInspecDetailDTO qmsInspecDetail = qmsInspecDetailService.getDetail(inspecDetailBo);
StringBuilder builder = new StringBuilder();
if (StrUtil.isNotBlank(path)) {
builder.append(path);
builder.append(FileUtil.FILE_SEPARATOR);
}
builder.append("CalInspect")
.append(FileUtil.FILE_SEPARATOR)
.append(qmsInspecJob.getJobNo())
.append(FileUtil.FILE_SEPARATOR)
.append(qmsInspecDetail.getQcItem());
return builder.toString();
}
}

View File

@ -236,7 +236,6 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
QmsInspecDetailDTO inspecDetail = baseMapper.selectDetail(inspecDetailBo);
QmsInspecJob inspecJob = getQmsInspecJobService().getById(inspecDetail.getInspecJobBo());
QmsSamplePlanDTO samplePlan = new QmsSamplePlanDTO();
samplePlan.setHandle(QmsSamplePlan.genHandle(site, inspecDetail.getSamplePlan()));
samplePlan.setQty(inspecJob.getPopulationQty());
@ -264,7 +263,7 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
@Override
@Transactional
public void saveIQCResult(QmsInspecDetailDTO dto) {
init();
String inspecJobBo = dto.getInspecJobBo();
String inspecDetailBo = dto.getHandle();
List<QmsInspecFactorDTO> factorList = dto.getFactorList();
@ -294,6 +293,33 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
qmsInspecResultNccodeService.saveBatch(inspecResultNcList);
}
@Override
public QmsInspecDetailDTO getInstrumentDetailResult(String inspecDetailBo) {
QmsInspecDetailDTO inspecDetail = baseMapper.selectDetail(inspecDetailBo);
String itemType = inspecDetail.getItemType();
List<QmsInspecResult> inspecResults = qmsInspecResultService.list(Wrappers.lambdaQuery(QmsInspecResult.class)
.eq(QmsInspecResult::getInspecDetailBo, inspecDetailBo));
inspecResults.forEach(result -> {
QmsInspecResultDTO resultDTO = new QmsInspecResultDTO();
BeanUtils.copyProperties(result, resultDTO);
if ("0".equals(itemType)) {
List<QmsInspecResultNccodeDTO> ncCodeList = qmsInspecResultNccodeService.selectAll(result.getSid());
resultDTO.setQmsInspecResultNccodeList(ncCodeList);
}
inspecDetail.getInspecResultList().add(resultDTO);
});
inspecDetail.setOocRemark(formatter(inspecDetail.getOocRemark()));
inspecDetail.setResultRemark(formatter(inspecDetail.getResultRemark()));
return inspecDetail;
}
@Override
public QmsInspecDetailDTO getDetail(String inspecDetailBo) {
return baseMapper.selectDetail(inspecDetailBo);
}
private QmsInspecSn filterSn(List<QmsInspecSn> inspecSns, String seq) {
return inspecSns.stream()
.filter(filters -> filters.getSeq().equals(seq))
@ -403,16 +429,16 @@ public class QmsInspecDetailServiceImpl extends ServiceImpl<QmsInspecDetailMappe
return stringBuilder.toString();
}
private String format(String str) {
private String format(String str){
String site = TenantContextHolder.getTenantId();
do {
String key = keyword(str);
String target = String.format("%s%s%s", percent, key, percent);
StringBuilder i18n = new StringBuilder(key);
if (StrUtil.isBlank(key)) {
break;
}
String target = String.format("%s%s%s", percent, key, percent);
StringBuilder i18n = new StringBuilder(key);
int start = str.indexOf("{");
int end = str.indexOf("}");

View File

@ -1,6 +1,7 @@
package com.foreverwin.iep.qms.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
@ -13,6 +14,7 @@ import com.foreverwin.iep.abn.entity.AbnMaster;
import com.foreverwin.iep.abn.feign.RemoteAbnService;
import com.foreverwin.iep.common.base.FrontPage;
import com.foreverwin.iep.common.constant.BaseConstants;
import com.foreverwin.iep.common.model.CustomValue;
import com.foreverwin.iep.common.model.http.HttpResponse;
import com.foreverwin.iep.common.model.spc.base.SpcExecuteRequest;
import com.foreverwin.iep.common.model.spc.dc.Nc;
@ -27,10 +29,12 @@ import com.foreverwin.iep.prd.constant.NextNumberTypeEnum;
import com.foreverwin.iep.prd.domain.GenerateNextNumberRequest;
import com.foreverwin.iep.prd.domain.GenerateNextNumberResponse;
import com.foreverwin.iep.prd.domain.NextNumberRetrieveRequest;
import com.foreverwin.iep.prd.domain.SaveCustomDataRequest;
import com.foreverwin.iep.prd.entity.NextNumber;
import com.foreverwin.iep.prd.entity.Operation;
import com.foreverwin.iep.prd.entity.ReasonCode;
import com.foreverwin.iep.prd.entity.RouterStep;
import com.foreverwin.iep.prd.feign.RemoteCustomFieldsService;
import com.foreverwin.iep.prd.feign.RemoteNextNumberService;
import com.foreverwin.iep.prd.feign.RemoteRouterService;
import com.foreverwin.iep.qms.constant.Factor;
@ -67,7 +71,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@ -99,6 +105,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
private final RemoteParamService remoteParamService;
private final RemoteSystemTransactionLogService remoteSystemTransactionLogService;
private final RemoteWmsReceiptDetailService remoteWmsReceiptDetailService;
private final RemoteCustomFieldsService remoteCustomFieldsService;
private static final String OK = "1";
private static final String NG = "0";
@ -132,6 +139,7 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
.map(SysRoleDTO::getRoleCode)
.collect(Collectors.toList()));
}
if ("1".equals(dto.getInspecType())) {
IPage<QmsInspecJobDTO> response = baseMapper.selectIQC(page, dto);
response.getRecords().forEach(qmsInspecJobDTO -> {
@ -145,6 +153,8 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
}
});
return response;
} else if ("3".equals(dto.getInspecType())) {
return baseMapper.selectInstrument(page, dto);
} else {
return baseMapper.selectAll(page, dto);
}
@ -153,16 +163,19 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
@Transactional(rollbackFor = Exception.class)
@Override
public QmsInspecJob create(InspecJob inspecJob) {
String lotNo = inspecJob.getLotNo();
if ("0".equals(inspecJob.getInspecType())) {
// 生產
String lotNo = inspecJob.getLotNo();
LotState lotState = validation(inspecJob);
LotBasis lotBasis = getLotBasis(lotNo);
LotState lotState = validation(inspecJob);
LotBasis lotBasis = getLotBasis(lotNo);
String item = HandleBoProcessor.trimHandle(lotBasis.getItemBo());
String item = HandleBoProcessor.trimHandle(lotBasis.getItemBo());
inspecJob.setItem(item);
inspecJob.setTargetBo(lotState.getHandle());
inspecJob.setPopulationQty(lotState.getQty());
inspecJob.setItem(item);
inspecJob.setTargetBo(lotState.getHandle());
inspecJob.setPopulationQty(lotState.getQty());
}
return createJob(inspecJob);
}
@ -210,8 +223,8 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
.set(QmsInspecJob::getCompleteUser, user)
.set(QmsInspecJob::getCompleteDateTime, LocalDateTime.now())
.eq(QmsInspecJob::getHandle, inspecJobBo));
if ("1".equals(qmsInspecJob.getInspecType())) {
iqcUpdateDetail(qmsInspecJob);
if ("1".equals(qmsInspecJob.getInspecType()) || "3".equals(qmsInspecJob.getInspecType())) {
updateDetailByType(qmsInspecJob);
} else {
updateDetail(qmsInspecJob);
}
@ -912,7 +925,58 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
});
}
private void iqcUpdateDetail(QmsInspecJob qmsInspecJob) {
@Override
public void instrumentJudge(InspecJob inspecJob) {
String site = TenantContextHolder.getTenantId();
String user = SecurityUtils.getUserName();
LocalDateTime now = LocalDateTime.now();
String jobNo = inspecJob.getJobNo();
String inspecJobBo = QmsInspecJob.genHandle(site, jobNo);
String result = inspecJob.getResult();
String judgeRemark = inspecJob.getJudgeRemark();
update(Wrappers.lambdaUpdate(QmsInspecJob.class)
.set(QmsInspecJob::getStatus, "5")
.set(QmsInspecJob::getResult, result)
.set(QmsInspecJob::getJudgeRemark, judgeRemark)
.set(QmsInspecJob::getJudgeUser, user)
.set(QmsInspecJob::getJudgeDateTime, now)
.eq(QmsInspecJob::getHandle, inspecJobBo));
QmsInspecJob job = getById(inspecJobBo);
String qcPlanBo = job.getQcPlanBo();
List<CustomValue> customValues = remoteCustomFieldsService.retrieveCustomValues(qcPlanBo, SecurityConstants.FROM_IN).getData();
CustomValue customValue = customValues.stream()
.filter(filters -> filters.getFieldName().equals("EXP_DAYS")
&& StrUtil.isNotBlank(filters.getFieldValue())
&& NumberUtil.isNumber(filters.getFieldValue()))
.findFirst()
.orElse(null);
if (ObjectUtil.isNotNull(customValue) && StrUtil.isNotBlank(customValue.getFieldValue())) {
BigDecimal days = new BigDecimal(customValue.getFieldValue());
long second = days.multiply(new BigDecimal("24")) // 時
.multiply(new BigDecimal("60")) // 分
.multiply(new BigDecimal("60")) // 秒
.setScale(0, RoundingMode.HALF_UP)
.longValue();
LocalDateTime next = now.plusSeconds(second);
SaveCustomDataRequest saveCustomDataRequest = new SaveCustomDataRequest();
saveCustomDataRequest.setRef(job.getTargetBo());
saveCustomDataRequest.setDoFieldMerge(false);
saveCustomDataRequest.setObjectAlias("RESRCE");
CustomValue value = new CustomValue();
value.setFieldName("CAL_EXP");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
value.setFieldValue(next.format(dateTimeFormatter));
saveCustomDataRequest.setCustomData(new ArrayList<>(Collections.singletonList(value)));
remoteCustomFieldsService.saveCustomData(saveCustomDataRequest, SecurityConstants.FROM_IN);
}
}
private void updateDetailByType(QmsInspecJob qmsInspecJob) {
String jobBo = qmsInspecJob.getHandle();
List<QmsInspecDetailDTO> details = qmsInspecDetailService.selectAll(jobBo);
@ -995,7 +1059,10 @@ public class QmsInspecJobServiceImpl extends ServiceImpl<QmsInspecJobMapper, Qms
update(Wrappers.lambdaUpdate(QmsInspecJob.class)
.set(QmsInspecJob::getResult, hasNG ? NG : OK)
.eq(QmsInspecJob::getHandle, jobBo));
remoteWmsReceiptDetailService.updateInspecResult(qmsInspecJob.getTargetBo(), hasNG ? NG : OK);
if ("1".equals(qmsInspecJob.getInspecType())) {
remoteWmsReceiptDetailService.updateInspecResult(qmsInspecJob.getTargetBo(), hasNG ? NG : OK);
}
}
private void updateDetail(QmsInspecJob qmsInspecJob) {

View File

@ -50,4 +50,9 @@ public class QmsQcPlanTargetServiceImpl extends ServiceImpl<QmsQcPlanTargetMappe
public List<QmsQcPlanTargetDTO> getByTargetBoAndInspectLevel(String targetBo, String inspectLevel) {
return super.baseMapper.get(targetBo, inspectLevel);
}
@Override
public List<QmsQcPlanTargetDTO> getTargetByInstrumentGroup(String site) {
return baseMapper.selectTargetByInstrumentGroup(site);
}
}

View File

@ -0,0 +1,16 @@
package com.foreverwin.iep.qms.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.foreverwin.iep.qms.entity.QmsInspecAttachment;
import org.apache.ibatis.annotations.Mapper;
/**
* 检验单单身-附件
*
* @author mom code generator
* @date 2024-03-12 16:58:15
*/
@Mapper
public interface QmsInspecAttachmentMapper extends BaseMapper<QmsInspecAttachment> {
}

View File

@ -29,13 +29,16 @@ public interface QmsInspecJobMapper extends MomBaseMapper<QmsInspecJob> {
@Param("resrce") String resrce,
@Param("operation") String operation);
IPage<ReceiptInfo> selectReceiptNo( FrontPage page,
@Param("site") String site,
@Param("receiptNo") String receiptNo);
IPage<ReceiptInfo> selectReceiptNo(FrontPage page,
@Param("site") String site,
@Param("receiptNo") String receiptNo);
IPage<QmsInspecJobDTO> selectAll(FrontPage page,
@Param("dto") QmsInspecJobDTO dto);
IPage<QmsInspecJobDTO> selectIQC(FrontPage page,
@Param("dto") QmsInspecJobDTO dto);
IPage<QmsInspecJobDTO> selectInstrument(FrontPage page,
@Param("dto") QmsInspecJobDTO dto);
}

View File

@ -18,4 +18,6 @@ import java.util.List;
public interface QmsQcPlanTargetMapper extends MomBaseMapper<QmsQcPlanTarget> {
List<QmsQcPlanTargetDTO> get( @Param("targetBo") String targetBo, @Param("inspectLevel") String inspectLevel);
List<QmsQcPlanTargetDTO> selectTargetByInstrumentGroup(@Param("site") String site);
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.foreverwin.iep.qms.mapper.QmsInspecAttachmentMapper">
<resultMap id="qmsInspecAttachmentMap" type="com.foreverwin.iep.qms.entity.QmsInspecAttachment">
<id property="sid" column="SID"/>
<result property="inspecJobBo" column="INSPEC_JOB_BO"/>
<result property="inspecDetailBo" column="INSPEC_DETAIL_BO"/>
<result property="type" column="TYPE"/>
<result property="fileName" column="FILE_NAME"/>
<result property="dateCreate" column="DATE_CREATE"/>
<result property="creator" column="CREATOR"/>
</resultMap>
</mapper>

View File

@ -54,6 +54,9 @@
<result property="inspectLevel" column="INSPECT_LEVEL"/>
<result property="supplierBatch" column="SUPPLIER_BATCH"/>
<result property="currentResponsible" column="CURRENT_RESPONSIBLE"/>
<result property="groupName" column="GROUP_NAME"/>
<result property="groupNo" column="GROUP_NO"/>
<result property="calibrationType" column="CALIBRATION_TYPE"/>
</resultMap>
<resultMap id="item" type="com.foreverwin.iep.qms.domain.Item">
<result property="item" column="ITEM"/>
@ -246,4 +249,62 @@
</where>
order by a.JOB_NO
</select>
<select id="selectInstrument" resultMap="full">
select a.*,
b.QC_PLAN,
b.DESCRIPTION QC_PLAN_DESC,
b.CALIBRATION_TYPE,
c.RESRCE,
c.DESCRIPTION RESRCE_DESC,
e.GROUP_NAME,
e.GROUP_NO
from qms_inspec_job a
join qms_qc_plan b on a.QC_PLAN_BO = b.HANDLE
join resrce c on a.TARGET_BO = c.HANDLE
left join instrument_group_member d on c.HANDLE = d.RESOURCE_BO
left join instrument_group e on d.INSTRUMENT_GROUP_BO = e.HANDLE
<where>
AND a.SITE = #{dto.site}
<if test="dto.jobNo != null and dto.jobNo != ''">
AND a.JOB_NO = #{dto.jobNo}
</if>
<if test="dto.qcPlan != null and dto.qcPlan != ''">
AND b.QC_PLAN = #{dto.qcPlan}
</if>
<if test="dto.userGroup != null and dto.userGroup != ''">
AND a.USER_GROUP = #{dto.userGroup}
</if>
<if test="dto.resrce != null and dto.resrce != ''">
AND c.RESRCE = #{dto.resrce}
</if>
<if test="dto.groupNo != null and dto.groupNo != ''">
AND e.GROUP_NO = #{dto.groupNo}
</if>
<if test="dto.groupName != null and dto.groupName != ''">
AND e.GROUP_NAME = #{dto.groupName}
</if>
<if test="dto.from != null">
AND a.DATE_CREATE &gt;= #{dto.from}
</if>
<if test="dto.to != null">
AND a.DATE_CREATE &lt;= #{dto.to}
</if>
<if test="dto.status != null and dto.status != ''">
AND a.STATUS = #{dto.status}
</if>
<if test="dto.result != null and dto.result != ''">
AND a.RESULT = #{dto.result}
</if>
<if test="dto.calibrationType != null and dto.calibrationType != ''">
AND b.CALIBRATION_TYPE = #{dto.calibrationType}
</if>
<if test="dto.userGroups != null and dto.userGroups.size() > 0">
AND a.USER_GROUP in
<foreach collection="dto.userGroups" item="userGroup" open="(" separator="," close=")">
#{userGroup}
</foreach>
</if>
</where>
order by a.JOB_NO
</select>
</mapper>

View File

@ -21,6 +21,12 @@
<result property="userGroup" column="USER_GROUP"/>
<result property="qcPlanDesc" column="QC_PLAN_DESC"/>
</resultMap>
<resultMap id="full" type="com.foreverwin.iep.qms.dto.QmsQcPlanTargetDTO" extends="qmsQcPlanTargetMap">
<result property="resourceBo" column="RESOURCE_BO"/>
<result property="qcPlanBo" column="QC_PLAN_BO"/>
<result property="calibrationFreq" column="CALIBRATION_FREQ"/>
</resultMap>
<select id="get" resultMap="userGroupMap">
select a.*, b.DESCRIPTION QC_PLAN_DESC, b.USER_GROUP
@ -36,4 +42,18 @@
</where>
order by INSPECT_LEVEL
</select>
<select id="selectTargetByInstrumentGroup" resultMap="full">
select a.HANDLE,
c.QC_PLAN,
b.RESOURCE_BO,
d.HANDLE QC_PLAN_BO,
d.CALIBRATION_FREQ
from instrument_group a
join instrument_group_member b on a.HANDLE = b.INSTRUMENT_GROUP_BO
join qms_qc_plan_target c on a.HANDLE = c.TARGET_BO
join qms_qc_plan d on c.SITE = d.SITE and c.QC_PLAN = d.QC_PLAN and d.CURRENT_REVISION = 'Y'
where a.SITE = #{site}
and d.CALIBRATION_FREQ is not null
</select>
</mapper>