package cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality;
|
|
import cn.hutool.core.util.StrUtil;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualityPageReqVO;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import org.apache.ibatis.annotations.Mapper;
|
|
import java.util.Collection;
|
import java.util.List;
|
import java.util.Map;
|
|
@Mapper
|
public interface MesQcSeedQualityMapper extends BaseMapperX<MesQcSeedQualityDO> {
|
|
default PageResult<MesQcSeedQualityDO> selectPage(MesQcSeedQualityPageReqVO reqVO) {
|
return selectPage(reqVO, new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.likeIfPresent(MesQcSeedQualityDO::getCode, reqVO.getCode())
|
.likeIfPresent(MesQcSeedQualityDO::getBatchCode, reqVO.getBatchCode())
|
.eqIfPresent(MesQcSeedQualityDO::getBatchCode, reqVO.getExactBatchCode())
|
.eqIfPresent(MesQcSeedQualityDO::getResult, reqVO.getResult())
|
.eqIfPresent(MesQcSeedQualityDO::getWorkflowStatus, reqVO.getWorkflowStatus())
|
.eqIfPresent(MesQcSeedQualityDO::getQcLine, reqVO.getQcLine())
|
.eqIfPresent(MesQcSeedQualityDO::getBizType, reqVO.getBizType())
|
.isNull(Boolean.TRUE.equals(reqVO.getUnbound()), MesQcSeedQualityDO::getBatchCode)
|
.orderByAsc(MesQcSeedQualityDO::getCode)
|
.orderByAsc(MesQcSeedQualityDO::getQcLine)
|
.orderByDesc(MesQcSeedQualityDO::getInspectedAt)
|
.orderByDesc(MesQcSeedQualityDO::getId));
|
}
|
|
/** 同一袋码可能同时存在加工部、销售部两条记录,按质检线升序返回 */
|
default List<MesQcSeedQualityDO> selectListByCode(String code) {
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getCode, code)
|
.orderByAsc(MesQcSeedQualityDO::getQcLine));
|
}
|
|
default List<MesQcSeedQualityDO> selectListByCodeForUpdate(String code) {
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getCode, code)
|
.orderByAsc(MesQcSeedQualityDO::getQcLine)
|
.last("FOR UPDATE"));
|
}
|
|
default MesQcSeedQualityDO selectByCodeAndLine(String code, Integer qcLine) {
|
return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getCode, code)
|
.eq(MesQcSeedQualityDO::getQcLine, qcLine));
|
}
|
|
default MesQcSeedQualityDO selectByReturnSalesId(Long returnSalesId) {
|
return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getReturnSalesId, returnSalesId)
|
.orderByDesc(MesQcSeedQualityDO::getId));
|
}
|
|
default MesQcSeedQualityDO selectByReturnSalesIdForUpdate(Long returnSalesId) {
|
return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getReturnSalesId, returnSalesId)
|
.orderByDesc(MesQcSeedQualityDO::getId)
|
.last("FOR UPDATE"));
|
}
|
|
/** 清空同一袋码的公司质检流程实例编号,便于公司审批驳回后重新发起 */
|
default void clearCompanyProcessInstance(String code) {
|
update(null, new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getCode, code)
|
.set(MesQcSeedQualityDO::getCompanyProcessInstanceId, null));
|
}
|
|
default void clearLineProcessInstance(Long id) {
|
update(null, new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getId, id)
|
.set(MesQcSeedQualityDO::getProcessInstanceId, null));
|
}
|
|
default List<MesQcSeedQualityDO> selectListByCodes(Collection<String> codes) {
|
if (codes.isEmpty()) return List.of();
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>().in(MesQcSeedQualityDO::getCode, codes));
|
}
|
|
default List<MesQcSeedQualityDO> selectListByCodesForUpdate(Collection<String> codes) {
|
if (codes.isEmpty()) return List.of();
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>().in(MesQcSeedQualityDO::getCode, codes).last("FOR UPDATE"));
|
}
|
|
default MesQcSeedQualityDO selectByIdForUpdate(Long id) {
|
return selectOne(new LambdaQueryWrapperX<MesQcSeedQualityDO>().eq(MesQcSeedQualityDO::getId, id).last("FOR UPDATE"));
|
}
|
|
default List<MesQcSeedQualityDO> selectListByIdsForUpdate(Collection<Long> ids) {
|
if (ids.isEmpty()) return List.of();
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.in(MesQcSeedQualityDO::getId, ids)
|
.orderByAsc(MesQcSeedQualityDO::getId)
|
.last("FOR UPDATE"));
|
}
|
|
default List<MesQcSeedQualityDO> selectListByProcessInstanceId(String processInstanceId) {
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getProcessInstanceId, processInstanceId));
|
}
|
|
default List<MesQcSeedQualityDO> selectListByCompanyProcessInstanceId(String processInstanceId) {
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getCompanyProcessInstanceId, processInstanceId));
|
}
|
|
default List<MesQcSeedQualityDO> selectListByBatchCode(String batchCode) {
|
return selectList(new LambdaQueryWrapperX<MesQcSeedQualityDO>()
|
.eq(MesQcSeedQualityDO::getBatchCode, batchCode)
|
.orderByDesc(MesQcSeedQualityDO::getInspectedAt));
|
}
|
|
/** 按生产批次分组的组数(未绑定批次归入空批次组) */
|
default long countBatchGroups(MesQcSeedQualityPageReqVO reqVO) {
|
QueryWrapper<MesQcSeedQualityDO> wrapper = buildBatchGroupFilter(reqVO);
|
wrapper.select("COUNT(DISTINCT IFNULL(batch_code, '')) AS cnt");
|
List<Object> values = selectObjs(wrapper);
|
if (values.isEmpty() || values.get(0) == null) {
|
return 0L;
|
}
|
return ((Number) values.get(0)).longValue();
|
}
|
|
/**
|
* 按生产批次分组的分页汇总,offset/limit 由调用方按批次页计算。
|
* 同一袋码存在加工部、销售部两条记录,因此按袋码去重统计。
|
*/
|
default List<Map<String, Object>> selectBatchGroups(MesQcSeedQualityPageReqVO reqVO, long offset, int limit) {
|
QueryWrapper<MesQcSeedQualityDO> wrapper = buildBatchGroupFilter(reqVO);
|
wrapper.select(
|
"IFNULL(batch_code, '') AS batchCode",
|
"MAX(batch_id) AS batchId",
|
"MAX(item_id) AS itemId",
|
"COUNT(DISTINCT code) AS totalCount",
|
"COUNT(DISTINCT CASE WHEN result = 1 THEN code END) AS passCount",
|
"COUNT(DISTINCT CASE WHEN result = 2 THEN code END) AS failCount",
|
"COUNT(DISTINCT CASE WHEN result IS NULL OR result = 0 THEN code END) AS processingCount",
|
"COUNT(DISTINCT CASE WHEN workflow_status IN (10, 50) THEN code END) AS pendingRetestCount",
|
"COUNT(DISTINCT CASE WHEN workflow_status IN (20, 25) THEN code END) AS pendingProcessReviewCount",
|
"COUNT(DISTINCT CASE WHEN workflow_status IN (30, 60) THEN code END) AS pendingCompanyReviewCount",
|
"COUNT(DISTINCT CASE WHEN workflow_status = 40 THEN code END) AS releasedCount",
|
"COUNT(DISTINCT CASE WHEN workflow_status = 70 THEN code END) AS scrappedCount",
|
"MAX(inspected_at) AS lastInspectedAt");
|
wrapper.groupBy("IFNULL(batch_code, '')");
|
wrapper.orderByDesc("MAX(inspected_at)", "MAX(id)");
|
wrapper.last("LIMIT " + offset + ", " + limit);
|
return selectMaps(wrapper);
|
}
|
|
private static QueryWrapper<MesQcSeedQualityDO> buildBatchGroupFilter(MesQcSeedQualityPageReqVO reqVO) {
|
QueryWrapper<MesQcSeedQualityDO> wrapper = new QueryWrapper<>();
|
if (StrUtil.isNotBlank(reqVO.getCode())) {
|
wrapper.like("code", reqVO.getCode());
|
}
|
if (StrUtil.isNotBlank(reqVO.getBatchCode())) {
|
wrapper.like("batch_code", reqVO.getBatchCode());
|
}
|
if (reqVO.getResult() != null) {
|
wrapper.eq("result", reqVO.getResult());
|
}
|
if (reqVO.getWorkflowStatus() != null) {
|
wrapper.eq("workflow_status", reqVO.getWorkflowStatus());
|
}
|
if (reqVO.getQcLine() != null) {
|
wrapper.eq("qc_line", reqVO.getQcLine());
|
}
|
if (reqVO.getBizType() != null) {
|
wrapper.eq("biz_type", reqVO.getBizType());
|
}
|
return wrapper;
|
}
|
}
|