fix:首页生产工单接口开发(包括工序进度)

This commit is contained in:
zhangxuanming 2025-01-20 18:18:34 +08:00
parent b681e845da
commit 5d1b0da8f6
17 changed files with 217 additions and 3 deletions

View File

@ -306,4 +306,14 @@ public class ProWorkorderController extends BaseController
return AjaxResult.success(); return AjaxResult.success();
} }
/**
* 首页生产工单查询
* @param proWorkorder
* @return
*/
@GetMapping("/getHomeList")
public AjaxResult getHomeList(ProWorkorder proWorkorder) {
return proWorkorderService.getHomeList(proWorkorder);
}
} }

View File

@ -0,0 +1,26 @@
package com.ktg.mes.pro.controller.vo;
import com.ktg.mes.pro.domain.ProRouteProcess;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ProRouteHomeVO extends ProRouteProcess {
/**
* 完成数量
*/
private BigDecimal completeNumber;
/**
* 未完成数量
*/
private BigDecimal incompleteNumber;
/**
* 总数
*/
private BigDecimal total;
}

View File

@ -0,0 +1,13 @@
package com.ktg.mes.pro.controller.vo;
import com.ktg.mes.pro.domain.ProWorkorder;
import lombok.Data;
import java.util.List;
@Data
public class ProWorkorderHomeVO extends ProWorkorder {
private List<ProRouteHomeVO> routeHomg;
}

View File

@ -2,6 +2,7 @@ package com.ktg.mes.pro.mapper;
import java.util.List; import java.util.List;
import com.ktg.mes.pro.domain.ProFeedback; import com.ktg.mes.pro.domain.ProFeedback;
import org.apache.ibatis.annotations.Param;
/** /**
* 生产报工记录Mapper接口 * 生产报工记录Mapper接口
@ -58,4 +59,6 @@ public interface ProFeedbackMapper
* @return 结果 * @return 结果
*/ */
public int deleteProFeedbackByRecordIds(Long[] recordIds); public int deleteProFeedbackByRecordIds(Long[] recordIds);
List<ProFeedback> selectByWorkorderIds(@Param("workorderIds") List<Long> workorderIds);
} }

View File

@ -92,4 +92,6 @@ public interface ProRouteProcessMapper
void updateBatch(@Param("list") List<ProRouteProcess> list); void updateBatch(@Param("list") List<ProRouteProcess> list);
List<ProRouteProcess> selectByProcessIds(@Param("entity") Long[] processIds); List<ProRouteProcess> selectByProcessIds(@Param("entity") Long[] processIds);
List<ProRouteProcess> selectByRouteIds(@Param("routeIds") List<Long> routeIds);
} }

View File

@ -2,6 +2,7 @@ package com.ktg.mes.pro.mapper;
import java.util.List; import java.util.List;
import com.ktg.mes.pro.domain.ProRouteProduct; import com.ktg.mes.pro.domain.ProRouteProduct;
import org.apache.ibatis.annotations.Param;
/** /**
* 产品制程Mapper接口 * 产品制程Mapper接口
@ -67,4 +68,11 @@ public interface ProRouteProductMapper
* @return * @return
*/ */
public int deleteByRouteId(Long routeId); public int deleteByRouteId(Long routeId);
/**
* 根据 productIds 查询相关数据
* @param productIds
* @return
*/
List<ProRouteProduct> selectByProductIds(@Param("productIds") List<Long> productIds);
} }

View File

@ -58,4 +58,11 @@ public interface IProFeedbackService
* @return 结果 * @return 结果
*/ */
public int deleteProFeedbackByRecordId(Long recordId); public int deleteProFeedbackByRecordId(Long recordId);
/**
* 根据 workorderIds 查询
* @param workorderIds
* @return
*/
List<ProFeedback> selectByWorkorderIds(List<Long> workorderIds);
} }

View File

@ -114,4 +114,6 @@ public interface IProRouteProcessService
List<ProRouteProcess> selectByProcessIds(Long[] processIds); List<ProRouteProcess> selectByProcessIds(Long[] processIds);
AjaxResult editProRouteProcess(ProRouteProcess proRouteProcess); AjaxResult editProRouteProcess(ProRouteProcess proRouteProcess);
List<ProRouteProcess> selectByRouteIds(List<Long> routeIds);
} }

View File

@ -72,4 +72,11 @@ public interface IProRouteProductService
* @return * @return
*/ */
public int deleteByRouteId(Long routeId); public int deleteByRouteId(Long routeId);
/**
* 根据 productIds 查询相关数据
* @param productIds
* @return
*/
List<ProRouteProduct> selectByProductIds(List<Long> productIds);
} }

View File

@ -1,5 +1,6 @@
package com.ktg.mes.pro.service; package com.ktg.mes.pro.service;
import com.ktg.common.core.domain.AjaxResult;
import com.ktg.mes.pro.domain.ProWorkorder; import com.ktg.mes.pro.domain.ProWorkorder;
import java.util.List; import java.util.List;
@ -72,5 +73,10 @@ public interface IProWorkorderService
public int deleteProWorkorderByWorkorderId(Long workorderId); public int deleteProWorkorderByWorkorderId(Long workorderId);
/**
* 首页生产工单查询
* @param proWorkorder
* @return
*/
AjaxResult getHomeList(ProWorkorder proWorkorder);
} }

