@@ -271,7 +271,8 @@ img { | |||
&:focus, | |||
&:hover { | |||
color: #fff; | |||
background-color: mix(#fff, $--color-primary, 15%); | |||
// background-color: mix(#fff, $--color-primary, 15%); | |||
background-color: rgb(210, 210, 210); | |||
} | |||
} | |||
> .el-menu-item.is-active, | |||
@@ -280,6 +281,7 @@ img { | |||
&:focus, | |||
&:hover { | |||
color: #fff; | |||
background-color: rgb(210, 210, 210); | |||
} | |||
} | |||
.el-menu-item i, | |||
@@ -154,7 +154,7 @@ | |||
@size-change="handleSizeChange" | |||
@current-change="handlePageChange" | |||
:current-page.sync="attrPage" | |||
:page-sizes="[5, 10, 20]" | |||
:page-sizes="[10, 20, 50]" | |||
:page-size="attrSize" | |||
:total="attrTotal" | |||
layout="total, sizes, prev, next"></el-pagination> | |||
@@ -411,7 +411,7 @@ export default { | |||
scrollingContainer: null, | |||
}, | |||
attrPage: 1, | |||
attrSize: 10, | |||
attrSize: 20, | |||
attrTotal: 0, | |||
fileList: [], | |||
imgPreviewDialogVisible: false, | |||
@@ -463,7 +463,7 @@ export default { | |||
dialogVisible: function (val) { | |||
if (!!val) { | |||
this.attrPage = 1; | |||
this.attrSize = 10; | |||
this.attrSize = 20; | |||
} | |||
}, | |||
}, | |||
@@ -10,26 +10,35 @@ | |||
:width="'30%'" | |||
:modal="false" | |||
:fullscreen="false" | |||
:top="'10vh'" | |||
> | |||
:top="'10vh'"> | |||
<!-- :append-to-body="appendToBody"> --> | |||
<div> | |||
<div v-loading="loading"> | |||
<el-form ref="dataForm" :model="dataForm"> | |||
<el-row v-for="(row, rowIndex) in configs.rows" :key="'row_' + rowIndex" :gutter="20"> | |||
<el-col v-for="(col, colIndex) in row" :key="colIndex" :span="col.span ?? 24 / row.length"> | |||
<el-form-item :prop="col.prop" :rules="col.rules || null" :label="col.label"> | |||
<el-input v-if="col.input" v-model="dataForm[col.prop]" clearable :disabled="detailMode" v-bind="col.elparams" /> | |||
<el-input | |||
v-if="col.input" | |||
v-model="dataForm[col.prop]" | |||
clearable | |||
:disabled="detailMode" | |||
v-bind="col.elparams" /> | |||
<el-select | |||
v-if="col.select" | |||
v-model="dataForm[col.prop]" | |||
clearable | |||
:disabled="detailMode" | |||
v-bind="col.elparams" | |||
@change="handleSelectChange(col, $event)" | |||
> | |||
<el-option v-for="(opt, optIdx) in col.options" :key="'option_' + optIdx" :label="opt.label" :value="opt.value"> | |||
@change="handleSelectChange(col, $event)"> | |||
<el-option | |||
v-for="(opt, optIdx) in col.options" | |||
:key="'option_' + optIdx" | |||
:label="opt.label" | |||
:value="opt.value"> | |||
<span>{{ opt.label }}</span> | |||
<span v-if="col.customLabel" style="display: inline-clock; margin-left: 12px; font-size: .9em;">{{ opt[col.customLabel] || '-' }}</span> | |||
<span v-if="col.customLabel" style="display: inline-clock; margin-left: 12px; font-size: 0.9em"> | |||
{{ opt[col.customLabel] || "-" }} | |||
</span> | |||
</el-option> | |||
</el-select> | |||
<el-switch | |||
@@ -38,9 +47,13 @@ | |||
:active-value="1" | |||
:inactive-value="0" | |||
@change="handleSwitchChange" | |||
:disabled="detailMode" /> | |||
<el-input | |||
v-if="col.textarea" | |||
type="textarea" | |||
v-model="dataForm[col.prop]" | |||
:disabled="detailMode" | |||
/> | |||
<el-input v-if="col.textarea" type="textarea" v-model="dataForm[col.prop]" :disabled="detailMode" v-bind="col.elparams" /> | |||
v-bind="col.elparams" /> | |||
<!-- add more... --> | |||
</el-form-item> | |||
</el-col> | |||
@@ -56,9 +69,9 @@ | |||
:key="'operation_' + index" | |||
:type="operate.type" | |||
@click="handleBtnClick(operate)" | |||
:loading="(operate.name === 'add' || operate.name === 'update') && btnLoading" | |||
>{{ operate.label }}</el-button | |||
> | |||
:loading="(operate.name === 'add' || operate.name === 'update') && btnLoading"> | |||
{{ operate.label }} | |||
</el-button> | |||
</template> | |||
<el-button @click="handleBtnClick({ name: 'cancel' })">取消</el-button> | |||
</div> | |||
@@ -99,10 +112,20 @@ export default { | |||
col, | |||
"options", | |||
!col.customLabel | |||
? res.data.list.map((item) => ({ label: item.name, value: item.id })) | |||
: res.data.list.map((item) => ({ label: item.name, value: item.id, [col.customLabel]: item[col.customLabel] })) | |||
? res.data.list.map((item) => ({ label: item[col.optionLabel ?? "name"], value: item.id })) | |||
: res.data.list.map((item) => ({ | |||
label: item[col.optionLabel ?? "name"], | |||
value: item.id, | |||
[col.customLabel]: item[col.customLabel], | |||
})) | |||
); | |||
console.log( | |||
res.data.list.map((item) => ({ | |||
label: item.name, | |||
value: item.id, | |||
[col.customLabel]: item[col.customLabel], | |||
})) | |||
); | |||
console.log(res.data.list.map((item) => ({ label: item.name, value: item.id, [col.customLabel]: item[col.customLabel] }))) | |||
} else { | |||
this.$set(col, "options", []); | |||
} | |||
@@ -111,6 +134,7 @@ export default { | |||
}); | |||
return { | |||
loading: false, | |||
btnLoading: false, | |||
visible: false, | |||
detailMode: false, | |||
@@ -132,7 +156,7 @@ export default { | |||
resetForm(excludeId = false) { | |||
setTimeout(() => { | |||
Object.keys(this.dataForm).forEach((key) => { | |||
console.log(">>> clearing key: ", key); | |||
// console.log(">>> clearing key: ", key); | |||
if (excludeId && key === "id") return; | |||
this.dataForm[key] = null; | |||
}); | |||
@@ -141,7 +165,8 @@ export default { | |||
}, | |||
init(id, isdetail = false) { | |||
console.log("[small dialog] init", id, isdetail); | |||
// console.log("[small dialog] init", id, isdetail); | |||
this.visible = true; | |||
this.detailMode = isdetail; | |||
if (this.$refs.dataForm) this.$refs.dataForm.clearValidate(); | |||
@@ -152,16 +177,22 @@ export default { | |||
if (this.dataForm.id) { | |||
// 如果是编辑 | |||
this.$http.get(this.urls.subase + `/${this.dataForm.id}`).then(({ data: res }) => { | |||
if (res && res.code === 0) { | |||
const dataFormKeys = Object.keys(this.dataForm); | |||
this.dataForm = __pick(res.data, dataFormKeys); | |||
} | |||
this.visible = true; | |||
}); | |||
} else { | |||
// 如果不是编辑 | |||
this.visible = true; | |||
this.loading = true; | |||
this.$http | |||
.get(this.urls.subase + `/${this.dataForm.id}`) | |||
.then(({ data: res }) => { | |||
if (res && res.code === 0) { | |||
const dataFormKeys = Object.keys(this.dataForm); | |||
this.dataForm = __pick(res.data, dataFormKeys); | |||
} else { | |||
throw new Error(res.msg); | |||
} | |||
this.loading = false; | |||
}) | |||
.catch((err) => { | |||
this.loading = false; | |||
this.$message.error(err.message); | |||
}); | |||
} | |||
}); | |||
}, | |||
@@ -139,11 +139,12 @@ export default function () { | |||
props: [ | |||
{ type: "index", label: "序号" }, | |||
{ prop: "material", label: "原料", isEditField: true }, | |||
{ prop: "materialDesc", label: "原料描述", isEditField: true }, | |||
{ prop: "materialName", label: "中文名称", isEditField: true }, | |||
{ width: 130, prop: "qty", label: "配方原料重量", filter: (val) => (!!val ? val + " kg" : "-"), isEditField: true }, | |||
{ width: 130, prop: "sumqty", label: "配方总重量", filter: (val) => (!!val ? val + " kg" : "-"), isEditField: true }, | |||
{ prop: "percent", label: "配比 [%]", filter: (val) => (!!val ? val + " %" : "-"), isEditField: true }, | |||
{ prop: "remark", label: "备注", isEditField: true }, | |||
{ prop: "materialDesc", label: "原料描述", isEditField: true }, | |||
// { prop: "percent", label: "配比 [%]", filter: (val) => (!!val ? val + " %" : "-"), isEditField: true }, | |||
// { prop: "remark", label: "备注", isEditField: true }, | |||
{ prop: "createTime", label: "添加时间", filter: timeFilter }, | |||
{ | |||
prop: "operations", | |||
@@ -169,11 +170,12 @@ export default function () { | |||
[ | |||
{ | |||
select: true, | |||
label: "物料", | |||
label: "原料", | |||
prop: "materialId", | |||
rules: { required: true, message: "必填项不能为空", trigger: "blur" }, | |||
elparams: { placeholder: "请选择物料", filterable: true }, | |||
elparams: { placeholder: "请选择原料", filterable: true }, | |||
options: [], | |||
optionLabel: 'code', | |||
customLabel: 'description', | |||
fetchData: () => this.$http.get("/pms/material/page", { params: { limit: 999, page: 1 } }), | |||
}, | |||
@@ -181,10 +183,10 @@ export default function () { | |||
[ | |||
{ | |||
input: true, | |||
label: "物料重量[kg]", | |||
label: "原料重量[kg]", | |||
prop: "qty", | |||
rules: { required: true, message: "必填项不能为空", trigger: "blur" }, | |||
elparams: { placeholder: "请输入物料重量" }, | |||
elparams: { placeholder: "请输入原料重量" }, | |||
}, | |||
], | |||
[ | |||
@@ -112,7 +112,7 @@ export default { | |||
topBtnConfig: null, | |||
totalPage: 100, | |||
page: 1, | |||
size: 20, // 默认20 | |||
size: 100, // 默认20 | |||
dataList: [], | |||
tableLoading: false, | |||
subdialogVisible: false, | |||
@@ -34,6 +34,7 @@ export default function () { | |||
], | |||
}, | |||
]; | |||
tableProps.defaultPageSize = 100; | |||
const headFormFields = [ | |||
{ | |||
@@ -108,6 +109,7 @@ export default function () { | |||
prop: "materialId", | |||
fetchData: () => this.$http.get("/pms/material/page", { params: { key: '', limit: 999, page: 1 } }), | |||
options: [], | |||
optionLabel: 'code', | |||
customLabel: 'description', | |||
rules: { required: true, message: "必填项不能为空", trigger: "change" }, | |||
elparams: { filterable: true, placeholder: "请选择原料" }, | |||
@@ -3,6 +3,17 @@ | |||
<section class="container-title" style="margin-top: 10px; display: flex; align-items: center"> | |||
<div class="brand-color-line"></div> | |||
<span style="line-height: 20px">料仓料位</span> | |||
<!-- 导航器 --> | |||
<div class="float-right__pagination" style="flex: 1 auto; display:flex; align-items:center; justify-content: flex-end;"> | |||
<el-pagination | |||
@size-change="handleSizeChange" | |||
@current-change="handlePageChange" | |||
:current-page.sync="page" | |||
:page-size.sync="limit" | |||
:page-sizes="[20, 50, 100, 200, 1000]" | |||
:total="totalPage" | |||
layout="total, sizes, prev, pager, next, jumper"></el-pagination> | |||
</div> | |||
</section> | |||
<section class="container-content"> | |||
<div class="dialy-storage" v-if="dailyStorage.length"> | |||
@@ -17,8 +28,7 @@ | |||
padding-left: 16px; | |||
top: 10px; | |||
left: -16px; | |||
" | |||
> | |||
"> | |||
日料仓 | |||
</h3> | |||
<div class="storage-list" style="padding: 12px 0; display: flex; flex-wrap: wrap"> | |||
@@ -31,8 +41,7 @@ | |||
:material="st.material ?? '默认物料'" | |||
:total="2" | |||
:unit-value="st.unitDictValue" | |||
:ratio="st.ratio" | |||
/> | |||
:ratio="st.ratio" /> | |||
</div> | |||
</div> | |||
<div class="middle-storage" v-if="middleStorage.length"> | |||
@@ -47,8 +56,7 @@ | |||
padding-left: 16px; | |||
top: 10px; | |||
left: -16px; | |||
" | |||
> | |||
"> | |||
中间仓 | |||
</h3> | |||
<div class="middle-list" style="padding: 12px 0; display: flex; flex-wrap: wrap"> | |||
@@ -61,8 +69,7 @@ | |||
:material="st.material ?? '默认物料'" | |||
:total="2" | |||
:unit-value="st.unitDictValue" | |||
:ratio="st.ratio" | |||
/> | |||
:ratio="st.ratio" /> | |||
</div> | |||
</div> | |||
<div class="unknown-storage" v-if="unknownStorage.length"> | |||
@@ -77,8 +84,7 @@ | |||
padding-left: 16px; | |||
top: 10px; | |||
left: -16px; | |||
" | |||
> | |||
"> | |||
未知仓 | |||
</h3> | |||
<div class="unknown-list" style="padding: 12px 0; display: flex; flex-wrap: wrap"> | |||
@@ -91,8 +97,7 @@ | |||
:material="st.material ?? '默认物料'" | |||
:total="2" | |||
:unit-value="st.unitDictValue" | |||
:ratio="st.ratio" | |||
/> | |||
:ratio="st.ratio" /> | |||
</div> | |||
</div> | |||
</section> | |||
@@ -108,6 +113,9 @@ export default { | |||
props: {}, | |||
data() { | |||
return { | |||
limit: 100, | |||
page: 1, | |||
totalPage: 0, | |||
middleStorage: [], | |||
dailyStorage: [], | |||
unknownStorage: [], | |||
@@ -123,12 +131,25 @@ export default { | |||
this.unknownStorage.splice(0); | |||
}, | |||
handleSizeChange(val) { | |||
this.page = 1; | |||
this.limit = val; | |||
this.getList(); | |||
}, | |||
handlePageChange(val) { | |||
this.getList(); | |||
}, | |||
getList(storageType) { | |||
this.resetAllStorages(); | |||
const params = storageType ? { limit: this.limit, page: this.page, typeDictValue: storageType } : { limit: this.limit, page: this.page }; | |||
const params = storageType | |||
? { limit: this.limit, page: this.page, typeDictValue: storageType } | |||
: { limit: this.limit, page: this.page }; | |||
this.$http.get("/pms/materialStorageDynamic/page", { params }).then(({ data: res }) => { | |||
if (res.code === 0) { | |||
if ("list" in res.data) { | |||
this.totalPage = res.data.total; | |||
res.data.list.forEach((item) => { | |||
if (item.typeDictValue === "1") { | |||
this.dailyStorage.push(item); | |||
@@ -169,4 +190,8 @@ export default { | |||
background: #0b58ff; | |||
/* position: absolute; */ | |||
} | |||
.float-right__pagination >>> .el-pagination { | |||
margin: 0; | |||
} | |||
</style> |
@@ -105,7 +105,7 @@ export default function () { | |||
label: "工艺编码", | |||
prop: "code", | |||
rules: { required: true, message: "必填项不能为空", trigger: "blur" }, | |||
elparams: { placeholder: "请输入混料程序编码" }, // disabled: true }, | |||
elparams: { placeholder: "请输入混料工艺编码" }, // disabled: true }, | |||
}, | |||
], | |||
// [ | |||
@@ -138,7 +138,7 @@ export default function () { | |||
// { type: 'index', label: '序号' }, | |||
// { prop: "createTime", label: "添加时间", filter: timeFilter }, | |||
{ prop: "name", label: "参数名称", isEditField: true }, | |||
{ prop: "code", label: "参数编码", isEditField: true }, | |||
// { prop: "code", label: "参数编码", isEditField: true }, | |||
// { prop: "specifications", label: "规格", isEditField: true }, | |||
{ width: 80, prop: "value", label: "参数值", isEditField: true }, | |||
// { prop: "valueFloor", label: "参数值下限", isEditField: true }, | |||