shish 4 年 前
コミット
eabc705567

+ 1 - 1
ghsApp/src/admin/home/apply.vue

@@ -44,7 +44,7 @@ export default {
                     list:[
                         {name: "利润表",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/profit"},
                         {name: "收入渠道",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/kdIncome"},
-                        {name: "花材销售榜",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/productSale"},
+                        {name: "花材销",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/productSale"},
                         {name: "客户下单榜",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/customSale"},
                         {name: "采购统计",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/cgStat"},
                     ]

+ 0 - 1
ghsApp/src/admin/statistics/cgStat.vue

@@ -8,7 +8,6 @@
 		</view>
 		<view class="top-bar">
 			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
-			<ShopSelect class="bar" top="0" @selectShopFn="selectShopFn" />
 		</view>
 		<view class="main-view">
 			<view class="space-view ex-table">

+ 0 - 1
ghsApp/src/admin/statistics/customSale.vue

@@ -9,7 +9,6 @@
 
 		<view class="top-bar">
 			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
-			<ShopSelect class="bar" top="0" @selectShopFn="selectShopFn" />
 		</view>
 
 		<view class="main-view">

+ 0 - 1
ghsApp/src/admin/statistics/kdIncome.vue

@@ -3,7 +3,6 @@
 	<view class="ex-page">
 		<view class="top-bar">
 			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
-			<ShopSelect class="bar" top="0" @selectShopFn="selectShopFn" />
 		</view>
 
 		<view  class="main-view">

+ 0 - 1
ghsApp/src/admin/statistics/productSale.vue

@@ -9,7 +9,6 @@
 
 	<view class="top-bar">
 		<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
-		<ShopSelect class="bar" top="0" @selectShopFn="selectShopFn" />
 	</view>
 
 		<scroll-view scroll-y scroll-with-animation class="main-view">

+ 0 - 1
ghsApp/src/admin/statistics/profit.vue

@@ -3,7 +3,6 @@
 	<view class="ex-page">
 		<view class="top-bar">
 			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
-			<ShopSelect class="bar" top="0" @selectShopFn="selectShopFn" />
 		</view>
 		<scroll-view scroll-y scroll-with-animation class="main-view">
 			<view class="space-view ex-table">

+ 1 - 1
ghsApp/src/pages.json

@@ -213,7 +213,7 @@
 			"root": "admin/statistics",
 			"pages": [
 				{"path": "profit","style": {"navigationBarTitleText": "利润表"}},
-				{"path": "productSale","style": {"navigationBarTitleText": "花材销售榜"}},
+				{"path": "productSale","style": {"navigationBarTitleText": "花材销"}},
 				{"path": "kdIncome","style": {"navigationBarTitleText": "收入渠道"}},
 				{"path": "customSale","style": {"navigationBarTitleText": "客户下单排行"}},
 				{"path": "incomeStat","style": {"navigationBarTitleText": "应收款"}},

+ 1 - 3
ghsApp/src/pagesArrears/details.vue

@@ -114,7 +114,7 @@ export default {
 			if (this.detailsList) {
 				for (const item of this.detailsList) {
 					if (item.checked) {
-						amount=amount+Number(item.actPrice);
+						amount=amount+Number(item.remainDebtPrice);
 					}
 				}
 			}
@@ -202,8 +202,6 @@ export default {
 			for (let index = 0; index < this.detailsList.length; index++) {
 				const element = this.detailsList[index].id;
 				if (element == item.id) {
-					//id相等选中
-
 					this.$set(this.detailsList, index, {
 						...this.detailsList[index],
 						checked: !this.detailsList[index].checked

+ 1 - 1
ghsApp/src/pagesArrears/detailsItem.vue

@@ -12,7 +12,7 @@
 				<view class="mark">{{ info.addTime.substr(0,16) }}</view>
 			</view>
 			<view class="item-row">
-				<view class="price">¥{{ parseFloat(info.realPrice) }}</view>
+				<view class="price">¥{{ parseFloat(info.remainDebtPrice) }}</view>
 				<view class="price" style="font-weight:normal;color:#3385FF;font-size:33upx;" @click.stop="goToDetai(info)">查看明细</view>
 			</view>
 		</view>

+ 2 - 2
ghsApp/src/pagesOrder/arrival.vue

@@ -11,13 +11,13 @@
 									<text class="item-name">{{ s.name }}</text>
 									<text class="item-price">
 										<text class="unit"></text>
-										<text class="price"><text v-if="s.bigNum>0">{{s.bigNum}}扎</text></text>
+										<text class="price"><text>{{s.xhNum}}{{s.xhUnitName}}</text></text>
 									</text>
 								</view>
 								<view class="info-line">
 									<text class="item-type"></text>
 									<view class="item-count">
-										<input type="number" class="num" v-model="s.bigNum" placeholder="到货数量" />
+										<input type="number" class="num" v-model="s.xhNum" placeholder="到货数量" />
 										<input type="digit" class="price" v-model="s.currentCost" placeholder="成本" />
 									</view>
 								</view>

+ 2 - 2
hdApp/src/admin/home/apply.vue

@@ -59,8 +59,8 @@ export default {
           list: [
             {name: "利润表",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/profit"},
             {name: "收入渠道",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/kdIncome"},
-            {name: "花材销售榜",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/productSale"},
-            {name: "客户下单榜",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/customSale"},
+            {name: "花材销",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/productSale"},
+            // {name: "客户下单榜",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/customSale"},
             {name: "采购统计",img: `${this.$constant.imgUrl}/ghs/home/jyzk.png`,url: "/admin/statistics/cgStat"}
           ]
         },

+ 214 - 0
hdApp/src/admin/statistics/cgStat.vue

@@ -0,0 +1,214 @@
+<template>
+<view class="app-content">
+	<view class="ex-page">
+		<view class="input-wrap_box">
+		<view>
+			<AppSearchModule placeholder="输入英文字母搜索" @input="searchFn"/>
+		</view>
+		</view>
+		<view class="top-bar">
+			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+		</view>
+		<view class="main-view">
+			<view class="space-view ex-table">
+				<block>
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+						<t-tr header><t-th>供应商</t-th><t-th>数量</t-th><t-th>金额</t-th><t-th>操作</t-th></t-tr>
+						<view v-for="(item, index) in profile" :key="index">
+							<t-tr>
+								<t-td><view>{{item.ghsName}}</view></t-td>
+								<t-td><view>{{parseFloat(item.num)}}</view></t-td>
+								<t-td><view>{{parseFloat(item.amount)}}</view></t-td>
+								<t-td></t-td>
+							</t-tr>
+						</view>
+					</t-table>
+				</block>
+			</view>
+		</view>
+	</view>
+</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatCgGhsProfile } from "@/api/statistics/index";
+import { list } from "@/mixins";
+import ShopSelect from "@/components/module/shopSelect";
+import DateSelect from "@/components/module/dateSelect";
+import AppSearchModule from "@/components/module/app-search";
+import {mapActions, mapGetters} from "vuex";
+export default {
+	components: { SelectList, AppWrapperEmpty,ShopSelect,AppSearchModule,DateSelect },
+	mixins: [list],
+	computed: {		...mapGetters(["getDictionariesInfo","getLoginInfo"])	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:[],
+			shopId:'',
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{ name: "姓名", dataIndex: "name", color: "info" },
+				{ name: "开单额", dataIndex: "amount", color: "info", width: 120, align: "center" },
+				{ name: "开单数", dataIndex: "num", color: "info", align: "center" }
+			],
+			dataList: [],
+			params:{ itemId: '', searchTime:'', startTime: "", endTime: "", shopId: "", },
+			profile:[],
+			storageData:[],
+			searchContent:'',
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this.getList().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		searchFn(e){
+			this.searchContent = e;
+			this.filterStat()
+		},
+		filterStat(){
+			let that = this
+			if(this.searchContent.length > 0){
+				that.profile = [];
+				that.storageData.forEach(obj => {
+					let hasName = obj.name && obj.name.indexOf(this.searchContent) >= 0;
+					let elePy = (obj.py && obj.py.toLocaleUpperCase()) || "";
+					let hasPy = elePy.indexOf(this.searchContent.toLocaleUpperCase()) >= 0;
+					if (hasName || hasPy) {
+						that.profile.push(obj)
+					}
+				})
+			}else{
+				that.profile = that.storageData
+			}
+		},
+		//选择分店
+		selectShopFn(val){
+			this.params.shopId = val.id;
+			this.init();
+		},
+		//选择时间
+		selectDateFn(val) {
+			this.params = {...this.params,...val}
+			this.init();			
+		},
+		async init() {
+			this.getList();
+		},
+		getList() {
+			let that = this
+			uni.showLoading()
+			getStatCgGhsProfile(this.params).then(res => {
+				uni.hideLoading()
+				if (!this.$util.isEmpty(res.data.list)) {
+					that.storageData = res.data.list
+					that.filterStat()
+				}else{
+					that.storageData=[]
+				}
+			});
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	padding-top:20upx;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		top:116upx;
+		display: flex;
+		width: 100%;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 80upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+			.change-level{
+				font-size:22upx;
+				padding:10upx 15upx;
+			}
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 266 - 0
hdApp/src/admin/statistics/customSale.vue

@@ -0,0 +1,266 @@
+<template>
+<view class="app-content">
+	<view class="ex-page">
+		<view class="input-wrap_box">
+		<view>
+			<AppSearchModule placeholder="输入英文字母搜索" @input="searchFn"/>
+		</view>
+		</view>
+
+		<view class="top-bar">
+			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+		</view>
+
+		<view class="main-view">
+			<view class="space-view ex-table">
+				<block>
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+
+						<t-tr header><t-th>客户</t-th><t-th>等级</t-th><t-th>数量</t-th><t-th>金额</t-th><t-th>操作</t-th></t-tr>
+
+						<view v-for="(item, index) in profile" :key="index">
+							<t-tr>
+								<t-td><view>{{item.customName}}</view></t-td>
+								<t-td><view>{{item.levelName}}</view></t-td>
+								<t-td><view>{{parseFloat(item.num)}}</view></t-td>
+								<t-td><view>{{parseFloat(item.amount)}}</view></t-td>
+								<t-td>
+									<button class="admin-button-com mini blue change-level" @click="updateLevel(item)">调等级</button>
+								</t-td>
+							</t-tr>
+						</view>
+
+					</t-table>
+				</block>
+			</view>
+		</view>
+
+
+	</view>
+</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatKhCgProfile } from "@/api/statistics/index";
+import { changeLevel } from "@/api/custom";
+import { list } from "@/mixins";
+import ShopSelect from "@/components/module/shopSelect";
+import DateSelect from "@/components/module/dateSelect";
+import AppSearchModule from "@/components/module/app-search";
+import {mapActions, mapGetters} from "vuex";
+export default {
+	components: { SelectList, AppWrapperEmpty,ShopSelect,AppSearchModule,DateSelect },
+	mixins: [list],
+	computed: {		...mapGetters(["getDictionariesInfo","getLoginInfo"])	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:[],
+			shopId:'',
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{
+					name: "姓名",
+					dataIndex: "name",
+					color: "info"
+				},
+				{
+					name: "开单额",
+					dataIndex: "amount",
+					color: "info",
+					width: 120,
+					align: "center"
+				},
+				{
+					name: "开单数",
+					dataIndex: "num",
+					color: "info",
+					align: "center"
+				}
+			],
+			dataList: [],
+			params:{
+				itemId: '',
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+				shopId: "",
+			},
+			profile:[],
+			storageData:[],
+			searchContent:'',
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this.getList().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		searchFn(e){
+			this.searchContent = e;
+			this.filterStat()
+		},
+		filterStat(){
+			let that = this
+			if(this.searchContent.length > 0){
+				that.profile = [];
+				that.storageData.forEach(obj => {
+					let hasName = obj.name && obj.name.indexOf(this.searchContent) >= 0;
+					let elePy = (obj.py && obj.py.toLocaleUpperCase()) || "";
+					let hasPy = elePy.indexOf(this.searchContent.toLocaleUpperCase()) >= 0;
+					if (hasName || hasPy) {
+						that.profile.push(obj)
+					}
+				})
+			}else{
+				that.profile = that.storageData
+			}
+		},
+		//选择分店
+		selectShopFn(val){
+			this.params.shopId = val.id;
+			this.init();
+		},
+		//选择时间
+		selectDateFn(val) {
+			this.params = {...this.params,...val}
+			this.init();			
+		},
+		async init() {
+			this.getList();
+		},
+		getList() {
+			let that = this
+			uni.showLoading()
+			getStatKhCgProfile(this.params).then(res => {
+				uni.hideLoading()
+				if (!this.$util.isEmpty(res.data.list)) {
+					that.storageData = res.data.list
+					that.filterStat()
+				}else{
+					that.storageData=[]
+				}
+			});
+		},
+		updateLevel(item){
+			let customId = item.customId
+			let self = this
+			let levelList = ['散客', '普店', '银店', '金店']
+			uni.showActionSheet({
+				itemList: levelList,
+				success: function (respond) {
+					let currentIndex = respond.tapIndex
+					changeLevel({customId:customId,level:currentIndex}).then(res => {
+						if(res.code == 1) {
+							item.levelName = res.data.levelName
+							self.$msg(res.msg)
+						}
+					}).catch(err => {
+						console.log('err', err)
+					})
+				}
+			})
+
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	padding-top:20upx;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		top:116upx;
+		display: flex;
+		width: 100%;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 80upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+			.change-level{
+				font-size:22upx;
+				padding:10upx 15upx;
+			}
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 186 - 0
hdApp/src/admin/statistics/incomeStat.vue

@@ -0,0 +1,186 @@
+<template>
+	<view class="ex-page">
+		<view class="top-bar">
+			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+		</view>
+		<scroll-view scroll-y scroll-with-animation class="main-view">
+			<view class="space-view ex-table">
+				<block>
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+
+						<t-tr header><t-th>客户</t-th><t-th>应收款(元)</t-th><t-th>操作</t-th></t-tr>
+						<t-tr><t-td><view>米加加鲜花</view></t-td><t-td><view>86500.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花点时间</view></t-td><t-td><view>70129.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>国兰花尚</view></t-td><t-td><view>67111.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>一间花店</view></t-td><t-td><view>51906.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花极客</view></t-td><t-td><view>4403.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花朵朵</view></t-td><t-td><view>3501.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>松柏花艺</view></t-td><t-td><view>23214.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花和尚</view></t-td><t-td><view>1479.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花植言</view></t-td><t-td><view>1645.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>拈花微笑</view></t-td><t-td><view>1153.00</view></t-td><t-td><view></view></t-td></t-tr>
+
+					</t-table>
+				</block>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatProfit } from "@/api/statistics/index";
+import { list } from "@/mixins";
+import DorpdownSelect from "@/components/module/shopSelect";
+import {mapActions, mapGetters} from "vuex";
+export default {
+	components: { SelectList, AppWrapperEmpty,DorpdownSelect },
+	mixins: [list],
+	computed: {		...mapGetters(["getDictionariesInfo","getLoginInfo"])	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:'',
+			shopId:'',//选择分店id
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{
+					name: "姓名",
+					dataIndex: "name",
+					color: "info"
+				},
+				{
+					name: "开单额",
+					dataIndex: "amount",
+					color: "info",
+					width: 120,
+					align: "center"
+				},
+				{
+					name: "开单数",
+					dataIndex: "num",
+					color: "info",
+					align: "center"
+				}
+			],
+			dataList: [],
+			params:{
+				itemId: '',
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+				shopId: "",
+			},
+			profit:[],
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this._list().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		async init() {
+			this._list();
+		},
+		_list() {
+			let that = this
+			getStatProfit(this.params).then(res => {
+				that.profit = res.data
+			});
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		display: flex;
+		width: 100%;
+		top:116upx;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 80upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 211 - 0
hdApp/src/admin/statistics/kdIncome.vue

@@ -0,0 +1,211 @@
+<template>
+<view class="app-content">
+	<view class="ex-page">
+		<view class="top-bar">
+			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+		</view>
+
+		<view  class="main-view">
+			<view class="space-view ex-table">
+				<block>
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+						<t-tr header><t-th>收款方式</t-th><t-th>收入金额</t-th><t-th>退款金额</t-th></t-tr>
+
+						<view v-for="(item, index) in profile" :key="index">
+							<t-tr>
+								<t-td><view>{{item.name}}</view></t-td>
+								<t-td><view>{{item.kd}}</view></t-td>
+								<t-td><view>{{item.refund}}</view></t-td>
+							</t-tr>
+						</view>
+
+					</t-table>
+				</block>
+			</view>
+			<view class="act-income">扣除退款后收入:¥{{income}}</view>
+		</view>
+	</view>
+</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatKdProfile } from "@/api/statistics/index";
+import { list } from "@/mixins";
+import ShopSelect from "@/components/module/shopSelect";
+import DateSelect from "@/components/module/dateSelect";
+import {mapActions, mapGetters} from "vuex";
+export default {
+	components: { SelectList, AppWrapperEmpty,ShopSelect,DateSelect},
+	mixins: [list],
+	computed: {		...mapGetters(["getDictionariesInfo","getLoginInfo"])	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:'',
+			menuTimeObj:'',
+			menuShopObj:'',
+			shopId:'',
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{
+					name: "姓名",
+					dataIndex: "name",
+					color: "info"
+				},
+				{
+					name: "开单额",
+					dataIndex: "amount",
+					color: "info",
+					width: 120,
+					align: "center"
+				},
+				{
+					name: "开单数",
+					dataIndex: "num",
+					color: "info",
+					align: "center"
+				}
+			],
+			dataList: [],
+			params:{
+				itemId: '',
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+				shopId: "",
+			},
+			profile:[],
+			income:0
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this._list().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		//选择分店
+		selectShopFn(val){
+			this.params.shopId = val.id;
+			this.init();
+		},
+		//选择时间
+		selectDateFn(val) {
+			this.params = {...this.params,...val}
+			this.init();			
+		},
+		async init() {
+			this._list();
+		},
+		_list() {
+			let that = this
+			uni.showLoading()
+			getStatKdProfile(this.params).then(res => {
+				uni.hideLoading()
+				that.profile = res.data.list
+				that.income = res.data.income
+			});
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	padding-top:20upx;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		display: flex;
+		width: 100%;
+		top:20upx;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 60upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+		}
+		.act-income{
+			margin-left:60upx;
+			margin-top:30upx;
+			font-size:30upx;
+			color:rgb(92, 91, 91);
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 183 - 0
hdApp/src/admin/statistics/mayPayStat.vue

@@ -0,0 +1,183 @@
+<template>
+	<view class="ex-page">
+		<view class="top-bar">
+			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+		</view>
+		<scroll-view scroll-y scroll-with-animation class="main-view">
+			<view class="space-view ex-table">
+				<block>
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+
+						<t-tr header><t-th>供应商</t-th><t-th>应付款(元)</t-th><t-th>操作</t-th></t-tr>
+						<t-tr><t-td><view>盛丰</view></t-td><t-td><view>286500.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>茗星花卉</view></t-td><t-td><view>170129.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>珍情花卉</view></t-td><t-td><view>367111.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花伍鲜花</view></t-td><t-td><view>551906.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花醉美</view></t-td><t-td><view>74403.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>美旗鲜花</view></t-td><t-td><view>64403.00</view></t-td><t-td><view></view></t-td></t-tr>
+						<t-tr><t-td><view>花醉美</view></t-td><t-td><view>94403.00</view></t-td><t-td><view></view></t-td></t-tr>
+
+					</t-table>
+				</block>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatProfit } from "@/api/statistics/index";
+import { list } from "@/mixins";
+import DorpdownSelect from "@/components/module/shopSelect";
+import {mapActions, mapGetters} from "vuex";
+export default {
+	components: { SelectList, AppWrapperEmpty,DorpdownSelect },
+	mixins: [list],
+	computed: {		...mapGetters(["getDictionariesInfo","getLoginInfo"])	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:'',
+			shopId:'',
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{
+					name: "姓名",
+					dataIndex: "name",
+					color: "info"
+				},
+				{
+					name: "开单额",
+					dataIndex: "amount",
+					color: "info",
+					width: 120,
+					align: "center"
+				},
+				{
+					name: "开单数",
+					dataIndex: "num",
+					color: "info",
+					align: "center"
+				}
+			],
+			dataList: [],
+			params:{
+				itemId: '',
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+				shopId: "",
+			},
+			profit:[],
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this._list().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		async init() {
+			this._list();
+		},
+		_list() {
+			let that = this
+			getStatProfit(this.params).then(res => {
+				that.profit = res.data
+			});
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		display: flex;
+		width: 100%;
+		top:116upx;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 80upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 232 - 0
hdApp/src/admin/statistics/productSale.vue

@@ -0,0 +1,232 @@
+<template>
+<view class="app-content">
+	<view class="ex-page">
+    <view class="input-wrap_box">
+      <view>
+        <AppSearchModule placeholder="输入英文字母搜索" @input="searchFn"/>
+      </view>
+    </view>
+
+	<view class="top-bar">
+		<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+	</view>
+
+		<scroll-view scroll-y scroll-with-animation class="main-view">
+			<view class="space-view ex-table">
+				<block v-if="!$util.isEmpty(profile)">
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+						<t-tr header><t-th>花材</t-th><t-th>数量</t-th><t-th>金额</t-th></t-tr>
+						<view v-for="(item, index) in profile" :key="index" @click="goDetail(item)">
+							<t-tr>
+								<t-td><view>{{item.name}}</view></t-td>
+								<t-td><view>{{parseFloat(item.num)}}</view></t-td>
+								<t-td><view>{{parseFloat(item.amount)}}</view></t-td>
+							</t-tr>
+						</view>
+					</t-table>
+				</block>
+			</view>
+		</scroll-view>
+	</view>
+</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatItemProfit } from "@/api/statistics/index";
+import { list } from "@/mixins";
+import ShopSelect from "@/components/module/shopSelect";
+import DateSelect from "@/components/module/dateSelect";
+import {mapActions, mapGetters} from "vuex";
+import AppSearchModule from "@/components/module/app-search";
+export default {
+	components: { SelectList, AppWrapperEmpty,ShopSelect,DateSelect,AppSearchModule},
+	mixins: [list],
+	computed: {		...mapGetters(["getDictionariesInfo","getLoginInfo"])	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:'',
+			shopId:'',
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{
+					name: "姓名",
+					dataIndex: "name",
+					color: "info"
+				},
+				{
+					name: "开单额",
+					dataIndex: "amount",
+					color: "info",
+					width: 120,
+					align: "center"
+				},
+				{
+					name: "开单数",
+					dataIndex: "num",
+					color: "info",
+					align: "center"
+				}
+			],
+			dataList: [],
+			params:{
+				itemId: '',
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+				shopId: "",
+			},
+			profile:[],
+			storageData:[],
+			searchContent:'',
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this.getStatList().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		searchFn(e){
+			this.searchContent = e;
+			this.filterStat()
+		},
+		filterStat(){
+			let that = this
+			if(this.searchContent.length > 0){
+				that.profile = [];
+				that.storageData.forEach(obj => {
+					let hasName = obj.name && obj.name.indexOf(this.searchContent) >= 0;
+					let elePy = (obj.py && obj.py.toLocaleUpperCase()) || "";
+					let hasPy = elePy.indexOf(this.searchContent.toLocaleUpperCase()) >= 0;
+					if (hasName || hasPy) {
+						that.profile.push(obj)
+					}
+				})
+			}else{
+				that.profile = that.storageData
+			}
+		},
+		//选择分店
+		selectShopFn(val){
+			this.params.shopId = val.id;
+			this.init();
+		},
+		//选择时间
+		selectDateFn(val) {
+			this.params = {...this.params,...val}
+			this.init();			
+		},
+		async init() {
+			this.getStatList();
+		},
+		getStatList() {
+			let that = this
+			uni.showLoading()
+			getStatItemProfit(this.params).then(res => {
+				uni.hideLoading()
+				if (!this.$util.isEmpty(res.data.list)) {
+					that.storageData = res.data.list
+					that.filterStat()
+				}else{
+					that.storageData=[]
+				}
+			});
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	padding-top:20upx;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		display: flex;
+		width: 100%;
+		top:116upx;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 80upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 213 - 0
hdApp/src/admin/statistics/profit.vue

@@ -0,0 +1,213 @@
+<template>
+<view class="app-content">
+	<view class="ex-page">
+		<view class="top-bar">
+			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+		</view>
+		<scroll-view scroll-y scroll-with-animation class="main-view">
+			<view class="space-view ex-table">
+				<block>
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+
+						<t-tr header>
+							<t-th>类型</t-th>
+							<t-th>金额</t-th>
+							<t-th>操作</t-th>
+						</t-tr>
+
+						<t-tr v-for="(item, inIndex) in profit.income" :key="inIndex">
+							<t-td><view>{{item.name}}</view></t-td>
+							<t-td><view>{{item.amount}}</view></t-td>
+							<t-td><view></view></t-td>
+						</t-tr>
+						<!--同个节点v-for key重复会报错,所以再包一层-->
+						<view>
+							<t-tr v-for="(item, exIndex) in profit.expend" :key="exIndex">
+								<t-td><view>{{item.name}}</view></t-td>
+								<t-td v-if="item.amount==0"><view>0</view></t-td>
+								<t-td v-else><view>-{{item.amount}}</view></t-td>
+								<t-td><view></view></t-td>
+							</t-tr>
+							</view>
+						<t-tr>
+							<t-td align="center"><view style="font-weight:bold;color:black;">合计:{{profit.balance||0}}</view></t-td>
+						</t-tr>
+
+					</t-table>
+				</block>
+			</view>
+		</scroll-view>
+	</view>
+</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatProfit } from "@/api/statistics/index";
+import { list } from "@/mixins";
+import ShopSelect from "@/components/module/shopSelect";
+import DateSelect from "@/components/module/dateSelect";
+import {mapActions, mapGetters} from "vuex";
+export default {
+	components: { SelectList, AppWrapperEmpty,ShopSelect,DateSelect},
+	mixins: [list],
+	computed: {		
+		...mapGetters(["getDictionariesInfo","getLoginInfo"])
+	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:'',
+			shopId:'',
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{
+					name: "姓名",
+					dataIndex: "name",
+					color: "info"
+				},
+				{
+					name: "开单额",
+					dataIndex: "amount",
+					color: "info",
+					width: 120,
+					align: "center"
+				},
+				{
+					name: "开单数",
+					dataIndex: "num",
+					color: "info",
+					align: "center"
+				}
+			],
+			dataList: [],
+			params:{
+				itemId: '',
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+				shopId: "",
+			},
+			profit:[],
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this._list().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		//选择分店
+		selectShopFn(val){
+			this.params.shopId = val.id;
+			this.init();
+		},
+		//选择时间
+		selectDateFn(val) {
+			this.params = {...this.params,...val}
+			this.init();			
+		},
+		async init() {
+			this._list();
+		},
+		_list() {
+			let that = this
+			getStatProfit(this.params).then(res => {
+				that.profit = res.data
+			});
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		display: flex;
+		width: 100%;
+		top:20upx;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 80upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 207 - 0
hdApp/src/admin/statistics/sale.vue

@@ -0,0 +1,207 @@
+<template>
+	<view class="ex-page">
+		<view class="top-bar">
+			<DateSelect class="bar" top="0" @selectDateFn="selectDateFn" />
+		</view>
+		<scroll-view scroll-y scroll-with-animation class="main-view">
+			<view class="space-view ex-table">
+				<block>
+					<t-table :headerBackgroundColor="'#F0F2F6'">
+						<t-tr header>
+							<t-th>类型</t-th>
+							<t-th>金额</t-th>
+							<t-th>操作</t-th>
+						</t-tr>
+
+						<t-tr v-for="(item, index) in profit.income" :key="index">
+							<t-td><view>{{item.name}}</view></t-td>
+							<t-td><view>{{item.amount}}</view></t-td>
+							<t-td><view></view></t-td>
+						</t-tr>
+
+						<t-tr v-for="(item, index) in profit.expend" :key="index">
+							<t-td><view>{{item.name}}</view></t-td>
+							<t-td v-if="item.amount==0"><view>0</view></t-td>
+							<t-td v-else><view>-{{item.amount}}</view></t-td>
+							<t-td><view></view></t-td>
+						</t-tr>
+
+						<t-tr>
+							<t-td align="center"><view style="font-weight:bold;color:black;">合计:{{profit.balance||0}}</view></t-td>
+						</t-tr>
+
+					</t-table>
+				</block>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatProfit } from "@/api/statistics/index";
+import { list } from "@/mixins";
+import ShopSelect from "@/components/module/shopSelect";
+import DateSelect from "@/components/module/dateSelect";
+import {mapActions, mapGetters} from "vuex";
+export default {
+	components: { SelectList, AppWrapperEmpty,ShopSelect,DateSelect },
+	mixins: [list],
+	computed: {		...mapGetters(["getDictionariesInfo","getLoginInfo"])	},
+	data() {
+		return {
+			isShow:false,
+			customizationTime:'',
+			shopId:'',
+			itemId:'',
+			nowTime: "",
+			showTimeDropdown: false,
+			nowShop: "",
+			showShopDropdown: false,
+			columns: [
+				{
+					name: "姓名",
+					dataIndex: "name",
+					color: "info"
+				},
+				{
+					name: "开单额",
+					dataIndex: "amount",
+					color: "info",
+					width: 120,
+					align: "center"
+				},
+				{
+					name: "开单数",
+					dataIndex: "num",
+					color: "info",
+					align: "center"
+				}
+			],
+			dataList: [],
+			params:{
+				itemId: '',
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+				shopId: "",
+			},
+			profit:[],
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this._list().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	onLoad(e) {
+		this.itemId = e.id;
+		this.params.itemId = e.id;
+		this.shopId = this.getLoginInfo.shopId;
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		//选择分店
+		selectShopFn(val){
+			this.params.shopId = val.id;
+			this.init();
+		},
+		//选择时间
+		selectDateFn(val) {
+			this.params = {...this.params,...val}
+			this.init();			
+		},
+		async init() {
+			this._list();
+		},
+		_list() {
+			let that = this
+			getStatProfit(this.params).then(res => {
+				that.profit = res.data
+			});
+		}
+	}
+};
+</script>
+<style lang="scss" scoped>
+.ex-page {
+	background: white;
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	.top-bar {
+		position: absolute;
+		left: 0;
+		display: flex;
+		width: 100%;
+		top:116upx;
+		z-index: 20;
+		.bar{
+			width: 50%;
+			height: 100%;
+			text-align: center;
+			&:nth-child(1){
+				border-right: 1upx solid #eeeeec;
+			}
+		}
+	}
+	.main-view {
+		margin-top: 80upx;
+		flex: 1;
+		background-color: #f9fbfc;
+		.space-view {
+			background-color: #fff;
+		}
+		.ex-info {
+			padding: 30upx;
+			.info-cell {
+				display: flex;
+				align-items: center;
+				font-size: 28upx;
+				&:not(:first-child) {
+					margin-top: 20upx;
+				}
+				.cell-label {
+					width: 110upx;
+					color: #666666;
+				}
+				.cell-value {
+					margin-left: 40upx;
+					color: #333;
+					&.warning {
+						color: #ffaf1d;
+					}
+					&.success {
+						color: #27c325;
+					}
+				}
+			}
+		}
+		.ex-table {
+			/deep/.icon-info {
+				color: #333333;
+			}
+		}
+	}
+	.bar-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		padding: 0 30upx;
+		width: 100%;
+		height: 100upx;
+
+		box-shadow: 0upx -1upx 6upx 0upx rgba(4, 0, 0, 0.06);
+		.info-view {
+			font-size: 26upx;
+		}
+		.btn-view {
+			display: flex;
+			.admin-button-com {
+				margin: 0 10upx;
+			}
+		}
+	}
+}
+</style>

+ 31 - 4
hdApp/src/api/statistics/index.js

@@ -1,8 +1,6 @@
 import https from '@/plugins/luch-request_0.0.7/request'
 
-/** *
- * 数据统计
- */
+//数据统计
 export const getStatList = data => {
 	return https.get('/stat/list', data)
 }
@@ -13,4 +11,33 @@ export const getMainProfile = data => {
 //员工业绩
 export const getStatYj = data => {
 	return https.get('/stat-yj/list', data)
-}
+}
+
+//业绩
+export const getStatProfit = data => {
+	return https.get('/stat/profit', data)
+}
+
+//花材排行
+export const getStatItemProfit = data => {
+	return https.get('/stat-item/profile', data)
+}
+
+//收入统计
+export const getStatKdProfile = data => {
+	return https.get('/stat-kd/profile', data)
+}
+
+//客户下单排行
+export const getStatKhCgProfile = data => {
+	return https.get('/stat-kh-cg/profile', data)
+}
+
+//客户下单排行
+export const getStatCgGhsProfile = data => {
+	return https.get('/stat-cg-ghs/profile', data)
+}
+
+export const getStatBookProfit = data => {
+	return https.get('/stat-book/profile', data)
+}

+ 149 - 0
hdApp/src/components/module/shopSelect.vue

@@ -0,0 +1,149 @@
+<template>
+    <view class="select-bg_bx">
+        <view v-if="isShowTit" @click="switchCut" :class="['select-title',dropdownShow?'select_corlor':'']">
+            <text>{{showShopName!=''?showShopName:getMyShopInfo.shopName}}</text>
+            <text v-if="placeholder" style="color: #ccc;">{{placeholder}}</text>
+            <i v-if="isShowMore" class="iconfont iconsanjiao_xia"></i>
+        </view>
+        <view v-else @click="switchCut" :class="['select-title',dropdownShow?'select_corlor':'']">
+          <text v-if="placeholder" style="color: #ccc;">{{placeholder}}</text>
+        </view>
+        <view class="select-mark-view" v-show="dropdownShow" @click="switchCut"></view>
+        <view v-if="dropdownShow" :style="{top}" class="select-fixed_bx">
+            <slot>
+                <view class="select-item-box">
+                    <view class="title">门店</view>
+                    <view class="item-child_box">
+                        <button v-for="(item,index) in shopList" :key="index" @click="changeItem(item)" 
+                        :class="['admin-button-com','mini-btn','default']"> {{item.name}} </button>
+                    </view>
+                </view>
+            </slot>
+        </view>
+    </view>
+</template>
+<script>
+import DropdownList from "@/components/plugin/dropdown-list";
+import {mapGetters,mapState} from "vuex";
+export default {
+    name:'DorpdownSelect',
+    components:{
+        DropdownList
+    },
+    props:{
+        top:{
+            type: String,
+            default: 'auto'
+        },
+        isShowTit:{
+            type: Boolean,
+            default: true
+        },
+            typeTime:{
+            type: Boolean,
+            default: false
+        },
+        isShowMore:{
+            type: Boolean,
+            default: true
+        },
+        placeholder: {
+            type: String,
+            default: ''
+        }
+    },
+    data(){
+        return {
+            dropdownShow: false,
+            selectItem:'',
+            showShopName:'',
+            shopList:[]
+        }
+    },
+    computed:{
+		...mapGetters(["getMyShopInfo"]),
+        ...mapState({userShopAll:state=>state.user.userShopAll}),
+    },
+    mounted(){
+        this.shopList = this.userShopAll.map(i=>({...i,name:i.shopName}))
+    },
+	watch:{
+        userShopAll (val) {
+			if(!this.$util.isEmpty(val)) {
+				this.shopList = val.map(i=>({
+					...i,
+					name:i.shopName
+				}));
+			}
+		}
+	},
+    methods:{
+        switchCut(){
+            this.dropdownShow = !this.dropdownShow
+        },
+        changeItem(val){
+            this.dropdownShow = false;
+            this.showShopName = val.name;
+            this.$emit('selectShopFn',val)
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.select-bg_bx {
+    .select-title {
+        color: #666666;
+        font-size: 26upx;
+        & .iconsanjiao_xia {
+            margin-left: 10upx;
+        }
+        &.select_corlor {
+            color: #3385FF;
+            & .iconsanjiao_xia {
+                transform: rotate(180deg);
+            }
+        }
+    }
+    .select-mark-view {
+        height: 100vh;
+        height: 100%;
+        position: fixed;
+        width: 100%;
+        background-color: rgba(0, 0, 0, 0.5);
+        left: 0;
+        top: 0upx;
+        z-index: 20;
+    }
+    & .select-fixed_bx {
+        position: fixed;
+        width: 100%;
+        background-color: #FFFFFF;
+        left: 0upx;
+        top:0upx;
+        z-index: 29;
+        padding:110upx 30upx 40upx;
+        border-radius: 0upx 0upx 20upx 20upx;
+        transition: all 0.5s ease-in-out;
+        & .select-item-box {
+            & .title {
+                font-size: 24upx;
+                color: #333333;
+                font-weight: 600;
+                text-align: left;
+            }
+            & .item-child_box {
+                padding: 20upx 0 0;
+                align-items: center;
+                & .admin-button-com {
+                    margin-bottom: 20upx;
+                    padding: 18upx 50upx;
+                    margin-right: 20upx;
+                    &.custom {
+                        width: 100%;
+                    }
+                }
+            }
+        }
+    }
+}
+</style>

+ 6 - 1
hdApp/src/pages.json

@@ -212,7 +212,12 @@
 		{
 			"root": "admin/statistics",
 			"pages": [
-				{ "path": "demo", "style": { "navigationBarTitleText": "数据统计" } }
+				{"path": "profit","style": {"navigationBarTitleText": "利润表"}},
+				{"path": "productSale","style": {"navigationBarTitleText": "花材销量"}},
+				{"path": "kdIncome","style": {"navigationBarTitleText": "收入渠道"}},
+				{"path": "incomeStat","style": {"navigationBarTitleText": "应收款"}},
+				{"path": "cgStat","style": {"navigationBarTitleText": "采购统计"}},
+				{"path": "mayPayStat","style": {"navigationBarTitleText": "应付款"}}
 			]
 		},
 		{

+ 1 - 1
hdApp/src/pagesPurchase/components/gatheringList.vue

@@ -12,7 +12,7 @@
         <view class="mark">{{ info.addTime.substr(0,16) }}</view>
       </view>
       <view class="item-row">
-        <view class="price">¥{{ parseFloat(info.realPrice) }}</view>
+        <view class="price">¥{{ parseFloat(info.remainDebtPrice) }}</view>
         <view class="price" style="font-weight:normal;color:#3385FF;font-size:32upx;" @click.stop="goToDetai(info)">查看明细</view>
       </view>
     </view>

+ 1 - 7
hdApp/src/pagesPurchase/gatherPay.vue

@@ -1,18 +1,14 @@
 <template>
-  <!-- 各种回调页面 -->
   <div class="app-content awaitPayYe awaitPayYe">
     <div class="callback-wrap">
       <div class="bg_01"></div>
       <div class="callback-blo">
-        <!-- 使用icon -->
-        <!-- 待支付 -->
         <block>
           <div class="icon">
             <i class="iconfont icondaizhifu"></i>
           </div>
         </block>
         <view class="wait">待付款</view>
-        <!-- 待支付 -->
         <block>
           <div class="price">
             <span>¥</span>
@@ -32,7 +28,6 @@
     </div>
   </div>
 </template>
-
 <script>
 import { purchaseClearWxPay } from "@/api/purchase/index";
 import wexinPay from "@/utils/pay/wxPay";
@@ -48,8 +43,7 @@ export default {
       },
       psdKey: '',
       orderSn: '',
-      actPrice: '',
-      _type: '1'
+      actPrice: ''
     };
   },
   onLoad (options) {

+ 1 - 1
hdApp/src/pagesPurchase/gathering.vue

@@ -89,7 +89,7 @@ export default {
       if (this.detailsList) {
         for (const item of this.detailsList) {
           if (item.checked) {
-            amount = amount + Number(item.realPrice);
+            amount = amount + Number(item.remainDebtPrice);
           }
         }
       }