Browse Source

2026-04-10

新增【Routing Operations】页面
master
fengyuan_yang 2 months ago
parent
commit
4d134a9b4e
  1. 39
      src/main/java/com/spring/modules/part/controller/RoutingOperationsController.java
  2. 11
      src/main/java/com/spring/modules/part/dto/RoutingOperationsBatchSaveDto.java
  3. 10
      src/main/java/com/spring/modules/part/dto/RoutingOperationsDescQueryDto.java
  4. 19
      src/main/java/com/spring/modules/part/dto/RoutingOperationsQueryDto.java
  5. 23
      src/main/java/com/spring/modules/part/mapper/RoutingOperationsMapper.java
  6. 2
      src/main/java/com/spring/modules/part/service/RoutingManagementService.java
  7. 12
      src/main/java/com/spring/modules/part/service/RoutingOperationsService.java
  8. 51
      src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java
  9. 140
      src/main/java/com/spring/modules/part/service/impl/RoutingOperationsServiceImpl.java
  10. 46
      src/main/java/com/spring/modules/part/vo/RoutingOperationsVo.java
  11. 100
      src/main/resources/mapper/part/RoutingOperationsMapper.xml

39
src/main/java/com/spring/modules/part/controller/RoutingOperationsController.java

@ -0,0 +1,39 @@
package com.spring.modules.part.controller;
import com.spring.common.utils.PageUtils;
import com.spring.common.utils.R;
import com.spring.modules.part.dto.RoutingOperationsBatchSaveDto;
import com.spring.modules.part.dto.RoutingOperationsQueryDto;
import com.spring.modules.part.dto.RoutingOperationsDescQueryDto;
import com.spring.modules.part.service.RoutingOperationsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/plm/routingOperations")
public class RoutingOperationsController {
@Autowired
private RoutingOperationsService routingOperationsService;
@PostMapping("/search")
public R search(@RequestBody RoutingOperationsQueryDto query) {
PageUtils page = routingOperationsService.routingOperationsSearch(query);
return R.ok().put("page", page);
}
@PostMapping("/batchSave")
public R batchSave(@RequestBody RoutingOperationsBatchSaveDto dto) {
routingOperationsService.batchSave(dto);
return R.ok();
}
@PostMapping("/getDesc")
public R getDesc(@RequestBody RoutingOperationsDescQueryDto dto) {
String desc = routingOperationsService.getDesc(dto);
return R.ok().put("desc", desc);
}
}

11
src/main/java/com/spring/modules/part/dto/RoutingOperationsBatchSaveDto.java

@ -0,0 +1,11 @@
package com.spring.modules.part.dto;
import com.spring.modules.part.entity.RoutingComponentEntity;
import lombok.Data;
import java.util.List;
@Data
public class RoutingOperationsBatchSaveDto {
private List<RoutingComponentEntity> items;
}

10
src/main/java/com/spring/modules/part/dto/RoutingOperationsDescQueryDto.java

@ -0,0 +1,10 @@
package com.spring.modules.part.dto;
import lombok.Data;
@Data
public class RoutingOperationsDescQueryDto {
private String site;
private String type; // workCenter or laborClass
private String code;
}

19
src/main/java/com/spring/modules/part/dto/RoutingOperationsQueryDto.java

@ -0,0 +1,19 @@
package com.spring.modules.part.dto;
import com.spring.common.utils.QueryPage;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class RoutingOperationsQueryDto extends QueryPage {
private String site;
private String partNo;
private String partDesc;
private String routingType;
private Integer routingRevision;
private String alternativeNo;
private Integer operationNo;
private String operationName;
private String workCenterNo;
}

23
src/main/java/com/spring/modules/part/mapper/RoutingOperationsMapper.java

