排产模块优化 / 排产单页面优化,排产模块优化 / 订单跟踪页面优化

This commit is contained in:
朱昊天
2026-07-09 17:13:46 +08:00
parent 2cd141262b
commit a0c7da8fe0
14 changed files with 723 additions and 139 deletions

View File

@@ -23,6 +23,7 @@ import com.klp.flow.domain.bo.SchProdScheduleItemBo;
import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo;
import com.klp.flow.domain.bo.SchProdScheduleItemReceiveBo;
import com.klp.flow.domain.bo.SchProdScheduleItemMergeValidateBo;
import com.klp.flow.domain.bo.SchProdScheduleItemSortBo;
import com.klp.flow.service.ISchProdScheduleItemService;
import com.klp.common.core.page.TableDataInfo;
@@ -138,4 +139,9 @@ public class SchProdScheduleItemController extends BaseController {
public R<SchProdScheduleItemMergeValidateVo> mergeValidate(@Validated @RequestBody SchProdScheduleItemMergeValidateBo validateBo) {
return R.ok(iSchProdScheduleItemService.validateMerge(validateBo));
}
@PostMapping("/sort")
public R<Void> saveSort(@Validated @RequestBody SchProdScheduleItemSortBo sortBo) {
return toAjax(iSchProdScheduleItemService.saveSort(sortBo));
}
}

View File

