Browse Source

新增销售

zhangdan 3 năm trước cách đây
mục cha
commit
391bd4f8f3
5 tập tin đã thay đổi với 463 bổ sung1 xóa
  1. 34 0
      api/sales.js
  2. 11 0
      pages.json
  3. 6 1
      pages/index/index.vue
  4. 223 0
      pages/sales/index.vue
  5. 189 0
      pages/sales/productPricing.vue

+ 34 - 0
api/sales.js

@@ -0,0 +1,34 @@
+import axios from '@/libs/axios.js'
+
+// 数据统计信息
+export const bizData = (params) => {
+  return axios.request({
+    url: `home/queryBizData`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 销售单列表
+export const salesList = (params) => {
+  const url = `sales/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios.request({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 产品报价列表
+export const dealerProductList = (params) => {
+  const url = `dealerProduct/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios.request({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}

+ 11 - 0
pages.json

@@ -192,6 +192,13 @@
 				"navigationBarTitleText": "出入库明细",
 				"enablePullDownRefresh": false
 			}
+		},
+		{
+			"path": "pages/sales/productPricing", // 产品报价
+			"style": {
+				"navigationBarTitleText": "产品报价",
+				"enablePullDownRefresh": false
+			}
 		}
     ],
 	"globalStyle": {
@@ -208,6 +215,10 @@
 	"tabBar": {
 		"fontSize": "14px",
 		"list": [
+			{
+				"pagePath": "pages/sales/index",
+				"text": "销售"
+			},
 		{
 			"pagePath": "pages/stock/index",
 			"text": "库存"

+ 6 - 1
pages/index/index.vue

@@ -43,11 +43,16 @@
 			})
 			uni.setTabBarItem({
 			  "index": 1,
+			  "iconPath": "static/"+theme+"/tabbar/stock.png",
+			  "selectedIconPath": "static/"+theme+"/tabbar/stock-active.png",
+			})
+			uni.setTabBarItem({
+			  "index": 2,
 			  "iconPath": "static/"+theme+"/tabbar/home.png",
 			  "selectedIconPath": "static/"+theme+"/tabbar/home-active.png",
 			})
 			uni.setTabBarItem({
-			  "index": 2,
+			  "index": 3,
 			  "iconPath": "static/"+theme+"/tabbar/user.png",
 			  "selectedIconPath": "static/"+theme+"/tabbar/user-active.png",
 			})

+ 223 - 0
pages/sales/index.vue

@@ -0,0 +1,223 @@
+<template>
+	<view class="sales-content">
+		<!--销售数据统计 -->
+		<view class="content-data">
+			<view class="date-type">
+				<text :class="['type',timeType=='day' ? 'active_day' : '']" @click="seleteTime(0)">今日</text>
+				<text :class="['type',timeType=='week' ? 'active_day' : '']" @click="seleteTime(1)">本周</text>
+				<text :class="['type',timeType=='mounth' ? 'active_day' : '']" @click="seleteTime(2)">本月</text>
+			</view>
+			<view class="total">
+				<view class="item-box">
+					<u-count-to  :end-val="salesCount" separator=","></u-count-to>
+					<view>销售总单量(个)</view>
+				</view>
+				<view class="item-box">
+					<u-count-to :end-val="salesAmount" separator="," :decimals="2"></u-count-to>
+					<view>销售总金额(¥)</view>
+				</view>
+			</view>
+		</view>
+		<!-- 销售报价及销售单创建 -->
+		<view class="sales-box">
+			 <view class="sales-box-1" @click="toPage('/pages/sales/productPricing')">
+				 <view class="title">产品报价</view>
+			 </view>
+			 <view class="sales-box-1" @click="toPage('/pages/latePlay/chooseBulk')">
+				 <view class="title">新增销售单</view>
+			 </view>
+		</view>
+		<!-- 销售单 -->
+		<view class="sales-list">
+			<view class="title">
+				<text class="title-name">销售单</text>
+				<text class="title-all">查看全部<u-icon name="arrow-right" color="#999" size="28"></u-icon></text>
+			</view>
+		</view>
+		<scroll-view class="st-detailList-con" scroll-y @scrolltolower="onreachBottom">
+			<view class="st-detailList-main">
+				<!-- <view class="st-detailList-main-item" v-for="(item, index) in listData" :key="item.id" @click="getDetail(item)">
+					<view class="st-detailList-tit">
+						<view class="u-line" :style="{backgroundColor: $config('primaryColor')}"></view>{{item.productName}}
+					</view>
+					<view class="st-detailList-item-con flex align_center">
+						<view class="pimgs">
+							<u-image :src="item.product&&item.product.productMsg?item.product.productMsg:`../../static/${theme}/def_img@2x.png`" width="128" height="128" border-radius="10"></u-image>
+						</view>
+						<view class="flex_1">
+							<view>产品编码:{{item.productCode}}</view>
+							<view class="padding_3">原厂编码:{{item.productOrigCode}}</view>
+							<view class="flex align_center justify_between">
+								<view class="font_13">
+									可用数量:
+									<u-count-to :end-val="item.currentStockQty ? item.currentStockQty : 0" separator="," font-size="26"></u-count-to>个
+								</view>
+								<view class="font_13">
+									库存成本:
+									¥<u-count-to :end-val="item.currentStockCost ? item.currentStockCost : 0" separator="," font-size="26" :decimals="2"></u-count-to>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+				<view v-if="listData && listData.length == 0">
+					<u-empty :text="noDataText" mode="list" :img-width="200" :margin-top="30"></u-empty>
+				</view> -->
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {bizData,salesList} from '@/api/sales'
+	export default{
+		data(){
+			return{
+				timeType:'day',
+				bizData:null, // 销售数据统计
+				salesCount:0, // 销售总单数
+				salesAmount:0, // 销售总金额
+			}
+		},
+		onLoad() {
+			this.getBizData()
+		},
+		methods:{
+			seleteTime(val){
+				if(val==0){
+					this.timeType='day'
+					// this.salesCount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.dayTotalQty || this.bizData.purchaseBill.dayTotalQty==0) ? this.bizData.purchaseBill.dayTotalQty : 0
+					// this.salesAmount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.dayDiscountedAmount || this.bizData.purchaseBill.dayDiscountedAmount==0) ? this.bizData.purchaseBill.dayDiscountedAmount : 0
+				}else if(val==1){
+					this.timeType='week'
+					// this.salesCount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.weekPurchaseQty || this.bizData.purchaseBill.weekPurchaseQty==0) ? this.bizData.purchaseBill.weekPurchaseQty : 0
+					// this.salesAmount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.weekDiscountedAmount || this.bizData.purchaseBill.weekDiscountedAmount==0) ? this.bizData.purchaseBill.weekDiscountedAmount : 0
+				}else{
+					this.timeType='mounth'
+					// this.salesCount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.monthPurchaseQty || this.bizData.purchaseBill.monthPurchaseQty==0) ? this.bizData.purchaseBill.monthPurchaseQty : 0
+					// this.salesAmount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.monthDiscountedAmount || this.bizData.purchaseBill.monthDiscountedAmount==0) ? this.bizData.purchaseBill.monthDiscountedAmount : 0
+				}
+				this.getBizData()
+				console.log(val,this.salesCount,this.salesAmount,'this.salesAmount')
+			},
+			toPage(url){
+				uni.navigateTo({
+					url:url
+				})
+			},
+			getBizData () {
+			  bizData({}).then(res => {
+			    if (res.status == 200) {
+			      this.bizData = res.data
+				  if(this.timeType=='day'){
+				  	this.salesCount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.dayTotalQty || this.bizData.purchaseBill.dayTotalQty==0) ? this.bizData.purchaseBill.dayTotalQty : 0
+				  	this.salesAmount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.dayDiscountedAmount || this.bizData.purchaseBill.dayDiscountedAmount==0) ? this.bizData.purchaseBill.dayDiscountedAmount : 0
+				  }else if(this.timeType=='week'){
+				  	this.salesCount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.weekPurchaseQty || this.bizData.purchaseBill.weekPurchaseQty==0) ? this.bizData.purchaseBill.weekPurchaseQty : 0
+				  	this.salesAmount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.weekDiscountedAmount || this.bizData.purchaseBill.weekDiscountedAmount==0) ? this.bizData.purchaseBill.weekDiscountedAmount : 0
+				  }else{
+				  	this.salesCount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.monthPurchaseQty || this.bizData.purchaseBill.monthPurchaseQty==0) ? this.bizData.purchaseBill.monthPurchaseQty : 0
+				  	this.salesAmount=this.bizData&&this.bizData.purchaseBill&&(this.bizData.purchaseBill.monthDiscountedAmount || this.bizData.purchaseBill.monthDiscountedAmount==0) ? this.bizData.purchaseBill.monthDiscountedAmount : 0
+				  }
+			    } else {
+			      this.bizData = null
+			    }
+			  })
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.sales-content{
+		width: 100%;
+		padding: 30rpx;
+		.content-data{
+			background-color: #fff;
+			padding: 20upx 20upx;
+			border-radius: 20upx;
+			box-shadow: 3upx 2upx 6upx #eee;
+			margin-bottom: 30upx;
+			.date-type{
+				margin: 0 120upx 30upx 120upx;
+				border-radius: 50upx;
+				border: 1upx solid #eee;
+				.type{
+					display: inline-block;
+					padding: 10upx 0;
+					width: 33%;
+					text-align: center;
+				}
+				.type:first-child{
+					border-top-left-radius: 50upx;
+					border-bottom-left-radius: 50upx;
+				}
+				.type:last-child{
+					border-top-right-radius: 50upx;
+					border-bottom-right-radius: 50upx;
+				}
+				.type:not(:last-child){
+					border-right: 1upx solid #eee;
+				}
+				.active_day {
+				  background: rgb(0, 122, 255);
+				  color: #fff;
+				}
+			}
+			.total{
+				display: flex;
+				.item-box{
+					text-align: center;
+					width: 50%;
+					color:#999;
+					
+				}
+				.item-box:first-child{
+					border-right: 1px solid #e4e7ed;
+				}
+			}
+		}
+		.sales-box{
+			display: flex;
+			align-items: center;
+			margin-bottom: 30upx;
+			.sales-box-1{
+				background-color: #ffffff;
+				border-radius: 20upx;
+				box-shadow: 3upx 2upx 6upx #eee;
+				padding: 30rpx;
+				width: 50%;
+				color: #424D5E;
+				text-align: center;
+				.title{
+					font-size: 32rpx;
+					color: rgb(0, 122, 255);
+					font-weight: bold;
+				}
+			}
+			> view{
+				&:first-child{
+					margin-right: 15rpx;
+				}
+				&:last-child{
+					margin-left: 15rpx;
+				}
+			}
+		}
+		.sales-list{
+			.title{
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				.title-name{
+					font-size: 32upx;
+					color:#000 ;
+					font-weight: 1000;
+				}
+				.title-all{
+					color:#999;
+				}
+			}
+		}
+	}
+</style>

+ 189 - 0
pages/sales/productPricing.vue

@@ -0,0 +1,189 @@
+<template>
+	<view class="productPricing-content">
+		<view class="checkbox-price">
+			<u-checkbox-group  placement="row"  @change="checkboxChange">
+				<u-checkbox v-model="item.checked" activeColor="rgb(4, 133, 246)" v-for="(item,index) in priceList" :key="index" :name="item.name" :label="item.name">{{item.name}}</u-checkbox>
+			</u-checkbox-group>
+		</view>
+		<scroll-view class="product-list" scroll-y @scrolltolower="onreachBottom">
+			<view class="st-detailList-main">
+				<view class="st-detailList-main-item" v-for="(item, index) in listData" :key="item.id" @click="getDetail(item)">
+					<view class="st-detailList-tit">
+						<view class="u-line" :style="{backgroundColor: $config('primaryColor')}"></view>{{item.name}}
+					</view>
+					<view class="st-detailList-item-con flex align_center">
+						<view class="pimgs">
+							<u-image :src="item.product&&item.product.productMsg?item.product.productMsg:`../../static/${theme}/def_img@2x.png`" width="128" height="128" border-radius="10"></u-image>
+						</view>
+						<view class="flex_1">
+							<view>产品编码:{{item.code}}</view>
+							<view class="padding_3">原厂编码:{{item.origCode}}</view>
+							<view class="flex align_center justify_between">
+								<view class="font_13">
+									库存数量:
+									<u-count-to :end-val="item.stockQty ? item.stockQty : 0" separator="," font-size="26"></u-count-to>个
+								</view>
+								<view class="font_13">
+									车主价:
+									¥<u-count-to :end-val="item.carOwnersPrice ? item.carOwnersPrice : 0" separator="," font-size="26" :decimals="2"></u-count-to>
+								</view>
+							</view>
+						</view>
+					</view>
+					<view class="price-all flex justify_between">
+						<view class="price-item">
+							<u-count-to :end-val="item.offerCost ? item.offerCost : 0" separator="," font-size="26" :decimals="2"></u-count-to>
+							<view>成本价</view>
+						</view>
+						<view class="price-item">
+							<u-count-to :end-val="item.offerCost ? item.offerCost : 0" separator="," font-size="26" :decimals="2"></u-count-to>
+							<view>成本价</view>
+						</view>
+						<view class="price-item">
+							<u-count-to :end-val="item.offerCost ? item.offerCost : 0" separator="," font-size="26" :decimals="2"></u-count-to>
+							<view>成本价</view>
+						</view>
+						<view class="price-item">
+							<u-count-to :end-val="item.offerCost ? item.offerCost : 0" separator="," font-size="26" :decimals="2"></u-count-to>
+							<view>成本价</view>
+						</view>
+					</view>
+				</view>
+				<view v-if="listData && listData.length == 0">
+					<u-empty :text="noDataText" mode="list" :img-width="200" :margin-top="30"></u-empty>
+				</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import { dealerProductList } from '@/api/sales'
+	export default{
+		data(){
+			return{
+				listData:[],
+				totalNum:0,
+				priceList:[{name:'成本价',checked:false},{name:'市级价',checked:false},{name:'特约价',checked:false},{name:'市级终端价',checked:false}],
+				pageNo:1,
+				pageSize:10,
+				noDataText: '暂无数据',
+				theme: ''
+			}
+		},
+		onLoad() {
+			this.theme = getApp().globalData.theme
+			this.getList()
+		},
+		methods:{
+			// 价格显示
+			checkboxChange(e){
+				console.log(e,'val ,change')
+				// if(val&&val.length>0){
+				// 	const a= val.find(item=>{item=='成本价'})
+				// }
+			},
+			// 列表
+			getList(pageNo){
+				const _this = this
+				if (pageNo) {
+					this.pageNo = pageNo
+				}
+				let params =  { pageNo: this.pageNo, pageSize: this.pageSize }
+				dealerProductList(params).then(res => {
+					if (res.status == 200) {
+						if(this.pageNo>1){
+							this.listData = this.listData.concat(res.data.list || [])
+						}else{
+							this.listData = res.data.list || []
+						}
+						this.totalNum = res.data.count || 0
+					} else {
+						this.listData = []
+						this.totalNum = 0
+						this.noDataText = res.message
+					}
+				})
+			},
+			// scroll-view到底部加载更多
+			onreachBottom() {
+				if(this.listData.length < this.totalNum){
+					this.pageNo += 1
+					this.getList()
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.productPricing-content{
+		width:100%;
+		height: 100vh;
+		.checkbox-price{
+			background-color: #fff;
+			display: flex;
+			justify-content: space-around;
+			padding: 20rpx 0;
+			margin-bottom: 15rpx;
+			color: #191919;
+		}
+		.product-list{
+			height: calc(100vh - 94upx);
+				.st-detailList-main{
+					.st-detailList-main-item{
+						background: #ffffff;
+						padding: 20upx;
+						margin-bottom: 25upx;
+						border-radius: 25upx;
+						box-shadow: 1px 1px 3px #EEEEEE;
+						.st-detailList-tit{
+							padding-bottom: 20upx;
+							border-bottom: 1px solid #e4e7ed;
+							white-space: nowrap;
+							overflow: hidden;
+							text-overflow: ellipsis;
+							.u-line{
+								display: inline-block;
+								width: 6upx;
+								height: 40upx;
+								background-color: red;
+								vertical-align: bottom;
+								margin: 0 20upx 0 10upx;
+							}
+						}
+						.st-detailList-item-con{
+							padding: 20upx;
+							font-size: 26upx;
+							.pimgs{
+								margin-right: 16upx;
+							}
+							.font_13{
+								font-size: 26upx;
+							}
+							.padding_3{
+								padding: 6upx 0;
+							}
+						}
+						.price-all{
+							border-top: 1px solid #e4e7ed;
+							padding: 20upx 20upx 0;
+							.price-item{
+								width: 25%;
+								border-right:  1px solid #e4e7ed;
+								text-align: center;
+								>view{
+									color:#999;
+								}
+							}
+							.price-item:last-child{
+								border-right:  none;
+							}
+						}
+					}
+				}
+				
+				
+		}
+	}
+</style>