View File

@ -93,4 +93,9 @@ public class ProFeedbackServiceImpl implements IProFeedbackService
{ {
return proFeedbackMapper.deleteProFeedbackByRecordId(recordId); return proFeedbackMapper.deleteProFeedbackByRecordId(recordId);
} }
@Override
public List<ProFeedback> selectByWorkorderIds(List<Long> workorderIds) {
return proFeedbackMapper.selectByWorkorderIds(workorderIds);
}
} }

View File

@ -264,4 +264,9 @@ public class ProRouteProcessServiceImpl implements IProRouteProcessService
} }
return AjaxResult.success(status); return AjaxResult.success(status);
} }
@Override
public List<ProRouteProcess> selectByRouteIds(List<Long> routeIds) {
return proRouteProcessMapper.selectByRouteIds(routeIds);
}
} }

View File

@ -111,4 +111,9 @@ public class ProRouteProductServiceImpl implements IProRouteProductService
public int deleteByRouteId(Long routeId) { public int deleteByRouteId(Long routeId) {
return proRouteProductMapper.deleteByRouteId(routeId); return proRouteProductMapper.deleteByRouteId(routeId);
} }
@Override
public List<ProRouteProduct> selectByProductIds(List<Long> productIds) {
return proRouteProductMapper.selectByProductIds(productIds);
}
} }

View File

