update: 更新收货汇总对接

This commit is contained in:
admin 2024-03-15 14:41:42 +08:00
parent 2dd4b8e43c
commit 8e3dd63aa2
7 changed files with 259 additions and 138 deletions

View File

@ -4,13 +4,13 @@
<view class="title">筛选</view> <view class="title">筛选</view>
<u-list height="200"> <u-list height="200">
<u-list-item> <u-list-item>
<u-cell :title="`供应商`" @click="handleDialog('showSupplier', true)"> <u-cell :title="`${isShipment ? '客户' : '供应商'}`" @click="handleDialog('showSupplier', true)">
<template #right-icon> </template> <template #right-icon> </template>
</u-cell> </u-cell>
</u-list-item> </u-list-item>
<u-list-item boder="none"> <u-list-item boder="none">
<u-cell <u-cell
:title="`收货产品`" :title="`${isShipment ? '出货产品' : '收货产品'}`"
@click="handleDialog('showProduct', true)" @click="handleDialog('showProduct', true)"
> >
<template #right-icon> </template> <template #right-icon> </template>
@ -42,6 +42,7 @@
@handleDialog="(v:boolean) => {handleDialog('showProduct', v)}" @handleDialog="(v:boolean) => {handleDialog('showProduct', v)}"
@changeProduct="changeProduct" @changeProduct="changeProduct"
ref="productRef" ref="productRef"
:isShipment="isShipment"
></ProductDialog> ></ProductDialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -49,6 +50,7 @@ import SupplierDialog from "./SupplierDialog.vue";
import ProductDialog from "./ProductDialog.vue"; import ProductDialog from "./ProductDialog.vue";
const props = defineProps<{ const props = defineProps<{
show: boolean; show: boolean;
isShipment: boolean;
}>(); }>();
const emit = defineEmits(["handleDialog", "changeOther"]); const emit = defineEmits(["handleDialog", "changeOther"]);
const handleClose = () => { const handleClose = () => {

View File

@ -1,10 +1,14 @@
<template> <template>
<u-popup :show="show" mode="left" :closeable="true" @close="handleClose"> <u-popup :show="show" mode="left" :closeable="true" @close="handleClose">
<view class="c-dialog-filter"> <view class="c-dialog-filter">
<view class="title">收货产品</view> <view class="title">{{ isShipment ? "出货" : "收货" }}产品</view>
<view class="dialog-product-layout"> <view class="dialog-product-layout">
<text v-for="(item, index) in state.list" :class="{ active: state.current === item.id }" @click="handleSelect(item)" :key="index" <text
>{{ item.reProductsName }}</text v-for="(item, index) in state.list"
:class="{ active: state.current === item.id }"
@click="handleSelect(item)"
:key="index"
>{{isShipment ? item.shmProductsName : item.reProductsName }}</text
> >
</view> </view>
<!-- <view class="btn-confirm"> <!-- <view class="btn-confirm">
@ -16,36 +20,44 @@
</u-popup> </u-popup>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ReceiveProductApi } from '@/services'; import { ReceiveProductApi, GoodsApi } from "@/services";
const props = defineProps<{ const props = defineProps<{
show: boolean, show: boolean;
}>() isShipment: boolean;
const emit = defineEmits(['handleDialog', 'changeProduct']); }>();
const emit = defineEmits(["handleDialog", "changeProduct"]);
const handleClose = () => { const handleClose = () => {
emit('handleDialog', false) emit("handleDialog", false);
} };
const state = reactive<any>({ const state = reactive<any>({
list: [], list: [],
current: -1, current: -1,
});
}) const handleSelect = (item: any) => {
state.current = item.id;
const handleSelect = (item:any) => { emit("changeProduct", item);
state.current = item.id emit("handleDialog", false);
emit('changeProduct', item) };
emit('handleDialog', false)
}
const getList = () => { const getList = () => {
ReceiveProductApi.getAllReProducts().then(res => { if (props.isShipment) {
if (res.code === 200) { GoodsApi.getShipmentProductList().then((res) => {
state.list = res.data if (res.code === 200) {
state.list = res.data;
}
});
} else {
ReceiveProductApi.getAllReProducts().then((res) => {
if (res.code === 200) {
state.list = res.data;
}
});
} }
}) };
}
onMounted(() => { onMounted(() => {
getList() getList();
}) });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.c-dialog-filter { .c-dialog-filter {
@ -58,53 +70,53 @@ onMounted(() => {
text-align: center; text-align: center;
} }
} }
// dialog // dialog
.dialog-product-layout { .dialog-product-layout {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12); box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx; border-radius: 13rpx;
margin: 42rpx 25rpx; margin: 42rpx 25rpx;
padding: 19rpx; padding: 19rpx;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
flex-flow: row wrap; flex-flow: row wrap;
max-height: 70vh; max-height: 70vh;
overflow: auto; overflow: auto;
text { text {
font-weight: 400; font-weight: 400;
font-size: 26rpx; font-size: 26rpx;
color: #999999; color: #999999;
background: #ffffff; background: #ffffff;
border-radius: 6rpx; border-radius: 6rpx;
border: 1px solid rgba(153, 153, 153, 0.64); border: 1px solid rgba(153, 153, 153, 0.64);
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
padding: 10rpx 20rpx; padding: 10rpx 20rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
margin-left: 10rpx; margin-left: 10rpx;
margin-right: 10rpx; margin-right: 10rpx;
} }
.active { .active {
border-color: $u-primary; border-color: $u-primary;
color: $u-primary; color: $u-primary;
}
}
.btn-confirm {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
position: absolute;
bottom: 0rpx;
width: 100%;
left: 0rpx;
padding: 27.56rpx;
.btn {
text-align: center;
::v-deep button {
width: 80%;
border-radius: 43rpx;
} }
} }
}
.btn-confirm { </style>
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
position: absolute;
bottom: 0rpx;
width: 100%;
left: 0rpx;
padding: 27.56rpx;
.btn {
text-align: center;
::v-deep button {
width: 80%;
border-radius: 43rpx;
}
}
}
</style>

