From 4530c68ea3f172b9e01f3f4eec794955b086dcba Mon Sep 17 00:00:00 2001 From: mkm <727897186@qq.com> Date: Sun, 29 Sep 2024 22:00:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BC=80=E5=8F=91=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84?= =?UTF-8?q?URL=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- src/views/order/beforehand_order/add.vue | 204 +++++++++++++++++ src/views/order/beforehand_order/index.vue | 254 +++++++++++++++++++++ 3 files changed, 459 insertions(+), 1 deletion(-) create mode 100644 src/views/order/beforehand_order/add.vue create mode 100644 src/views/order/beforehand_order/index.vue diff --git a/.env.development b/.env.development index 522e48fce..2eb6f3946 100644 --- a/.env.development +++ b/.env.development @@ -6,6 +6,6 @@ VITE_NOW_TYPE = 'dist' # VITE_APP_BASE_URL='http://192.168.1.10:8546' # VITE_APP_BASE_URL='https://test-multi-store.lihaink.cn' # VITE_APP_BASE_URL='https://multi-store.lihaink.cn' -VITE_APP_BASE_URL='http://192.168.1.22:8545' +VITE_APP_BASE_URL='http://192.168.1.6:8545' # VITE_APP_BASE_URL='https://ceshi-multi-store.lihaink.cn' diff --git a/src/views/order/beforehand_order/add.vue b/src/views/order/beforehand_order/add.vue new file mode 100644 index 000000000..8cb144673 --- /dev/null +++ b/src/views/order/beforehand_order/add.vue @@ -0,0 +1,204 @@ +<template> + <el-card> + <div class="mb-4 text-lg font-bold">商品入库操作</div> + <div> + <el-form ref="formRef" :model="formData" label-width="90px"> + <el-form-item label="总价" prop="total_price"> + <el-input + v-model="formData.total_price" + clearable + placeholder="请输入总价" + :readonly="false" + style="width: 240px" + /> + </el-form-item> + <el-form-item label="备注"> + <el-input v-model="formData.remark" type="input" rows="4" /> + </el-form-item> + <el-form-item label="商品" prop="store_id"> + <div class="flex-1 w-full"> + <div class="mb-2"> + <el-button type="primary" @click="showProduct = true" + >添加商品</el-button + > + </div> + <el-table :data="productList"> + <el-table-column label="商品ID" prop="id" show-overflow-tooltip /> + <el-table-column label="商品图片" prop="image" min-width="80"> + <template #default="{ row }"> + <el-image + style="width: 50px; height: 50px" + :src="row.image" + :preview-teleported="true" + /> + </template> + </el-table-column> + <el-table-column + label="商品名称" + prop="store_name" + min-width="200" + show-overflow-tooltip + /> + <el-table-column + label="单位" + prop="unit_name" + min-width="80" + show-overflow-tooltip + /> + <el-table-column label="数量" min-width="150"> + <template #default="{ row }"> + <el-input v-model="row.nums" @change="handleChange(row)" /> + </template> + </el-table-column> + <el-table-column label="价格" min-width="150"> + <template #default="{ row }"> + <el-input v-model="row.purchases" @change="handleChange(row)" /> + </template> + </el-table-column> + <el-table-column label="总价" min-width="150"> + <template #default="{ row }"> + <el-input v-model="row.total_price" /> + </template> + </el-table-column> + <el-table-column label="操作" width="120" fixed="right"> + <template #default="{ row }"> + <el-button + type="danger" + link + @click="handleDeleteProdut(row.id)" + > + 删除 + </el-button> + </template> + </el-table-column> + </el-table> + </div> + </el-form-item> + <el-form-item label=""> + <el-button @click="handleSubmit" type="primary" class="w-40">提交</el-button> + </el-form-item> + </el-form> + </div> + <el-dialog v-model="showProduct" title="选择商品" width="70%"> + <product-pop @onBindStore="onBindProduct"></product-pop> + </el-dialog> + </el-card> +</template> + +<script lang="ts" setup name="storeProductEdit"> +import { ElMessage, type FormInstance } from 'element-plus' +import useMultipleTabs from '@/hooks/useMultipleTabs' +import { apiStoreProductImport } from '@/api/store_product' +import { timeFormat } from '@/utils/util' +import type { PropType } from 'vue' +import { onMounted } from 'vue' +import { useRouter, useRoute } from 'vue-router' +import { apiWarehouseOrderAdd } from '@/api/warehouse_order' +import { apiWarehouseLists } from '@/api/warehouse' +import { apiSupplierLists } from '@/api/supplier' + +const route = useRoute() +defineProps({ + dictData: { + type: Object as PropType<Record<string, any[]>>, + default: () => ({}) + } +}) +const emit = defineEmits(['success', 'close']) +const formRef = shallowRef<FormInstance>() +const { removeTab } = useMultipleTabs() + +const warehouseList = ref([]) + +// 表单数据 +const formData = reactive({ + total_price: '', + warehouse_id: '', + supplier_id: '', + code: '', + total_price: 0, + remark: '', + outstanding_amount: 0, + completed_amount: 0 +}) + +const warehouse = () => { + apiWarehouseLists({}).then((res) => { + warehouseList.value = res.lists + }) +} + +const showProduct = ref(false) // 选择商品列表是否显示 +// 商品列表 +const productList = ref([]) +// 删除已有商品 +const handleDeleteProdut = (id: number) => { + productList.value = productList.value.filter((item: any) => item.id !== id) +} +// 选择商品 +const onBindProduct = (e: any[]) => { + e.forEach((item: any) => { + if (!productList.value.find((t: any) => t.id == item.id)) { + productList.value.push(item) + } + }) + showProduct.value = false +} +const userloading = ref(false) +const userList = ref([]) +const remoteMethodUser = (e = '') => { + userloading.value = true + apiSupplierLists({ mer_name: e }) + .then((res) => { + userList.value = res.lists + setTimeout(() => { + userloading.value = false + }, 300) + }) + .catch((err) => { + setTimeout(() => { + userloading.value = false + }, 300) + }) +} +function handleChange(row) { + row.total_price = (row.nums * row.purchases).toFixed(2) + if (row.total_price > 0) { + formData.total_price = ( + parseFloat(formData.total_price) + parseFloat(row.total_price) + ).toFixed(2) + } +} + +const router = useRouter() +// 提交按钮 +const handleSubmit = async () => { + const product_arr = productList.value.map((item: any) => { + return { + product_id: item.id, + nums: item.nums, + purchase: item.purchases || 0, + total_price: item.total_price || 0, + manufacture: item.manufacture, + expiration_date: item.expiration_date + } + }) + apiWarehouseOrderAdd({ + product_arr, + ...formData + }).then((res) => { + // removeTab() + // if (res.code == 1) { + // ElMessage.success(res.msg) + setTimeout(() => { + router.push({ + path: '/warehouse/warehouse_order' + }) + }, 2000) + // } else { + // ElMessage.error(res.msg) + // } + }) +} +warehouse() +</script> diff --git a/src/views/order/beforehand_order/index.vue b/src/views/order/beforehand_order/index.vue new file mode 100644 index 000000000..6cbf3b049 --- /dev/null +++ b/src/views/order/beforehand_order/index.vue @@ -0,0 +1,254 @@ +<template> + <div> + <el-card class="!border-none mb-4" shadow="never"> + <el-form class="mb-[-16px]" :model="queryParams" inline> + <el-form-item label="仓库ID" prop="warehouse_id"> + <el-input + class="w-[280px]" + v-model="queryParams.warehouse_id" + clearable + placeholder="请输入仓库" + /> + </el-form-item> + <el-form-item label="供应商" prop="supplier_id"> + <el-select + v-model="queryParams.supplier_id" + filterable + remote + reserve-keyword + placeholder="输入供应商名称搜索" + remote-show-suffix + :remote-method="remoteMethodUser" + :loading="userloading" + style="width: 240px" + > + <el-option + v-for="item in userList" + :key="item.id" + :label="item.mer_name" + :value="item.id" + /> + </el-select> + </el-form-item> + <el-form-item label="日期" prop="create_time"> + <el-date-picker + v-model="startEndTime" + type="daterange" + range-separator="至" + start-placeholder="开始日期" + end-placeholder="结束日期" + unlink-panels + @change="changeStartEndTime" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="resetPage">查询</el-button> + <el-button @click="resetParams">重置</el-button> + <export-data + class="ml-2.5" + :fetch-fun="apiWarehouseOrderLists" + :params="queryParams" + :page-size="pager.size" + /> + </el-form-item> + </el-form> + </el-card> + <el-card class="!border-none" v-loading="pager.loading" shadow="never"> + <router-link + :to="{ + path: 'beforehand_order_add' + }" + class="ml-4" + > + <el-button type="primary"> 入库 </el-button> + </router-link> + <div class="mt-4"> + <el-table :data="pager.lists" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" /> + <el-table-column label="id" prop="id" show-overflow-tooltip width="55" /> + <el-table-column label="操作时间" prop="create_time" show-overflow-tooltip /> + <el-table-column label="仓库" prop="warehouse_name" show-overflow-tooltip /> + <el-table-column label="供应商" prop="supplier_name" show-overflow-tooltip /> + <el-table-column label="单号" prop="code" show-overflow-tooltip /> + <el-table-column label="状态" prop="financial_pm_name" show-overflow-tooltip /> + <el-table-column label="填写人员" prop="admin_name" show-overflow-tooltip /> + <!-- <el-table-column label="批次" prop="batch" show-overflow-tooltip /> --> + <el-table-column label="已结" prop="completed_amount" show-overflow-tooltip /> + <el-table-column label="未结" prop="outstanding_amount" show-overflow-tooltip /> + <el-table-column label="总价格" prop="total_price" show-overflow-tooltip /> + <el-table-column label="备注" prop="mark" show-overflow-tooltip /> + + <el-table-column label="操作" width="120" fixed="right"> + <template #default="{ row }"> + <el-button type="primary" link @click="handleDetai(row)" + >详情</el-button + > + <el-button + v-perms="['warehouse_order.warehouse_order/edit']" + type="primary" + link + @click="handleEdit(row)" + > + 编辑 + </el-button> + <el-button + v-perms="['warehouse_order.warehouse_order/delete']" + type="danger" + link + @click="handleDelete(row.id)" + > + 删除 + </el-button> + </template> + </el-table-column> + </el-table> + </div> + <div class="flex mt-4 justify-end"> + <pagination v-model="pager" @change="getLists" /> + </div> + </el-card> + <!-- <edit-popup + v-if="showEdit" + ref="editRef" + :dict-data="dictData" + @success="getLists" + @close="showEdit = false" + /> + <details-popup + v-if="showDetails" + ref="detailsRef" + @success="getLists" + @close="showDetails = false" + :dictData="dictData" + /> --> + </div> +</template> + +<script lang="ts" setup name="warehouseOrderLists"> +import { usePaging } from '@/hooks/usePaging' +import { useDictData } from '@/hooks/useDictOptions' +import { apiWarehouseOrderLists, apiWarehouseOrderDelete } from '@/api/warehouse_order' +import { timeFormat } from '@/utils/util' +import feedback from '@/utils/feedback' +// import EditPopup from './edit.vue' +// import DetailsPopup from './details.vue' +import { apiSystemStoreLists } from '@/api/system_store' +import moment from 'moment' +import { apiSupplierLists } from '@/api/supplier' +// const editRef = shallowRef<InstanceType<typeof EditPopup>>() +// const detailsRef = shallowRef<InstanceType<typeof DetailsPopup>>() + +// 是否显示编辑框 +const showEdit = ref(false) +const showDetails = ref(false) + +// 查询条件 +const queryParams = reactive({ + warehouse_id: '', + product_name: '', + financial_pm: 1, + store_id: '', + start_time: '', + end_time: '', + supplier_id: '' +}) + +// 选中数据 +const selectData = ref<any[]>([]) + +// 表格选择后回调事件 +const handleSelectionChange = (val: any[]) => { + selectData.value = val.map(({ id }) => id) +} + +// 获取字典数据 +const { dictData } = useDictData('') + +// 分页相关 +const { pager, getLists, resetParams, resetPage } = usePaging({ + fetchFun: apiWarehouseOrderLists, + params: queryParams +}) + +// 添加 +const handleAdd = async () => { + showEdit.value = true + await nextTick() + editRef.value?.open('add') +} + +// 编辑 +const handleEdit = async (data: any) => { + showEdit.value = true + await nextTick() + editRef.value?.open('edit') + editRef.value?.setFormData(data) +} + +// 删除 +const handleDelete = async (id: number | any[]) => { + await feedback.confirm('确定要删除?') + await apiWarehouseOrderDelete({ id }) + getLists() +} +// 详情 +const handleDetai = async (data: any) => { + showDetails.value = true + await nextTick() + detailsRef.value?.open() + detailsRef.value?.getDetail(data) +} +const startEndTime = ref([]) + +const changeStartEndTime = () => { + if (startEndTime.value[0] && startEndTime.value[1]) { + queryParams.start_time = moment(startEndTime.value[0]).format('YYYY-MM-DD') + ' 00:00:00' + queryParams.end_time = moment(startEndTime.value[1]).format('YYYY-MM-DD') + ' 23:59:59' + } else { + queryParams.start_time = '' + queryParams.end_time = '' + } + getLists() +} +const storeloading = ref(false) +const storeList = ref([]) +const remoteMethod = (e = '') => { + storeloading.value = true + apiSystemStoreLists({ + name: e, + page_size: 50 + }) + .then((res) => { + storeList.value = res.lists + setTimeout(() => { + storeloading.value = false + }, 300) + }) + .catch((err) => { + setTimeout(() => { + storeloading.value = false + }, 300) + }) +} + +const userloading = ref(false) +const userList = ref([]) +const remoteMethodUser = (e = '') => { + userloading.value = true + apiSupplierLists({ mer_name: e }) + .then((res) => { + userList.value = res.lists + setTimeout(() => { + userloading.value = false + }, 300) + }) + .catch((err) => { + setTimeout(() => { + userloading.value = false + }, 300) + }) +} +onMounted(() => { + getLists() +}) +</script>