@ -1,15 +1,31 @@
package com.ktg.mes.pro.service.impl; package com.ktg.mes.pro.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ktg.common.constant.UserConstants; import com.ktg.common.constant.UserConstants;
import com.ktg.common.core.domain.AjaxResult;
import com.ktg.common.utils.DateUtils; import com.ktg.common.utils.DateUtils;
import com.ktg.common.utils.StringUtils; import com.ktg.common.utils.StringUtils;
import com.ktg.mes.pro.controller.vo.ProRouteHomeVO;
import com.ktg.mes.pro.controller.vo.ProWorkorderHomeVO;
import com.ktg.mes.pro.domain.ProFeedback;
import com.ktg.mes.pro.domain.ProRouteProcess;
import com.ktg.mes.pro.domain.ProRouteProduct;
import com.ktg.mes.pro.domain.ProWorkorder; import com.ktg.mes.pro.domain.ProWorkorder;
import com.ktg.mes.pro.mapper.ProWorkorderMapper; import com.ktg.mes.pro.mapper.ProWorkorderMapper;
import com.ktg.mes.pro.service.IProFeedbackService;
import com.ktg.mes.pro.service.IProRouteProcessService;
import com.ktg.mes.pro.service.IProRouteProductService;
import com.ktg.mes.pro.service.IProWorkorderService; import com.ktg.mes.pro.service.IProWorkorderService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 生产工单Service业务层处理 * 生产工单Service业务层处理
@ -23,6 +39,15 @@ public class ProWorkorderServiceImpl implements IProWorkorderService
@Autowired @Autowired
private ProWorkorderMapper proWorkorderMapper; private ProWorkorderMapper proWorkorderMapper;
@Autowired
private IProRouteProductService proRouteProductService;
@Autowired
private IProRouteProcessService proRouteProcessService;
@Autowired
private IProFeedbackService proFeedbackService;
/** /**
* 查询生产工单 * 查询生产工单
* *
@ -126,4 +151,73 @@ public class ProWorkorderServiceImpl implements IProWorkorderService
{ {
return proWorkorderMapper.deleteProWorkorderByWorkorderId(workorderId); return proWorkorderMapper.deleteProWorkorderByWorkorderId(workorderId);
} }
@Override
public AjaxResult getHomeList(ProWorkorder proWorkorder) {
// 获取所有工单
List<ProWorkorder> workorders = proWorkorderMapper.selectProWorkorderList(proWorkorder);
// 获取所有的工单ID
List<Long> workorderIds = workorders.stream().map(ProWorkorder::getWorkorderId).collect(Collectors.toList());
List<ProFeedback> feedbacks = proFeedbackService.selectByWorkorderIds(workorderIds);
// 处理报工数据
feedbacks.stream().forEach(item -> {
if (ObjectUtil.isEmpty(item.getQuantityFeedback())) {
item.setQuantityFeedback(BigDecimal.ZERO);
}
});
// 获取所有工单所需的工序
List<Long> productIds = workorders.stream().map(ProWorkorder::getProductId).distinct().collect(Collectors.toList());
// 根据所有产品ID查询所有工序数据
List<ProRouteProduct> products = proRouteProductService.selectByProductIds(productIds);
List<Long> routeIds = products.stream().map(ProRouteProduct::getRouteId).collect(Collectors.toList());
List<ProRouteProcess> routeList = proRouteProcessService.selectByRouteIds(routeIds);
List<ProRouteHomeVO> routeHomeList = new ArrayList<>();
routeList.forEach(item -> {
ProRouteHomeVO proWorkorderHomeVO = new ProRouteHomeVO();
BeanUtil.copyProperties(item, proWorkorderHomeVO);
routeHomeList.add(proWorkorderHomeVO);
});
// 构建工序流程数据
Map<Long, List<ProRouteHomeVO>> routeMap = new HashMap<>();
products.forEach(item -> {
routeMap.putIfAbsent(item.getItemId(), routeHomeList.stream().filter(val -> val.getRouteId().equals(item.getRouteId())).collect(Collectors.toList()));
});
// 遍历构造
List<ProWorkorderHomeVO> proWorkorders = new ArrayList<>();
workorders.stream().forEach(item -> {
ProWorkorderHomeVO proWorkorderHomeVO = new ProWorkorderHomeVO();
BeanUtil.copyProperties(item, proWorkorderHomeVO);
proWorkorders.add(proWorkorderHomeVO);
Long productId = item.getProductId();
List<ProRouteHomeVO> processes = routeMap.get(productId);
if (processes != null && processes.size() > 0) {
processes.forEach(val -> {
val.setTotal(item.getQuantity());
List<ProFeedback> collect = feedbacks.stream().filter(entity ->
(entity.getWorkorderId().equals(item.getWorkorderId())
&& entity.getRouteId().equals(val.getRouteId())
&& entity.getProcessId().equals(val.getProcessId())))
.collect(Collectors.toList());
if (collect != null && collect.size() > 0) {
BigDecimal reduce = collect.stream().map(ProFeedback::getQuantityFeedback).reduce(BigDecimal.ZERO, BigDecimal::add);
val.setCompleteNumber(reduce);
val.setIncompleteNumber(val.getTotal().subtract(val.getCompleteNumber()));
}
});
proWorkorderHomeVO.setRouteHomg(processes);
}
});
// 构建工单树结构数据
Map<Long, List<ProWorkorderHomeVO>> map = proWorkorders.stream().collect(Collectors.groupingBy(ProWorkorderHomeVO::getParentId));
proWorkorders.stream().forEach(item -> {
item.setChildren(map.get(item.getWorkorderId()));
});
List<ProWorkorderHomeVO> collect = proWorkorders.stream().filter(item -> 0L == item.getParentId()).collect(Collectors.toList());
return AjaxResult.success(collect);
}
} }

View File

@ -98,6 +98,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectProFeedbackVo"/> <include refid="selectProFeedbackVo"/>
where f.record_id = #{recordId} where f.record_id = #{recordId}
</select> </select>
<select id="selectByWorkorderIds" resultType="com.ktg.mes.pro.domain.ProFeedback" resultMap="ProFeedbackResult">
<include refid="selectProFeedbackVo"/>
where f.workorder_id in
<foreach collection="workorderIds" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
<insert id="insertProFeedback" parameterType="ProFeedback" useGeneratedKeys="true" keyProperty="recordId"> <insert id="insertProFeedback" parameterType="ProFeedback" useGeneratedKeys="true" keyProperty="recordId">
insert into pro_feedback insert into pro_feedback

View File

@ -114,13 +114,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectByRouteId" resultType="ProRouteProcess" resultMap="ProRouteProcessResult"> <select id="selectByRouteId" resultType="ProRouteProcess" resultMap="ProRouteProcessResult">
select * from pro_route_process where route_id = #{routeId} select * from pro_route_process where route_id = #{routeId}
</select> </select>
<select id="selectByProcessIds" resultType="com.ktg.mes.pro.domain.ProRouteProcess"> <select id="selectByProcessIds" resultType="com.ktg.mes.pro.domain.ProRouteProcess" resultMap="ProRouteProcessResult">
select * from pro_route_process select * from pro_route_process
where process_id in where process_id in
<foreach collection="entity" item="item" separator="," open="(" close=")"> <foreach collection="entity" item="item" separator="," open="(" close=")">
#{item} #{item}
</foreach> </foreach>
</select> </select>
<select id="selectByRouteIds" resultType="com.ktg.mes.pro.domain.ProRouteProcess" resultMap="ProRouteProcessResult">
<include refid="selectProRouteProcessVo"/>
where route_id in
<foreach collection="routeIds" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
<insert id="insertProRouteProcess" parameterType="ProRouteProcess" useGeneratedKeys="true" keyProperty="recordId"> <insert id="insertProRouteProcess" parameterType="ProRouteProcess" useGeneratedKeys="true" keyProperty="recordId">
insert into pro_route_process insert into pro_route_process

View File

@ -55,6 +55,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectProRouteProductVo"/> <include refid="selectProRouteProductVo"/>
where item_id = #{itemId} limit 1 where item_id = #{itemId} limit 1
</select> </select>
<select id="selectByProductIds" resultType="ProRouteProduct" resultMap="ProRouteProductResult">
<include refid="selectProRouteProductVo"/>
where item_id in
<foreach collection="productIds" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
<insert id="insertProRouteProduct" parameterType="ProRouteProduct" useGeneratedKeys="true" keyProperty="recordId"> <insert id="insertProRouteProduct" parameterType="ProRouteProduct" useGeneratedKeys="true" keyProperty="recordId">
insert into pro_route_product insert into pro_route_product