Merge remote-tracking branch 'origin/main'

This commit is contained in:
牛子源 2025-05-14 16:31:44 +08:00
commit 3340e5f3fd
9 changed files with 359 additions and 73 deletions

View File

@ -20,7 +20,7 @@
<div class="container">
<div class="tabs">
<span v-for="(item,index) in statusList " :key="index" :class="query.status == item.value ? 'tabs-item' : ''"
@click="tab(item)">{{ item.label }}&nbsp;{{ item.num }}
@click="tab(item)">{{ item.label }}&nbsp;({{ item.num }})
</span>
</div>
<div class="search">

View File

@ -46,12 +46,6 @@
width: 140px;
height: 50px;
position: relative;
span {
display: inline-block;
height: 50px;
}
&::before {
content: '';
display: inline-block;

View File

@ -1,7 +1,6 @@
<template>
<div style="position: fixed; z-index: 99999;">
<Mask :height="700" :width="900" :is-show="show">
<CloseBtn @click="show = false"></CloseBtn>
<Mask :height="700" :width="900" :is-show="show" @close="show =false">
<el-card>
<template #header>
<div class="header">追溯码采集</div>

View File

@ -14,7 +14,19 @@
</el-col>
<el-col :span="6">
<el-form-item label="采购人">
<el-input style="width: 234px;" disabled v-model="userInfo.name"></el-input>
<el-select
v-model="inventory_order_data.managerUserId"
placeholder="选择采购人"
clearable
style="width: 240px"
>
<el-option
v-for="item in managerUserList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
@ -42,7 +54,7 @@
</el-col>
<el-col :span="6">
<el-form-item prop="supplierId" label="供应商" :rules="formRules.supplierId">
<el-select style="width: 234px;" v-model="inventory_order_data.supplierId" placeholder="请选择供应商">
<el-select style="width: 130px;margin-right: 10px" v-model="inventory_order_data.supplierId" placeholder="请选择供应商">
<el-option
v-for="item in supplier_list"
:key="item.id"
@ -50,6 +62,7 @@
:value="item.id"
/>
</el-select>
<el-button type="primary" @click="addSupplier">添加供应商</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
@ -163,10 +176,11 @@
</div>
</template>
</Mask>
<AddSupplier ref="addSupplierRef" @close="getSupplierList"></AddSupplier>
<!-- <Mask :is-show="is_add" :top="100">-->
<!-- <Edit ref="editRef" @close="is_add = false;"/>-->
<!-- </Mask>-->
<CheckoutDetail ref="checkoutDetailRef" @confirm="confirmTrace"></CheckoutDetail>
<CheckoutDetail ref="checkoutDetailRef" @confirm="confirmTrace"></CheckoutDetail>
</template>
<script lang="ts" setup>
@ -175,6 +189,7 @@ import {post} from '@/utils/request.ts'
import Edit from "@/components/inventory/goods/Edit.vue";
import Mask from "@/components/common/Mask.vue";
import {ElMessage} from "element-plus";
import AddSupplier from "@/components/inventory/supplier/AddSupplier.vue";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import CheckoutDetail from "@/components/inventory/CheckoutDetail.vue";
import {Search} from "@element-plus/icons-vue";
@ -195,8 +210,8 @@ let inventory_order_data = ref({
managerUserId: null,
kindConut: 0,
totalPrice: 0,
shippingCode: null,
invoiceCode: null,
shippingCode: "-",
invoiceCode: "-",
inventoryOrderGoodsList: []
})
const checkProductionDate = (row: any) => {
@ -245,6 +260,11 @@ const getTotalPrice = () => {
const emit = defineEmits(['close'])
let exit = () => {
isShow.value = false
initInventoryOrderData()
table_list.value = []
emit('close')
}
const initInventoryOrderData = () => {
inventory_order_data.value = {
code: null,
purchaseDate: getFormattedDate(),
@ -254,12 +274,10 @@ let exit = () => {
managerUserId: null,
kindConut: 0,
totalPrice: 0,
shippingCode: null,
invoiceCode: null,
shippingCode: "-",
invoiceCode: "-",
inventoryOrderGoodsList: []
}
table_list.value = []
emit('close')
}
const table_list: any = ref([])
@ -281,7 +299,6 @@ let confirm = async () => {
//
inventory_order_data.value.kindConut = table_list.value.length;
inventory_order_data.value.managerUserId = userInfo.value.id;
//
if (table_list.value.length === 0) {
@ -355,6 +372,7 @@ const userInfo = ref<any>({})
const getUserInfo = () => {
post("manager/user/verify", null).then((res: any) => {
userInfo.value = res
inventory_order_data.value.managerUserId = res.id
})
}
const removeTableRow = (row: any) => {
@ -367,7 +385,16 @@ const removeTableRow = (row: any) => {
const init = () => {
isShow.value = true
getSupplierList()
getManagerUserList()
getUserInfo()
}
const managerUserList: any = ref([])
const getManagerUserList = () => {
post("manager/user/list", {
}).then((res: any) => {
managerUserList.value = res
})
}
//
const openCheckoutDetail = (row: any) => {
@ -389,6 +416,12 @@ const confirmTrace = (data: any) => {
// }
// })
}
const addSupplierRef = ref()
const addSupplier = () => {
nextTick(() => {
addSupplierRef.value?.addInit();
})
}
defineExpose({init})
</script>
<style scoped lang="scss">

View File

@ -1,5 +1,5 @@
<template>
<Mask :width="1200" :is-show="isShow" @close="exit"
<Mask :width="1200" :is-show="isShow" @close="exit"
title="编辑" :height="720" :show-footer="true">
<div class="edit-panel" v-loading="isLoading" element-loading-text="正在保存......">
<div class="top">
@ -14,7 +14,21 @@
</el-col>
<el-col :span="6">
<el-form-item label="采购人">
<span style="width: 234px;" class="order-info">{{ inventory_order_data.managerUserName }}</span>
<el-select
v-if="orderInfoIsEdit"
v-model="inventory_order_data.managerUserId"
placeholder="选择采购人"
clearable
style="width: 240px"
>
<el-option
v-for="item in managerUserList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<span style="width: 234px;" class="order-info" v-else>{{ inventory_order_data.managerUserName }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
@ -52,7 +66,7 @@
v-model="inventory_order_data.supplierId"
placeholder="请选择供应商"
v-if="orderInfoIsEdit"
style="width: 234px;"
style="width: 130px;margin-right: 10px"
>
<el-option
v-for="item in supplier_list"
@ -61,7 +75,8 @@
:value="item.id"
/>
</el-select>
<span style="width: 234px;" class="order-info" v-else>{{ inventory_order_data.supplierName }}</span>
<el-button v-if="orderInfoIsEdit" type="primary" @click="addSupplier">添加供应商</el-button>
<span style="width: 234px;" class="order-info" v-if="!orderInfoIsEdit">{{ inventory_order_data.supplierName }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
@ -192,8 +207,8 @@
</template>
</Mask>
<Mask :is-show="is_add" >
<AddSupplier ref="addSupplierRef" @close="getSupplierList"></AddSupplier>
<Mask :is-show="is_add">
<Edit ref="editRef" @close="is_add = false;"/>
</Mask>
@ -207,6 +222,7 @@ import Mask from "@/components/common/Mask.vue";
import {ElMessage, ElMessageBox} from "element-plus";
import GoodsSearch from "@/components/inventory/GoodsSearch.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import AddSupplier from "@/components/inventory/supplier/AddSupplier.vue";
const props = defineProps({
code: {
@ -303,7 +319,9 @@ const init = (e: any) => {
code.value = e
isShow.value = true
getSupplierList()
getManagerUserList()
getOrderDetail()
}
const getTotalPrice = () => {
let totalPrice = 0;
@ -362,6 +380,13 @@ const addOneGoods = (row: any) => {
}
)
}
const managerUserList: any = ref([])
const getManagerUserList = () => {
post("manager/user/list", {}).then((res: any) => {
managerUserList.value = res
})
}
const checkValue = (data: any) => {
let msg = null;
if (data.wholeNumber == 0) {
@ -397,7 +422,13 @@ const goodsSelectCallBack = (inventory: any) => {
getTotalPrice()
}, 200)
}
const addSupplierRef = ref();
const addSupplier = () => {
nextTick(() => {
addSupplierRef.value?.addInit()
})
}
defineExpose({init})
</script>
<style scoped lang="scss">
@ -439,6 +470,7 @@ defineExpose({init})
.active {
background-color: red;
}
.edit-panel {
height: 562px;
padding: 24px 24px 0;
@ -471,6 +503,7 @@ defineExpose({init})
}
}
}
.bottom {
height: 86px;
display: flex;

View File

@ -61,6 +61,11 @@ const reciceMessage = (response: Response) => {
}
const errorCallback = () => {
emit('changeLoading', false)
ElMessage({
message: "读卡器连接失败",
duration: 1000,
type: 'error',
});
}
const emit = defineEmits(['socialCardUpdate', 'close', 'changeLoading'])
@ -82,14 +87,6 @@ const getInfoFor1101 = (params: any) => {
duration: 1000,
});
emit('socialCardUpdate', socialCard.value)
}).catch((err:any) => {
isReading.value = false;
emit('changeLoading', false)
ElMessage({
message: "读取失败",
duration: 1000,
type: 'error',
});
})
}

View File

@ -1,7 +1,6 @@
<template>
<div class="layout-container">
<Header class="header"/>
<header>
<div class="center-wrapper">
<div class="childMenu">
@ -11,8 +10,6 @@
</div>
</div>
</header>
<div class="space"></div>
<main class="layout-main">
<router-view/>

View File

@ -5,19 +5,22 @@
<div class="left">
<el-form :inline="true" :model="searchModel">
<el-form-item>
<el-input placeholder="请输入名称"
<el-input placeholder="名称/首字母/批准文号/条形码/标识码"
clearable
v-model="searchModel.keyword"
style="width: 290px;height: 42px"
@input="searchGoods"
>
<template #prefix>
<el-icon><Search /></el-icon>
<el-icon>
<Search/>
</el-icon>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-cascader style="width: 180px;height: 42px" :options="allCateList" :show-all-levels="false" v-model="searchModel.cateId" clearable/>
<el-cascader style="width: 180px;height: 42px" :options="allCateList" :show-all-levels="false"
v-model="searchModel.cateId" clearable/>
</el-form-item>
<el-form-item>
<el-select
@ -37,7 +40,8 @@
</el-select>
</el-form-item>
<el-form-item style="margin-right: 0">
<el-input placeholder="最低毛利率" v-model="searchModel.minInterestRate" style="width: 100px;height: 42px">
<el-input placeholder="最低毛利率" v-model="searchModel.minInterestRate"
style="width: 100px;height: 42px">
<template #suffix>
<el-icon class="el-input__icon">%</el-icon>
</template>
@ -47,21 +51,32 @@
</el-icon>
</el-form-item>
<el-form-item>
<el-input placeholder="最高毛利率" v-model="searchModel.maxInterestRate" style="width: 100px;height: 42px">
<el-input placeholder="最高毛利率" v-model="searchModel.maxInterestRate"
style="width: 100px;height: 42px">
<template #suffix>
<el-icon class="el-input__icon">%</el-icon>
</template>
</el-input>
</el-form-item>
</el-form>
<div class="btn">
<div @click="searchGoods">搜索</div>
<div @click="resetSearch">重置</div>
</div>
</div>
<div class="right">
<el-checkbox v-model="inventoryNumber" label="不看0库存" size="large" @change="searchGoods"/>
<el-checkbox v-model="status" label="不看已停用" size="large" @change="searchGoods"/>
<div class="btn-group">
<div class="left">
<el-checkbox v-model="inventoryNumber" label="不看0库存" size="large" @change="searchGoods"/>
<el-checkbox v-model="status" label="不看已停用" size="large" @change="searchGoods"/>
</div>
<div class="btn" @click="resetSearch">
<el-icon style="margin-right: 10px">
<Refresh/>
</el-icon>
重置
</div>
<div class="btn" @click="searchGoods">
<el-icon style="margin-right: 10px">
<Search/>
</el-icon>
搜索
</div>
</div>
</div>
<div class="addBtn">
@ -72,7 +87,8 @@
</div>
</div>
<div class="content_goods" ref="content">
<el-table :data="tableData" style="width: 100%;height: 100%;padding: 0 24px" @row-click="openMack" :header-cell-style="{ backgroundColor: '#F1F5FB' }">
<el-table :data="tableData" style="width: 100%;height: 100%;padding: 0 24px" @row-click="openMack"
:header-cell-style="{ backgroundColor: '#F1F5FB' }">
<el-table-column fixed prop="name" label="名称" width="200" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.name }}{{ scope.row.commonName ? "(" + scope.row.commonName + ")" : "" }}
@ -152,11 +168,6 @@
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" width="100" show-overflow-tooltip/>
<el-table-column label="医保类别">
<template #default="scope">
{{ getTypeName(scope.row.type) }}
</template>
</el-table-column>
</el-table>
</div>
<div class="bottom">
@ -181,7 +192,7 @@
</div>
</div>
<Edit ref="editRef" @close="is_add = false;init()"/>
<Mask :isShow="open" :height="600" @close="open = false" title="编辑">
<Mask :isShow="open" :height="600" @close="open = false" title="编辑">
<el-tabs v-model="activeName" @tab-change="changeTab">
<el-tab-pane label="商品信息" name="first">
<Edit ref="editRef" @close="open = false;init()"/>
@ -204,7 +215,8 @@ import Edit from "@/components/inventory/goods/Edit.vue";
import InventoryBatchDetail from "@/components/inventory/goods/InventoryBatchDetail.vue";
import InventoryStatistics from "@/components/inventory/goods/InventoryStatistics.vue";
import CloseBtn from "@/components/CloseBtn.vue";
import {Search, SemiSelect} from "@element-plus/icons-vue";
import {Search, SemiSelect, Refresh} from "@element-plus/icons-vue";
const statisticsData = ref<any>({})
const inventoryNumber = ref(false)
const status = ref(false)
@ -431,7 +443,7 @@ const getStatisticsData = () => {
flex-direction: column;
.top {
height: 157px;
height: 144px;
padding: 24px 24px 0;
background: #fff;
display: flex;
@ -468,6 +480,12 @@ const getStatisticsData = () => {
color: #4D6DE4;
text-align: center;
line-height: 42px;
cursor: pointer;
&:hover {
background: #4D6DE4;
color: #fff;
border: none;
}
}
}
}
@ -499,10 +517,34 @@ const getStatisticsData = () => {
.tags {
margin-left: 5px;
}
:deep(.el-cascader .el-input){
:deep(.el-cascader .el-input) {
height: 42px;
}
:deep(.el-select__wrapper){
:deep(.el-select__wrapper) {
height: 42px;
}
.btn-group {
display: flex;
.btn {
width: 120px;
height: 42px;
background: #FFFFFF;
border-radius: 6px;
border: 1px solid #979797;
display: flex;
justify-content: center;
align-items: center;
margin-left: 24px;
cursor: pointer;
&:hover {
background: #4D6DE4;
color: #fff;
border: none;
}
}
}
</style>

View File

@ -1,37 +1,111 @@
<template>
<div class="container-wrapper">
<div class="top">
<el-dropdown>
<el-button type="primary" :icon="Plus" @click="openAdd">新增采购</el-button>
</el-dropdown>
<div class="search">
<div class="left">
<el-form :inline="true" :model="searchModel">
<el-form-item >
<el-date-picker
v-model="selectedDate"
type="daterange"
range-separator="-"
@change="handleDateChange"
start-placeholder="开始时间"
end-placeholder="结束时间"
/>
</el-form-item>
<el-form-item>
<el-input
v-model="searchModel.code"
placeholder="单号"
style="width: 200px;height: 42px"
:prefix-icon="Search"
>
</el-input>
</el-form-item>
<el-form-item>
<el-select
v-model="searchModel.supplierIds"
placeholder="供应商"
style="width: 200px;height: 42px"
multiple
>
<el-option
v-for="item in supplier_list"
:key="item"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-select
v-model="searchModel.managerUserIds"
placeholder="采购人"
style="width: 200px;height: 42px"
multiple
>
<el-option
v-for="item in managerUserList"
:key="item"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="right">
<div class="btn" @click="resetSearch">
<el-icon style="margin-right: 10px">
<Refresh/>
</el-icon>
重置
</div>
<div class="btn" @click="init">
<el-icon style="margin-right: 10px">
<Search/>
</el-icon>
搜索
</div>
</div>
</div>
<div class="addBtn">
<span @click="openAdd">新增采购</span>
</div>
</div>
<div class="content_list">
<el-scrollbar>
<el-table :data="tableData" style="width: 100%" @row-click="open_edit">
<el-table-column fixed label="进货单号" width="250" show-overflow-tooltip>
<el-table :data="tableData" style="width: 100%" @row-click="open_edit" :header-cell-style="{ backgroundColor: '#F1F5FB' }">
<el-table-column fixed label="采购单号" show-overflow-tooltip>
<template #default="scope">
<div class="link">{{ scope.row.code }}</div>
</template>
</el-table-column>
<el-table-column label="品种" prop="kindCount" width="100">
<el-table-column label="货单号" prop="shippingCode">
</el-table-column>
<el-table-column label="入库金额" width="100">
<el-table-column label="品种" prop="kindCount">
</el-table-column>
<el-table-column label="入库金额">
<template #default="scope">
{{ scope.row.totalPrice.toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="采购人" prop="managerUserName" width="100"></el-table-column>
<el-table-column label="采购人" prop="managerUserName"></el-table-column>
<el-table-column label="供应商" prop="supplierName"></el-table-column>
<el-table-column prop="purchaseDate" label="采购时间">
<template #default="scope">
{{ formatDate(scope.row.purchaseDate) }}
</template>
</el-table-column>
<el-table-column prop="createDatetime" label="创建时间">
<template #default="scope">
{{ formatDate(scope.row.createDatetime) }}
</template>
<!-- <el-table-column prop="createDatetime" label="入库时间">-->
<!-- <template #default="scope">-->
<!-- {{ formatDate(scope.row.purchaseDate) }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="备注" prop="remark">
</el-table-column>
</el-table>
</el-scrollbar>
@ -60,7 +134,8 @@ import {useRoute} from "vue-router";
import AddOrder from "@/components/inventory/purchase/AddOrder.vue";
import Mask from "@/components/common/Mask.vue";
import EditOrder from "@/components/inventory/purchase/EditOrder.vue";
import {Plus} from "@element-plus/icons-vue";
import {Plus, Refresh, Search, SemiSelect} from "@element-plus/icons-vue";
import {formatDateArray, getEndOfDay} from "@/utils/dateUtils.ts";
let tableData = ref([])
let is_edit = ref(false)
@ -68,6 +143,8 @@ const route = useRoute()
let open_code = ref(null)
onMounted(() => {
init()
getSupplierList()
getManagerUserList()
})
const addOrderRef = ref<any>('')
const openAdd = () => {
@ -87,6 +164,7 @@ let init = () => {
const query = {
page: page.value,
pageSize: 20,
...searchModel.value
}
post("inventory/order/list", {query: query}).then((res: any) => {
tableData.value = res.list
@ -115,6 +193,49 @@ const formatDate = (isoStr: any) => {
const date = new Date(isoStr);
return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
}
const selectedDate = ref<any>([])
const handleDateChange = (date: any[]) => {
selectedDate.value = formatDateArray(date)
if (selectedDate.value[0] == selectedDate.value[1]) {
selectedDate.value[1] = getEndOfDay(selectedDate.value[1]); // 23:59
}
searchModel.value.beginTime = selectedDate.value[0]
searchModel.value.endTime = selectedDate.value[1]
}
const supplier_list = ref<any>([])
const getSupplierList = () => {
const query = {
turn: 1
}
post("inventory/supplier/list", {query: query}).then((res: any) => {
supplier_list.value = res.list
})
}
const managerUserList: any = ref([])
const getManagerUserList = () => {
post("manager/user/list", {
}).then((res: any) => {
managerUserList.value = res
})
}
const searchModel = ref({
code: "",
managerUserIds: [],
supplierIds: [],
beginTime: null,
endTime:null
})
const resetSearch = () => {
searchModel.value = {
code: "",
managerUserIds: [],
supplierIds: [],
beginTime: null,
endTime:null
}
init()
}
</script>
<style scoped lang="scss">
@use "@/assets/scss/base.scss";
@ -202,4 +323,74 @@ const formatDate = (isoStr: any) => {
}
}
.top {
height: 110px;
background: #fff;
display: flex;
flex-direction: column;
.search {
display: flex;
justify-content: space-between;
.left {
flex: 1;
display: flex;
justify-content: space-between;
margin-right: 24px;
.el-form-item {
margin-right: 5px;
}
}
.right {
display: flex;
.btn {
width: 120px;
height: 42px;
background: #FFFFFF;
border-radius: 6px;
border: 1px solid #979797;
display: flex;
justify-content: center;
align-items: center;
margin-left: 24px;
cursor: pointer;
&:hover {
background: #4D6DE4;
color: #fff;
border: none;
}
}
}
}
.addBtn {
span {
display: inline-block;
width: 120px;
height: 42px;
background: #FFFFFF;
border-radius: 6px;
border: 1px solid #4D6DE4;
margin-right: 24px;
font-weight: 500;
font-size: 16px;
color: #4D6DE4;
text-align: center;
line-height: 42px;
cursor: pointer;
&:hover {
background: #4D6DE4;
color: #fff;
border: none;
}
}
}
}
:deep(.el-range-editor.el-input__wrapper) {
height: 42px;
}
:deep(.el-select__wrapper) {
height: 42px;
}
</style>