View File

@ -10,7 +10,7 @@
<view class="box"><text>单据状态</text></view> <view class="box"><text>单据状态</text></view>
<view class="box-btn" <view class="box-btn"
><text ><text
v-for="(item, index) in state.statusList" v-for="(item, index) in isShipment ? state.statusList2 : state.statusList1"
:key="index" :key="index"
:class="{ active: state.currentStates === item.id }" :class="{ active: state.currentStates === item.id }"
@click="handleSelect(item)" @click="handleSelect(item)"
@ -23,11 +23,12 @@
<script setup lang="ts"> <script setup lang="ts">
const props = defineProps<{ const props = defineProps<{
show: boolean; show: boolean;
isShipment: boolean;
}>(); }>();
const state = reactive({ const state = reactive({
currentStates: -1, currentStates: -1,
statusList: [ statusList1: [
{ {
id: -1, id: -1,
name: "全部", name: "全部",
@ -45,6 +46,20 @@ const state = reactive({
name: "未审核", name: "未审核",
}, },
], ],
statusList2: [
{
id: -1,
name: "全部",
},
{
id: 4,
name: "已结算",
},
{
id: 3,
name: "未结算",
},
],
}); });
const emit = defineEmits(["handleDialog", "changeStatus"]); const emit = defineEmits(["handleDialog", "changeStatus"]);
@ -52,10 +67,10 @@ const handleClose = () => {
emit("handleDialog", false); emit("handleDialog", false);
}; };
const handleSelect = (item: any) => { const handleSelect = (item: any) => {
state.currentStates = item.id state.currentStates = item.id;
emit("changeStatus", item) emit("changeStatus", item);
emit("handleDialog", false); emit("handleDialog", false);
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .u-popup__content { ::v-deep .u-popup__content {

View File

@ -118,6 +118,7 @@
<!-- 单据弹框 --> <!-- 单据弹框 -->
<StatusDialog <StatusDialog
:show="showDialog.showStatus" :show="showDialog.showStatus"
:isShipment="false"
@handleDialog="(v:boolean) => {handleDialog('showStatus', v)}" @handleDialog="(v:boolean) => {handleDialog('showStatus', v)}"
@changeStatus="changeStatus" @changeStatus="changeStatus"
/> />

View File

@ -2,41 +2,46 @@
<view class="layout-box"> <view class="layout-box">
<view class="filter"> <view class="filter">
<u-input <u-input
v-model="params.startTime" v-model="state.startTime"
disabled disabled
disabledColor="#ffffff" disabledColor="#ffffff"
placeholder="请选择开始时间" placeholder="请选择开始时间"
></u-input> ></u-input>
<text>-</text> <text>-</text>
<u-input <u-input
v-model="params.endTime" v-model="state.endTime"
disabled disabled
disabledColor="#ffffff" disabledColor="#ffffff"
placeholder="请选择结束时间" placeholder="请选择结束时间"
></u-input> ></u-input>
<u-icon name="arrow-down-fill" @click="handleDialog('showTime',true)"></u-icon> <u-icon
name="arrow-down"
@click="handleDialog('showTime', true)"
></u-icon>
<text class="status">单据状态</text> <text class="status">单据状态</text>
<u-icon name="arrow-down-fill" @click="handleDialog('showStatus', true)"></u-icon> <u-icon
name="arrow-down"
@click="handleDialog('showStatus', true)"
></u-icon>
<text class="btn" @click="handleDialog('showFilter', true)">筛选</text> <text class="btn" @click="handleDialog('showFilter', true)">筛选</text>
</view> </view>
<view class="box"> <view class="box">
<up-row> <up-row>
<up-col span="4"> <up-col span="4">
<view class="inner-box" style="border: none"> <view class="inner-box" style="border: none">
<view class="num">892339.9</view> <view class="num">{{ state.summary.totalAmount }}</view>
<view>出货总量/kg</view> <view>出货总量/kg</view>
</view> </view>
</up-col> </up-col>
<up-col span="4"> <up-col span="4">
<view class="inner-box"> <view class="inner-box">
<view class="num">892339.9</view> <view class="num">{{ state.summary.totalPayShipment }}</view>
<view>已收/kg</view> <view>已收/kg</view>
</view> </view>
</up-col> </up-col>
<up-col span="4"> <up-col span="4">
<view class="inner-box"> <view class="inner-box">
<view class="num">892339.9</view> <view class="num">{{ state.summary.totalUnPayShipment }}</view>
<view>未收/kg</view> <view>未收/kg</view>
</view> </view>
</up-col> </up-col>
@ -47,19 +52,19 @@
<up-row> <up-row>
<up-col span="4"> <up-col span="4">
<view class="inner-box" style="border: none"> <view class="inner-box" style="border: none">
<view class="num">892339.9</view> <view class="num">{{ state.summary.totalCollection }}</view>
<view>结算金额/kg</view> <view>结算金额/</view>
</view> </view>
</up-col> </up-col>
<up-col span="4"> <up-col span="4">
<view class="inner-box"> <view class="inner-box">
<view class="num">892339.9</view> <view class="num">{{ state.summary.totalPayCollection }}</view>
<view>实收金额</view> <view>实收金额</view>
</view> </view>
</up-col> </up-col>
<up-col span="4"> <up-col span="4">
<view class="inner-box"> <view class="inner-box">
<view class="num">892339.9</view> <view class="num">{{ state.summary.totalUnPayCollection }}</view>
<view>应收金额</view> <view>应收金额</view>
</view> </view>
</up-col> </up-col>
@ -69,14 +74,14 @@
<up-row> <up-row>
<up-col span="6"> <up-col span="6">
<view class="inner-box" style="border: none"> <view class="inner-box" style="border: none">
<view class="num">892339.9</view> <view class="num">{{ state.summary.totalReceipt }}</view>
<view>出货单</view> <view>出货单</view>
</view> </view>
</up-col> </up-col>
<up-col span="6"> <up-col span="6">
<view class="inner-box"> <view class="inner-box">
<view class="num">892339.9</view> <view class="num">{{ state.summary.averagePrice }}</view>
<view>均价(/kg)</view> <view>均价/kg</view>
</view> </view>
</up-col> </up-col>
</up-row> </up-row>
@ -86,47 +91,59 @@
<uni-table stripe emptyText="暂无更多数据"> <uni-table stripe emptyText="暂无更多数据">
<!-- 表头行 --> <!-- 表头行 -->
<uni-tr> <uni-tr>
<uni-th align="center" v-for="(item, index) in tableTitleList" :key="index">{{ <uni-th v-for="(item, index) in tableTitleList" :key="index">{{
item.name item.name
}}</uni-th> }}</uni-th>
</uni-tr> </uni-tr>
<!-- 表格数据行 --> <!-- 表格数据行 -->
<uni-tr v-for="(item, index) in 10" :key="index"> <uni-tr v-for="(item, index) in state.summary.rankings" :key="index">
<uni-td>张家港华仁再生</uni-td> <uni-td>{{ item.userName }}</uni-td>
<uni-td>1636.00</uni-td> <uni-td>{{ item.totalAmount }}</uni-td>
<uni-td>5646.00</uni-td> <uni-td>{{ item.totalPayment }}</uni-td>
<uni-td>5636.00</uni-td> <uni-td>{{ item.totalOrderNumber }}</uni-td>
<uni-td>5636.00</uni-td> <uni-td>{{ item.totalOrderNumber }}</uni-td>
</uni-tr> </uni-tr>
</uni-table> </uni-table>
</view> </view>
</view> </view>
<!-- 时间弹框 --> <!-- 时间弹框 -->
<TimeDialog ref="timeDialog" :show="showDialog.showTime" @handleDialog="(v:boolean) => {handleDialog('showTime', v)}"/> <TimeDialog
ref="timeDialog"
:show="showDialog.showTime"
@handleDialog="(v:boolean) => {handleDialog('showTime', v)}"
@changeTime="changeTime"
/>
<!-- 单据弹框 --> <!-- 单据弹框 -->
<StatusDialog :show="showDialog.showStatus" @handleDialog="(v:boolean) => {handleDialog('showStatus', v)}"/> <StatusDialog
:show="showDialog.showStatus"
:isShipment="true"
@handleDialog="(v:boolean) => {handleDialog('showStatus', v)}"
@changeStatus="changeStatus"
/>
<!-- 筛选弹框 --> <!-- 筛选弹框 -->
<FilterDialog :show="showDialog.showFilter" @handleDialog="(v:boolean) => {handleDialog('showFilter', v)}"/> <FilterDialog
:show="showDialog.showFilter"
@handleDialog="(v:boolean) => {handleDialog('showFilter', v)}"
@changeOther="changeOther"
:isShipment="true"
/>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import TimeDialog from './components/TimeDialog.vue' import TimeDialog from "./components/TimeDialog.vue";
import StatusDialog from './components/StatusDialog.vue' import StatusDialog from "./components/StatusDialog.vue";
import FilterDialog from './components/FilterDialog.vue' import FilterDialog from "./components/FilterDialog.vue";
const params = reactive({ import { ShipmentApi } from "@/services";
startTime: "2024-01-01", import { formatDate, getCurrentMonthStartAndEnd } from "@/utils";
endTime: "2024-01-01",
});
const tableTitleList = reactive([ const tableTitleList = reactive([
{ {
name: "客户", name: "客户",
}, },
{ {
name: "结算重量", name: "结算重量/kg",
}, },
{ {
name: "结算金额", name: "结算金额",
@ -140,21 +157,84 @@ const tableTitleList = reactive([
]); ]);
const showDialog = < const showDialog = <
{ {
[key: string]: boolean [key: string]: boolean;
} }
>reactive( >reactive({
{ showTime: false,
showTime: false, showStatus: false,
showStatus: false, showFilter: false,
showFilter: false });
const state = reactive<{
summary: ShipmentSummaryCount;
startTime: string;
endTime: string;
scaleStatus: number;
userId: number;
productId: number;
}>({
summary: {
totalAmount: 0, //
totalPayShipment: 0, //
totalUnPayShipment: 0, //
totalCollection: 0, //
totalPayCollection: 0, //
totalUnPayCollection: 0, //
totalReceipt: 0, //
averagePrice: 0, //
rankings: [],
},
startTime: formatDate(getCurrentMonthStartAndEnd().start, "{y}-{m}-{d}"),
endTime: formatDate(getCurrentMonthStartAndEnd().end, "{y}-{m}-{d}"),
scaleStatus: -1,
userId: -1,
productId: -1,
});
const changeTime = (obj: any) => {
state.startTime = obj.startTime;
state.endTime = obj.endTime;
getList();
};
const changeStatus = (obj: any) => {
state.scaleStatus = obj.id;
getList();
};
const changeOther = (obj: any) => {
state.userId = obj.userId;
state.productId = obj.productId;
getList();
};
const handleDialog = (key: string, v: boolean) => {
showDialog[key] = v;
};
const getList = () => {
let params: any = {
startTime: state.startTime + " 00:00:00",
endTime: state.endTime + " 23:59:59",
};
if (state.scaleStatus > -1) {
params.scaleStatus = state.scaleStatus;
} }
) if (state.userId > -1) {
params.userId = state.userId;
const handleDialog = (key: string, v:boolean) => { }
showDialog[key] = v if (state.productId > -1) {
} params.productId = state.productId;
}
ShipmentApi.getOrderInReceipt(params).then((res) => {
if (res.code === 200) {
state.summary = res.data;
}
});
};
onMounted(() => {
getList();
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.layout-box { .layout-box {
@ -164,15 +244,14 @@ const handleDialog = (key: string, v:boolean) => {
align-items: center; align-items: center;
justify-items: center; justify-items: center;
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
font-weight: 500; font-size: 28rpx;
font-size: 27rpx;
color: #000000; color: #000000;
::v-deep .u-input { ::v-deep .u-input {
padding: 0rpx 16.03rpx !important; padding: 0rpx 16.03rpx !important;
input { input {
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
font-weight: 400; font-weight: 400;
font-size: 21rpx !important; font-size: 24rpx !important;
color: #000000; color: #000000;
} }
} }
@ -195,7 +274,7 @@ const handleDialog = (key: string, v:boolean) => {
align-items: center; align-items: center;
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
font-weight: 400; font-weight: 400;
font-size: 24rpx; font-size: 26rpx;
color: #000000; color: #000000;
text-align: center; text-align: center;
background: #ffffff; background: #ffffff;
@ -207,7 +286,7 @@ const handleDialog = (key: string, v:boolean) => {
text-align: center; text-align: center;
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
font-weight: 400; font-weight: 400;
font-size: 24rpx; font-size: 26rpx;
color: #000000; color: #000000;
border-left: 1px solid #e9e9e9; border-left: 1px solid #e9e9e9;
.num { .num {
@ -216,21 +295,20 @@ const handleDialog = (key: string, v:boolean) => {
} }
} }
::v-deep .uni-table { ::v-deep .uni-table {
min-width: auto !important; min-width: 500px !important;
.uni-table-th { .uni-table-th {
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
font-weight: 500; font-weight: 500;
font-size: 22rpx; font-size: 24rpx;
color: #000000; color: #000000;
padding: 5px 5px; padding: 5px 5px;
} }
.uni-table-td { .uni-table-td {
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
font-weight: 400; font-weight: 400;
font-size: 21rpx; font-size: 24rpx;
color: #000000; color: #000000;
} }
} }
} }
</style> </style>

View File

@ -53,12 +53,13 @@ export const countOrderByMonth = () => {
url: "/api/orderOut/countOrderByMonth" url: "/api/orderOut/countOrderByMonth"
}); });
}; };
// 出库分类统计
export const getOrderInReceipt = () => { // 出库分类统计
return http<Shipment>({ export const getOrderInReceipt = (data: any) => {
return http<ShipmentSummaryCount>({
method: "GET", method: "GET",
url: "/api/orderOut/OrderInReceipt" url: "/api/orderOut/OrderInReceipt",
data
}); });
}; };
// 出货单排行榜 // 出货单排行榜

12
src/types/order.d.ts vendored
View File

@ -59,6 +59,18 @@ interface ReceiveSummaryCount {
averagePrice?: number; // 平均单价 averagePrice?: number; // 平均单价
rankings?: Array; rankings?: Array;
} }
interface ShipmentSummaryCount {
totalAmount?: number; // 收货汇总:审核过收货总量
totalPayShipment?: number; // 已支付的出货总
totalUnPayShipment?: number; // 未支付的出货总量
totalCollection?: number; // 总收款
totalPayCollection?: number; // 已经收到的收款
totalUnPayCollection?: number; // 未收到的收款
totalReceipt?: number; // 收货单数量已审核的
averagePrice?: number; // 平均单价
rankings?: Array;
}
// 分页结构 // 分页结构
interface OrderPage<T> { interface OrderPage<T> {
total: number; total: number;