@@ -135,6 +135,10 @@ public class SchProdScheduleItem extends BaseEntity {
* 工序ID
*/
private Long actionId;
/**
* 排序号
*/
private Integer sortNo;
/**
* 规格 例1.0X1250
*/

View File

@@ -162,6 +162,10 @@ public class SchProdScheduleItemBo extends BaseEntity {
* 工序ID
*/
private Long actionId;
/**
* 排序号
*/
private Integer sortNo;
/**
* 规格 例1.0X1250

View File

@@ -0,0 +1,14 @@
package com.klp.flow.domain.bo;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
public class SchProdScheduleItemSortBo {
@NotEmpty(message = "scheduleIds不能为空")
private List<Long> scheduleIds;
}

View File

@@ -202,6 +202,11 @@ public class SchProdScheduleItemVo {
@TableField(exist = false)
private String stepName;
/**
* 排序号
*/
private Integer sortNo;
/**
* 规格 例1.0X1250
*/

View File

@@ -7,6 +7,7 @@ import com.klp.flow.domain.bo.SchProdScheduleItemBo;
import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo;
import com.klp.flow.domain.bo.SchProdScheduleItemReceiveBo;
import com.klp.flow.domain.bo.SchProdScheduleItemMergeValidateBo;
import com.klp.flow.domain.bo.SchProdScheduleItemSortBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
@@ -70,4 +71,9 @@ public interface ISchProdScheduleItemService {
* 合并校验:检查待合并记录来源产需单的 header 字段是否一致
*/
SchProdScheduleItemMergeValidateVo validateMerge(SchProdScheduleItemMergeValidateBo validateBo);
/**
* 保存已排产拖拽排序
*/
Boolean saveSort(SchProdScheduleItemSortBo sortBo);
}

View File

@@ -13,6 +13,7 @@ import com.klp.flow.domain.bo.SchProdScheduleItemBo;
import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo;
import com.klp.flow.domain.bo.SchProdScheduleItemReceiveBo;
import com.klp.flow.domain.bo.SchProdScheduleItemMergeValidateBo;
import com.klp.flow.domain.bo.SchProdScheduleItemSortBo;
import com.klp.flow.domain.vo.SchProdScheduleItemVo;
import com.klp.flow.domain.vo.SchProdScheduleItemMergeValidateVo;
import com.klp.flow.domain.SchProdScheduleItem;
@@ -56,7 +57,12 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi
*/
@Override
public SchProdScheduleItemVo queryById(Long scheduleId){
return baseMapper.selectVoById(scheduleId);
SchProdScheduleItemVo vo = baseMapper.selectVoById(scheduleId);
if (vo != null) {
fillStepName(java.util.Collections.singletonList(vo));
fillMissingHeaderFields(java.util.Collections.singletonList(vo));
}
return vo;
}
/**
@@ -68,6 +74,7 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi
Page<SchProdScheduleItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if (result.getRecords() != null && !result.getRecords().isEmpty()) {
fillStepName(result.getRecords());
fillMissingHeaderFields(result.getRecords());
}
return TableDataInfo.build(result);
}
@@ -81,6 +88,7 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi
List<SchProdScheduleItemVo> list = baseMapper.selectVoList(lqw);
if (list != null && !list.isEmpty()) {
fillStepName(list);
fillMissingHeaderFields(list);
}
return list;
}
@@ -121,6 +129,8 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi
lqw.eq(StringUtils.isNotBlank(bo.getRowRemark()), SchProdScheduleItem::getRowRemark, bo.getRowRemark());
// actionId
lqw.eq(bo.getActionId() != null, SchProdScheduleItem::getActionId, bo.getActionId());
lqw.orderByAsc(SchProdScheduleItem::getSortNo);
lqw.orderByAsc(SchProdScheduleItem::getScheduleId);
return lqw;
}
@@ -148,6 +158,149 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi
}
}
private void fillMissingHeaderFields(List<SchProdScheduleItemVo> voList) {
List<SchProdScheduleItemVo> missingList = voList.stream()
.filter(vo -> StringUtils.isBlank(vo.getCustomerName())
|| StringUtils.isBlank(vo.getBusinessUser())
|| StringUtils.isBlank(vo.getBusinessPhone())
|| vo.getDeliveryCycle() == null
|| StringUtils.isBlank(vo.getProductType())
|| StringUtils.isBlank(vo.getUsePurpose()))
.collect(Collectors.toList());
if (missingList.isEmpty()) {
return;
}
List<String> scheduleNos = missingList.stream()
.map(SchProdScheduleItemVo::getScheduleNo)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
if (scheduleNos.isEmpty()) {
return;
}
List<SchProdSchedule> headers = schProdScheduleMapper.selectList(
Wrappers.<SchProdSchedule>lambdaQuery()
.in(SchProdSchedule::getScheduleNo, scheduleNos)
);
Map<String, SchProdSchedule> headerMap = headers.stream()
.collect(Collectors.toMap(SchProdSchedule::getScheduleNo, h -> h, (v1, v2) -> v1));
for (SchProdScheduleItemVo vo : missingList) {
SchProdSchedule header = headerMap.get(vo.getScheduleNo());
if (header == null) {
continue;
}
boolean changed = false;
SchProdScheduleItem update = new SchProdScheduleItem();
update.setScheduleId(vo.getScheduleId());
if (StringUtils.isBlank(vo.getCustomerName()) && StringUtils.isNotBlank(header.getCustomerName())) {
vo.setCustomerName(header.getCustomerName());
update.setCustomerName(header.getCustomerName());
changed = true;
}
if (StringUtils.isBlank(vo.getBusinessUser()) && StringUtils.isNotBlank(header.getBusinessUser())) {
vo.setBusinessUser(header.getBusinessUser());
update.setBusinessUser(header.getBusinessUser());
changed = true;
}
if (StringUtils.isBlank(vo.getBusinessPhone()) && StringUtils.isNotBlank(header.getBusinessPhone())) {
vo.setBusinessPhone(header.getBusinessPhone());
update.setBusinessPhone(header.getBusinessPhone());
changed = true;
}
if (vo.getDeliveryCycle() == null && header.getDeliveryCycle() != null) {
vo.setDeliveryCycle(header.getDeliveryCycle());
update.setDeliveryCycle(header.getDeliveryCycle());
changed = true;
}
if (StringUtils.isBlank(vo.getProductType()) && StringUtils.isNotBlank(header.getProductType())) {
vo.setProductType(header.getProductType());
update.setProductType(header.getProductType());
changed = true;
}
if (StringUtils.isBlank(vo.getUsePurpose()) && StringUtils.isNotBlank(header.getUsePurpose())) {
vo.setUsePurpose(header.getUsePurpose());
update.setUsePurpose(header.getUsePurpose());
changed = true;
}
if (StringUtils.isBlank(vo.getThicknessTolerance()) && StringUtils.isNotBlank(header.getThicknessTolerance())) {
vo.setThicknessTolerance(header.getThicknessTolerance());
update.setThicknessTolerance(header.getThicknessTolerance());
changed = true;
}
if (StringUtils.isBlank(vo.getWidthTolerance()) && StringUtils.isNotBlank(header.getWidthTolerance())) {
vo.setWidthTolerance(header.getWidthTolerance());
update.setWidthTolerance(header.getWidthTolerance());
changed = true;
}
if (StringUtils.isBlank(vo.getSurfaceQuality()) && StringUtils.isNotBlank(header.getSurfaceQuality())) {
vo.setSurfaceQuality(header.getSurfaceQuality());
update.setSurfaceQuality(header.getSurfaceQuality());
changed = true;
}
if (StringUtils.isBlank(vo.getSurfaceTreatment()) && StringUtils.isNotBlank(header.getSurfaceTreatment())) {
vo.setSurfaceTreatment(header.getSurfaceTreatment());
update.setSurfaceTreatment(header.getSurfaceTreatment());
changed = true;
}
if (StringUtils.isBlank(vo.getInnerDiameter()) && StringUtils.isNotBlank(header.getInnerDiameter())) {
vo.setInnerDiameter(header.getInnerDiameter());
update.setInnerDiameter(header.getInnerDiameter());
changed = true;
}
if (StringUtils.isBlank(vo.getOuterDiameter()) && StringUtils.isNotBlank(header.getOuterDiameter())) {
vo.setOuterDiameter(header.getOuterDiameter());
update.setOuterDiameter(header.getOuterDiameter());
changed = true;
}
if (StringUtils.isBlank(vo.getPackReq()) && StringUtils.isNotBlank(header.getPackReq())) {
vo.setPackReq(header.getPackReq());
update.setPackReq(header.getPackReq());
changed = true;
}
if (StringUtils.isBlank(vo.getCutEdgeReq()) && StringUtils.isNotBlank(header.getCutEdgeReq())) {
vo.setCutEdgeReq(header.getCutEdgeReq());
update.setCutEdgeReq(header.getCutEdgeReq());
changed = true;
}
if (StringUtils.isBlank(vo.getSingleCoilWeight()) && StringUtils.isNotBlank(header.getSingleCoilWeight())) {
vo.setSingleCoilWeight(header.getSingleCoilWeight());
update.setSingleCoilWeight(header.getSingleCoilWeight());
changed = true;
}
if (StringUtils.isBlank(vo.getWeightDeviation()) && StringUtils.isNotBlank(header.getWeightDeviation())) {
vo.setWeightDeviation(header.getWeightDeviation());
update.setWeightDeviation(header.getWeightDeviation());
changed = true;
}
if (StringUtils.isBlank(vo.getOtherTechReq()) && StringUtils.isNotBlank(header.getOtherTechReq())) {
vo.setOtherTechReq(header.getOtherTechReq());
update.setOtherTechReq(header.getOtherTechReq());
changed = true;
}
if (StringUtils.isBlank(vo.getPaymentDesc()) && StringUtils.isNotBlank(header.getPaymentDesc())) {
vo.setPaymentDesc(header.getPaymentDesc());
update.setPaymentDesc(header.getPaymentDesc());
changed = true;
}
if (StringUtils.isBlank(vo.getRemark()) && StringUtils.isNotBlank(header.getRemark())) {
vo.setRemark(header.getRemark());
update.setRemark(header.getRemark());
changed = true;
}
if (changed) {
baseMapper.updateById(update);
}
}
}
/**
* 新增排产单主加明细可合并
*/
@@ -504,6 +657,22 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi
return vo;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveSort(SchProdScheduleItemSortBo sortBo) {
List<Long> scheduleIds = sortBo.getScheduleIds();
for (int i = 0; i < scheduleIds.size(); i++) {
Long id = scheduleIds.get(i);
baseMapper.update(
null,
Wrappers.<SchProdScheduleItem>lambdaUpdate()
.set(SchProdScheduleItem::getSortNo, i + 1)
.eq(SchProdScheduleItem::getScheduleId, id)
);
}
return true;
}
/**
* 反射获取字段值(用于动态字段比较 — SchProdSchedule header
*/

View File

@@ -33,6 +33,7 @@
<result property="returnReason" column="return_reason"/>
<result property="scheduleDetailIds" column="schedule_detail_ids"/>
<result property="actionId" column="action_id"/>
<result property="sortNo" column="sort_no"/>
<result property="spec" column="spec"/>
<result property="material" column="material"/>
<result property="scheduleWeight" column="schedule_weight"/>