123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760 |
- <template>
- <div class="p20">
-
- <el-card class="box-card">
- <el-row>
- <el-col :span="12">
- <el-text class="mx-1">关键词:</el-text>
- <el-input class="width200" placeholder="请输入物品名称" v-model="data.params.keyword"
- @keyup.enter.native="getList"> </el-input>
- <el-button type="primary" class="ml10" @click="getList">
- <el-icon>
- <ele-Search />
- </el-icon>
- 查询
- </el-button>
- </el-col>
- <el-col :span="12" class="tr">
- <el-button type="primary" @click="addPage">添加</el-button>
- <el-button type="danger" @click="deleteMult">批量删除</el-button>
- <el-button type="default" @click="checkAll">查看全部</el-button>
- <el-button type="default" @click="importExcel()">导入</el-button>
- <el-button type="default" @click="exportExcel()">导出</el-button>
- <el-button type="default" @click="enable">启用</el-button>
- <el-button type="default" @click="forbidden">禁用</el-button>
- </el-col>
- </el-row>
- </el-card>
-
- <el-row :gutter="20">
- <el-col :span="16">
- <el-card class="box-card mt20" v-loading="data.loading">
-
- <el-table :data="data.tableData" @selection-change="handleTableDataSelectionChange">
-
- <el-table-column type="selection" width="55" />
- <el-table-column fixed prop="no" label="物品编码" width="150"
- :default-sort="{ prop: 'date', order: 'descending' }" />
- <el-table-column prop="name" label="物品名称" width="150" />
- <el-table-column prop="desc" label="物品介绍" width="" />
- <el-table-column prop="goodClass.name" label="物品类别" width="" />
- <el-table-column prop="unit" label="单位" width="" />
- <el-table-column prop="spec" label="规格" width="" />
- <el-table-column prop="valid" label="是否有效" width="">
- <template #default="scope">
- <el-tag v-if="scope.row.valid == 1">启用</el-tag>
- <el-tag type="danger" v-if="scope.row.valid == 0">禁用</el-tag>
- </template>
- </el-table-column>
- <el-table-column fixed="right" label="操作" width="200">
- <template #default="scope">
- <el-button link type="primary" @click="openDetail(scope.row)">详情</el-button>
- <el-button link type="primary" @click="print(scope.row)">打印</el-button>
- <el-button link type="primary" @click="edit(scope.$index, scope.row)">编辑</el-button>
- <el-button link type="danger" @click="deleteOne(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
-
- <div class="yc_pagebox">
- <el-pagination v-model:current-page="data.pagination.currentPage"
- v-model:page-size="data.pagination.pageSize" :page-sizes="getThemeConfig.pageSizeArray"
- layout="total, sizes, prev, pager, next, jumper" :total="data.pagination.total"
- @size-change="handleSizeChange" @current-change="handleCurrentChange" />
- </div>
- </el-card>
- </el-col>
- <el-col :span="8">
- <el-card class="box-card mt20" v-loading="data.classLoading">
- <div class="class">
- <div class="classFont">物品分类</div>
- <el-button type="primary" @click="addClassPage">新增类别</el-button>
- </div>
- <div class="mt20">
- <el-input class="" placeholder="请输入物品分类名称" v-model="data.classParams.keyword"
- @keyup.enter.native="getClass"> </el-input>
- </div>
-
- <el-table :data="data.tableClassData" style="width: 100%" @row-click="checkproduct">
-
- <el-table-column prop="name" label="分类名称" width="" />
- <el-table-column prop="desc" label="分类说明" width="" />
- <el-table-column fixed="right" label="操作" width="200">
- <template #default="scope">
- <el-button link type="primary"
- @click.stop="classEdit(scope.$index, scope.row)">编辑</el-button>
- <el-button link type="danger" @click.stop="deleteClassOne(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </el-card>
- </el-col>
- </el-row>
-
- <vuecmf-dialog width="1000px" :model_value="data.dialog.show" :title="data.dialog.title" @close="closePage">
- <template #content>
- <el-form :model="newForm" label-width="120px" ref="formRef" v-loading="data.dialog.isLoading">
-
-
- <el-row>
- <el-col :span="12">
- <el-form-item label="物品编码" prop="no"
- :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
- <el-input v-model="newForm.no" placeholder="填写物品代码" />
- </el-form-item></el-col>
- <el-col :span="12">
- <el-form-item label="物品名称" prop="name"
- :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
- <el-input v-model="newForm.name" placeholder="填写物品名称" />
- </el-form-item></el-col>
- </el-row>
- <el-row class="mt20">
- <el-col :span="12">
- <el-form-item label="物品单位" prop="unit">
- <el-input v-model="newForm.unit" placeholder="填写物品单位" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="物品介绍" prop="desc">
- <el-input v-model="newForm.desc" placeholder="填写物品介绍" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row class="mt20">
- <el-col :span="12">
- <el-form-item label="物品规格" prop="spec">
- <el-input v-model="newForm.spec" placeholder="填写物品规格" />
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="物品分类" prop="good_class_id">
- <el-select v-model="newForm.good_class_id" value-key="id" placeholder="选择物品分类">
- <el-option v-for="item in data.region" :key="item.id" :label="item.name"
- :value="item.id" />
- </el-select>
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item class="mt20" label="状态" prop="valid"
- :rules="[{ required: true, message: '请选择状态', trigger: 'blur' }]">
- <el-radio-group v-model="newForm.valid">
- <el-radio :label="1">启用</el-radio>
- <el-radio :label="0">禁用</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
- <div class="height20"></div>
- </template>
- <template #footer>
- <el-button type="default" @click="closePage">取消</el-button>
- <el-button type="primary" @click="submitForm(formRef)">确定</el-button>
- </template>
- </vuecmf-dialog>
-
- <vuecmf-dialog width="1000px" :model_value="data.dialogDetail.showDetail" :title="data.dialogDetail.titleDetail"
- @close="closePage">
- <template #content>
- <el-form :model="newForm" label-width="120px" ref="formRef" v-loading="data.dialogDetail.isLoadingDetail">
-
-
- <el-row>
- <el-col :span="12">
- <el-form-item label="物品编码:" prop="no">
- <el-text class="mx-1">{{ newForm.no }}</el-text>
- </el-form-item></el-col>
- <el-col :span="12">
- <el-form-item label="物品名称:" prop="name">
- <el-text class="mx-1">{{ newForm.name }}</el-text>
- </el-form-item></el-col>
- </el-row>
- <el-row class="mt20">
- <el-col :span="12">
- <el-form-item label="物品单位:" prop="unit">
- <el-text class="mx-1">{{ newForm.unit }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="物品介绍:" prop="desc">
- <el-text class="mx-1">{{ newForm.desc }}</el-text>
- </el-form-item>
- </el-col>
- </el-row>
- <el-row class="mt20">
- <el-col :span="12">
- <el-form-item label="物品规格:" prop="spec">
- <el-text class="mx-1">{{ newForm.spec }}</el-text>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="物品分类:" prop="good_class_id">
- <el-text class="mx-1">{{ newForm.good_class_id }}</el-text>
- </el-form-item>
- </el-col>
- </el-row>
- <el-form-item class="mt20" label="状态:" prop="valid">
- <el-text class="mx-1">{{ newForm.valid == 1 ? "启用" : "禁用" }}</el-text>
- </el-form-item>
- </el-form>
- <div class="height20"></div>
- </template>
- </vuecmf-dialog>
-
- <vuecmf-dialog width="1000px" :model_value="data.classDialog.classShow" :title="data.classDialog.classTitle"
- @close="closePage">
- <template #content>
- <el-form :model="data.form" label-width="120px" ref="formRef" v-loading="data.classDialog.classIsLoading">
-
- <el-form-item label="分类名称" prop="name"> <el-input v-model="data.form.name" placeholder="填写分类名称" />
- </el-form-item>
- <el-form-item label="分类说明" prop="desc"> <el-input v-model="data.form.desc" placeholder="填写分类说明" />
- </el-form-item>
- </el-form>
- <div class="height20"></div>
- </template>
- <template #footer>
- <el-button type="default" @click="closePage">取消</el-button>
- <el-button type="primary" @click="submitClassForm(formRef)">确定</el-button>
- </template>
- </vuecmf-dialog>
- <ImportExcelDialog ref="importExcelDialogRef" @refresh="getTableData()" />
- <ExportExcelDialog ref="exportExcelDialogRef" @refresh="getTableData()" />
- </div>
- </template>
- <script lang="ts" setup>
- import { defineAsyncComponent, onMounted, reactive, computed, ref, watch } from 'vue';
- import { storeToRefs } from 'pinia';
- import { useThemeConfig } from '/@/stores/themeConfig';
- import Good from '/@/api/model/Good';
- import GoodClass from '/@/api/model/GoodClass';
- import { ElMessage, ElMessageBox } from 'element-plus';
- import type { FormInstance, FormRules } from 'element-plus';
- import router from '/@/router';
- const storesThemeConfig = useThemeConfig();
- const { themeConfig } = storeToRefs(storesThemeConfig);
- const getThemeConfig = computed(() => {
- return themeConfig.value;
- });
- const formRef = ref<FormInstance>();
- const multipleSelection = ref([]);
- const data = reactive({
-
- params: {
- pageSize: getThemeConfig.value.pageSize,
- page: 1,
- keyword: '',
- good_class_id: null,
- },
- classParams: {
- pageSize: getThemeConfig.value.pageSize,
- page: 1,
- keyword: '',
- },
-
- pagination: {
- currentPage: 1,
- pageSize: getThemeConfig.value.pageSize,
- total: 100,
- },
- loading: false,
- classPagination: {
- currentPage: 1,
- pageSize: getThemeConfig.value.pageSize,
- total: 100,
- },
- classLoading: false,
- tableData: [],
- tableClassData: [],
-
- dialog: {
- show: false,
- title: '添加',
- isLoading: false,
- type: "edit" as "submit" | "edit"
- },
-
- dialogDetail: {
- showDetail: false,
- titleDetail: '添加',
- isLoadingDetail: false,
- },
-
- classDialog: {
- classShow: false,
- classTitle: '添加',
- classIsLoading: false,
- },
- form: {} as any,
-
- value: '',
-
- region: [] as any,
-
- impparam: {
- date: "",
- keyword: "",
- product_id: "",
- classes_id: "",
- page: 1,
- list_rows: 10,
- is_sort: 0
- },
- });
- watch(() => [data.params.good_class_id, data.params.keyword], (count, prevCount) => {
- data.params.page = 1
- getList();
- }
- )
- const getTableData = () => {
- getList();
- getClass();
- };
- const ImportExcelDialog = defineAsyncComponent(() => import("/@/views/payrollModule/import.vue"));
- const importExcelDialogRef = ref();
- const importExcel = () => {
- importExcelDialogRef.value.openDialog();
- };
- const ExportExcelDialog = defineAsyncComponent(() => import("/@/views/payrollModule/export.vue"));
- const exportExcelDialogRef = ref();
- const exportExcel = () => {
-
- exportExcelDialogRef.value.openDialog(data.impparam);
- };
- const newForm = reactive({
- no: '',
- name: '',
- desc: '',
- unit: '',
- img: '',
- spec: '',
- index: 0,
- good_class_id: '' as number | string,
- valid: 1,
- });
- const newClassForm = () => {
- let form = {
- id: 0,
- name: '',
- desc: '',
- valid: 1,
- };
- return form;
- };
- const enable = async () => {
- const items = multipleSelection.value.map((item: any) => { item.valid = 1; return item });
- let res = await Good.edit(items);
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- ElMessage.success(res.msg);
- getList()
- };
- const forbidden = async () => {
- const items = multipleSelection.value.map((item: any) => { item.valid = 0; return item });
- let res = await Good.edit(items);
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- ElMessage.success(res.msg);
- getList()
- };
- const handleSizeChange = (val: number) => {
- data.params.pageSize = val;
- data.classParams.pageSize = val;
- getList();
- getClass()
- };
- const handleCurrentChange = (val: number) => {
- data.params.page = val;
- getList();
- };
- const search = async () => {
- data.params.page = 1;
- await getList();
- };
- const init = async () => { };
- const getAll = async () => {
- data.loading = true;
- const res = await GoodClass.all();
- data.loading = false;
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- console.log("getAllres", res);
- data.region = res.data
- console.log("data.region", data.region);
- };
- const getClass = async () => {
- data.classLoading = true;
- const res = await GoodClass.list({
- pageParams: {
- page: data.classParams.page,
- size: data.classParams.pageSize,
- },
- keyword: data.classParams.keyword
- });
- data.classLoading = false;
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- console.log("getClass", res);
- data.tableClassData = res.data.data;
-
-
-
-
- };
- const checkAll = async () => {
- data.params.good_class_id = null
- getList();
- };
- const checkproduct = async (row: any) => {
- console.log("check", row.id);
- data.params.good_class_id = row.id;
- };
- const getList = async () => {
- data.loading = true;
- const res = await Good.list({
- pageParams: {
- page: data.params.page,
- size: data.params.pageSize,
- },
- keyword: data.params.keyword,
- good_class_id: data.params.good_class_id
- });
- data.loading = false;
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- data.tableData = res.data.data;
-
- data.pagination.total = res.data.total;
- data.pagination.currentPage = res.data.current_page;
- data.pagination.pageSize = res.data.per_page;
- };
- const handleTableDataSelectionChange = (val: any) => {
- multipleSelection.value = val;
- console.log('lzj500🚀 ~ file: index.vue:203 ~ handleTableDataSelectionChange ~ val:', val);
- };
- const closePage = () => {
- data.dialog.show = false;
- data.dialogDetail.showDetail = false;
- data.classDialog.classShow = false;
- };
- const addClassPage = () => {
- data.classDialog.classShow = true;
- data.classDialog.classTitle = '添加分类';
- data.form = newClassForm();
- console.log('lzj500🚀 ~ file: index.vue:160 ~ addPage ~ dialog:', data.classDialog);
- };
- const addPage = async () => {
- await getAll();
- data.dialog.show = true;
- data.dialog.title = '添加物品';
- data.dialog.type = "submit";
- newForm.no = '';
- newForm.desc = '';
- newForm.good_class_id = '';
- newForm.img = '';
- newForm.unit = '';
- newForm.valid = 1;
- newForm.spec = '';
- newForm.name = '';
- console.log('lzj500🚀 ~ file: index.vue:160 ~ addPage ~ dialog:', data.dialog);
- };
- const classEdit = async (index: number, item: any) => {
- data.classDialog.classShow = true;
- data.classDialog.classTitle = '编辑分类';
- data.form = item;
- };
- const edit = async (index: number, item: any) => {
- data.dialog.show = true;
- data.dialog.title = '编辑物品';
- data.dialog.type = "edit";
- newForm.no = item.no;
- newForm.desc = item.desc;
- newForm.good_class_id = item.good_class_id;
- newForm.img = item.img;
- newForm.unit = item.unit;
- newForm.valid = item.valid;
- newForm.spec = item.spec;
- newForm.name = item.name;
- newForm.index = item.id;
-
- };
- const openDetail = async (item: any) => {
- console.log("itemitem", item);
- data.dialogDetail.showDetail = true;
- data.dialogDetail.titleDetail = '仓库详情';
- newForm.no = item.no;
- newForm.desc = item.desc;
- newForm.good_class_id = item.goodClass.name;
- newForm.img = item.img;
- newForm.unit = item.unit;
- newForm.valid = item.valid;
- newForm.spec = item.spec;
- newForm.name = item.name;
- newForm.index = item.id;
- };
- const print = (item: any) => {
-
-
-
-
- router.push({ name: 'printGood', query: { no: item.no, name: item.name } });
- };
- const submitClassForm = (formEl: FormInstance | undefined) => {
- if (!formEl) return;
- formEl.validate(async (valid) => {
- if (!valid) {
- console.log('error submit!');
- return false;
- }
-
- let res = null;
- data.classDialog.classIsLoading = true;
- if (data.form?.id) {
-
- res = await GoodClass.edit(data.form);
- } else {
- res = await GoodClass.add(data.form);
- }
- data.classDialog.classIsLoading = false;
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- ElMessage.success(res.msg);
- await getClass();
- search();
- closePage();
- });
- };
- const submitForm = (formEl: FormInstance | undefined) => {
- if (!formEl) return;
- formEl.validate(async (valid) => {
- if (!valid) {
- console.log('error submit!');
- return false;
- }
- let res = null;
- data.dialog.isLoading = true;
- console.log("🚀 ~ file: good.vue:638 ~ formEl.validate ~ newForm:", newForm)
- if (data.dialog.type == "edit") {
-
- res = await Good.edit([{
- id: newForm.index,
- no: newForm.no,
- name: newForm.name,
- img: newForm.img,
- spec: newForm.spec,
- valid: newForm.valid,
- unit: newForm.unit,
- desc: newForm.desc,
- good_class_id: newForm.good_class_id,
- }])
- } else {
- res = await Good.add(newForm);
- }
- data.dialog.isLoading = false;
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- ElMessage.success(res.msg);
- search();
- closePage();
- });
- };
- const deleteClassOne = (item: any) => {
- ElMessageBox.confirm('删除后不可恢复,确定要删除该记录吗?', '警告', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- })
- .then(() => {
- doClassDelete(item.id);
- })
- .catch(() => { });
- };
- const deleteOne = (item: any) => {
- ElMessageBox.confirm('删除后不可恢复,确定要删除该记录吗?', '警告', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- })
- .then(() => {
- doDelete([item.id]);
- })
- .catch(() => { });
- };
- const deleteMult = (item: any) => {
- if (multipleSelection.value.length == 0) {
- ElMessage.error('请选择要删除的记录');
- return;
- }
- let ids = multipleSelection.value.map((item: any) => item.id);
- ElMessageBox.confirm('删除后不可恢复,确定要删除选中记录吗?', '警告', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- })
- .then(() => {
- doDelete(ids);
- })
- .catch(() => { });
- };
- const doClassDelete = async (id: any) => {
- data.loading = true;
- let res = await GoodClass.delete({ id });
- data.loading = false;
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- await getClass();
- };
- const doDelete = async (id: any) => {
- data.loading = true;
- let res = await Good.delete({ id });
- data.loading = false;
- if (res.code != 0) {
- ElMessage.error(res.msg);
- return;
- }
- await getList();
- };
- onMounted(async () => {
- getList();
- getClass();
- getAll();
- init();
- });
- </script>
- <style>
- .class {
- display: flex;
- align-items: center;
- justify-content: space-between;
- }
- .classFont {
- color: #31373D;
- font-size: 14px;
- font-weight: bold;
- }
- .active {
- color: blue;
- }
- </style>
|