Compare commits

...

2 Commits

Author SHA1 Message Date
砂糖
5ec293fc94 feat(物料管理): 添加质量状态多选查询功能
在物料管理模块中新增质量状态多选查询功能,包括:
1. 后端添加qualityStatusCsv字段支持多选查询
2. 前端CoilSelector组件增加品质多选下拉框
3. 服务层实现多选条件过滤逻辑
2026-04-02 14:24:52 +08:00
砂糖
d31bd14692 feat(字典组件): 添加DictSelect组件并替换多处muti-select
添加DictSelect组件作为全局组件,并在多个报表模板中替换原有的muti-select组件
优化字典项筛选逻辑,调整样式和提示文本
2026-04-02 09:10:58 +08:00
14 changed files with 69 additions and 40 deletions

View File

@@ -63,6 +63,10 @@
<el-option label="简包" value="简包" /> <el-option label="简包" value="简包" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="品质">
<muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status" placeholder="请选择品质"
clearable />
</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
canSelectDisabled :clearInput="false" clearable /> canSelectDisabled :clearInput="false" clearable />
@@ -179,7 +183,7 @@ export default {
WarehouseBirdMini, WarehouseBirdMini,
DragResizeBox DragResizeBox
}, },
dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer'], dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status'],
props: { props: {
// 非触发器模式下,外部控制显隐(触发器模式下无效) // 非触发器模式下,外部控制显隐(触发器模式下无效)
visible: { visible: {

View File

@@ -20,7 +20,7 @@
<div <div
v-if="editable" v-if="editable"
@click="openDictDialog" @click="openDictDialog"
style="cursor: pointer; height: 24px; width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;" style="cursor: pointer; min-height: 24px; min-width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;"
> >
<i class="el-icon-setting"></i> <i class="el-icon-setting"></i>
</div> </div>
@@ -28,7 +28,7 @@
<div <div
v-if="refresh" v-if="refresh"
@click="handleRefresh" @click="handleRefresh"
style="cursor: pointer; height: 24px; width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;" style="cursor: pointer; min-height: 24px; min-width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;"
> >
<i class="el-icon-refresh"></i> <i class="el-icon-refresh"></i>
</div> </div>
@@ -52,7 +52,7 @@
<el-row :gutter="15"> <el-row :gutter="15">
<el-col :span="kisv ? 24 : 12"> <el-col :span="kisv ? 24 : 12">
<el-form-item label="值/标签" prop="dictValue" v-if="kisv"> <el-form-item label="值/标签" prop="dictValue" v-if="kisv">
<el-input v-model="form.dictValue" placeholder="请输入字典值(标签自动同步)" /> <el-input v-model="form.dictValue" placeholder="请输入字典值,在此处输入用于新增字典项" />
</el-form-item> </el-form-item>
<el-form-item label="字典标签" prop="dictLabel" v-else> <el-form-item label="字典标签" prop="dictLabel" v-else>
<el-input v-model="form.dictLabel" placeholder="请输入字典标签" /> <el-input v-model="form.dictLabel" placeholder="请输入字典标签" />

View File

@@ -47,6 +47,7 @@ import DictData from '@/components/DictData'
import KLPTable from '@/components/KLPUI/KLPTable/index.vue' import KLPTable from '@/components/KLPUI/KLPTable/index.vue'
import MemoInput from '@/components/MemoInput/index.vue' import MemoInput from '@/components/MemoInput/index.vue'
import CurrentCoilNo from '@/components/KLPService/Renderer/CurrentCoilNo.vue' import CurrentCoilNo from '@/components/KLPService/Renderer/CurrentCoilNo.vue'
import DictSelect from '@/components/DictSelect'
// 初始化所有列 // 初始化所有列
import { initAllColumns } from '@/views/wms/report/js/column.js' import { initAllColumns } from '@/views/wms/report/js/column.js'
@@ -76,6 +77,7 @@ Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview) Vue.component('ImagePreview', ImagePreview)
Vue.component('KLPTable', KLPTable) Vue.component('KLPTable', KLPTable)
Vue.component('MemoInput', MemoInput) Vue.component('MemoInput', MemoInput)
Vue.component('DictSelect', DictSelect)
Vue.component('CurrentCoilNo', CurrentCoilNo) Vue.component('CurrentCoilNo', CurrentCoilNo)

View File

@@ -153,12 +153,15 @@ const calcTeamSummary = (list) => {
} }
const calcMSummary = (list, lossList) => { const calcMSummary = (list, lossList) => {
// 统计需要二外处理M卷也就是钢卷的currentCoilNo中带有M的钢卷在统计产出钢卷的数量和重量时需要忽略并记录并且在统计消耗钢卷的总重量时也需要移除 // 统计需要二外处理M卷也就是钢卷的currentCoilNo中带有M, 且M不在前五位的钢卷,在统计产出钢卷的数量和重量时需要忽略并记录,并且在统计消耗钢卷的总重量时也需要移除
function isMcoil(coil) {
return coil.currentCoilNo && coil.currentCoilNo.includes('M') && coil.currentCoilNo.indexOf('M') > 4
}
// 筛选出 M 卷 // 筛选出 M 卷
const mCoils = list.filter(item => item.currentCoilNo && item.currentCoilNo.includes('M')) const mCoils = list.filter(item => isMcoil(item))
// 非 M 卷 // 非 M 卷
const nonMCoils = list.filter(item => !item.currentCoilNo || !item.currentCoilNo.includes('M')) const nonMCoils = list.filter(item => !item.currentCoilNo || !isMcoil(item))
// 非 M 卷作为产出统计 // 非 M 卷作为产出统计
const outCount = nonMCoils.length const outCount = nonMCoils.length

View File

@@ -32,12 +32,11 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质" prop="itemMaterial"> <el-form-item label="材质" prop="itemMaterial">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dictType="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家" prop="itemManufacturer"> <el-form-item label="厂家" prop="itemManufacturer">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dictType="coil_manufacturer" placeholder="请选择厂家" clearable multiple />
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button> <el-button type="primary" @click="handleQuery">查询</el-button>

View File

@@ -28,12 +28,12 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质" prop="itemMaterial"> <el-form-item label="材质" prop="itemMaterial">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dict-type="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家" prop="itemManufacturer"> <el-form-item label="厂家" prop="itemManufacturer">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dict-type="coil_manufacturer"
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择厂家" clearable multiple />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button> <!-- 统一改为handleQuery --> <el-button type="primary" @click="handleQuery">查询</el-button> <!-- 统一改为handleQuery -->
@@ -158,7 +158,7 @@ export default {
default: () => [] default: () => []
} }
}, },
dicts: ['product_coil_status', 'coil_material', 'coil_itemname', 'coil_manufacturer'], dicts: ['product_coil_status', 'coil_itemname'],
data() { data() {
// 工具函数:个位数补零 // 工具函数:个位数补零
const addZero = (num) => num.toString().padStart(2, '0') const addZero = (num) => num.toString().padStart(2, '0')

View File

@@ -31,12 +31,12 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质" prop="endTime"> <el-form-item label="材质" prop="endTime">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dict-type="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家" prop="endTime"> <el-form-item label="厂家" prop="endTime">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dict-type="coil_manufacturer"
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item prop="endTime"> <el-form-item prop="endTime">
<el-button type="primary" @click="getList">查询</el-button> <el-button type="primary" @click="getList">查询</el-button>

View File

@@ -27,12 +27,12 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质" prop="itemMaterial"> <el-form-item label="材质" prop="itemMaterial">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dict-type="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家" prop="itemManufacturer"> <el-form-item label="厂家" prop="itemManufacturer">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dict-type="coil_manufacturer"
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="getList">查询</el-button> <el-button type="primary" @click="getList">查询</el-button>

View File

@@ -28,12 +28,12 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质" prop="itemMaterial"> <el-form-item label="材质" prop="itemMaterial">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dict-type="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家" prop="itemManufacturer"> <el-form-item label="厂家" prop="itemManufacturer">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dict-type="coil_manufacturer"
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button> <el-button type="primary" @click="handleQuery">查询</el-button>

View File

@@ -32,12 +32,12 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质" prop="endTime"> <el-form-item label="材质" prop="endTime">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dict-type="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家" prop="endTime"> <el-form-item label="厂家" prop="endTime">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dict-type="coil_manufacturer"
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item prop="endTime"> <el-form-item prop="endTime">
<el-button type="primary" @click="handleQuery">查询</el-button> <el-button type="primary" @click="handleQuery">查询</el-button>

View File

@@ -38,12 +38,12 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质"> <el-form-item label="材质">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dict-type="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家"> <el-form-item label="厂家">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dict-type="coil_manufacturer"
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button> <el-button type="primary" @click="handleQuery">查询</el-button>

View File

@@ -28,12 +28,12 @@
placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择规格" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="材质" prop="itemMaterial"> <el-form-item label="材质" prop="itemMaterial">
<muti-select style="width: 200px;" v-model="queryParams.itemMaterial" :options="dict.type.coil_material" <dict-select style="width: 200px;" v-model="queryParams.itemMaterial" dict-type="coil_material"
placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择材质" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item label="厂家" prop="itemManufacturer"> <el-form-item label="厂家" prop="itemManufacturer">
<muti-select style="width: 200px;" v-model="queryParams.itemManufacturer" <dict-select style="width: 200px;" v-model="queryParams.itemManufacturer" dict-type="coil_manufacturer"
:options="dict.type.coil_manufacturer" placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" /> placeholder="请选择厂家" clearable @keyup.enter.native="handleQuery" multiple />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button> <el-button type="primary" @click="handleQuery">查询</el-button>

View File

@@ -167,6 +167,11 @@ public class WmsMaterialCoilBo extends BaseEntity {
*/ */
private String qualityStatus; private String qualityStatus;
/**
* 质量状态多选查询
*/
private String qualityStatusCsv;
/** /**
* 切边要求 * 切边要求
*/ */

View File

@@ -485,6 +485,22 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
qw.in("mc.warehouse_id", warehouseIdList.stream().distinct().collect(Collectors.toList())); qw.in("mc.warehouse_id", warehouseIdList.stream().distinct().collect(Collectors.toList()));
} }
List<String> qualityStatusList = new ArrayList<>();
if (StringUtils.isNotBlank(bo.getQualityStatusCsv())) {
String[] qualityStatusArray = bo.getQualityStatusCsv().split(",");
for (String qualityStatusStr : qualityStatusArray) {
if (StringUtils.isNotBlank(qualityStatusStr)) {
try {
qualityStatusList.add(qualityStatusStr.trim());
} catch (NumberFormatException ignore) {
}
}
}
}
if (!qualityStatusList.isEmpty()) {
qw.in("mc.quality_status", qualityStatusList.stream().distinct().collect(Collectors.toList()));
}
// 统一处理 nextWarehouseId 与 nextWarehouseIds // 统一处理 nextWarehouseId 与 nextWarehouseIds
List<Long> nextWarehouseIdList = new ArrayList<>(); List<Long> nextWarehouseIdList = new ArrayList<>();
if (bo.getNextWarehouseId() != null) { if (bo.getNextWarehouseId() != null) {