Compare commits

...

10 Commits

Author SHA1 Message Date
e937ff50f6 Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-03-10 14:03:48 +08:00
891ec659de refactor(service): 修改钢卷统计汇总服务返回值类型
- 将 insertByBo 方法返回值从 Boolean 改为 WmsCoilStatisticsSummaryVo
- 更新控制器方法返回完整的业务对象而不是布尔值
- 实现新增后查询并返回完整的汇总记录信息
- 提供更丰富的新增操作响应数据
2026-03-10 14:03:38 +08:00
砂糖
730148e966 feat(wms): 新增导出功能并优化发货单显示
- 在base.vue中新增导出按钮和按库区排序选项
- 添加exportCoilWithAll API接口用于批量导出
- 在waybill.vue中新增showNewExport属性控制导出按钮显示
- 优化发货单页面显示,增加订单编号和备注显示
- 新增delivery/canuse页面用于展示可用钢卷
- 修复发货单修改时订单编号显示问题
2026-03-10 13:33:30 +08:00
8927760eb1 refactor(WmsMaterialCoilService): 替换查询包装器实现以优化导出功能
- 将 queryExportList 方法中的 buildQueryWrapper 替换为 buildQueryWrapperPlus
- 移除旧的 buildQueryWrapper 方法及其完整的查询条件构建逻辑
- 保留导出列表的基本查询和数据处理流程
2026-03-10 13:14:09 +08:00
328c46b8b8 refactor(material): 优化材料卷查询导出功能
- 将查询包装器构建方法从 buildQueryWrapper 替换为 buildQueryWrapperPlus
- 提升导出列表查询的数据完整性和准确性
2026-03-10 11:58:34 +08:00
c21f5dc813 feat(material): 添加钢卷物料完整字段导出功能
- 新增 WmsMaterialCoilAllExportVo 完整字段导出 VO 类
- 在 IWmsMaterialCoilService 中添加 queryExportListAll 方法
- 实现 queryExportListAll 方法支持完整字段导出
- 添加 /exportAll 接口支持完整字段导出
- 更新数据库查询映射添加班组和发货人字段
- 修改 WmsMaterialCoilExportVo 添加班组、业务用途等字段
- 调整导出接口注释从完整字段改为精简字段描述
2026-03-10 11:47:42 +08:00
c5089faaea Merge remote-tracking branch 'origin/0.8.X' into 0.8.X 2026-03-10 10:43:08 +08:00
f5017443d5 feat(wms): 新增卷材统计摘要附件功能
- 在 WmsCoilStatisticsSummary 实体中添加 attachmentInfo 字段
- 在 WmsCoilStatisticsSummaryBo 中添加 attachmentInfo 字段
- 在 WmsCoilStatisticsSummaryVo 中添加 attachmentInfo 字段
- 更新 Mapper XML 映射文件中的结果映射配置
- 修改 Vo 类继承 BaseEntity 基类
2026-03-10 10:42:57 +08:00
砂糖
f5904fa7f3 feat(wms): 添加次品标签页并优化钢卷统计表格
refactor(LeftList): 移除表单包装简化对话框结构
feat(Perspective): 新增宽度分类统计组件
perf(TrimStatistics): 优化表格宽度分组和过滤逻辑
2026-03-09 17:19:06 +08:00
砂糖
3f4ee0fce3 fix(wms): 更新镀锌原料标签判断逻辑并调整标签尺寸
修改多个文件中的镀锌原料仓库判断条件,增加新的仓库ID支持
调整DuGeTag.vue中标签的高度为100mm
更新base.vue中的标签类型判断逻辑,增加更多产品类型处理
修正DuGeTag.vue中的联系电话信息
2026-03-09 16:33:52 +08:00
27 changed files with 737 additions and 186 deletions

View File

@@ -345,4 +345,15 @@ export function categoryWidthStatistics() {
url: '/wms/materialCoil/statistics/categoryWidthStatistics',
method: 'get',
})
}
/**
* 钢卷被退货,发给客户的钢卷被退货
*/
export function exportCoilWithAll(data) {
return request({
url: '/wms/materialCoil/exportAll',
method: 'post',
data
})
}

View File

@@ -114,7 +114,7 @@
Jiaxiang County,Jining City,Shandong Province</span>
<br />
<span>
TEL0537-6625068 0537-6625067
TEL1905-3728822 1905-3728835
</span>
</div>
<div class="contact-timestamp">

View File

