发货单打印调整

This commit is contained in:
z 2026-04-24 15:29:39 +08:00
parent 6e92b0dd0e
commit 08574f46cf
6 changed files with 182 additions and 64 deletions

View File

@ -151,7 +151,7 @@ public class bdgzsomthingController {
BeanUtils.toBean(list, bdgzsomthingRespVO.class));
}
@Scheduled(fixedRate = 10800000)
// @Scheduled(fixedRate = 10800000)
public void scheduledTask() {
bdgzsomthingService.selectds();
}

View File

@ -10,7 +10,9 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.configuration.Configurati
import com.chanko.yunxi.mes.module.heli.dal.dataobject.dataacquisition.DataAcquisitionDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.chanko.yunxi.mes.module.heli.controller.admin.dataacquisition.vo.*;
/**
@ -46,18 +48,57 @@ public interface DataAcquisitionMapper extends BaseMapperX<DataAcquisitionDO> {
"ORDER BY t1.running_status ASC")
List<DataAcquisitionDO> selectLatestByCode();
@Select("SELECT t1.id FROM equipment_data_acquisition t1 " +
"INNER JOIN (" +
" SELECT code, MAX(create_time) AS max_create_time " +
" FROM equipment_data_acquisition " +
" WHERE status = 1 " +
" GROUP BY code" +
") t2 ON t1.code = t2.code " +
"WHERE t1.status = 0 " +
" AND t1.create_time > t2.max_create_time " +
"ORDER BY t1.create_time ASC")
@Select("SELECT id FROM (" +
" SELECT t1.id, " +
" @rn := IF(@prev_code = t1.code, @rn + 1, 1) AS row_num, " +
" @prev_code := t1.code " +
" FROM equipment_data_acquisition t1 " +
" INNER JOIN (" +
" SELECT code, MAX(CASE WHEN status = 1 THEN create_time END) AS max_status1_time " +
" FROM equipment_data_acquisition GROUP BY code" +
" ) t2 ON t1.code = t2.code, (SELECT @rn := 0, @prev_code := '') vars " +
" WHERE t1.status = 0 " +
" AND (t2.max_status1_time IS NULL OR t1.create_time > t2.max_status1_time) " +
" ORDER BY t1.code, t1.create_time" +
") ranked WHERE row_num = 1")
List<Long> selectNextStatusZeroIds();
@Update("UPDATE equipment_data_acquisition t " +
"INNER JOIN (" +
" SELECT target_id FROM (" +
" SELECT id AS target_id FROM (" +
" SELECT t1.id, " +
" @rn := IF(@prev_code = t1.code, @rn + 1, 1) AS row_num, " +
" @prev_code := t1.code " +
" FROM equipment_data_acquisition t1 " +
" INNER JOIN (" +
" SELECT code, MAX(CASE WHEN status = 1 THEN create_time END) AS max_status1_time " +
" FROM equipment_data_acquisition GROUP BY code" +
" ) t2 ON t1.code = t2.code, (SELECT @rn := 0, @prev_code := '') vars " +
" WHERE t1.status = 0 " +
" AND (t2.max_status1_time IS NULL OR t1.create_time > t2.max_status1_time) " +
" ORDER BY t1.code, t1.create_time" +
" ) ranked WHERE row_num = 1" +
" ) tmp" +
") target ON t.id = target.target_id " +
"SET t.status = 1")
int updateNextStatusToActive();
@Update("UPDATE equipment_data_acquisition t " +
"INNER JOIN (" +
" SELECT id, " +
" DATE_ADD(#{baseTime}, INTERVAL rn * 5 SECOND) AS new_time " +
" FROM (" +
" SELECT id, code, " +
" @rn := IF(@prev_code = code, @rn + 1, 0) AS rn, " +
" @prev_code := code " +
" FROM equipment_data_acquisition, (SELECT @rn := 0, @prev_code := '') vars " +
" ORDER BY code, id" +
" ) ranked" +
") calc ON t.id = calc.id " +
"SET t.create_time = calc.new_time")
int batchUpdateTimeByGroup(@Param("baseTime") java.time.LocalDateTime baseTime);
default List<DataAcquisitionDO> getDataAcquisitionList(String code){
MPJLambdaWrapper<DataAcquisitionDO> query = new MPJLambdaWrapper<>();
query.selectAll(DataAcquisitionDO.class)
@ -70,6 +111,6 @@ public interface DataAcquisitionMapper extends BaseMapperX<DataAcquisitionDO> {
.last("limit 10");
return selectList(query);
}
@Select("")
@Select("SELECT status FROM equipment_job_config LIMIT 1;")
Integer selectStatus();
}

View File

@ -3,7 +3,6 @@ package com.chanko.yunxi.mes.module.heli.service.dataacquisition;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.dataacquisition.vo.DataAcquisitionPageReqVO;
@ -88,23 +87,13 @@ public class DataAcquisitionServiceImpl implements DataAcquisitionService {
@Override
public void updateDataCollection() {
// 查找每个 code 分组中 status=1 的最大 createTime 之后的 status=0 的最小记录的 id
Integer integer = dataAcquisitionMapper.selectStatus();
System.out.println("=== equipment_job_config status: " + integer);
log.info("=== equipment_job_config status: {}", integer);
if (ObjectUtil.isNotEmpty(integer) && integer == 0) {
List<Long> ids = dataAcquisitionMapper.selectNextStatusZeroIds();
System.out.println("=== selectNextStatusZeroIds returned " + (ids == null ? 0 : ids.size()) + " ids: " + ids);
if (ObjectUtil.isNotEmpty(ids)) {
LambdaUpdateWrapper<DataAcquisitionDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(DataAcquisitionDO::getId, ids);
updateWrapper.set(DataAcquisitionDO::getStatus, 1);
int rows = dataAcquisitionMapper.update(null, updateWrapper);
System.out.println("=== updated rows: " + rows);
} else {
System.out.println("=== No status=0 records found");
}
int rows = dataAcquisitionMapper.updateNextStatusToActive();
log.info("=== updated rows: {}", rows);
} else {
System.out.println("=== Task disabled (status != 0)");
log.info("=== Task disabled (status != 0)");
}
}
@ -120,33 +109,8 @@ public class DataAcquisitionServiceImpl implements DataAcquisitionService {
@Override
public void updateTime(LocalDateTime acquisitionTime) {
// 查询所有数据按 code 分组并按 id 排序id 代表插入顺序
List<DataAcquisitionDO> allData = dataAcquisitionMapper.selectList(
new LambdaQueryWrapper<DataAcquisitionDO>()
.orderByAsc(DataAcquisitionDO::getId)
);
if (allData == null || allData.isEmpty()) {
return;
}
// code 分组
Map<String, List<DataAcquisitionDO>> groupedByCode = allData.stream()
.collect(Collectors.groupingBy(DataAcquisitionDO::getCode, Collectors.toList()));
// 遍历每个分组更新时间
for (Map.Entry<String, List<DataAcquisitionDO>> entry : groupedByCode.entrySet()) {
List<DataAcquisitionDO> groupData = entry.getValue();
for (int i = 0; i < groupData.size(); i++) {
DataAcquisitionDO record = groupData.get(i);
// 第一条记录使用 updateReqVO 的时间之后的每条增加5秒
LocalDateTime newCreateTime = acquisitionTime.plusSeconds(i * 5L);
// 更新该条记录的创建时间
record.setCreateTime(newCreateTime);
dataAcquisitionMapper.updateById(record);
}
}
// 一条 SQL 批量更新 code 分组每组内按 id 排序第一条用 acquisitionTime之后每条递增5秒
dataAcquisitionMapper.batchUpdateTimeByGroup(acquisitionTime);
}

View File

@ -10,6 +10,7 @@ import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.screen.vo.ScreenPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.screen.vo.ScreenSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.equipmanufacture.EquipManufactureDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.found.FoundDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.monordnum.MonOrdNumDO;
@ -28,6 +29,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatch
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.yearnum.YearNumDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.customer.CustomerMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.equipmanufacture.EquipManufactureMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.found.FoundMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.monordnum.MonOrdNumMapper;
@ -114,6 +116,8 @@ public class ScreenServiceImpl implements ScreenService {
private ProcessBomDetailMapper processBomDetailMapper;
@Resource
private ProcessDesignProgressMapper processDesignProgressMapper;
@Resource
private CustomerMapper customerMapper;
@Override
public Long createScreen(ScreenSaveReqVO createReqVO) {
@ -257,14 +261,62 @@ public class ScreenServiceImpl implements ScreenService {
@Override
public List<ProcessDetailDO> searchProgress(Integer type) {
ProcessDO processDO = processMapper.selectType(type);
if (ObjectUtil.isNotEmpty(processDO)) {
List<ProcessDetailDO> processDetailDOS = processDetailMapper.selectProcessIdAndIsSelect(processDO.getId());
if (ObjectUtil.isNotEmpty(processDetailDOS)) {
return processDetailDOS;
}
return processDetailMapper.selectProcessId(processDO.getId());
if (ObjectUtil.isEmpty(processDO)) {
return new ArrayList<>();
}
return new ArrayList<>();
List<ProcessDetailDO> processDetailDOS = processDetailMapper.selectProcessIdAndIsSelect(processDO.getId());
List<ProcessDetailDO> result;
if (ObjectUtil.isEmpty(processDetailDOS)) {
result = processDetailMapper.selectProcessId(processDO.getId());
} else {
result = processDetailDOS;
}
if (ObjectUtil.isEmpty(result)) {
return new ArrayList<>();
}
// 批量查询项目和客户信息,避免N+1查询
List<Long> projectIds = result.stream()
.map(ProcessDetailDO::getProjectId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (CollUtil.isEmpty(projectIds)) {
return result;
}
Map<Long, ProjectOrderDO> projectOrderMap = projectOrderMapper.selectBatchIds(projectIds).stream()
.collect(Collectors.toMap(ProjectOrderDO::getId, Function.identity()));
List<Long> customerIds = projectOrderMap.values().stream()
.map(ProjectOrderDO::getCustomerId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
Map<Long, CustomerDO> customerMap;
if (CollUtil.isNotEmpty(customerIds)) {
customerMap = customerMapper.selectBatchIds(customerIds).stream()
.collect(Collectors.toMap(CustomerDO::getId, Function.identity()));
} else {
customerMap = Collections.emptyMap();
}
// 设置项目名称和客户简称
result.forEach(processDetailDO -> {
ProjectOrderDO projectOrderDO = projectOrderMap.get(processDetailDO.getProjectId());
if (ObjectUtil.isNotEmpty(projectOrderDO) && ObjectUtil.isNotEmpty(projectOrderDO.getCustomerId())) {
CustomerDO customerDO = customerMap.get(projectOrderDO.getCustomerId());
if (ObjectUtil.isNotEmpty(customerDO)) {
processDetailDO.setProjectNameSim(projectOrderDO.getProjectNameSim() + "(" + customerDO.getBrief() + ")");
}
}
});
return result;
}
public void syncYearData() {
@ -345,6 +397,19 @@ public class ScreenServiceImpl implements ScreenService {
ProcessDO process = getProcess(1);
List<ProjectOrderDO> projectOrderDOS =projectOrderMapper.selectOrder();
List<ProcessDetailDO> processDetailDOS = processDetailMapper.selectProcessIdAndIsSelect(process.getId());
for (ProcessDetailDO processDetailDO : processDetailDOS) {
ProjectOrderDO projectOrderDO = projectOrderMapper.selectById(processDetailDO.getProjectId());
if (ObjectUtil.isNotEmpty(projectOrderDO)){
processDetailDO.setProjectName(projectOrderDO.getProjectName());
processDetailDO.setProjectNameSim(projectOrderDO.getProjectNameSim());
processDetailDO.setProjectId(projectOrderDO.getId());
processDetailDO.setOrdDate(projectOrderDO.getOrderTime());
processDetailDO.setProjectStartTime(projectOrderDO.getProjectStartTime());
processDetailDO.setProjectEndTime(projectOrderDO.getProjectEndTime());
processDetailDO.setDeliveryStatus(projectOrderDO.getDeliveryStatus());
}
}
//删除现有数据
deleteProcessDetail(process.getId());
List<ProcessDetailDO> addList = new ArrayList<>();
@ -535,6 +600,19 @@ public class ScreenServiceImpl implements ScreenService {
ProcessDO process = getProcess(3);
List<ProjectOrderDO> projectOrderDOS =projectOrderMapper.selectOrder();
List<ProcessDetailDO> processDetailDOS = processDetailMapper.selectProcessIdAndIsSelect(process.getId());
for (ProcessDetailDO processDetailDO : processDetailDOS) {
ProjectOrderDO projectOrderDO = projectOrderMapper.selectById(processDetailDO.getProjectId());
if (ObjectUtil.isNotEmpty(projectOrderDO)){
processDetailDO.setProjectName(projectOrderDO.getProjectName());
processDetailDO.setProjectNameSim(projectOrderDO.getProjectNameSim());
processDetailDO.setProjectId(projectOrderDO.getId());
processDetailDO.setOrdDate(projectOrderDO.getOrderTime());
processDetailDO.setProjectStartTime(projectOrderDO.getProjectStartTime());
processDetailDO.setProjectEndTime(projectOrderDO.getProjectEndTime());
processDetailDO.setDeliveryStatus(projectOrderDO.getDeliveryStatus());
}
}
//删除现有数据
deleteProcessDetail(process.getId());
List<ProcessDetailDO> addList = new ArrayList<>();
@ -617,6 +695,18 @@ public class ScreenServiceImpl implements ScreenService {
ProcessDO process = getProcess(2);
List<ProjectOrderDO> projectOrderDOS =projectOrderMapper.selectOrder();
List<ProcessDetailDO> processDetailDOS = processDetailMapper.selectProcessIdAndIsSelect(process.getId());
for (ProcessDetailDO processDetailDO : processDetailDOS) {
ProjectOrderDO projectOrderDO = projectOrderMapper.selectById(processDetailDO.getProjectId());
if (ObjectUtil.isNotEmpty(projectOrderDO)){
processDetailDO.setProjectName(projectOrderDO.getProjectName());
processDetailDO.setProjectNameSim(projectOrderDO.getProjectNameSim());
processDetailDO.setProjectId(projectOrderDO.getId());
processDetailDO.setOrdDate(projectOrderDO.getOrderTime());
processDetailDO.setProjectStartTime(projectOrderDO.getProjectStartTime());
processDetailDO.setProjectEndTime(projectOrderDO.getProjectEndTime());
processDetailDO.setDeliveryStatus(projectOrderDO.getDeliveryStatus());
}
}
//删除现有数据
deleteProcessDetail(process.getId());
List<ProcessDetailDO> addList = new ArrayList<>();

View File

@ -12,7 +12,7 @@
:inline="true"
label-width="110px"
>
<el-form-item label="发货单号" prop="code">
<el-form-item label="号" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入发货单号"

View File

@ -68,6 +68,7 @@
<td colspan="4" v-if="item.category == 'DELIVER_LIST'">{{ item.name }}</td>
<td colspan="4" v-if="item.category== 'OTHER_LIST' && item.subType == 1">备件:{{ item.name }}</td>
<td colspan="4" v-if="item.category== 'OTHER_LIST' && item.subType == 2">刀具:{{ item.name }}</td>
<td colspan="4" v-if="item.category== 'OTHER_LIST' && item.subType == 3">其他:{{ item.name }}</td>
<td>{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, item.unit) }}</td>
<td>{{ item.amount }}</td>
<td>{{ item.weight }}</td>
@ -331,6 +332,15 @@ style="
<td> {{ item.amount }} </td>
<td colspan="2">{{ item.remark }} </td>
</tr>
<tr v-for="(item, index) in formData.otherSubs" :key="index">
<td> {{ index + 1 }} </td>
<td colspan="3">
<span>其他:{{ item.name }}</span>
</td>
<td colspan="3">{{ item.blueprintNo }}</td>
<td> {{ item.amount }} </td>
<td colspan="2">{{ item.remark }} </td>
</tr>
</tbody>
<tbody v-if="subTotalAmount <20">
<tr v-for="item in (20-subTotalAmount)" :key="item">
@ -413,6 +423,15 @@ style="
<td> {{ item.amount }} </td>
<td colspan="2">{{ item.remark }} </td>
</tr>
<tr v-for="(item, index) in formData.otherSubs" :key="index">
<td> {{ index + 1 }} </td>
<td colspan="3">
<span>其他:{{ item.name }}</span>
</td>
<td colspan="3">{{ item.blueprintNo }}</td>
<td> {{ item.amount }} </td>
<td colspan="2">{{ item.remark }} </td>
</tr>
</tbody>
<tbody v-if="subTotalAmount <20">
<tr v-for="item in (20-subTotalAmount)" :key="item">
@ -584,6 +603,7 @@ const formData: any = ref({
deliverOrderOtherSubs: [],
deliverOrderOtherSpareSubs: [],
deliverOrderOtherCutterSubs: [],
otherSubs: [],
attachments: [],
operateLogs: [],
active: undefined,
@ -627,6 +647,9 @@ const open = async (id: number) => {
formData.value.deliverOrderOtherCutterSubs = subArr.filter(
(sub) => sub.category == 'OTHER_LIST' && sub.subType == 2
)
formData.value.otherSubs = subArr.filter(
(sub) => sub.category == 'OTHER_LIST' && sub.subType == 3
)
} else {
num.value=6-subTotalAmount.value
formData.value.deliverOrderSubs = subArr