Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
jhd
2026-07-13 09:43:16 +08:00
10 changed files with 69 additions and 61 deletions

View File

@@ -1,11 +1,12 @@
import request from '@/utils/request'
// 查询参数列表
export function listConfig(query) {
export function listConfig(query, requestOptions = {}) {
return request({
url: '/system/config/list',
method: 'get',
params: query
params: query,
...requestOptions
})
}
@@ -18,28 +19,31 @@ export function getConfig(configId) {
}
// 根据参数键名查询参数值
export function getConfigKey(configKey) {
export function getConfigKey(configKey, requestOptions = {}) {
return request({
url: '/system/config/configKey/' + configKey,
method: 'get'
method: 'get',
...requestOptions
})
}
// 新增参数配置
export function addConfig(data) {
export function addConfig(data, requestOptions = {}) {
return request({
url: '/system/config',
method: 'post',
data: data
data: data,
...requestOptions
})
}
// 修改参数配置
export function updateConfig(data) {
export function updateConfig(data, requestOptions = {}) {
return request({
url: '/system/config',
method: 'put',
data: data
data: data,
...requestOptions
})
}

View File

@@ -802,6 +802,8 @@ export default {
pageNum: 1,
pageSize: 10,
configKey,
}, {
silentError: true,
})
const rows = (res && res.rows) || []
const hit = rows.find(item => item && item.configKey === configKey)
@@ -839,7 +841,6 @@ export default {
this.debugLog('saveConfig-payload-too-long', { payloadLength: payload.length, persistPayload })
if (this.$cache) this.$cache.local.setJSON(storageKey, persistPayload)
this.configVisible = false
if (this.$modal) this.$modal.msgWarning(`配置内容过多后端参数长度上限为500当前为${payload.length},已使用本地保存`)
return
}
try {
@@ -848,6 +849,8 @@ export default {
const updateRes = await updateConfig({
...existsConfig,
configValue: payload,
}, {
silentError: true,
})
this.debugLog('saveConfig-updateConfig-success', { storageKey, updateRes, existsConfig })
} else {
@@ -859,6 +862,8 @@ export default {
configValue: payload,
configType: 'Y',
remark: `工作台快捷入口配置(${label}`,
}, {
silentError: true,
})
this.debugLog('saveConfig-addConfig-success', { storageKey, addRes })
}
@@ -869,7 +874,6 @@ export default {
this.debugLog('saveConfig-upsert-error', e)
if (this.$cache) this.$cache.local.setJSON(storageKey, persistPayload)
this.configVisible = false
if (this.$modal) this.$modal.msgWarning('保存失败,已使用本地保存')
}
},
/**

View File

@@ -102,6 +102,7 @@ service.interceptors.response.use(res => {
const code = res.data.code || 200;
// 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default']
const silentError = !!(res.config && res.config.silentError)
// 二进制数据则直接返回
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data
@@ -120,13 +121,19 @@ service.interceptors.response.use(res => {
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
} else if (code === 500) {
Message({ message: msg, type: 'error' })
if (!silentError) {
Message({ message: msg, type: 'error' })
}
return Promise.reject(new Error(msg))
} else if (code === 601) {
Message({ message: msg, type: 'warning' })
if (!silentError) {
Message({ message: msg, type: 'warning' })
}
return Promise.reject('error')
} else if (code !== 200) {
Notification.error({ title: msg })
if (!silentError) {
Notification.error({ title: msg })
}
return Promise.reject('error')
} else {
return res.data
@@ -142,7 +149,9 @@ service.interceptors.response.use(res => {
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
Message({ message: message, type: 'error', duration: 5 * 1000 })
if (!(error.config && error.config.silentError)) {
Message({ message: message, type: 'error', duration: 5 * 1000 })
}
return Promise.reject(error)
}
)

View File

@@ -1312,21 +1312,22 @@ export default {
if (!this.activeReport) return
const key = 'cost_chart_cols_' + this.activeReport.reportId
const allKeys = this.chartDataCols.map(c => this.getColKey(c))
let selected = []
try {
const saved = localStorage.getItem(key)
if (saved) {
const parsed = JSON.parse(saved)
this.chartSelectedKeys = (parsed.selected || []).filter(k => allKeys.includes(k))
return
selected = (parsed.selected || []).filter(k => allKeys.includes(k))
}
} catch (e) { /* ignore */ }
// default: select all
this.chartSelectedKeys = [...allKeys]
this.chartSelectedKeys = selected
},
saveChartSelection() {
if (!this.activeReport) return
const key = 'cost_chart_cols_' + this.activeReport.reportId
localStorage.setItem(key, JSON.stringify({ selected: this.chartSelectedKeys }))
localStorage.setItem(key, JSON.stringify({
selected: this.chartSelectedKeys
}))
},
addChartCol(key) {
this.chartSelectedKeys.push(key)
@@ -1439,9 +1440,9 @@ export default {
/deep/ .summary-row td .cell { color: #303133; }
.summary-label { font-weight: bold; color: #303133; padding: 0 5px; }
.summary-val { font-weight: bold; color: #303133; }
/deep/ .chart-fullscreen { width: 100% !important; max-width: 100% !important; height: 100vh !important; margin: 0 !important; display: flex; flex-direction: column; }
/deep/ .chart-fullscreen .el-dialog__body { flex: 1; max-height: none; overflow: auto; padding: 16px 20px; }
/deep/ .chart-fullscreen .el-dialog__header { padding: 12px 20px; flex-shrink: 0; }
/deep/ .chart-fullscreen { width: 100% !important; max-width: 100% !important; margin: 0 !important; }
/deep/ .chart-fullscreen .el-dialog__body { max-height: calc(100vh - 90px); overflow: auto; padding: 16px 20px; }
/deep/ .chart-fullscreen .el-dialog__header { padding: 12px 20px; }
.chart-tag-bar { padding: 0 4px 8px; }
.chart-tag-row { display: flex; flex-wrap: wrap; align-items: center; margin-bottom: 4px; }
.chart-tag-row:last-child { margin-bottom: 0; }

View File

@@ -2298,8 +2298,9 @@ export default {
});
},
handleExportCoil(row) {
exportCoil(row.coilId).then(response => {
this.$modal.msgSuccess("发货成功");
this.$modal.confirm('是否确认将钢卷"' + row.currentCoilNo + '"进行发货?').then(() => {
exportCoil(row.coilId).then(response => {
this.$modal.msgSuccess("发货成功");
// 2. 插入一条已完成的待操作记录
addPendingAction({
coilId: row.coilId,
@@ -2318,6 +2319,8 @@ export default {
}).catch(error => {
this.$modal.msgError("发货失败");
});
}).catch(() => {
});
},
async handleNewExport(row) {
this.loading = true

View File

@@ -530,8 +530,8 @@ export default {
}
return {
start: `${startDate} 00:00:00`,
end: `${endDate} 23:59:59`
start: `${startDate} 07:00:00`,
end: `${endDate} 07:00:00`
};
};
@@ -812,8 +812,8 @@ export default {
// all 类型:年视图日期变更
handleYearDateChange() {
if (this.yearDate) {
this.queryParams.startTime = `${this.yearDate}-01-01 00:00:00`;
this.queryParams.endTime = `${this.yearDate}-12-31 23:59:59`;
this.queryParams.startTime = `${this.yearDate}-01-01 07:00:00`;
this.queryParams.endTime = `${this.yearDate}-12-31 07:00:00`;
this.handleQuery();
}
},

View File

@@ -2,6 +2,7 @@ package com.klp.controller;
import com.klp.common.core.domain.R;
import com.klp.domain.bo.WmsAnnealPerformanceBo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.vo.anneal.WmsAnnealPerformanceVo;
import com.klp.service.IWmsAnnealPerformanceService;
@@ -36,7 +37,7 @@ public class WmsAnnealPerformanceController {
* 查询退火计划中的加工前钢卷列表
*/
@GetMapping("/rawCoils")
public R<List<WmsMaterialCoilVo>> getRawCoils(WmsAnnealPerformanceBo bo) {
return R.ok(performanceService.queryPlanCoils(bo));
public R<List<WmsMaterialCoilVo>> getRawCoils(WmsAnnealPerformanceBo bo, WmsMaterialCoilBo coilBo) {
return R.ok(performanceService.queryPlanCoils(bo, coilBo));
}
}

View File

@@ -1,6 +1,7 @@
package com.klp.service;
import com.klp.domain.bo.WmsAnnealPerformanceBo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.vo.anneal.WmsAnnealPerformanceVo;
@@ -19,5 +20,5 @@ public interface IWmsAnnealPerformanceService {
/**
* 查询退火计划中的加工前钢卷列表
*/
List<WmsMaterialCoilVo> queryPlanCoils(WmsAnnealPerformanceBo bo);
List<WmsMaterialCoilVo> queryPlanCoils(WmsAnnealPerformanceBo bo, WmsMaterialCoilBo coilBo);
}

View File

@@ -144,27 +144,32 @@ public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceSer
continue; // 没找到加工后的卷,跳过
}
// 如果传入了筛选条件,只保留匹配的钢卷
if (bo.getEnterCoilNo() != null && !bo.getEnterCoilNo().isEmpty()) {
// 筛选加工后的钢卷
if (StringUtils.isNotBlank(bo.getEnterCoilNo())) {
if (coilVo.getEnterCoilNo() == null ||
!coilVo.getEnterCoilNo().contains(bo.getEnterCoilNo())) {
continue; // 跳过不匹配的钢卷
continue;
}
}
if (bo.getCurrentCoilNo() != null && !bo.getCurrentCoilNo().isEmpty()) {
if (StringUtils.isNotBlank(bo.getCurrentCoilNo())) {
if (coilVo.getCurrentCoilNo() == null ||
!coilVo.getCurrentCoilNo().contains(bo.getCurrentCoilNo())) {
continue; // 跳过不匹配的钢卷
continue;
}
}
// 钢卷本身的逻辑库区筛选coilVo.warehouseId保持不变
if (bo.getCoilWarehouseId() != null) {
if (coilVo.getWarehouseId() == null ||
!coilVo.getWarehouseId().equals(bo.getCoilWarehouseId())) {
continue; // 跳过不匹配的钢卷
continue;
}
}
// 出炉逻辑库区筛选planCoil.logicWarehouseId是加工后去向
if (bo.getWarehouseId() != null) {
if (planCoil.getLogicWarehouseId() == null ||
!planCoil.getLogicWarehouseId().equals(bo.getWarehouseId())) {
continue;
}
}
// 为每个planCoil创建独立的detail携带自身的logicWarehouseId/furnaceLevel
WmsAnnealPerformanceDetailVo coilDetail = new WmsAnnealPerformanceDetailVo();
coilDetail.setPlanId(detail.getPlanId());
@@ -205,7 +210,7 @@ public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceSer
}
@Override
public List<WmsMaterialCoilVo> queryPlanCoils(WmsAnnealPerformanceBo bo) {
public List<WmsMaterialCoilVo> queryPlanCoils(WmsAnnealPerformanceBo bo, WmsMaterialCoilBo coilBo) {
// 1. 查询退火计划
LambdaQueryWrapper<WmsFurnacePlan> planQw = new LambdaQueryWrapper<WmsFurnacePlan>()
.ge(bo.getStartTime() != null, WmsFurnacePlan::getActualStartTime, bo.getStartTime())
@@ -237,8 +242,7 @@ public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceSer
return Collections.emptyList();
}
// 3. 按coilId直接查询加工前的钢卷
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
// 3. 按coilId查询加工前的钢卷筛选条件由coilBo带入
coilBo.setCoilIds(coilIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
PageQuery pageQuery = new PageQuery();
pageQuery.setPageNum(1);

View File

@@ -17,21 +17,6 @@
<if test="planNo != null and planNo != ''">
AND p.plan_no LIKE CONCAT('%', #{planNo}, '%')
</if>
<if test="enterCoilNo != null and enterCoilNo != ''">
AND mc.enter_coil_no LIKE CONCAT('%', #{enterCoilNo}, '%')
</if>
<!-- 当前钢卷号匹配 -->
<if test="currentCoilNo != null and currentCoilNo != ''">
AND mc.current_coil_no LIKE CONCAT('%', #{currentCoilNo}, '%')
</if>
<!-- 出炉时的逻辑库区筛选wms_furnace_plan_coil.logic_warehouse_id -->
<if test="warehouseId != null">
AND pc.logic_warehouse_id = #{warehouseId}
</if>
<!-- 钢卷本身的逻辑库区筛选wms_material_coil.warehouse_id -->
<if test="coilWarehouseId != null">
AND mc.warehouse_id = #{coilWarehouseId}
</if>
</where>
</sql>
@@ -54,10 +39,6 @@
p.end_time AS endTime
FROM wms_furnace_plan p
LEFT JOIN wms_furnace f ON f.furnace_id = p.target_furnace_id
<if test="enterCoilNo != null and enterCoilNo != '' or currentCoilNo != null and currentCoilNo != '' or warehouseId != null or coilWarehouseId != null">
INNER JOIN wms_furnace_plan_coil pc ON pc.plan_id = p.plan_id AND pc.del_flag = 0
INNER JOIN wms_material_coil mc ON mc.coil_id = pc.coil_id AND mc.del_flag = 0
</if>
<include refid="AnnealPerformanceWhere" />
GROUP BY p.plan_id, p.plan_no, p.target_furnace_id, f.furnace_name, p.actual_start_time, p.end_time
ORDER BY p.actual_start_time DESC, p.plan_no DESC