@@ -36,7 +36,7 @@
v-if="tagType === 'ge'"
:content="content"
:paperWidthMm="180"
:paperHeightMm="80"
:paperHeightMm="100"
/>
<!-- <SampleTagPreview v-if="labelType === '4'" :content="content" />
<ForgeTagPreview v-if="labelType === '5'" :content="content" />
@@ -141,7 +141,7 @@ export default {
handler(newVal) {
const { itemName, itemType, warehouseId } = newVal;
// 在镀锌颜料库的卷使用镀锌原料标签
if (itemType == 'raw_material' && warehouseId == '1988150263284953089') {
if (itemType == 'raw_material' && (warehouseId == '1988150263284953089' || warehouseId == '1988150487185289217')) {
this.labelType = '5';
} else if (itemType == 'raw_material') {
this.labelType = '2';

View File

@@ -0,0 +1,138 @@
<template>
<div class="hot-zha-raw">
<!-- 使用 el-table 展示数据 -->
<el-table
v-loading="loading"
:data="processedData"
border
style="width: 100%;"
:header-cell-style="{background: '#f2f2f2', fontWeight: 600}"
>
<!-- 类别列 -->
<el-table-column
label="类别"
prop="category"
min-width="180"
align="left"
/>
<!-- 合并的净边表头 -->
<el-table-column
label="净边"
align="center"
>
<el-table-column
label="1000"
prop="width1000"
min-width="100"
align="center"
/>
<el-table-column
label="1200"
prop="width1200"
min-width="100"
align="center"
/>
<el-table-column
label="1220"
prop="width1220"
min-width="100"
align="center"
/>
<el-table-column
label="1250"
prop="width1250"
min-width="100"
align="center"
/>
</el-table-column>
<!-- 其他宽度及毛边列 -->
<el-table-column
label="其他宽度及毛边"
prop="otherWidth"
min-width="120"
align="center"
/>
<!-- 合计列 -->
<el-table-column
label="合计"
prop="total"
min-width="100"
align="center"
:cell-style="{fontWeight: 600, color: '#1890ff'}"
/>
</el-table>
<!-- 无数据提示el-table 自带空数据提示这里可保留统一样式 -->
<div v-if="!data || data.length === 0" class="empty-data">
暂无数据
</div>
</div>
</template>
<script>
export default {
name: 'HotZhaRaw',
props: {
data: {
type: Array,
default: () => []
}
},
data() {
return {
loading: false // 可根据实际需求控制加载状态
};
},
computed: {
processedData() {
if (!this.data || !Array.isArray(this.data)) {
return [];
}
console.log(this.data);
// 深拷贝避免修改原数据
return this.data;
}
},
methods: {
// el-table 专用的数字格式化方法
formatTableNumber(row, column) {
const num = row[column.prop];
if (num === null || num === undefined || num === '') return '0.000';
return Number(num).toFixed(3);
}
}
};
</script>
<style scoped>
.hot-zha-raw {
width: 100%;
min-height: 200px;
padding: 10px;
box-sizing: border-box;
}
.empty-data {
text-align: center;
padding: 40px;
color: #999;
font-size: 14px;
}
/* 覆盖 el-table 样式,保持视觉统一 */
:deep(.el-table) {
--el-table-header-text-color: #303133;
--el-table-row-hover-bg-color: #f8f9fa;
}
:deep(.el-table th) {
border-right: 1px solid #ddd;
}
:deep(.el-table td) {
border-right: 1px solid #ddd;
}
</style>

View File

@@ -1,7 +1,7 @@
<template>
<div class="trim-statistics-table">
<el-table
:data="tableData"
:data="filteredTableData"
border
stripe
:span-method="objectSpanMethod"
@@ -15,7 +15,7 @@
align="center"
/>
<!-- 冷硬卷板净边料现货库存 表头组 -->
<!-- 冷硬卷板净边料现货库存 独立表头组 -->
<el-table-column
label="冷硬卷板净边料现货库存"
align="center"
@@ -27,18 +27,19 @@
<el-table-column label="数量(件)" prop="trimmedTotalCount" width="80" align="center" />
<el-table-column label="重量(吨)" prop="trimmedTotalWeight" width="80" align="center" />
</el-table-column>
<!-- 净边料独立宽度列合并后的分组 -->
<el-table-column
v-for="width in widthList"
:key="'trimmed-' + width"
:label="width"
v-for="group in trimmedWidthGroups"
:key="'trimmed-' + group.key"
:label="group.label"
align="center"
>
<el-table-column label="数量(件)" :prop="`trimmed_${width}_count`" width="80" align="center" />
<el-table-column label="重量(吨)" :prop="`trimmed_${width}_weight`" width="80" align="center" />
<el-table-column label="数量(件)" :prop="`trimmed_${group.key}_count`" width="80" align="center" />
<el-table-column label="重量(吨)" :prop="`trimmed_${group.key}_weight`" width="80" align="center" />
</el-table-column>
</el-table-column>
<!-- 冷硬卷板毛边料现货库存 表头组 -->
<!-- 冷硬卷板毛边料现货库存 独立表头组 -->
<el-table-column
label="冷硬卷板毛边料现货库存"
align="center"
@@ -50,14 +51,15 @@
<el-table-column label="数量(件)" prop="untrimmedTotalCount" width="80" align="center" />
<el-table-column label="重量(吨)" prop="untrimmedTotalWeight" width="80" align="center" />
</el-table-column>
<!-- 毛边料独立宽度列合并后的分组 -->
<el-table-column
v-for="width in widthList"
:key="'untrimmed-' + width"
:label="width"
v-for="group in untrimmedWidthGroups"
:key="'untrimmed-' + group.key"
:label="group.label"
align="center"
>
<el-table-column label="数量(件)" :prop="`untrimmed_${width}_count`" width="80" align="center" />
<el-table-column label="重量(吨)" :prop="`untrimmed_${width}_weight`" width="80" align="center" />
<el-table-column label="数量(件)" :prop="`untrimmed_${group.key}_count`" width="80" align="center" />
<el-table-column label="重量(吨)" :prop="`untrimmed_${group.key}_weight`" width="80" align="center" />
</el-table-column>
</el-table-column>
</el-table>
@@ -71,69 +73,202 @@ export default {
data: {
type: Array,
default: () => []
},
// 可配置的宽度分组规则(支持自定义)
widthGroupRules: {
type: Object,
default: () => ({
'1000系列': ['1000', '1000~1005', '1010/1015'],
'1200基础系列': ['1200/1202', '1200~1215'],
'1218基础系列': ['1218/1220', '1218~1235', '1210/1215'],
'1240系列': ['1240/1252'],
'1225系列': ['1225/1235'],
'1250+系列': ['1250~1265', '1260-1265']
})
}
},
computed: {
// 定义表格中需要展示的宽度规格(与图片中一致)
widthList() {
return [
'1000', '1200/1202', '1218/1220', '1240/1252',
'1010/1015', '1210/1215', '1225/1235', '1260-1265',
'1000~1005', '1200~1215', '1218~1235', '1250~1265'
];
// ========== 净边料相关计算 ==========
// 提取净边料所有原始宽度
rawTrimmedWidths() {
const widthSet = new Set();
this.data.forEach(item => {
item.trimmedList.forEach(trimmed => {
if (trimmed.width) widthSet.add(trimmed.width);
});
});
return Array.from(widthSet);
},
// 处理后的数据(适配表格列结构
// 净边料宽度分组(合并相近宽度
trimmedWidthGroups() {
return this.generateWidthGroups(this.rawTrimmedWidths);
},
// ========== 毛边料相关计算 ==========
// 提取毛边料所有原始宽度
rawUntrimmedWidths() {
const widthSet = new Set();
this.data.forEach(item => {
item.untrimmedList.forEach(untrimmed => {
if (untrimmed.width) widthSet.add(untrimmed.width);
});
});
return Array.from(widthSet);
},
// 毛边料宽度分组(合并相近宽度)
untrimmedWidthGroups() {
return this.generateWidthGroups(this.rawUntrimmedWidths);
},
// 处理后的原始表格数据
tableData() {
return this.data.map(item => {
const row = {
thickness: item.thickness,
trimmedTotalCount: 0, // 净边料总计数量
trimmedTotalWeight: 0, // 净边料总计重量
untrimmedTotalCount: 0, // 毛边料总计数量
untrimmedTotalWeight: 0 // 毛边料总计重量
trimmedTotalCount: 0,
trimmedTotalWeight: 0,
untrimmedTotalCount: 0,
untrimmedTotalWeight: 0
};
// 初始化所有宽度的数量和重量为0
this.widthList.forEach(width => {
row[`trimmed_${width}_count`] = 0;
row[`trimmed_${width}_weight`] = 0;
row[`untrimmed_${width}_count`] = 0;
row[`untrimmed_${width}_weight`] = 0;
// 初始化净边料分组数据
this.trimmedWidthGroups.forEach(group => {
row[`trimmed_${group.key}_count`] = 0;
row[`trimmed_${group.key}_weight`] = 0;
});
// 处理净边料数据
// 初始化毛边料分组数据
this.untrimmedWidthGroups.forEach(group => {
row[`untrimmed_${group.key}_count`] = 0;
row[`untrimmed_${group.key}_weight`] = 0;
});
// 处理净边料数据(按分组求和)
item.trimmedList.forEach(trimmed => {
const widthKey = trimmed.width;
if (this.widthList.includes(widthKey)) {
row[`trimmed_${widthKey}_count`] = trimmed.coilCount;
row[`trimmed_${widthKey}_weight`] = trimmed.totalWeight;
// 累加总计
row.trimmedTotalCount += trimmed.coilCount;
row.trimmedTotalWeight = (Number(row.trimmedTotalWeight) + Number(trimmed.totalWeight)).toFixed(3);
}
const width = trimmed.width;
const count = Number(trimmed.coilCount) || 0;
const weight = Number(trimmed.totalWeight) || 0;
// 找到宽度所属的分组并累加
this.trimmedWidthGroups.forEach(group => {
if (group.includesWidth(width)) {
row[`trimmed_${group.key}_count`] += count;
row[`trimmed_${group.key}_weight`] = (row[`trimmed_${group.key}_weight`] + weight).toFixed(3);
}
});
// 累加总计
row.trimmedTotalCount += count;
row.trimmedTotalWeight = (Number(row.trimmedTotalWeight) + weight).toFixed(3);
});
// 处理毛边料数据
// 处理毛边料数据(按分组求和)
item.untrimmedList.forEach(untrimmed => {
const widthKey = untrimmed.width;
if (this.widthList.includes(widthKey)) {
row[`untrimmed_${widthKey}_count`] = untrimmed.coilCount;
row[`untrimmed_${widthKey}_weight`] = untrimmed.totalWeight;
// 累加总计
row.untrimmedTotalCount += untrimmed.coilCount;
row.untrimmedTotalWeight = (Number(row.untrimmedTotalWeight) + Number(untrimmed.totalWeight)).toFixed(3);
}
const width = untrimmed.width;
const count = Number(untrimmed.coilCount) || 0;
const weight = Number(untrimmed.totalWeight) || 0;
// 找到宽度所属的分组并累加
this.untrimmedWidthGroups.forEach(group => {
if (group.includesWidth(width)) {
row[`untrimmed_${group.key}_count`] += count;
row[`untrimmed_${group.key}_weight`] = (row[`untrimmed_${group.key}_weight`] + weight).toFixed(3);
}
});
// 累加总计
row.untrimmedTotalCount += count;
row.untrimmedTotalWeight = (Number(row.untrimmedTotalWeight) + weight).toFixed(3);
});
return row;
});
},
// 过滤掉全0的行
filteredTableData() {
return this.tableData.filter(row => {
let hasNonZeroData = false;
// 检查净边料总计
if (Number(row.trimmedTotalCount) > 0 || Number(row.trimmedTotalWeight) > 0) {
hasNonZeroData = true;
}
// 检查毛边料总计
if (Number(row.untrimmedTotalCount) > 0 || Number(row.untrimmedTotalWeight) > 0) {
hasNonZeroData = true;
}
// 检查净边料分组列
if (!hasNonZeroData) {
this.trimmedWidthGroups.forEach(group => {
if (Number(row[`trimmed_${group.key}_count`]) > 0 || Number(row[`trimmed_${group.key}_weight`]) > 0) {
hasNonZeroData = true;
}
});
}
// 检查毛边料分组列
if (!hasNonZeroData) {
this.untrimmedWidthGroups.forEach(group => {
if (Number(row[`untrimmed_${group.key}_count`]) > 0 || Number(row[`untrimmed_${group.key}_weight`]) > 0) {
hasNonZeroData = true;
}
});
}
return hasNonZeroData;
});
}
},
methods: {
// 合并表头的跨度方法(可选,若需要合并行/列可扩展
// 生成宽度分组(核心方法
generateWidthGroups(rawWidths) {
const groups = [];
const usedWidths = new Set();
// 遍历分组规则,匹配原始宽度
Object.entries(this.widthGroupRules).forEach(([groupLabel, widthList]) => {
// 筛选出当前分组包含的原始宽度
const matchedWidths = rawWidths.filter(width => widthList.includes(width));
if (matchedWidths.length === 0) return;
// 创建分组对象
const groupKey = groupLabel.replace(/[^a-zA-Z0-9]/g, '_');
groups.push({
key: groupKey,
label: groupLabel,
widths: matchedWidths,
includesWidth: function(width) {
return this.widths.includes(width);
}
});
// 标记已使用的宽度
matchedWidths.forEach(width => usedWidths.add(width));
});
// 处理未匹配到分组的宽度(单独成组)
rawWidths.forEach(width => {
if (!usedWidths.has(width)) {
const groupKey = width.replace(/[^a-zA-Z0-9]/g, '_');
groups.push({
key: groupKey,
label: width,
widths: [width],
includesWidth: function(width) {
return this.widths.includes(width);
}
});
}
});
return groups;
},
// 合并表头的跨度方法
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
// 可根据需求实现行/列合并逻辑,例如合并重复的厚度行
// 示例:若需合并相同厚度的行,可在此处返回 { rowspan: n, colspan: m }
return { rowspan: 1, colspan: 1 };
}
}

View File

@@ -51,6 +51,7 @@
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button icon="el-icon-download" size="mini" @click="handleNewExport" v-if="showNewExport">导出</el-button>
</el-form-item>
</el-form>
@@ -73,6 +74,9 @@
<el-button type="info" plain icon="el-icon-printer" size="mini" :disabled="multiple"
@click="handleBatchPrintLabel">批量打印标签</el-button>
</el-col>
<el-col :span="1.5" v-if="showOrderBy">
<el-checkbox v-model="queryParams.orderBy" v-loading="loading" @change="getList" label="orderBy">按实际库区排序</el-checkbox>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@@ -177,7 +181,8 @@
<el-table-column label="关联订单" align="center" prop="relatedToOrder" v-if="showRelatedToOrder" width="150">
<template slot-scope="scope">
<el-switch @change="handleRelatedToOrderChange(scope.row)" v-model="scope.row.isRelatedToOrder" :active-value="1" :inactive-value="0" />
<el-switch @change="handleRelatedToOrderChange(scope.row)" v-model="scope.row.isRelatedToOrder"
:active-value="1" :inactive-value="0" />
</template>
</el-table-column>
@@ -404,7 +409,8 @@ import {
exportCoil,
cancelExportCoil,
checkCoilNo,
returnCoil
returnCoil,
exportCoilWithAll
} from "@/api/wms/coil";
import { listBoundCoil } from "@/api/wms/deliveryWaybillDetail";
import WarehouseSelect from "@/components/KLPService/WarehouseSelect";
@@ -529,6 +535,14 @@ export default {
showRelatedToOrder: {
type: Boolean,
default: false,
},
showOrderBy: {
type: Boolean,
default: false,
},
showNewExport: {
type: Boolean,
default: false,
}
},
data() {
@@ -577,6 +591,7 @@ export default {
itemIds: undefined,
status: undefined,
updateTime: undefined,
orderBy: false,
...this.querys,
},
// 表单参数
@@ -787,8 +802,26 @@ export default {
handlePrintLabel(row) {
const item = row.itemType === 'product' ? row.product : row.rawMaterial;
const itemName = row.itemType === 'product' ? item?.productName || '' : item?.rawMaterialName || '';
this.labelRender.type = row.itemType === 'product' ? '3' : '2';
const itemType = row.itemType || '';
const warehouseId = row.warehouseId || '';
// 在镀锌颜料库的卷使用镀锌原料标签
if (itemType == 'raw_material' && (warehouseId == '1988150263284953089' || warehouseId == '1988150487185289217')) {
this.labelRender.type = '5';
} else if (itemType == 'raw_material') {
this.labelRender.type = '2';
} else if (itemType == 'product' && itemName == '冷硬卷') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '热轧卷板') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '镀锌卷') {
this.labelRender.type = '4';
} else if (itemType == 'product' && itemName == '冷轧卷') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '镀铬卷') {
this.labelRender.type = 'ge';
} else {
this.labelRender.type = '3';
}
this.labelRender.data = {
...row,
itemName: itemName,
@@ -898,12 +931,6 @@ export default {
}
},
handleAbnormal(row) {
// this.$router.push({
// path: '/quality/detail',
// query: {
// coilId: row.coilId,
// }
// })
this.currentCoilId = row.coilId;
this.abnormalOpen = true;
},
@@ -1019,6 +1046,33 @@ export default {
}).catch(error => {
this.$modal.msgError("发货失败");
});
},
async handleNewExport(row) {
this.loading = true
let coilIds = ''
const query = {
...this.queryParams,
selectType: 'product',
pageSize: 9999,
pageNum: 1,
}
if (this.showWaybill) {
const res = await listBoundCoil(query)
coilIds = res.rows.map(item => item.coilId).join(',')
this.loading = false
this.download('wms/deliveryWaybill/export', {
coilIds,
}, 'coil.xlsx')
} else {
const { rows: coils } = await listMaterialCoil(query)
coilIds = coils.map(item => item.coilId).join(',')
this.loading = false
this.download('wms/materialCoil/exportAll', {
coilIds,
}, 'coil.xlsx')
}
},
handleCheck(row) {
this.isCheck = true;
@@ -1153,7 +1207,6 @@ export default {
...this.queryParams
}, `materialCoil_${new Date().getTime()}.xlsx`)
},
/** 批量打印标签按钮 */
handleBatchPrintLabel() {
if (!this.ids || this.ids.length === 0) {

View File

@@ -661,7 +661,7 @@ export default {
const itemType = row.itemType || '';
const warehouseId = row.warehouseId || '';
// 在镀锌颜料库的卷使用镀锌原料标签
if (itemType == 'raw_material' && warehouseId == '1988150263284953089') {
if (itemType == 'raw_material' && (warehouseId == '1988150263284953089' || warehouseId == '1988150487185289217')) {
this.labelRender.type = '5';
} else if (itemType == 'raw_material') {
this.labelRender.type = '2';

View File

@@ -55,12 +55,10 @@
<!-- 添加或修改钢卷生产统计对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<div v-for="item in tableType" :key="item.statType" @click="handleCreate(item)" class="type-item">
<div class="type-title">{{ item.title }}</div>
<div class="type-desc">{{ item.description }}</div>
</div>
</el-form>
<div v-for="item in tableType" :key="item.statType" @click="handleCreate(item)" class="type-item">
<div class="type-title">{{ item.title }}</div>
<div class="type-desc">{{ item.description }}</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>

View File

@@ -78,19 +78,7 @@ export default {
currentRow: {},
};
},
created() {
this.getList();
},
methods: {
/** 查询钢卷生产统计列表 */
getList() {
this.loading = true;
listCoilStatisticsSummary(this.queryParams).then(response => {
this.coilStatisticsSummaryList = response.rows;
this.total = response.total;
this.loading = false;
});
},
// 取消按钮
cancel() {
this.open = false;

View File

@@ -29,7 +29,8 @@ export default {
showStatus: true,
hideType: true,
showLength: true,
canExportAll: true
canExportAll: true,
showOrderBy: true,
}
}
}

View File

@@ -8,6 +8,10 @@
<BasePage :qrcode="qrcode" :querys="querys" :labelType="labelType" :hideWarehouseQuery="hideWarehouseQuery"
:hideType="hideType" />
</el-tab-pane>
<el-tab-pane label="次品" name="third">
<BasePage :qrcode="qrcode" :querys="query3" :labelType="labelType" :hideWarehouseQuery="hideWarehouseQuery"
:hideType="hideType" />
</el-tab-pane>
</el-tabs>
</template>
@@ -34,6 +38,10 @@ export default {
nextWarehouseId: '2019583429955104769', // 废品仓
// materialType: '废品'
},
query3: {
dataType: 1,
OnlyScrap: true,
},
hideWarehouseQuery: true,
showAbnormal: true,
labelType: '2',

View File

@@ -2,6 +2,7 @@
<BasePage
:qrcode="qrcode"
:showWaybill="showWaybill"
:showNewExport="showNewExport"
:querys="querys" :labelType="labelType" :showStatus="showStatus" :hideType="hideType" :showControl="showControl" :showExportTime="showExportTime" />
</template>
@@ -27,6 +28,7 @@ export default {
hideType: false,
showExportTime: false,
showWaybill: true,
showNewExport: true,
}
}
}

View File

@@ -0,0 +1,38 @@
<template>
<BasePage :qrcode="qrcode"
:querys="querys"
:labelType="labelType"
:showStatus="showStatus"
:hideType="hideType"
:showLength="showLength"
:canExportAll="canExportAll"
/>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue';
export default {
components: {
BasePage
},
data() {
return {
qrcode: false,
querys: {
dataType: 1,
materialType: '成品',
itemType: 'product',
status: 0,
orderBy: true
},
labelType: '3',
showStatus: true,
hideType: true,
showLength: true,
canExportAll: true,
showOrderBy: false,
}
}
}
</script>

View File

@@ -43,13 +43,20 @@
<el-table-column label="车牌" align="center" prop="licensePlate" width="100" />
<el-table-column label="收货单位" align="center" prop="consigneeUnit" />
<!-- <el-table-column label="发货单位" align="center" prop="senderUnit" /> -->
<el-table-column label="订单编号" align="center" prop="orderNo" />
<el-table-column label="订单编号" align="center" prop="orderNo">
<template slot-scope="scope">
<span v-if="scope.row.orderId">{{ scope.row.orderCode }}</span>
<span v-else>{{ scope.row.principalPhone }}</span>
</template>
</el-table-column>
<el-table-column label="发货时间" align="center" prop="deliveryTime" width="100">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.deliveryTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="负责人" align="center" prop="principal" width="60" />
<el-table-column label="备注" align="center" prop="remark" width="100" show-overflow-tooltip/>
<!-- <el-table-column label="负责人电话" align="center" prop="principalPhone" width="100" /> -->
<el-table-column label="完成状态" align="center" prop="status" width="120">
<template slot-scope="scope">
@@ -109,9 +116,12 @@
<el-form-item label="负责人" prop="principal">
<el-input v-model="form.principal" placeholder="请输入负责人" />
</el-form-item>
<!-- <el-form-item label="负责人电话" prop="principalPhone">
<el-input v-model="form.principalPhone" placeholder="请输入负责人电话" />
</el-form-item> -->
<el-form-item label="订单编号" prop="principalPhone" v-if="!form.orderId">
<el-input v-model="form.principalPhone" placeholder="请输入订单编号"/>
</el-form-item>
<el-form-item label="订单编号" prop="principalPhone" v-else title="当前发货单已绑定订单">
<el-input v-model="form.orderCode" placeholder="请输入订单编号" readonly disabled/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
@@ -338,7 +348,10 @@ export default {
const waybillId = row.waybillId || this.ids
getDeliveryWaybill(waybillId).then(response => {
this.loading = false;
this.form = response.data;
this.form = {
...response.data,
orderCode: row.orderCode
};
this.open = true;
this.title = "修改发货单";
});

View File

@@ -71,8 +71,8 @@ public class WmsCoilStatisticsSummaryController extends BaseController {
@Log(title = "钢卷生产统计汇总(数据透视结果持久化)", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody WmsCoilStatisticsSummaryBo bo) {
return toAjax(iWmsCoilStatisticsSummaryService.insertByBo(bo));
public R<WmsCoilStatisticsSummaryVo> add(@Validated(AddGroup.class) @RequestBody WmsCoilStatisticsSummaryBo bo) {
return R.ok(iWmsCoilStatisticsSummaryService.insertByBo(bo));
}
/**

View File

@@ -1,13 +1,15 @@
package com.klp.controller;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
import java.util.stream.Collectors;
import com.klp.domain.vo.WmsMaterialCoilExportVo;
import com.klp.domain.vo.WmsMaterialCoilDeliveryExportVo;
import com.klp.domain.vo.WmsMaterialCoilLocationGridVo;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.klp.domain.vo.*;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
@@ -22,7 +24,6 @@ import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.domain.vo.dashboard.CoilTrimStatisticsVo;
import com.klp.domain.vo.dashboard.CategoryWidthStatisticsVo;
@@ -66,7 +67,7 @@ public class WmsMaterialCoilController extends BaseController {
}
/**
* 导出钢卷物料表列表(完整字段版本)
* 导出钢卷物料表列表(精简字段版本)
*/
@Log(title = "钢卷物料表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
@@ -74,6 +75,16 @@ public class WmsMaterialCoilController extends BaseController {
List<WmsMaterialCoilExportVo> list = iWmsMaterialCoilService.queryExportList(bo);
ExcelUtil.exportExcel(list, "钢卷物料表", WmsMaterialCoilExportVo.class, response);
}
/**
* 导出钢卷物料表列表(完整字段版本)
* 导出全部字段
*/
@Log(title = "钢卷物料表", businessType = BusinessType.EXPORT)
@PostMapping("/exportAll")
public void exportSimple(WmsMaterialCoilBo bo, HttpServletResponse response) {
List<WmsMaterialCoilAllExportVo> list = iWmsMaterialCoilService.queryExportListAll(bo);
ExcelUtil.exportExcel(list, "钢卷物料表", WmsMaterialCoilAllExportVo.class, response);
}
/**
* 导出发货报表(按 coilIds联查发货单明细/主表/发货计划)

View File

@@ -46,4 +46,7 @@ public class WmsCoilStatisticsSummary extends BaseEntity {
@TableLogic
private Long delFlag;
// 新增附件字段
private String attachmentInfo;
}

View File

@@ -42,5 +42,8 @@ public class WmsCoilStatisticsSummaryBo extends BaseEntity {
*/
private String remark;
// 新增附件字段
private String attachmentInfo;
}

View File

@@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
@@ -15,7 +16,7 @@ import lombok.Data;
*/
@Data
@ExcelIgnoreUnannotated
public class WmsCoilStatisticsSummaryVo {
public class WmsCoilStatisticsSummaryVo extends BaseEntity {
private static final long serialVersionUID = 1L;
@@ -52,5 +53,7 @@ public class WmsCoilStatisticsSummaryVo {
@ExcelProperty(value = "备注")
private String remark;
// 新增附件字段
private String attachmentInfo;
}

View File

@@ -0,0 +1,193 @@
package com.klp.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 钢卷物料导出VO
*
* @author klp
* @date 2025-11-27
*/
@Data
@ExcelIgnoreUnannotated
public class WmsMaterialCoilAllExportVo {
/**
* 类型(成品/原料)
*/
@ExcelProperty(value = "类型")
private String itemTypeDesc;
/**
* 逻辑库区
*/
@ExcelProperty(value = "逻辑库区")
private String warehouseName;
/**
* 实际库区
*/
@ExcelProperty(value = "实际库区")
private String actualWarehouseName;
/**
* 入场卷号
*/
@ExcelProperty(value = "入场卷号")
private String enterCoilNo;
/**
* 厂家卷号
*/
@ExcelProperty(value = "厂家卷号")
private String supplierCoilNo;
/**
* 成品卷号
*/
@ExcelProperty(value = "成品卷号")
private String currentCoilNo;
/**
* 日期
*/
@ExcelProperty(value = "日期")
private Date createTime;
/**
* 发货时间(仅临时存储,不导出)
*/
@ExcelProperty(value = "发货时间")
private Date exportTime;
// 发货人
@ExcelProperty(value = "发货人")
private String exportBy;
/**
* 重量kg
*/
@ExcelProperty(value = "重量")
private BigDecimal netWeight;
// 班组
private String team;
/**
* 用途
*/
@ExcelProperty(value = "用途")
private String purpose;
/**
* 切边要求
*/
@ExcelProperty(value = "切边要求")
private String trimmingRequirement;
/**
* 包装种类
*/
@ExcelProperty(value = "包装种类")
private String packagingRequirement;
/**
* 产品状态
*/
@ExcelProperty(value = "产品质量")
private String qualityStatus;
/**
* 打包状态
*/
@ExcelProperty(value = "打包状态")
private String packingStatus;
/**
* 库存状态
*/
@ExcelProperty(value = "库存状态")
private String statusDesc;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 名称
*/
@ExcelProperty(value = "名称")
private String itemName;
@ExcelProperty(value = "长度")
private BigDecimal length;
/**
* 规格
*/
@ExcelProperty(value = "规格")
private String specification;
/**
* 材质
*/
@ExcelProperty(value = "材质")
private String material;
/**
* 厂家
*/
@ExcelProperty(value = "厂家")
private String manufacturer;
/**
* 表面处理
*/
@ExcelProperty(value = "表面处理")
private String surfaceTreatmentDesc;
/**
* 锌层
*/
@ExcelProperty(value = "锌层")
private String zincLayer;
/**
* 物品ID
*/
@ExcelProperty(value = "物品ID")
private Long itemId;
/**
* 更新时间(仅临时存储,不导出,用于发货时间为空时兜底)
*/
private Date updateTime;
// 数据类型
@Excel(name = "数据类型", readConverterExp = "0=历史,1=当前")
private Integer dataType;
// 调制度
@ExcelProperty(value = "调制度")
private String temperGrade;
// 镀层种类
@ExcelProperty(value = "镀层种类")
private String coatingType;
// 业务用途
@ExcelProperty(value = "业务用途")
private String businessPurpose;
// 是否与订单相关 readConverterExp
@Excel(name = "是否与订单相关", readConverterExp = "0=否,1=是")
private Integer isRelatedToOrder;
}

View File

@@ -2,6 +2,7 @@ package com.klp.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.Excel;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
@@ -174,4 +175,13 @@ public class WmsMaterialCoilExportVo {
private String temperGrade;
// 镀层种类
private String coatingType;
// 班组
private String team;
// 业务用途
private String businessPurpose;
// 是否与订单相关 readConverterExp
private Integer isRelatedToOrder;
}

View File

@@ -35,7 +35,7 @@ public interface IWmsCoilStatisticsSummaryService {
/**
* 新增钢卷生产统计汇总(数据透视结果持久化)
*/
Boolean insertByBo(WmsCoilStatisticsSummaryBo bo);
WmsCoilStatisticsSummaryVo insertByBo(WmsCoilStatisticsSummaryBo bo);
/**
* 修改钢卷生产统计汇总(数据透视结果持久化)

View File

@@ -1,8 +1,6 @@
package com.klp.service;
import com.klp.domain.vo.WmsMaterialCoilDeliveryExportVo;
import com.klp.domain.vo.WmsMaterialCoilLocationGridVo;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.vo.*;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
@@ -231,5 +229,7 @@ public interface IWmsMaterialCoilService {
String enterCoilNo,
String currentCoilNo,
String manufacturer);
List<WmsMaterialCoilAllExportVo> queryExportListAll(WmsMaterialCoilBo bo);
}

View File

@@ -71,14 +71,14 @@ public class WmsCoilStatisticsSummaryServiceImpl implements IWmsCoilStatisticsSu
* 新增钢卷生产统计汇总(数据透视结果持久化)
*/
@Override
public Boolean insertByBo(WmsCoilStatisticsSummaryBo bo) {
public WmsCoilStatisticsSummaryVo insertByBo(WmsCoilStatisticsSummaryBo bo) {
WmsCoilStatisticsSummary add = BeanUtil.toBean(bo, WmsCoilStatisticsSummary.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setSummaryId(add.getSummaryId());
}
return flag;
return queryById(add.getSummaryId());
}
/**

View File

@@ -2348,7 +2348,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
public List<WmsMaterialCoilExportVo> queryExportList(WmsMaterialCoilBo bo) {
QueryWrapper<WmsMaterialCoil> lqw = buildQueryWrapper(bo);
QueryWrapper<WmsMaterialCoil> lqw = buildQueryWrapperPlus(bo);
List<WmsMaterialCoilExportVo> wmsMaterialCoilExportVos = baseMapper.selectExportList(lqw);
// 遍历数据,根据状态替换日期字段,并处理空值兜底
wmsMaterialCoilExportVos.stream().forEach(vo -> {
@@ -2379,7 +2379,25 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
});
return wmsMaterialCoilExportVos;
}
/**
* 查询钢卷导出数据列表(完整版)
*/
@Override
@Transactional(readOnly = true)
public List<WmsMaterialCoilAllExportVo> queryExportListAll(WmsMaterialCoilBo bo) {
QueryWrapper<WmsMaterialCoil> lqw = buildQueryWrapperPlus(bo);
List<WmsMaterialCoilExportVo> wmsMaterialCoilVos = baseMapper.selectExportList(lqw);
List<WmsMaterialCoilAllExportVo> exportVoList = BeanUtil.copyToList(wmsMaterialCoilVos, WmsMaterialCoilAllExportVo.class);
if (CollectionUtils.isNotEmpty(exportVoList)) {
for (WmsMaterialCoilAllExportVo vo : exportVoList) {
if (Objects.equals(vo.getDataType(), 0)) {
vo.setActualWarehouseName(null);
}
}
}
return exportVoList;
}
/**
* 发货报表导出:按 coilIds 查询钢卷 + 发货单明细/主表/计划联查数据
*/
@@ -2532,86 +2550,6 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
/**
* 构建查询条件
*/
private QueryWrapper<WmsMaterialCoil> buildQueryWrapper(WmsMaterialCoilBo bo) {
QueryWrapper<WmsMaterialCoil> lqw = Wrappers.query();
// 基础字段筛选
lqw.eq(bo.getCoilId() != null, "mc.coil_id", bo.getCoilId());
lqw.eq(StringUtils.isNotBlank(bo.getEnterCoilNo()), "mc.enter_coil_no", bo.getEnterCoilNo());
lqw.like(StringUtils.isNotBlank(bo.getCurrentCoilNo()), "mc.current_coil_no", bo.getCurrentCoilNo());
lqw.like(StringUtils.isNotBlank(bo.getSupplierCoilNo()), "mc.supplier_coil_no", bo.getSupplierCoilNo());
lqw.eq(bo.getDataType() != null, "mc.data_type", bo.getDataType());
lqw.eq(bo.getWarehouseId() != null, "mc.warehouse_id", bo.getWarehouseId());
lqw.eq(bo.getActualWarehouseId() != null, "mc.actual_warehouse_id", bo.getActualWarehouseId());
lqw.eq(StringUtils.isNotBlank(bo.getItemType()), "mc.item_type", bo.getItemType());
lqw.eq(bo.getHasMergeSplit() != null, "mc.has_merge_split", bo.getHasMergeSplit());
// 修改itemId筛选逻辑支持逗号分隔的多个ID查询
if (StringUtils.isNotBlank(bo.getItemIds())) {
String[] itemIdArray = bo.getItemIds().split(",");
List<Long> itemIdList = new ArrayList<>();
for (String itemIdStr : itemIdArray) {
if (StringUtils.isNotBlank(itemIdStr)) {
try {
itemIdList.add(Long.parseLong(itemIdStr.trim()));
} catch (NumberFormatException e) {
// 忽略无效的ID格式
}
}
}
if (!itemIdList.isEmpty()) {
lqw.in("mc.item_id", itemIdList);
}
} else if (bo.getItemId() != null) {
// 兼容原来的itemId单值查询
lqw.eq("mc.item_id", bo.getItemId());
}
// 添加coilIds查询条件支持逗号分隔的多个coilId查询
if (StringUtils.isNotBlank(bo.getCoilIds())) {
String[] coilIdArray = bo.getCoilIds().split(",");
List<Long> coilIdList = new ArrayList<>();
for (String coilIdStr : coilIdArray) {
if (StringUtils.isNotBlank(coilIdStr)) {
try {
coilIdList.add(Long.parseLong(coilIdStr.trim()));
} catch (NumberFormatException e) {
// 忽略无效的ID格式
}
}
}
if (!coilIdList.isEmpty()) {
lqw.in("mc.coil_id", coilIdList);
}
}
lqw.eq(bo.getStatus() != null, "mc.status", bo.getStatus());
lqw.eq(StringUtils.isNotBlank(bo.getMaterialType()), "mc.material_type", bo.getMaterialType());
lqw.eq(StringUtils.isNotBlank(bo.getQualityStatus()), "mc.quality_status", bo.getQualityStatus());
lqw.eq(StringUtils.isNotBlank(bo.getPackingStatus()), "mc.packing_status", bo.getPackingStatus());
// 把team字段作为筛选条件
lqw.eq(StringUtils.isNotBlank(bo.getTeam()), "mc.team", bo.getTeam());
// 根据开始时间和结束时间筛选修改时间
lqw.ge(bo.getStartTime() != null, "mc.update_time", bo.getStartTime());
lqw.le(bo.getEndTime() != null, "mc.update_time", bo.getEndTime());
// 根据发货开始和结束筛选发货时间
lqw.ge(bo.getByExportTimeStart() != null, "mc.export_time", bo.getByExportTimeStart());
lqw.le(bo.getByExportTimeEnd() != null, "mc.export_time", bo.getByExportTimeEnd());
// 逻辑删除
lqw.eq("mc.del_flag", 0);
// 根据创建时间倒序
lqw.orderByDesc("mc.create_time");
return lqw;
}
/**
* 批量更新钢卷发货状态
*

View File

@@ -10,6 +10,7 @@
<result property="statType" column="stat_type"/>
<result property="statJson" column="stat_json"/>
<result property="remark" column="remark"/>
<result property="attachmentInfo" column="attachment_info"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>

View File

@@ -373,10 +373,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
mc.current_coil_no AS currentCoilNo,
-- 日期
mc.create_time AS createTime,
-- 班组
mc.team AS team,
-- 发货时间
mc.export_time AS exportTime,
-- 新增:更新时间(用于发货时间为空时兜底)
mc.update_time AS updateTime,
-- 发货人
mc.export_by AS exportBy,
-- 重量
mc.net_weight AS netWeight,
-- 长度