@ -0,0 +1,23 @@
package com.spring.modules.part.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.spring.modules.part.dto.RoutingOperationsQueryDto;
import com.spring.modules.part.entity.RoutingComponentEntity;
import com.spring.modules.part.vo.RoutingOperationsVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface RoutingOperationsMapper extends BaseMapper<RoutingComponentEntity> {
IPage<RoutingOperationsVo> routingOperationsSearch(Page<RoutingOperationsVo> page, @Param("query") RoutingOperationsQueryDto query);
int countWorkCenter(@Param("site") String site, @Param("workCenterNo") String workCenterNo);
int countLaborClass(@Param("site") String site, @Param("laborClassNo") String laborClassNo);
String getWorkCenterDesc(@Param("site") String site, @Param("workCenterNo") String workCenterNo);
String getLaborClassDesc(@Param("site") String site, @Param("laborClassNo") String laborClassNo);
}

2
src/main/java/com/spring/modules/part/service/RoutingManagementService.java

@ -41,6 +41,8 @@ public interface RoutingManagementService {
List<RoutingComponentVo> updateRoutingComponent(RoutingComponentEntity data);
void batchUpdateRoutingComponent(List<RoutingComponentEntity> items);
List<OperationEntity> queryOperationList(OperationEntity data);
Map<String, Object> routingDetailUpdate(RoutingDetailEntity data);

12
src/main/java/com/spring/modules/part/service/RoutingOperationsService.java

@ -0,0 +1,12 @@
package com.spring.modules.part.service;
import com.spring.common.utils.PageUtils;
import com.spring.modules.part.dto.RoutingOperationsBatchSaveDto;
import com.spring.modules.part.dto.RoutingOperationsQueryDto;
import com.spring.modules.part.dto.RoutingOperationsDescQueryDto;
public interface RoutingOperationsService {
PageUtils routingOperationsSearch(RoutingOperationsQueryDto query);
void batchSave(RoutingOperationsBatchSaveDto dto);
String getDesc(RoutingOperationsDescQueryDto dto);
}

51
src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java

@ -924,6 +924,57 @@ public class RoutingManagementServiceImpl extends ServiceImpl<RoutingManagementM
return list;
}
/**
* 批量修改routing子明细用于反查页面批量替换
* @param items
*/
@Override
@Transactional
public void batchUpdateRoutingComponent(List<RoutingComponentEntity> items) {
if (items == null || items.isEmpty()) {
return;
}
Map<String, Boolean> officialFlagCache = new HashMap<>();
Server srv = null;
if (dataUrl) {
srv = getIfsServer(items.get(0).getUpdateBy());
}
for (RoutingComponentEntity data : items) {
routingManagementMapper.updateRoutingComponent(data);
if (dataUrl) {
String detailKey = data.getSite() + "_" + data.getPartNo() + "_" + data.getRoutingRevision() + "_" + data.getRoutingType() + "_" + data.getAlternativeNo();
Boolean isOfficial = officialFlagCache.get(detailKey);
if (isOfficial == null) {
List<RoutingDetailEntity> routingDetailList = routingManagementMapper.queryRoutingDetailOfficialFlag(data);
isOfficial = !routingDetailList.isEmpty() && "Y".equals(routingDetailList.get(0).getOfficialFlag());
officialFlagCache.put(detailKey, isOfficial);
}
if (isOfficial) {
RoutingIfsItem routingIfsItem = routingManagementMapper.getRoutingComponentToIfs(data);
Map<String, String> updateRoutingComponentResponse = routingServiceBean.modifyRoutingItem(srv, routingIfsItem);
if (!"200".equals(updateRoutingComponentResponse.get("resultCode"))) {
throw new RuntimeException("ifs RoutingItem修改异常:" + updateRoutingComponentResponse.get("resultMsg"));
}
// 更新 ifs_row_id ifs_row_version
String s = String.valueOf(updateRoutingComponentResponse.get("obj"));
RoutingIfsItem ifsItems = JSON.parseObject(s, RoutingIfsItem.class);
if (ifsItems != null) {
data.setIfsRowId(ifsItems.getIfsRowId());
data.setIfsRowVersion(ifsItems.getIfsRowVersion());
routingManagementMapper.updateRoutingComponentIfsRow(data);
} else {
throw new RuntimeException("ifs RoutingItem修改接口返回值异常!");
}
}
}
}
}
/**
* 删除routing子明细
* @param data

140
src/main/java/com/spring/modules/part/service/impl/RoutingOperationsServiceImpl.java

@ -0,0 +1,140 @@
package com.spring.modules.part.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.spring.common.utils.PageUtils;
import com.spring.modules.part.dto.RoutingOperationsBatchSaveDto;
import com.spring.modules.part.dto.RoutingOperationsQueryDto;
import com.spring.modules.part.dto.RoutingOperationsDescQueryDto;
import com.spring.modules.part.entity.RoutingComponentEntity;
import com.spring.modules.part.mapper.RoutingOperationsMapper;
import com.spring.modules.part.service.RoutingManagementService;
import com.spring.modules.part.service.RoutingOperationsService;
import com.spring.modules.part.vo.RoutingOperationsVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Arrays;
@Service
public class RoutingOperationsServiceImpl implements RoutingOperationsService {
@Autowired
private RoutingOperationsMapper routingOperationsMapper;
@Autowired
private RoutingManagementService routingManagementService;
@Override
public PageUtils routingOperationsSearch(RoutingOperationsQueryDto query) {
if (query == null || StringUtils.isBlank(query.getSite())) {
throw new RuntimeException("工厂(site)不能为空");
}
if (StringUtils.isAllBlank(query.getPartNo(), query.getPartDesc(), query.getRoutingType(),
query.getAlternativeNo(), query.getOperationName(), query.getWorkCenterNo())
&& query.getRoutingRevision() == null && query.getOperationNo() == null) {
throw new RuntimeException("请至少填写一项查询条件");
}
if (StringUtils.isNotBlank(query.getPartNo())) {
query.setPartNo(query.getPartNo().trim());
}
if (StringUtils.isNotBlank(query.getPartDesc())) {
query.setPartDesc(query.getPartDesc().trim());
}
IPage<RoutingOperationsVo> page = routingOperationsMapper.routingOperationsSearch(
new Page<>(query.getPage(), query.getLimit()), query);
return new PageUtils(page);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchSave(RoutingOperationsBatchSaveDto dto) {
if (dto == null || CollectionUtils.isEmpty(dto.getItems())) {
throw new RuntimeException("没有需要保存的数据");
}
List<RoutingComponentEntity> items = dto.getItems();
Map<String, Boolean> workCenterCache = new HashMap<>();
Map<String, Boolean> laborClassCache = new HashMap<>();
List<String> validRunTimeCodes = Arrays.asList("Units/Hour", "Hours/Unit", "Hours");
for (RoutingComponentEntity item : items) {
if (StringUtils.isAnyBlank(item.getSite(), item.getPartNo(), item.getRoutingType())
|| item.getRoutingRevision() == null
|| item.getOperationId() == null) {
throw new RuntimeException("保存数据不完整:工厂、物料编码、工艺类型、版本号、工序ID不能为空");
}
if (item.getAlternativeNo() == null) {
item.setAlternativeNo("");
}
if (StringUtils.isBlank(item.getUpdateBy())) {
throw new RuntimeException("更新人不能为空");
}
// 校验加工中心编码
if (StringUtils.isNotBlank(item.getWorkCenterNo())) {
String wcKey = item.getSite() + ":" + item.getWorkCenterNo();
if (!workCenterCache.containsKey(wcKey)) {
int count = routingOperationsMapper.countWorkCenter(item.getSite(), item.getWorkCenterNo());
workCenterCache.put(wcKey, count > 0);
}
if (!workCenterCache.get(wcKey)) {
throw new RuntimeException("加工中心编码不合法:" + item.getWorkCenterNo());
}
} else {
throw new RuntimeException("加工中心编码不能为空");
}
// 校验调机过程中人员等级
if (StringUtils.isNotBlank(item.getSetupLaborClassNo())) {
String lcKey = item.getSite() + ":" + item.getSetupLaborClassNo();
if (!laborClassCache.containsKey(lcKey)) {
int count = routingOperationsMapper.countLaborClass(item.getSite(), item.getSetupLaborClassNo());
laborClassCache.put(lcKey, count > 0);
}
if (!laborClassCache.get(lcKey)) {
throw new RuntimeException("调机过程中人员等级不合法:" + item.getSetupLaborClassNo());
}
}
// 校验人员等级
if (StringUtils.isNotBlank(item.getLaborClassNo())) {
String lcKey = item.getSite() + ":" + item.getLaborClassNo();
if (!laborClassCache.containsKey(lcKey)) {
int count = routingOperationsMapper.countLaborClass(item.getSite(), item.getLaborClassNo());
laborClassCache.put(lcKey, count > 0);
}
if (!laborClassCache.get(lcKey)) {
throw new RuntimeException("人员等级不合法:" + item.getLaborClassNo());
}
}
// 校验产出单位
if (StringUtils.isNotBlank(item.getRunTimeCode())) {
if (!validRunTimeCodes.contains(item.getRunTimeCode())) {
throw new RuntimeException("产出单位不合法,只能是 Units/Hour、Hours/Unit、Hours 之一");
}
}
}
routingManagementService.batchUpdateRoutingComponent(items);
}
@Override
public String getDesc(RoutingOperationsDescQueryDto dto) {
if (dto == null || StringUtils.isAnyBlank(dto.getSite(), dto.getType(), dto.getCode())) {
return "";
}
if ("workCenter".equals(dto.getType())) {
return routingOperationsMapper.getWorkCenterDesc(dto.getSite(), dto.getCode());
} else if ("laborClass".equals(dto.getType())) {
return routingOperationsMapper.getLaborClassDesc(dto.getSite(), dto.getCode());
}
return "";
}
}

46
src/main/java/com/spring/modules/part/vo/RoutingOperationsVo.java

@ -0,0 +1,46 @@
package com.spring.modules.part.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class RoutingOperationsVo {
private String site;
private String partNo;
private String partDesc;
private String routingType;
private Integer routingRevision;
private String alternativeNo;
private String status;
private Integer operationId;
private Integer operationNo;
private String operationName;
private String workCenterNo;
private String workCenterDesc;
private BigDecimal machSetupTime;
private BigDecimal machRunFactor;
private String setupLaborClassNo;
private String setupLaborClassDesc;
private BigDecimal laborSetupTime;
private BigDecimal setupCrewSize;
private String laborClassNo;
private String laborClassDesc;
private BigDecimal laborRunFactor;
private String runTimeCode;
private BigDecimal crewSize;
private Date phaseInDate;
private Date phaseOutDate;
private BigDecimal overlap;
private BigDecimal efficiencyFactor;
private String outsideOpItem;
private Date createDate;
private String machineNo;
private String noteText;
private String ifsRowId;
private String ifsRowVersion;
}

100
src/main/resources/mapper/part/RoutingOperationsMapper.xml

@ -0,0 +1,100 @@
<?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.spring.modules.part.mapper.RoutingOperationsMapper">
<select id="routingOperationsSearch"
parameterType="com.spring.modules.part.dto.RoutingOperationsQueryDto"
resultType="com.spring.modules.part.vo.RoutingOperationsVo">
SELECT
prc.site,
prc.PART_NO AS partNo,
p.part_desc AS partDesc,
prc.routing_type AS routingType,
prc.routing_revision AS routingRevision,
prc.alternative_no AS alternativeNo,
prd.status,
prc.operation_id AS operationId,
prc.operation_no AS operationNo,
prc.operation_name AS operationName,
prc.work_center_no AS workCenterNo,
wc.work_center_desc AS workCenterDesc,
prc.mach_setup_time AS machSetupTime,
prc.mach_run_factor AS machRunFactor,
prc.setup_labor_class_no AS setupLaborClassNo,
dbo.get_labor_class_desc(prc.site, prc.setup_labor_class_no) AS setupLaborClassDesc,
prc.labor_setup_time AS laborSetupTime,
prc.setup_crew_size AS setupCrewSize,
prc.labor_class_no AS laborClassNo,
dbo.get_labor_class_desc(prc.site, prc.labor_class_no) AS laborClassDesc,
prc.labor_run_factor AS laborRunFactor,
prc.run_time_code AS runTimeCode,
prc.crew_size AS crewSize,
prh.phase_in_date AS phaseInDate,
prh.phase_out_date AS phaseOutDate,
prc.overlap,
prc.efficiency_factor AS efficiencyFactor,
prc.outside_op_item AS outsideOpItem,
prc.create_date AS createDate,
prc.machine_no AS machineNo,
prc.note_text AS noteText,
prc.ifs_row_id AS ifsRowId,
prc.ifs_row_version AS ifsRowVersion
FROM plm_routing_component AS prc
LEFT JOIN part AS p ON prc.site = p.site AND prc.part_no = p.part_no
LEFT JOIN plm_routing_detail AS prd ON prd.site = prc.site AND prd.part_no = prc.part_no
AND prd.routing_type = prc.routing_type AND prd.routing_revision = prc.routing_revision AND prd.alternative_no = prc.alternative_no
LEFT JOIN plm_routing_header AS prh ON prh.site = prc.site AND prh.part_no = prc.part_no
AND prh.routing_type = prc.routing_type AND prh.routing_revision = prc.routing_revision
LEFT JOIN work_center AS wc ON prc.site = wc.site AND prc.work_center_no = wc.work_center_no
<where>
prc.site = #{query.site}
<if test="query.partNo != null and query.partNo != ''">
AND prc.part_no = #{query.partNo}
</if>
<if test="query.partDesc != null and query.partDesc != ''">
AND p.part_desc LIKE #{query.partDesc}
</if>
<if test="query.routingType != null and query.routingType != ''">
AND prc.routing_type = #{query.routingType}
</if>
<if test="query.routingRevision != null">
AND prc.routing_revision = #{query.routingRevision}
</if>
<if test="query.alternativeNo != null and query.alternativeNo != ''">
AND prc.alternative_no = #{query.alternativeNo}
</if>
<if test="query.operationNo != null">
AND prc.operation_no = #{query.operationNo}
</if>
<if test="query.operationName != null and query.operationName != ''">
AND prc.operation_name LIKE #{query.operationName}
</if>
<if test="query.workCenterNo != null and query.workCenterNo != ''">
AND prc.work_center_no = #{query.workCenterNo}
</if>
</where>
ORDER BY
prc.part_no,
prc.site,
prc.routing_revision,
prc.routing_type,
prc.alternative_no,
prc.operation_no
</select>
<select id="countWorkCenter" resultType="int">
SELECT COUNT(1) FROM work_center WHERE site = #{site} AND work_center_no = #{workCenterNo}
</select>
<select id="countLaborClass" resultType="int">
SELECT COUNT(1) FROM labor_class WHERE site = #{site} AND level_id = #{laborClassNo}
</select>
<select id="getWorkCenterDesc" resultType="java.lang.String">
SELECT dbo.get_workCenter_desc(#{site}, #{workCenterNo})
</select>
<select id="getLaborClassDesc" resultType="java.lang.String">
SELECT dbo.get_labor_class_desc(#{site}, #{laborClassNo})
</select>
</mapper>
Loading…
Cancel
Save