feat(钢卷管理): 添加钢卷统计功能并优化仓库选择排序

新增钢卷统计接口和展示总净重功能
优化仓库选择组件,按使用频率排序选项
调整钢卷选择器布局和样式
This commit is contained in:
2026-04-17 09:55:27 +08:00
parent edcbf7a5f1
commit 8dbb7d1113
3 changed files with 62 additions and 9 deletions

View File

@@ -390,3 +390,11 @@ export function listTypeErrorCoil() {
timeout: 600000 timeout: 600000
}) })
} }
export function getCoilStatisticsList(params) {
return request({
url: '/wms/materialCoil/statisticsList',
method: 'get',
params,
})
}

View File

@@ -27,7 +27,7 @@
<el-option label="原料" value="raw_material" /> <el-option label="原料" value="raw_material" />
</el-select> </el-select>
</el-form-item> --> </el-form-item> -->
<el-form-item label="入场卷号"> <el-form-item label="入场卷号">
<el-input v-model="queryParams.enterCoilNo" placeholder="请输入入场卷号" clearable size="small" <el-input v-model="queryParams.enterCoilNo" placeholder="请输入入场卷号" clearable size="small"
@keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
@@ -74,8 +74,8 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="品质"> <el-form-item label="品质">
<muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status" placeholder="请选择品质" <muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status"
clearable /> placeholder="请选择品质" clearable />
</el-form-item> </el-form-item>
<el-form-item label="实际库区" v-if="orderBy"> <el-form-item label="实际库区" v-if="orderBy">
<actual-warehouse-select v-model="queryParams.actualWarehouseId" placeholder="请选择实际库区" canSelectLevel2 <actual-warehouse-select v-model="queryParams.actualWarehouseId" placeholder="请选择实际库区" canSelectLevel2
@@ -86,7 +86,8 @@
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button> <el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
<el-checkbox v-if="orderBy" style="margin-left: 10px;" v-model="showCoilMap" size="small">显示钢卷地图</el-checkbox> <el-checkbox v-if="orderBy" style="margin-left: 10px;" v-model="showCoilMap" size="small">显示钢卷地图</el-checkbox>
<el-checkbox v-if="orderBy && orderId" style="margin-left: 10px;" v-model="showOrderInfo" size="small">显示订单详情</el-checkbox> <el-checkbox v-if="orderBy && orderId" style="margin-left: 10px;" v-model="showOrderInfo"
size="small">显示订单详情</el-checkbox>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -122,8 +123,15 @@
</div> </div>
<!-- 分页 --> <!-- 分页 -->
<pagination v-if="!rangeMode" v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" <div style="display: flex; justify-content: flex-end; align-items: flex-end; gap: 10px;">
:limit.sync="queryParams.pageSize" @pagination="getList" /> <span>
总净重{{ coilTrimStatistics.total_net_weight || 0 }}t
</span>
<pagination v-if="!rangeMode" v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
</div>
<div v-if="multiple && selectedCoils.length > 0" class="selected-stats"> <div v-if="multiple && selectedCoils.length > 0" class="selected-stats">
<div class="stats-content"> <div class="stats-content">
@@ -181,7 +189,7 @@
</template> </template>
<script> <script>
import { listMaterialCoil } from '@/api/wms/coil'; import { listMaterialCoil, getCoilStatisticsList } from '@/api/wms/coil';
import { listActualWarehouse } from "@/api/wms/actualWarehouse"; import { listActualWarehouse } from "@/api/wms/actualWarehouse";
import { treeActualWarehouseTwoLevel } from "@/api/wms/actualWarehouse"; import { treeActualWarehouseTwoLevel } from "@/api/wms/actualWarehouse";
import MemoInput from '@/components/MemoInput/index.vue'; import MemoInput from '@/components/MemoInput/index.vue';
@@ -312,6 +320,7 @@ export default {
treeProps: { label: "actualWarehouseName", children: "children" }, treeProps: { label: "actualWarehouseName", children: "children" },
treeLoading: false, treeLoading: false,
showOrderInfo: false, showOrderInfo: false,
coilTrimStatistics: {},
}; };
}, },
computed: { computed: {
@@ -503,6 +512,11 @@ export default {
queryPayload.saleId = this.currentUserId; queryPayload.saleId = this.currentUserId;
} }
const response = await listMaterialCoil(queryPayload); const response = await listMaterialCoil(queryPayload);
const { pageNum, pageSize, excludeBound, orderBy, ...noPager } = queryPayload;
getCoilStatisticsList(noPager).then((res) => {
console.log('钢卷统计数据:', res);
this.coilTrimStatistics = res.data || {};
});
if (response.code === 200) { if (response.code === 200) {
this.coilList = response.rows || []; this.coilList = response.rows || [];
this.total = response.total || 0; this.total = response.total || 0;

View File

@@ -74,8 +74,10 @@ export default {
console.log('仓库API返回数据:', response); console.log('仓库API返回数据:', response);
const data = response.data || []; const data = response.data || [];
console.log('处理后的数据:', data); console.log('处理后的数据:', data);
this.warehouseOptions = this.buildTreeOptions(data); let options = this.buildTreeOptions(data);
console.log('构建的树形选项:', this.warehouseOptions); options = this.sortOptionsByUsage(options);
this.warehouseOptions = options;
console.log('构建并排序后的树形选项:', this.warehouseOptions);
}).catch(error => { }).catch(error => {
console.error("加载仓库选项失败:", error); console.error("加载仓库选项失败:", error);
this.warehouseOptions = []; this.warehouseOptions = [];
@@ -106,7 +108,36 @@ export default {
return options; return options;
}, },
getWarehouseUsage() {
try {
const usage = localStorage.getItem('warehouseUsage');
return usage ? JSON.parse(usage) : {};
} catch (error) {
console.error('获取仓库使用记录失败:', error);
return {};
}
},
updateWarehouseUsage(warehouseId) {
try {
const usage = this.getWarehouseUsage();
usage[warehouseId] = (usage[warehouseId] || 0) + 1;
localStorage.setItem('warehouseUsage', JSON.stringify(usage));
} catch (error) {
console.error('更新仓库使用记录失败:', error);
}
},
sortOptionsByUsage(options) {
const usage = this.getWarehouseUsage();
return options.sort((a, b) => {
const usageA = usage[a.warehouseId] || 0;
const usageB = usage[b.warehouseId] || 0;
return usageB - usageA;
});
},
onChange(val) { onChange(val) {
if (val) {
this.updateWarehouseUsage(val);
}
this.$emit('input', val); this.$emit('input', val);
this.$emit('change', val); this.$emit('change', val);
} }