Просмотр исходного кода

Merge branch 'zhongqi-delivery' of git.huaml.com:zhh/front-end into zhongqi-delivery

shizhongqi 8 месяцев назад
Родитель
Сommit
b0b0a7acb5
100 измененных файлов с 3611 добавлено и 796 удалено
  1. 2 2
      ghsApp/src/admin/billing/customerPlace.vue
  2. 2 2
      ghsApp/src/admin/billing/index.vue
  3. 4 4
      ghsApp/src/admin/billing/index2.vue
  4. 4 4
      ghsApp/src/admin/billing/priceChange.vue
  5. 3 3
      ghsApp/src/admin/breakage/index.vue
  6. 2 2
      ghsApp/src/admin/changePrice/batchChange.vue
  7. 2 2
      ghsApp/src/admin/changePrice/batchChange2.vue
  8. 2 2
      ghsApp/src/admin/changePrice/changeCgStaff.vue
  9. 2 2
      ghsApp/src/admin/changePrice/changeClass.vue
  10. 2 2
      ghsApp/src/admin/changePrice/changeStock.vue
  11. 4 4
      ghsApp/src/admin/changePrice/changeStock2.vue
  12. 4 4
      ghsApp/src/admin/changePrice/list.vue
  13. 2 2
      ghsApp/src/admin/changePrice/list2.vue
  14. 4 4
      ghsApp/src/admin/changePrice/outList.vue
  15. 4 4
      ghsApp/src/admin/changePrice/removeList.vue
  16. 4 4
      ghsApp/src/admin/changePrice/setSon.vue
  17. 4 4
      ghsApp/src/admin/changePrice/stopList.vue
  18. 4 4
      ghsApp/src/admin/cp/delList.vue
  19. 4 4
      ghsApp/src/admin/cp/item.vue
  20. 4 4
      ghsApp/src/admin/cp/list.vue
  21. 4 4
      ghsApp/src/admin/cp/ptCpList.vue
  22. 314 0
      ghsApp/src/admin/custom/dist.vue
  23. 381 0
      ghsApp/src/admin/custom/distCustom.vue
  24. 38 6
      ghsApp/src/admin/custom/set.vue
  25. 11 13
      ghsApp/src/admin/home/apply.vue
  26. 3 1
      ghsApp/src/admin/home/member.vue
  27. 50 4
      ghsApp/src/admin/item/detail.vue
  28. 2 2
      ghsApp/src/admin/item/lakala.vue
  29. 2 2
      ghsApp/src/admin/item/list.vue
  30. 17 5
      ghsApp/src/admin/item/list2.vue
  31. 2 2
      ghsApp/src/admin/item/selectList.vue
  32. 2 2
      ghsApp/src/admin/item/sendStock.vue
  33. 2 2
      ghsApp/src/admin/part/index.vue
  34. 2 2
      ghsApp/src/admin/ptItem/itemList.vue
  35. 201 50
      ghsApp/src/admin/shop/renew.vue
  36. 5 3
      ghsApp/src/admin/shop/renewSuccess.vue
  37. 246 5
      ghsApp/src/admin/shop/sk.vue
  38. 20 8
      ghsApp/src/admin/stat/customSale.vue
  39. 195 0
      ghsApp/src/admin/stat/distSale.vue
  40. 1 1
      ghsApp/src/admin/stat/profit.vue
  41. 8 7
      ghsApp/src/admin/stat/stock.vue
  42. 12 0
      ghsApp/src/api/custom/index.js
  43. 25 0
      ghsApp/src/api/dist/index.js
  44. 5 1
      ghsApp/src/api/order/index.js
  45. 5 0
      ghsApp/src/api/product/index.js
  46. 4 0
      ghsApp/src/api/stat/index.js
  47. 2 2
      ghsApp/src/manifest.json
  48. 20 4
      ghsApp/src/mixins/product2.js
  49. 8 4
      ghsApp/src/pages.json
  50. 91 12
      ghsApp/src/pagesClient/member/detail.vue
  51. 22 5
      ghsApp/src/pagesOrder/detail.vue
  52. 205 0
      ghsApp/src/pagesOrder/modify.vue
  53. 651 190
      ghsApp/src/pagesOrder/refund.vue
  54. 2 2
      ghsApp/src/pagesOrder/refundSuccess.vue
  55. 2 2
      ghsApp/src/pagesOrder/select.vue
  56. 3 3
      ghsApp/src/pagesPurchase/add.vue
  57. 2 2
      ghsApp/src/pagesPurchase/bookProduct.vue
  58. 20 11
      ghsApp/src/pagesPurchase/components/pageSuccess.vue
  59. 2 2
      ghsApp/src/pagesStorehouse/allot/exSelect.vue
  60. 2 2
      ghsApp/src/pagesStorehouse/inventory/select.vue
  61. 2 2
      ghsApp/src/pagesStorehouse/inventory/select2.vue
  62. 64 17
      ghsApp/src/pagesStorehouse/stockWarn/detailed.vue
  63. 2 2
      ghsApp/src/pagesStorehouse/stockWarn/manage.vue
  64. 16 2
      ghsPad/src/mixins/product.js
  65. 3 3
      hdApp/src/admin/billing/customerPlace.vue
  66. 3 3
      hdApp/src/admin/billing/goods.vue
  67. 3 3
      hdApp/src/admin/billing/hs.vue
  68. 3 3
      hdApp/src/admin/billing/index.vue
  69. 3 3
      hdApp/src/admin/billing/index2.vue
  70. 4 4
      hdApp/src/admin/billing/priceChange.vue
  71. 3 3
      hdApp/src/admin/billing/train.vue
  72. 3 3
      hdApp/src/admin/breakage/index.vue
  73. 1 1
      hdApp/src/admin/cg/item.vue
  74. 1 1
      hdApp/src/admin/cg/mall.vue
  75. 3 3
      hdApp/src/admin/changePrice/list.vue
  76. 3 3
      hdApp/src/admin/changePrice/list2.vue
  77. 5 5
      hdApp/src/admin/goods/add.vue
  78. 65 11
      hdApp/src/admin/goods/category.vue
  79. 8 13
      hdApp/src/admin/goods/categorySort.vue
  80. 20 77
      hdApp/src/admin/goods/detail.vue
  81. 53 26
      hdApp/src/admin/goods/goodsSort.vue
  82. 263 73
      hdApp/src/admin/goods/list.vue
  83. 3 3
      hdApp/src/admin/goods/selectItem.vue
  84. 4 5
      hdApp/src/admin/home/apply.vue
  85. 107 17
      hdApp/src/admin/home/workbench.vue
  86. 0 8
      hdApp/src/admin/item/add.vue
  87. 0 23
      hdApp/src/admin/item/detail.vue
  88. 3 3
      hdApp/src/admin/item/list.vue
  89. 22 10
      hdApp/src/admin/item/list2.vue
  90. 3 3
      hdApp/src/admin/item/xj.vue
  91. 3 3
      hdApp/src/admin/item/xjSelect.vue
  92. 1 1
      hdApp/src/admin/member/detail.vue
  93. 13 4
      hdApp/src/admin/member/level.vue
  94. 3 14
      hdApp/src/admin/order/components/detail-goods.vue
  95. 3 3
      hdApp/src/admin/part/index.vue
  96. 3 3
      hdApp/src/admin/ptItem/itemList.vue
  97. 250 9
      hdApp/src/admin/shop/sk.vue
  98. 4 0
      hdApp/src/api/goods/index.js
  99. 4 0
      hdApp/src/api/item/index.js
  100. 2 2
      hdApp/src/manifest.json

+ 2 - 2
ghsApp/src/admin/billing/customerPlace.vue

@@ -347,9 +347,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/billing/index.vue

@@ -357,9 +357,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/billing/index2.vue

@@ -65,8 +65,8 @@
 						<text>库存 {{ customData.stock?parseFloat(customData.stock):0 }}</text>
 						<text style="margin-left:14upx;">¥{{ parseFloat(customData.price) }}</text>
 						<text style="margin-left:14upx;">{{customData.ratio}}{{customData.smallUnit}}/{{customData.bigUnit}}</text>
-						<!-- 花样年花,要求不显示成本,其他批发商需要 -->
-						<text style="margin-left:14upx;" v-if="customData.mainId!=1553">成本 {{customData.avCost?parseFloat(customData.avCost):0}}</text>
+						<!-- 花样年花门店和出车,要求不显示成本,其他批发商需要 -->
+						<text style="margin-left:14upx;" v-if="customData.mainId!=1553 && customData.mainId!=1563">成本 {{customData.avCost?parseFloat(customData.avCost):0}}</text>
 					</view>
 					<view class="num_bx">
 						<input style="width:280upx" v-model="customData.userPrice" @focus="customData.userPrice = null" :class="[Number(customData.avCost) > Number(customData.userPrice) ? 'warning-price' : '']"
@@ -321,9 +321,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/billing/priceChange.vue

@@ -146,10 +146,10 @@ export default {
     }
   }
   .item_list_title {
-    margin-bottom: 20upx;
-    font-size: 24upx;
-    font-weight: 600;
-    color: #666666;
+		margin-bottom: 20upx;
+		font-size: 30upx;
+		font-weight: 600;
+		color: #3385FF;
   }
   .select-cmd_bx {
     & .kc {

+ 3 - 3
ghsApp/src/admin/breakage/index.vue

@@ -49,7 +49,7 @@
 		<modal-module :show="isAddModel" @cancel="addItemModelHidden" @click="confirmAddItemModel" :title="customData.name" color="#333" :size="32" padding="30rpx 30rpx" >
 			<template slot="customContent">
 				<view class="select-cmd_bx" v-if="customData">
-					<view class="kc"><text class="unit_price">库存 {{ customData.stock||0 }}</text></view>
+					<view class="kc"><text class="unit_price">库存 {{ customData.stock?parseFloat(customData.stock):0 }} 成本 {{ customData.avCost?parseFloat(customData.avCost):0 }}</text></view>
 					<view class="num_bx">
 
 						<!-- #ifdef APP-PLUS -->
@@ -241,9 +241,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/changePrice/batchChange.vue

@@ -321,9 +321,9 @@
 		}
 		.item_list_title {
 			margin-bottom: 20upx;
-			font-size: 24upx;
+			font-size: 30upx;
 			font-weight: 600;
-			color: #666666;
+			color: #3385FF;
 		}
 		.select-cmd_bx {
 			& .kc {

+ 2 - 2
ghsApp/src/admin/changePrice/batchChange2.vue

@@ -321,9 +321,9 @@
 		}
 		.item_list_title {
 			margin-bottom: 20upx;
-			font-size: 24upx;
+			font-size: 30upx;
 			font-weight: 600;
-			color: #666666;
+			color: #3385FF;
 		}
 		.select-cmd_bx {
 			& .kc {

+ 2 - 2
ghsApp/src/admin/changePrice/changeCgStaff.vue

@@ -345,9 +345,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/changePrice/changeClass.vue

@@ -317,9 +317,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/changePrice/changeStock.vue

@@ -277,9 +277,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/changePrice/changeStock2.vue

@@ -277,10 +277,10 @@ export default {
 		padding: 40upx 16upx;
 	}
 	.item_list_title {
-		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/changePrice/list.vue

@@ -344,10 +344,10 @@ export default {
 		padding: 40upx 16upx;
 	}
 	.item_list_title {
-		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/changePrice/list2.vue

@@ -345,9 +345,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/changePrice/outList.vue

@@ -252,10 +252,10 @@ export default {
 		padding: 40upx 16upx;
 	}
 	.item_list_title {
-		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/changePrice/removeList.vue

@@ -346,10 +346,10 @@ export default {
 		padding: 40upx 16upx;
 	}
 	.item_list_title {
-		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/changePrice/setSon.vue

@@ -252,10 +252,10 @@ export default {
 		padding: 40upx 16upx;
 	}
 	.item_list_title {
-		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/changePrice/stopList.vue

@@ -267,10 +267,10 @@ export default {
 		padding: 40upx 16upx;
 	}
 	.item_list_title {
-		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
ghsApp/src/admin/cp/delList.vue

@@ -300,10 +300,10 @@
           padding: 40upx 16upx;
       }
       .item_list_title {
-          margin-bottom: 20upx;
-          font-size: 24upx;
-          font-weight: 600;
-          color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
       }
       .select-cmd_bx {
           & .kc {

+ 4 - 4
ghsApp/src/admin/cp/item.vue

@@ -432,10 +432,10 @@
           padding: 40upx 16upx;
       }
       .item_list_title {
-          margin-bottom: 20upx;
-          font-size: 24upx;
-          font-weight: 600;
-          color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
       }
       .select-cmd_bx {
           & .kc {

+ 4 - 4
ghsApp/src/admin/cp/list.vue

@@ -303,10 +303,10 @@
           padding: 40upx 16upx;
       }
       .item_list_title {
-          margin-bottom: 20upx;
-          font-size: 24upx;
-          font-weight: 600;
-          color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
       }
       .select-cmd_bx {
           & .kc {

+ 4 - 4
ghsApp/src/admin/cp/ptCpList.vue

@@ -230,10 +230,10 @@ export default {
         padding: 10upx 40upx;
     }
     .item_list_title {
-        margin-bottom: 20upx;
-        font-size: 24upx;
-        font-weight: 600;
-        color: #666666;
+			margin-bottom: 20upx;
+			font-size: 30upx;
+			font-weight: 600;
+			color: #3385FF;
     }
     .select-cmd_bx {
         & .kc {

+ 314 - 0
ghsApp/src/admin/custom/dist.vue

@@ -0,0 +1,314 @@
+<template>
+	<view class="app-content" @click="globalClick">
+		<view class="list-wrap">
+			<block v-if="!$util.isEmpty(list.data)">
+				<view class="list" v-for="(item, index) in list.data" :key="index">
+					<view class="list-index">{{ item.id }}</view>
+					<view class="list-det">
+						<view class="app-size-28 app-color-0" style="font-size:28upx;font-weight:bold;color:#333333;">
+						{{ item.name || '' }}
+						</view>
+						<view class="list-operate">
+							<view class="operate-det" style="color:#333333;">
+								<span>编号 {{ item.id }}</span>
+							</view>
+							<view class="operate-icon" @click="editItem(item)">
+								<i class="iconfont iconbianji" style="font-size:38upx;"></i>
+							</view>
+							<button class="admin-button-com middle blue" @click="plSet(item)">批量设置</button>
+							<view class="operate-icon" @click.stop="delMyDist(item)">
+								<i class="iconfont iconshanchu1" style="font-size:38upx;"></i>
+							</view>
+						</view>
+					</view>
+				</view>
+				<operate-module v-if="operateShow" :top="operateTop" :right="30" @clickFn="operateList" :btnData="btnData" />
+			</block>
+			<block v-else>
+				<app-wrapper-empty title="暂无数据" :is-empty="$util.isEmpty(list.data)" />
+			</block>
+		</view>
+		<view class="app-footer">
+			<button class="admin-button-com middle blue" @click="addCategoryFn">添加片区</button>
+		</view>
+		<modal-module :show="modifyModal" :maskClosable="false" @cancel="modalCancel" @click="replaceModalClick" :title="modifyTitle" padding="30rpx 30rpx">
+			<template v-slot:content>
+				<view class="app-modal-input-wrap modify-modal">
+					<view class="inp-list-line">
+						<view class="line-label">名称</view>
+						<view class="line-input">
+							<input type="text" v-model="replaceForm.name" :adjust-position="false" class="inp-input" placeholder="请填写" />
+						</view>
+					</view>
+				</view>
+			</template>
+		</modal-module>
+		<modal-module :show="delModal" :maskClosable="false" @cancel="modalCancel" @click="delModalClick" content="确定删除?" color="#333" :size="32" padding="30upx 30upx"></modal-module>
+	</view>
+</template>
+<script>
+import ModalModule from '@/components/plugin/modal'
+import AppUploader from '@/components/app-uploader'
+import OperateModule from '@/admin/home/components/module/operate'
+import AppWrapperEmpty from '@/components/app-wrapper-empty'
+import { list } from '@/mixins'
+import { getList,addDist,updateDist,delDist} from '@/api/dist'
+export default {
+	name: 'dist',
+	components: {
+		ModalModule,
+		AppUploader,
+		OperateModule,
+		AppWrapperEmpty
+	},
+	mixins: [list],
+	data() {
+		return {
+			modifyModal: false,
+			modifyTitle: '添加',
+			replaceForm: {
+				name: '',
+				id:0
+			},
+			delModal: false,
+			operateShow: false,
+			operateData: {},
+			operateIndex: null,
+			operateTop: 0
+		}
+	},
+	computed: {
+		btnData() {
+			return [
+				{
+					text: '编辑',
+					icon: 'iconbianji',
+					click: () => {
+						this.modifyModal = true
+						this.modifyTitle = '编辑'
+						this.modifyForm = {
+							name: this.operateData.name,
+							id: this.operateData.id
+						}
+					}
+				},
+				{
+					text: '删除',
+					icon: 'iconshanchu1',
+					click: () => {
+						this.delModal = true
+					}
+				}
+			]
+		}
+	},
+	onPullDownRefresh() {
+		this.resetList()
+		this.getClassList().then(res => {
+			uni.stopPullDownRefresh()
+		})
+	},
+	onReachBottom() {
+		if (!this.list.finished) {
+			this.getClassList().then(res => {
+				uni.stopPullDownRefresh()
+			})
+		} else {
+			uni.stopPullDownRefresh()
+		}
+	},
+	onLoad() {
+	},
+	methods: {
+		plSet(item){
+			this.$util.pageTo({url: '/admin/custom/distCustom?distId='+item.id+'&distName='+item.name})
+		},
+		delMyDist(item){
+			let that = this
+			that.$util.confirmModal({content:'确认删除?'},() => {
+				delDist({id:item.id}).then(res=>{
+					if(res.code == 1){
+						that.$msg('删除成功')
+						that.getClassList()
+					}
+				})
+			})
+		},
+		editItem(item){
+				this.modifyModal = true
+				this.modifyTitle = '编辑'
+				this.replaceForm = {
+                    id:item.id,
+					name: item.name
+				}			
+		},
+		operateList(index){
+			if(index === 0){
+				this.modifyModal = true
+				this.modifyTitle = '编辑'
+				this.replaceForm = {
+                    id:this.operateData.id,
+					name: this.operateData.name
+				}
+			}else if(index === 1) {
+				this.delModal = true
+			}
+		},
+		async init() {
+			this.getClassList()
+		},
+		getClassList() {
+			return getList({page: this.list.page}).then(res => {
+				this.completes(res)
+			})
+		},
+		replaceClass() {
+			if (!this.replaceForm.name) {
+				this.$msg('请填写片区名称')
+				return false
+			}
+			let host = this.replaceForm.id == 0 ?  addDist : updateDist;
+			let form = JSON.parse(JSON.stringify(this.replaceForm))
+			host({
+				...form
+			}).then(res => {
+				this.$msg('操作成功')
+				this.modalCancel()
+				this.operateCancle()
+				setTimeout(() => {
+					this.resetList()
+					this.getClassList()
+				}, 1000)
+			})
+		},
+		addCategoryFn() {
+			this.resetForm()
+			this.modifyModal = true
+			this.modifyTitle = '新增'
+		},
+		resetForm() {
+			this.replaceForm = {
+				name: '',
+                id:0
+			}
+		},
+		replaceModalClick(e) {
+			if (e.index === 0) {
+				this.modalCancel()
+			} else {
+				this.replaceClass()
+			}
+		},
+		modalCancel() {
+			this.delModal = false
+			this.modifyModal = false
+		},
+		switchChangeFn(e) {
+			this.replaceForm.status = e.detail.value ? 1 : 0
+		},
+		delModalClick(e) {
+			if (e.index === 0) {
+				this.modalCancel()
+			} else {
+                uni.showToast({
+                    title: '开发中',
+                    duration: 2000, 
+                    icon:'none',
+                });
+			}
+		},
+		operateFn(item, index, event) {
+            this.operateData = item
+            this.operateIndex = index
+            this.operateShow = true
+            this.operateTop = event.currentTarget.offsetTop
+		},
+		operateCancle() {
+			this.operateData = {}
+			this.operateIndex = null
+			this.operateShow = false
+		},
+        globalClick(){
+            this.operateCancle()
+        },
+		changeStatusFn() {
+            uni.showToast({
+                title: '开发中',
+                duration: 2000, 
+                icon:'none',
+            });
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+	.app-content {
+		min-height: calc(100vh - 100upx);
+		padding-bottom: 100upx;
+	}
+	.list-wrap {
+		position: relative;
+		background-color: #fff;
+		.list {
+			height: 130upx;
+			@include disFlex(center, flex-start);
+			margin: 0 30upx 0 30upx;
+			color: $fontColor3;
+			border-bottom: 1upx solid $borderColor;
+			.list-index {
+				width: 80upx;
+			}
+			.list-img {
+				img {
+					height: 100%;
+				}
+			}
+			.list-det {
+				width: calc(100% - 50upx);
+				margin-left: 10upx;
+				.list-operate {
+					@include disFlex(center, space-between);
+					.operate-det {
+						& > span {
+							margin-left: 60upx;
+							&:first-child {
+								margin-left: 0;
+							}
+						}
+					}
+					.add-price{
+						text-decoration:underline;
+						font-size:30upx;
+						margin-left:10upx;
+					}
+					.operate-icon{
+						margin-left:5upx;
+					}
+				}
+			}
+		}
+	}
+	.app-footer {
+		justify-content: flex-end;
+		.admin-button-com {
+			width: 200upx;
+			margin-right: 30upx;
+		}
+	}
+	.modify-modal {
+		.prompt-text {
+			color: red;
+			position: relative;
+			right: 52upx;
+			bottom: 24upx;
+		}
+		.line-label {
+			width: 140upx;
+			flex-shrink: 0;
+		}
+		.switch-wrap {
+			margin-top: 30upx;
+		}
+	}
+</style>

+ 381 - 0
ghsApp/src/admin/custom/distCustom.vue

@@ -0,0 +1,381 @@
+<template>
+  <view class="app-main app-content">
+    <view class="input-wrap_box">
+      <view>
+        <AppSearchModule placeholder="输入拼音首字母搜索" @input="searchFn"/>
+      </view>
+    </view>
+    <block v-if="!$util.isEmpty(list.data)">
+      <block v-for="(item, index) in list.data" :key="index">
+        <tui-list-cell :arrow="false">
+          <view class="tui-msg-box">
+            <img :src="item.avatar" class="tui-msg-pic" mode="widthFix"/>
+            <view class="tui-msg-item" style="position:relative;">
+              <view class="tui-msg-name">
+                <view class="tui-user-name">
+                  {{ item.name }}
+                  <text v-if="item.level == 2" class="super-man">大客</text>
+                  <text v-if="item.level == 0" class="ls-man">散客</text>
+                </view>
+              </view>
+              <view class="tui-msg-content">
+                <span>{{ item.visitTime.substr(5,11) }}</span>
+
+                <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 10000" style="font-size:24upx;margin-left:20upx;color:green;font-weight:bold;">没有下过单</text>
+                <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 7" style="font-size:24upx;margin-left:20upx;color:green;font-weight:bold;">超1周未下单</text>
+                <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 30" style="font-size:24upx;margin-left:20upx;color:green;font-weight:bold;">超1个月未下单</text>
+                <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 180" style="font-size:24upx;margin-left:20upx;color:green;font-weight:bold;">超半年未下单</text>
+                <text v-if="item.overTimeUnExpend && item.overTimeUnExpend == 365" style="font-size:24upx;margin-left:20upx;color:green;font-weight:bold;">超1年未下单</text>
+
+                <text v-if="item.distName!=''" style="margin-left:30upx;font-size:30upx;font-weight:bold;color:#3385FF;">{{ item.distName }}</text>
+              </view>
+
+              <button class="admin-button-com middle" @click="openDistSelect(item)" style="position: absolute;right:80upx;top:-15upx;">重选</button>
+              <button class="admin-button-com middle blue" @click="confirmDist(item)" style="position: absolute;right:-50upx;top:-15upx;">确认</button>
+
+            </view>
+          </view>
+        </tui-list-cell>
+      </block>
+    </block>
+    <block v-else>
+      <app-wrapper-empty :is-empty="$util.isEmpty(list.data)" />
+    </block>
+
+    <!-- 配送区域选择弹框 -->
+    <uni-popup ref="distSelectRef" background-color="#fff" type="center" :animation="false" class="class-popup-style">
+      <view style="max-height:90vh;overflow: scroll;">
+        <view style="margin-left:30upx;margin-top:19upx;font-size:27upx;font-weight:bold;">请选择片区</view>
+        <view style="display:flex;padding:20upx;height:auto;justify-content: flex-start;align-items:center;flex-wrap:wrap;max-height:100vh;overflow:auto;">
+          <view v-for="(item, index) in allDist" :key="index" style="margin-bottom:20upx;margin-left:3upx;">
+            <button
+              class="admin-button-com staff-btn"
+              @click.stop="selectDist(item)"
+              :class="{'selected': currentDist.id === item.id}"
+            >
+              {{ item.name }}
+            </button>
+          </view>
+        </view>
+        <view style="text-align:center;padding:10upx 0 10upx 0;">
+          <button class="admin-button-com big blue" style="width:210upx;" @click="cancelDistSelect()">取消</button>
+        </view>
+      </view>
+    </uni-popup>
+
+  </view>
+</template>
+<script>
+import TuiListCell from "@/components/plugin/list-cell";
+import BadgeModule from "@/components/plugin/badge";
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import appVipModule from "@/components/module/app-vip";
+import AppTag from "@/components/module/app-tag.vue";
+import AppSearchModule from "@/components/module/app-search";
+import { list } from "@/mixins";
+import { getList } from "@/api/member";
+import { getAllDist,changeDist } from "@/api/dist"
+import { mapGetters } from "vuex";
+export default {
+  name: "selectCustom",
+  components: {
+    TuiListCell,
+    BadgeModule,
+    AppWrapperEmpty,
+    appVipModule,
+    AppTag,
+    AppSearchModule
+  },
+  mixins: [list],
+  data() {
+    return {
+      tabIndex: 0,
+      currentDist: {},
+      currentCustom: {},
+      couldScan: false,
+      allDist: []
+    };
+  },
+  computed:{
+  },
+  onPullDownRefresh() {
+    this.resetList();
+    this.getCustomList().then((res) => {
+      uni.stopPullDownRefresh();
+    });
+  },
+  onReachBottom() {
+    if (!this.list.finished) {
+      this.getCustomList().then((res) => {
+        uni.stopPullDownRefresh();
+      });
+    } else {
+      uni.stopPullDownRefresh();
+    }
+  },
+  onLoad() {
+    getAllDist().then(res=>{
+      if(res.code == 1){
+        this.allDist = res.data.list?res.data.list:[]
+      }
+    })
+    if(this.option.distName){
+      uni.setNavigationBarTitle({ title: '设置为'+this.option.distName })
+    }
+  },
+  methods: {
+    init() {
+       this.getCustomList()
+    },
+    searchFn(e) {
+        this.resetList();
+        this.seekVal = e;
+        this.getCustomList();
+    },
+    getCustomList() {
+      return getList({
+          search: "",
+          type:this.tabIndex,
+          page: this.list.page,
+          name: this.seekVal,
+        }).then((res) => {
+          this.completes(res);
+          if (this.$util.isEmpty(res.data)){
+            return false;
+          }
+        });
+    },
+    // 打开配送区域选择弹框
+    openDistSelect(item) {
+      this.currentCustom = item;
+      this.currentDist = { id: item.distId } || {};
+      this.$refs.distSelectRef.open('center');
+    },
+    confirmDist(custom){
+      let distId = this.option.distId?this.option.distId:0
+      let distName = this.option.distName?this.option.distName:''
+      changeDist({customId:custom.id,distId:distId}).then(res=>{
+        if(res.code == 1){
+          this.$msg('设置成功')
+          custom.distName = distName
+        }
+      })
+    },
+    // 选择配送区域
+    selectDist(dist) {
+      this.$refs.distSelectRef.close();
+      changeDist({customId:this.currentCustom.id,distId:dist.id}).then(res=>{
+        if(res.code == 1){
+          this.$msg('设置成功')
+          this.currentCustom.distName = dist.name
+        }
+      })
+    },
+    // 关闭弹框
+    cancelDistSelect() {
+      this.$refs.distSelectRef.close();
+    }
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.app-content {
+  padding-top: 100upx;
+  padding-bottom: 20upx;
+}
+.tabs-wrap {
+  position: fixed;
+  .tabs-left {
+    width: 80%;
+  }
+  .tabs-right {
+    width: 19%;
+    border-left: $borderColor;
+    @include disFlex(center, center);
+  }
+}
+.input-wrap_box {
+  background-color: #fff;
+  position: fixed;
+  top: 0;
+  z-index: 10;
+  /* 手机mobile屏幕小于1000px */
+  @media screen and (max-width: 1100px) {
+    width: 100%;
+  }
+  /* 收银台cashier屏幕大于1000px */
+  @media screen and (min-width:1100px) {
+    width: 40%;
+  }
+  height: 100upx;
+  display: flex;
+  align-items: center;
+  padding: 0 30upx;
+  & > view:nth-child(1) {
+    flex: 1;
+  }
+}
+.tui-msg-box {
+  display: flex;
+  align-items: center;
+
+  .tui-msg-pic {
+    width: 80upx;
+    height: 80upx;
+    border-radius: 50%;
+    margin-right: 20upx;
+  }
+
+  .tui-msg-item {
+    max-width:700upx;
+    min-height:100upx;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    & > div {
+      @include disFlex(center, flex-start);
+      & > div:first-child {
+        margin-right: 8upx;
+      }
+    }
+    .level-img {
+      ::v-deep.vip-text {
+        left: 70upx;
+        top: 8upx;
+      }
+    }
+    .normal-img {
+      width: 70upx;
+      padding: 2upx 6upx;
+      color: #999;
+      background-color: #f0f2f6;
+      border-radius: 20upx;
+      .vip-text {
+        font-size: 24upx;
+        transform: scale(0.6);
+        position: relative;
+        top: -2upx;
+        left: -8upx;
+      }
+    }
+    .member-img {
+      width: 70upx;
+      padding: 2upx 6upx;
+      color: green;
+      background-color: #f0f2f6;
+      border-radius: 20upx;
+      .vip-text {
+        font-size: 24upx;
+        transform: scale(0.6);
+        position: relative;
+        top: -2upx;
+        left: -8upx;
+      }
+    }
+    .iconfont {
+      color: #00aaed;
+    }
+  }
+
+  .tui-msg-name {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    font-size: 30upx;
+    line-height: 1;
+    color: #262b3a;
+    .tui-user-name {
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+      width: 500upx;
+      font-size: 32upx;
+      .super-man{
+        margin-left:30upx;
+        color:red;
+        font-size:24upx;
+        display:inline-block;
+        color:white;
+        border:1upx solid green;
+        padding:6upx 10upx;
+        background-color: green;
+        border-radius: 11upx;
+      }
+      .ls-man{
+        margin-left:30upx;
+        font-size:24upx;
+        display:inline-block;
+        color:white;
+        border:1upx solid #a5b1a5;
+        padding:6upx 10upx;
+        background-color: #a5b1a5;
+        border-radius: 11upx;
+      }
+    }
+  }
+
+  .tui-msg-content {
+    width:500upx;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    font-size: 24upx;
+    line-height: 1;
+    color: #9397a4;
+    .debt-amount{
+      margin-left:20upx;
+      .amount_num{
+        color:red;
+        margin-left:6upx;
+        font-weight:bold;
+      }
+    }
+  }
+}
+.tui-msg-right {
+  max-width: 120upx;
+  height: 80upx;
+  margin-left: auto;
+  margin-right: 24upx;
+  text-align: right;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.user_tag {
+  border: 1upx solid #cccccc;
+  padding: 5upx 12upx 5upx 12upx;
+  border-radius: 25upx;
+  color: #bbbbbb;
+  margin-right: 10upx;
+  margin-bottom: 12upx;
+  display: inline-block;
+  font-size: 30upx;
+}
+.class-popup-style{
+  z-index:99999;
+}
+.staff-btn {
+  min-width: 160upx;
+  padding: 0 27upx;
+  height: 80upx;
+  font-size: 40upx;
+  font-weight: bold;
+  margin: 8upx 8upx 0 0;
+  border-radius: 16upx;
+  background: #f0f2f6;
+  color: #333;
+  border: 2upx solid #e0e0e0;
+  transition: none;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.staff-btn.selected,
+.staff-btn:active {
+  background: #f0f2f6;
+  color: #333;
+  border-color: #e0e0e0;
+}
+</style>

+ 38 - 6
ghsApp/src/admin/custom/set.vue

@@ -13,7 +13,8 @@
 
 				<tui-list-cell class="line-cell" :hover="false">
 					<view class="tui-title ">新客授信额度</view>
-					<input type="number" v-model="form.allowDebtAmount" @focus="form.allowDebtAmount=''" placeholder-class="phcolor" class="tui-input" name="allowDebtAmount" placeholder="请填写金额" />
+					<input type="number" v-model="form.allowDebtAmount" style="width:240upx;" @focus="form.allowDebtAmount=''" placeholder-class="phcolor" class="tui-input" name="allowDebtAmount" placeholder="请填写金额" />
+					<button class="admin-button-com middle blue" @click="allSetDebt" style="margin-left:10upx;">已有客户生效</button>
 				</tui-list-cell>
 
 				<tui-list-cell class="line-cell" :hover="false">
@@ -21,6 +22,7 @@
 					<view>
 						<switch style="transform:scale(0.7,0.7)" :checked="form.showStock == 0 ? false : true" @change="showStockChange" /> {{form.showStock==1 ? '允许' : '禁止'}}
 					</view>
+					<button class="admin-button-com middle blue" @click="allLookStock" style="margin-left:80upx;">已有客户生效</button>
 				</tui-list-cell>
 
 				<tui-list-cell class="line-cell" :hover="false">
@@ -48,7 +50,7 @@
 						</view>
 
 						<view class="btn-row">
-							<button class="admin-button-com middle blue" @click="submitHomeDelivery">已有客户全部设置</button>
+							<button class="admin-button-com middle blue" @click="submitHomeDelivery">已有客户生效</button>
 						</view>
 					</view>
 				</tui-list-cell>
@@ -58,6 +60,7 @@
 					<view>
 						<switch style="transform:scale(0.7,0.7)" :checked="form.showSold == 0 ? false : true" @change="showSoldChange" /> {{form.showSold==1 ? '可以' : '禁止'}}
 					</view>
+					<button class="admin-button-com middle blue" @click="allLookSale" style="margin-left:80upx;">已有客户生效</button>
 				</tui-list-cell>
 
 			</view>
@@ -73,7 +76,7 @@ import AppAvatarModule from '@/components/module/app-avatar'
 import AppAreaSel from '@/components/app-area-sel'
 import AppUploader from "@/components/app-uploader";
 import { getDetail } from '@/api/shop'
-import { setChange,setCheck,setShowStock,modifyAllHomeAmount } from "@/api/custom"
+import { setChange,setCheck,setShowStock,modifyAllHomeAmount,allCredit,allSetLookStock,allSetLookSale } from "@/api/custom"
 export default {
 	name: 'set',
 	components: {
@@ -131,14 +134,43 @@ export default {
 		homeChange(e){
 			this.form.home = e.target.value ? 1 : 0
 		},
+		allLookSale(){
+			this.$util.confirmModal({content:'确认全部设置?'},() => {
+				allSetLookSale({showSold:this.form.showSold}).then(res=>{
+					if(res.code == 1){
+						this.$msg('设置成功')
+					}
+				})
+			})
+		},
+		allSetDebt(){
+			this.$util.confirmModal({content:'确认全部客户授信?'},() => {
+				allCredit({amount:this.form.allowDebtAmount}).then(res=>{
+					if(res.code == 1){
+						this.$msg('设置成功')
+					}
+				})
+			})
+		},
+		allLookStock(){
+			this.$util.confirmModal({content:'确认全部设置?'},() => {
+				allSetLookStock({showStock:this.form.showStock}).then(res=>{
+					if(res.code == 1){
+						this.$msg('设置成功')
+					}
+				})
+			})
+		},
 		submitHomeDelivery() {
 			const homeData = {
 				homeType: this.form.homeType,
 				homeAmount: this.form.homeAmount
 			}
-			modifyAllHomeAmount(homeData).then(res => {
-				uni.hideLoading()
-				this.$msg('设置成功')
+			this.$util.confirmModal({content:'确认全部生效?'},() => {
+				modifyAllHomeAmount(homeData).then(res => {
+					uni.hideLoading()
+					this.$msg('设置成功')
+				})
 			})
 		},
 		toSubmit() {

+ 11 - 13
ghsApp/src/admin/home/apply.vue

@@ -58,36 +58,34 @@ export default {
                         {name: "图文",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl.png`,url: "/admin/picText/picTextList"},
                     ]
                 },
+                {
+                    title:'客户',
+                    list:[
+                        {name: "片区划分",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl.png`,url: "/admin/custom/dist"},
+                        {name: "客户设置",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl.png`,url: "/admin/custom/set"}
+                    ]
+                },
                 {
                     title:'统计',
                     list:[
-
                         {name: "利润表",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/profit"},
                         {name: "收入统计",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/kdIncome"},
                         {name: "花材销量",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/productSale"},
                         {name: "客户业绩",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/customSale"},
+                        {name: "片区业绩",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/distSale"},
                         {name: "收支分类",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/classProfit"},
                         {name: "供货业绩",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/cgStat"},
                         {name: "采购人业绩",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/cgYj"},
                         {name: "采购花材",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/cgItem"},
                         {name: "采购运费",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/cgFreight"},
                         {name: "库存总览",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/stock"},
-                        {name: "损花材",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/wastage"},
-                        {name: "损总览",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/waste"},
+                        {name: "损花材",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/wastage"},
+                        {name: "损总览",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/waste"},
                         {name: "结账跟踪",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/clear"},
                         {name: "配送业绩",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/stat/sendYj"},
                         {name: "赊账汇总",img: `${this.$constant.hostUrl}/image/ghs/home/jyzk.png`,url: "/admin/custom/showTotalBalance"},
                     ]
                 },
-                {
-                    title:'产品',
-                    list:[
-
-                        {name: "产品列表",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl.png`,url: "/admin/cp/list"},
-                        {name: "产品分类",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl.png`,url: "/admin/cp/class"},
-                        {name: "已删除",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl.png`,url: "/admin/cp/delList"},
-                    ]
-                },
                 {
                     title:'订单与销售',
                     list:[
@@ -128,7 +126,7 @@ export default {
                         {name: "调拨入库",img: `${this.$constant.hostUrl}/image/ghs/home/dbrk.png`,url: "/pagesStorehouse/allot/allotPut"},
                         {name: "库存预警",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/item/list?warning=1"},
                         {name: "盘点",img: `${this.$constant.hostUrl}/image/ghs/home/pandian.png`,url: "/pagesStorehouse/inventory/list"},
-                        {name: "损",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/breakage/list"},
+                        {name: "损",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/breakage/list"},
                         {name: "改库存",img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs.png`,url: "/admin/changePrice/changeStock"}
                     ]
                 },

+ 3 - 1
ghsApp/src/admin/home/member.vue

@@ -53,6 +53,8 @@
                 <text v-if="Number(item.black)==2" style="color:red;font-weight:bold;margin-left:20upx;">黑名单</text>
                 <text v-if="Number(item.delStatus)==1" style="color:red;font-weight:bold;margin-left:20upx;">已删除</text>
 
+                <text v-if="item.distName!=''" style="color:#e0c8c8;font-weight:normal;margin-left:20upx;">{{ item.distName }}</text>
+
               </div>
             </div>
           </div>
@@ -322,7 +324,7 @@ export default {
     margin-right: 20upx;
   }
   .tui-msg-item {
-    max-width: 500upx;
+    max-width: 590upx;
     min-height: 80upx;
     overflow: hidden;
     display: flex;

+ 50 - 4
ghsApp/src/admin/item/detail.vue

@@ -71,8 +71,8 @@
         </tui-list-cell>
 
         <tui-list-cell class="line-cell" :arrow="false" :hover="false">
-        <view class="tui-title">平均成本</view>
-        <view style="color:#3385FF;width:300upx;">{{productData.avCost?productData.avCost:0}}</view>
+        <view class="tui-title" style="color:#19b31f;">平均成本</view>
+        <view style="color:#19b31f;width:300upx;" @click="showModifyAvCost(productData)">{{productData.avCost?parseFloat(productData.avCost):0}}</view>
         <button v-if="productData.id > 0" class="admin-button-com blue middle" @click="goAvCostDetail(productData)">变动记录</button>
         </tui-list-cell>
 
@@ -85,7 +85,7 @@
 
         <tui-list-cell class="line-cell" :hover="false">
           <view class="tui-title" style="color:#3385FF;font-weight:bold;">库存</view>
-          <input v-model="form.stock" style="width:300upx;" placeholder-class="phcolor" @focus="form.stock=''" @input="changeStock($event)" class="tui-input" name="stock" placeholder="请输入" type="digit"/>
+          <input v-model="form.stock" style="color:#3385FF;width:300upx;font-weight:bold;" placeholder-class="phcolor" @focus="form.stock=''" @input="changeStock($event)" class="tui-input" name="stock" placeholder="请输入" type="digit"/>
 
           <button v-if="productData.id > 0" class="admin-button-com blue middle" @click="goStockDetail(productData)">变动记录</button>
         </tui-list-cell>
@@ -433,6 +433,18 @@
 		</template>
 		</modal-module>
 
+		<modal-module :show="modifyAvCostShow" @click="modifyAvCostConfirm" :maskClosable="true" title="修改平均成本" padding="30rpx 30rpx" >
+		<template v-slot:content>
+			<view class="app-modal-input-wrap">
+        <view class="inp-list-line">
+          <view class="line-input">
+          <input type="digit" ref="input" style="width:62%;text-align:center;" v-model="newAvCost" @focus="newAvCost=''" :adjust-position="false" class="inp-input" />
+          </view>
+        </view>
+			</view>
+		</template>
+		</modal-module>
+
   </view>
 </template>
 
@@ -443,7 +455,7 @@ import { getAllItemClass } from "@/api/item-class";
 import { applyAuth,modifyCgStaff,setLosing,modifyUnit,modifyRatio,modifyWeight,clearLimitBuy } from '@/api/item';
 //import { delCpItem,addCpItem } from '@/api/cp'
 import { getAllUnit } from "@/api/unit";
-import { addProduct,updateProduct,getProductDetail,py,print,modifyOnStockFn,delStatusUpdate,changeBelongCost } from "@/api/product";
+import { addProduct,updateProduct,getProductDetail,py,print,modifyOnStockFn,delStatusUpdate,changeBelongCost,modifyAvCost } from "@/api/product";
 import { getPtItemDetail } from "@/api/pt-item";
 import { wastage } from "@/api/order";
 import { mapGetters } from "vuex"
@@ -467,6 +479,8 @@ export default {
       newWeight:'',
       onStockShow:false,
       newOnStock:0,
+      modifyAvCostShow:false,
+      newAvCost:'',
       status: 1,
       currentImgData: [],
       form: {
@@ -1006,6 +1020,38 @@ export default {
     goAvCostDetail(item){
       this.$util.pageTo({url: "/pagesStorehouse/stockWarn/detailed?id="+item.id+'&name='+item.name})
     },
+    showModifyAvCost(item){
+      this.modifyAvCostShow = true
+      this.newAvCost = item.avCost ? parseFloat(item.avCost) : 0
+      let that = this
+      setTimeout(x => {
+        this.$nextTick(() => {
+          that.avCostFocus = true
+        })
+      }, 300)
+    },
+    modifyAvCostConfirm(val){
+      let that = this
+      if (val.index == 0) {
+        this.modifyAvCostShow = false
+        this.newAvCost = ''
+        return
+      }
+      if(Number(that.newAvCost) < 0){
+        that.$msg('请填写正确的数值')
+        return false
+      }
+      that.$util.confirmModal({content:'确认修改?'},() => {
+        modifyAvCost({id:this.productData.id,avCost:that.newAvCost}).then((res) => {
+            if(res.code == 1){
+              that.getDetail()
+              that.modifyAvCostShow = false
+              that.newAvCost = ''
+              that.$msg('修改成功')
+            }
+          });
+      })
+    },
     goStockDetail(item){
 				this.$util.pageTo({url: "/pagesStorehouse/stockWarn/detailed?id="+item.id+'&name='+item.name})
 		},

+ 2 - 2
ghsApp/src/admin/item/lakala.vue

@@ -114,9 +114,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/item/list.vue

@@ -616,9 +616,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 17 - 5
ghsApp/src/admin/item/list2.vue

@@ -647,12 +647,25 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+.app-content {
+	display: flex;
+	flex-direction: column;
+	height: 100vh;
+	overflow: hidden;
+}
+
+.modern-tabs-container {
+	flex-shrink: 0;
+}
+
 .billing_box_bg {
-	height: 100%;
+	flex: 1;
 	display: flex;
 	background:white;
 	flex-direction: column;
+	overflow: hidden;
 	.input-wrap {
+		flex-shrink: 0;
 		display: flex;
 		padding: 10upx 20upx 22upx 13upx;
 		.search-bar {
@@ -668,7 +681,6 @@ export default {
 		overflow: hidden;
 	}
 	.tab-view {
-		height: calc(100vh - 140upx);
 		width: 170upx;
 		flex-shrink: 0;
 		background-color: #f0f2f6;
@@ -705,7 +717,6 @@ export default {
 		}
 	}
 	.right-box {
-		height: calc(100vh - 140upx);
 		flex: 1;
 		box-sizing: border-box;
 	}
@@ -714,9 +725,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 
 }
@@ -740,6 +751,7 @@ export default {
   padding: 0;
   background-color: #f8f9fa;
   width: 100%;
+  flex-shrink: 0;
 }
 
 .modern-tabs {

+ 2 - 2
ghsApp/src/admin/item/selectList.vue

@@ -558,9 +558,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/item/sendStock.vue

@@ -303,9 +303,9 @@
 		}
 		.item_list_title {
 			margin-bottom: 20upx;
-			font-size: 24upx;
+			font-size: 30upx;
 			font-weight: 600;
-			color: #666666;
+			color: #3385FF;
 		}
 		.select-cmd_bx {
 			& .kc {

+ 2 - 2
ghsApp/src/admin/part/index.vue

@@ -241,9 +241,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/admin/ptItem/itemList.vue

@@ -254,9 +254,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 201 - 50
ghsApp/src/admin/shop/renew.vue

@@ -1,12 +1,71 @@
 <template>
-    <view>
-        <view style="padding:40upx 20upx 40upx 20upx;height:auto;width:95vw;font-size:36upx;">
-			<view style="margin-top:24upx;">当前系统到期时间:{{ currentDeadline }}</view>
-			<view style="margin-top:24upx;">续期一年到期时间:<text style="color:#3385FF;">{{ newDeadline }}</text></view>
-			<view style="margin-top:40upx;text-align:center;">
-				<button class="admin-button-com big default" @click="closeRenew()" style="width:200upx;">稍后</button>
-        		<button class="admin-button-com big blue" @click="startRenew()" style="margin-left:80upx;width:200upx;">续期一年</button>
-			</view>
+    <view class="renew-container">
+        <!-- 系统到期信息卡片 -->
+        <view class="info-card">
+            <view class="info-row">
+                <text class="info-label">当前系统到期时间:</text>
+                <text class="info-value">{{ currentDeadline }}</text>
+            </view>
+            <view class="info-row">
+                <text class="info-label">续期一年到期时间:</text>
+                <text class="info-value highlight">{{ newDeadline }}</text>
+            </view>
+            <view class="btn-group">
+                <button class="admin-button-com big blue" @click="startRenew(0,0)">续期一年</button>
+            </view>
+        </view>
+
+        <!-- 商品列表 -->
+        <view class="products-container">
+            <!-- 仓库版系统 -->
+            <view class="product-item">
+                <view class="product-header">
+                    <text class="product-name">仓库版系统</text>
+                    <text class="product-price">2200元</text>
+                </view>
+                <view class="btn-group">
+                    <button class="admin-button-com big blue" @click="startRenew(1,2200)">购买</button>
+                </view>
+            </view>
+
+            <!-- 门店版(单屏收银机)系统 -->
+            <view class="product-item">
+                <view class="product-header">
+                    <text class="product-name">门店版(单屏收银机)系统</text>
+                    <text class="product-price">4800元</text>
+                </view>
+                <view class="btn-group">
+                    <button class="admin-button-com big blue" @click="startRenew(1,4800)">购买</button>
+                </view>
+            </view>
+
+            <!-- 门店版(双屏收银机)系统 -->
+            <view class="product-item">
+                <view class="product-header">
+                    <text class="product-name">门店版(双屏收银机)系统</text>
+                    <text class="product-price">5500元</text>
+                </view>
+                <view class="btn-group">
+                    <button class="admin-button-com big blue" @click="startRenew(1,5500)">购买</button>
+                </view>
+            </view>
+
+            <!-- 其他版本系统 -->
+            <view class="product-item">
+                <view class="product-header">
+                    <text class="product-name">其他版本系统</text>
+                    <input 
+                        type="digit" 
+                        class="custom-input" 
+                        placeholder="请输入金额" 
+                        v-model="customPrice"
+                        @focus="customPrice=''"
+                    />
+                </view>
+                <view class="btn-group">
+                    <button class="admin-button-com big blue" @click="startRenew(1,customPrice)">购买</button>
+                </view>
+            </view>
         </view>
     </view>
 </template>
@@ -20,7 +79,8 @@ export default {
 			currentDeadline:'',
 			newDeadline:'',
             hasRenew:0,
-            renewType:0
+            renewType:0,
+            customPrice:''
         }
     },
     computed: {
@@ -34,7 +94,6 @@ export default {
                 that.hasRenew = res.data.hasRenew ? res.data.hasRenew : 0
                 that.currentDeadline = res.data.currentDeadline
                 that.newDeadline = res.data.newDeadline
-                that.renewType = res.data.renewType?res.data.renewType:0
             }
         })
     },
@@ -45,48 +104,21 @@ export default {
         init(){
 
         },
-		startRenew(){
-            // #ifdef APP-PLUS
+		startRenew(type,price){
             let that = this
-            let type = uni.getSystemInfoSync().platform
-            that.$msg("请使用微信小程序操作续期")
-            if(type == 'android'){
-                if(plus.runtime.isApplicationExist({pname:'com.tencent.mm',action:'weixin://'})){
-                    plus.share.getServices(function(s){
-                        var sweixin
-                        for (var i = 0; i < s.length; i++) {
-                        var t = s[i];
-                        if (t.id == 'weixin') {
-                            sweixin = t;
-                        }
-                        }
-                        let miniOriginalId = that.dictInfo.miniOriginalId && that.dictInfo.miniOriginalId.current && that.dictInfo.miniOriginalId.current.ghs ? that.dictInfo.miniOriginalId.current.ghs : ''
-                        if (sweixin && sweixin.nativeClient) {
-                        sweixin.launchMiniProgram({
-                            id: miniOriginalId,
-                            path: '/admin/home/workbench',
-                            type: 0
-                        });
-                        } else {
-                        that.$msg("没有找到微信服务")
-                        //that.$msg("获取微信失败:" + e.message)
-                        //console.log(JSON.stringify(e));
-                        }
-                    }, function(e){
-                        that.$msg("没有找到微信服务哦")
-                        //that.$msg("获取微信失败:" + e.message)
-                        //console.log(JSON.stringify(e));
-                    });
-                } else {
-                    that.$msg("请安装微信,再打开小程序")
-                    return false
-                }
-                return true
-            }
+            // #ifdef APP-PLUS
+            that.$msg("APP不能操作,请打开微信小程序操作")
             // #endif
             // #ifdef MP-WEIXIN
             uni.showLoading({mask:true})
-            renewShop().then(res=>{
+            if(type == 1){
+                if(Number(price) <= 0){
+                    that.$msg("请输入金额")
+                    return false
+                }
+            }
+            this.renewType = type
+            renewShop({price:price,type:type}).then(res=>{
                 uni.hideLoading()
                 if(res.code == 1){
                     wexinPay(res.data, this.getSuccess, this.getError)
@@ -95,13 +127,132 @@ export default {
             // #endif
         },
 		getSuccess(){
-			this.$util.pageTo({url:"/admin/shop/renewSuccess",type:2})
+			this.$util.pageTo({url:"/admin/shop/renewSuccess?type="+this.renewType,type:2})
 		},
 		getError(){
-
+        },
+        closeRenew(){
+            uni.navigateBack()
         }
     }
 };
 </script>
 <style lang="scss" scoped>
+.renew-container {
+    width: 100%;
+    min-height: 100vh;
+    background-color: #f5f5f5;
+    padding: 20upx;
+}
+
+// 信息卡片
+.info-card {
+    background: white;
+    border-radius: 12upx;
+    padding: 30upx;
+    margin-bottom: 30upx;
+    box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.08);
+}
+
+.info-row {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 20upx 0;
+    font-size: 28upx;
+    line-height: 40upx;
+    
+    &:not(:last-child) {
+        border-bottom: 1upx solid #f0f0f0;
+    }
+}
+
+.info-label {
+    color: #666;
+    font-weight: 500;
+}
+
+.info-value {
+    color: #333;
+    font-weight: 500;
+    
+    &.highlight {
+        color: #3385ff;
+        font-weight: 600;
+    }
+}
+
+// 商品列表容器
+.products-container {
+    display: flex;
+    flex-direction: column;
+    gap: 20upx;
+}
+
+// 单个商品项
+.product-item {
+    background: white;
+    border-radius: 12upx;
+    padding: 30upx;
+    box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.08);
+}
+
+.product-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 40upx;
+    padding-bottom: 20upx;
+    border-bottom: 1upx solid #f0f0f0;
+}
+
+.product-name {
+    font-size: 28upx;
+    color: #333;
+    font-weight: 500;
+    flex: 1;
+}
+
+.product-price {
+    font-size: 32upx;
+    color: #3385ff;
+    font-weight: 600;
+}
+
+.custom-input {
+    width: 200upx;
+    height: 40upx;
+    padding: 0 10upx;
+    font-size: 28upx;
+    border: 2upx solid #ccc;
+    border-radius: 4upx;
+    background-color: white;
+    
+    &::placeholder {
+        color: #999;
+    }
+}
+
+// 按钮容器
+.btn-group {
+    display: flex;
+    justify-content: center;
+    margin-top: 40upx;
+    
+    .admin-button-com {
+        min-width: 200upx;
+        height: 60upx;
+        font-size: 28upx;
+        border-radius: 8upx;
+        letter-spacing: 2upx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        
+        &.big.blue {
+            background-color: #3385ff;
+            color: white;
+        }
+    }
+}
 </style>

+ 5 - 3
ghsApp/src/admin/shop/renewSuccess.vue

@@ -4,8 +4,8 @@
         <view class="top-view"> </view>
         <view class="result-view">
           <view :class="['iconfont', 'iconchenggong']"></view>
-          <view class="result-title">续期成功</view>
-          <view class="result-title">已延长到:{{ deadline?deadline.substr(0,10):'' }}</view>
+          <view class="result-title">支付成功</view>
+          <view class="result-title" v-if="type == 0">已延长到:{{ deadline?deadline.substr(0,10):'' }}</view>
           <button class="admin-button-com big" style="width:45vw;margin-top:20upx;" @click="goBack">返回</button>
         </view>
       </view>
@@ -18,10 +18,12 @@
     name: "renewSuccess",
     data() {
       return {
-        deadline:''
+        deadline:'',
+        type:0
       }
     },
     onLoad () {
+      this.type = this.option.type?this.option.type:0
     },
     methods: {
       goBack(){

+ 246 - 5
ghsApp/src/admin/shop/sk.vue

@@ -67,10 +67,61 @@
             </radio-group>
           </tui-list-cell>
 
+          <!-- 花材批发和零售 -->
+          <view class="action-btn" style="border-top:1upx solid #2bb931;margin-top:20upx;">
+            <text style="font-size: 30upx;font-weight: bold;">【花材】跑腿费计算方式</text>
+          </view>
+          <view style="display: flex; align-items: center; margin-left:30upx;">
+            <input class="input-field" type="number" v-model="hcFreeKm" placeholder="0" style="width:100upx;" @focus="hcFreeKm = ''" />
+            <text style="margin-left: 20upx;font-size:30upx;">公里内免费配送</text>
+          </view>
+          <view class="action-btn">
+            <button class="btn-add" @click="addFlowerMaterial">添加</button>
+          </view>
+          <view class="material-list">
+            <view v-for="(item, index) in flowerMaterials" :key="index" class="material-item">
+              <view class="material-info">
+                <view class="info-row">
+                  <text>满</text>
+                  <input class="input-field" v-model="item.num" type="number" placeholder="0" @focus="clearItemField(item, 'num')" />
+                  <text>扎,</text>
+                  <input class="input-field" v-model="item.price" type="digit" placeholder="0" @focus="clearItemField(item, 'price')" />
+                  <text>元,</text>
+                  <input class="input-field" v-model="item.distance" type="digit" placeholder="0" @focus="clearItemField(item, 'distance')" />
+                  <text>公里内免费配送</text>
+                </view>
+              </view>
+              <button class="btn-delete" @click="deleteFlowerMaterial(index)">删除</button>
+            </view>
+          </view>
+
+          <view class="warning-text">如不符合以上情况的,按实际跑腿费计算</view>
+
+          <!-- 花束 -->
+          <view class="section-title" style="border-top:1upx solid #2bb931;">【花束】跑腿费计算方式</view>
+
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">包配送的</view>
+            <input class="input-field" v-model="hsFreeKm" type="number" placeholder="0" @focus="hsFreeKm = ''" />
+            <view>公里内免费配送</view>
+          </tui-list-cell>
+
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">{{hsFreeKm}}公里以上</view>
+            <view class="input-row">
+              <text>每公里加收</text>
+              <input class="input-field" v-model="hsAddFee" type="digit" placeholder="0" @focus="hsAddFee = ''" />
+              <text>元</text>
+            </view>
+          </tui-list-cell>
+
+          <view class="warning-text">没有包配送的花束,按实际跑腿费计算</view>
+
         </view>
 
         <view class="confirm-btn">
-          <button class="admin-button-com big blue" @click="goBack">返回</button>
+          <button class="admin-button-com big default" @click="goBack">返回</button>
+          <button class="admin-button-com big blue" @click="commitSave">提交</button>
         </view>
     </view>
   </view>
@@ -97,9 +148,18 @@ export default {
       zjGatheringItem:0,
       zjGatheringItemName:'',
       selectItemOk:0,
-      wxStoreId:''
+      wxStoreId:'',
+      // 花材批发和零售配置
+      flowerMaterials: [{num:0,price:0,distance:0}],
+      // 花束配置
+      hsFreeKm: 0,
+      hsAddFee: 0,
+      hcFreeKm:0
     };
   },
+  onLoad() {
+    this.init()
+  },
   onShow() {
     let that = this
     if(that.form.customId != 0 && !this.$util.isEmpty(that.form.customId) && that.form.selectCustomOk == 1){
@@ -151,6 +211,22 @@ export default {
     goBack(){
       uni.navigateBack()
     },
+    commitSave(){
+      let that = this
+      modifyExt({
+        hcMap: JSON.stringify(this.flowerMaterials),
+        hsFreeKm: this.hsFreeKm,
+        hsAddFee: this.hsAddFee,
+        hcFreeKm: this.hcFreeKm
+      }).then(res=>{
+        if(res.code == 1){
+          this.$msg(res.msg)
+          setTimeout(() => {
+            that.goBack()
+          }, 1200)
+        }
+      })
+    },
     init(){
       if(this.hasLoad){
         return false
@@ -174,11 +250,71 @@ export default {
           this.thirdSendFee = res.data.thirdSendFee
           let main = res.data.main?res.data.main:[]
           this.wxStoreId = main.wxStoreId
+          // 加载花材批发和零售配置
+          this.flowerMaterials = res.data.hcMap ? JSON.parse(res.data.hcMap) : [{num:0,price:0,distance:0}]
+          console.log(this.flowerMaterials)
+          console.log(typeof this.flowerMaterials)
+          this.hcFreeKm = res.data.hcFreeKm ? res.data.hcFreeKm : 0
+          this.hsFreeKm = res.data.hsFreeKm ? res.data.hsFreeKm : 0
+          this.hsAddFee = res.data.hsAddFee ? res.data.hsAddFee : 0
         }
       })
     },
     selectCustom(){
       this.$util.pageTo({ url: '/admin/custom/selectCustom',query: {style:2}})
+    },
+    // 花材批发和零售 - 添加
+    addFlowerMaterial() {
+      this.flowerMaterials.push({
+        num: '',
+        price: '',
+        distance: ''
+      })
+    },
+    // 花材批发和零售 - 删除
+    deleteFlowerMaterial(index) {
+      uni.showModal({
+        title: '确认删除',
+        content: '确认删除该配置吗?',
+        success: (res) => {
+          if (res.confirm) {
+            this.flowerMaterials.splice(index, 1)
+            this.saveFlowerMaterials()
+          }
+        }
+      })
+    },
+    // 保存花材配置
+    saveFlowerMaterials() {
+      if (this.flowerMaterials.length === 0) {
+        return
+      }
+      modifyExt({
+        flowerMaterials: this.flowerMaterials
+      }).then(res => {
+        if (res.code === 1) {
+          this.$msg('花材配置保存成功')
+        } else {
+          this.$msg(res.msg || '保存失败')
+        }
+      })
+    },
+    // 保存花束配置
+    saveBundleConfig() {
+      modifyExt({
+        hsFreeKm: this.hsFreeKm,
+        hsAddFee: this.hsAddFee
+      }).then(res => {
+        if (res.code === 1) {
+          this.$msg('花束配置保存成功')
+        } else {
+          this.$msg(res.msg || '保存失败')
+        }
+      })
+    },
+    // 清空循环中的item字段
+    clearItemField(item, fieldName) {
+      this.$set(item, fieldName, '')
     }
   },
 };
@@ -188,6 +324,7 @@ export default {
 .app-content {
   min-height: calc(100vh - 20upx);
   padding-top: 20upx;
+  padding-bottom: 140upx;
 }
 .prompt-text {
   color: $fontColor3;
@@ -211,10 +348,114 @@ export default {
 }
 // 按钮
 .confirm-btn {
-  width: calc(100% - 60upx);
-  margin: 60upx 30upx 20upx;
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  width: 100%;
+  padding: 20upx 30upx;
+  display: flex;
+  gap: 20upx;
+  background-color: #fff;
+  box-shadow: 0 -2upx 10upx rgba(0, 0, 0, 0.1);
+  z-index: 100;
+  /* 兼容 iOS safe area */
+  padding-bottom: max(20upx, env(safe-area-inset-bottom));
   .admin-button-com {
-    width: 100%;
+    flex: 1;
   }
 }
+
+// 新增样式
+.section-title {
+  padding: 20upx 30upx;
+  font-size: 28upx;
+  font-weight: bold;
+  color: #333;
+  margin-top: 20upx;
+  background-color: #f5f5f5;
+}
+
+.action-btn {
+  padding: 20upx 30upx;
+  .btn-add {
+    background-color: #3385FF;
+    color: white;
+    padding: 10upx 20upx;
+    border-radius: 4upx;
+    border: none;
+    font-size: 20upx;
+  }
+}
+
+.material-list {
+  padding: 20upx 30upx;
+  
+  .material-item {
+    background-color: #f9f9f9;
+    padding: 20upx;
+    margin-bottom: 15upx;
+    border-radius: 4upx;
+    border: 1upx solid #e0e0e0;
+    
+    .material-info {
+      margin-bottom: 15upx;
+      
+      .info-row {
+        display: flex;
+        align-items: center;
+        flex-wrap: wrap;
+        gap: 8upx;
+        
+        .input-field {
+          width: 80upx;
+          height: 36upx;
+          padding: 0 8upx;
+          border: 1upx solid #ddd;
+          border-radius: 4upx;
+          font-size: 24upx;
+          text-align: center;
+          line-height: 36upx;
+        }
+      }
+    }
+    
+    .btn-delete {
+      background-color: #3385FF;
+      color: white;
+      padding: 8upx 16upx;
+      border-radius: 4upx;
+      border: none;
+      font-size: 22upx;
+      width: 100%;
+    }
+  }
+}
+
+.warning-text {
+  color: #FF0000;
+  font-size: 30upx;
+  padding: 0 30upx 15upx;
+  font-weight: bold;
+}
+
+.input-row {
+  display: flex;
+  align-items: center;
+  gap: 8upx;
+}
+
+.input-field {
+  width: 100upx;
+  height: 44upx;
+  padding: 0 10upx;
+  border: 1upx solid #ddd;
+  border-radius: 4upx;
+  font-size: 24upx;
+  text-align: center;
+  line-height: 44upx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
 </style>

+ 20 - 8
ghsApp/src/admin/stat/customSale.vue

@@ -17,23 +17,35 @@
 					<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-th>笔数</t-th>
+							<t-th>扎数</t-th>
+							<t-th>金额</t-th>
+							<t-th>成本</t-th>
+							<t-th>利润</t-th>
 						</t-tr>
 							<block v-if="profile.list && !$util.isEmpty(profile.list)">
 								<view v-for="(item, index) in profile.list" :key="index">
 									<t-tr>
 										<t-td><view style="color:#333333;font-size:28upx;">{{item.customName?item.customName:'-'}}</view></t-td>
-										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.orderPrice)}}</view></t-td>
-										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.tkPrice)}}</view></t-td>
-										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.amount)}}</view></t-td>
 										<t-td><view style="color:#333333;font-size:28upx;">{{parseFloat(item.num)}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">{{item.count?parseFloat(item.count):0}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.amount)}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.cost)}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.profit)}}</view></t-td>
 									</t-tr>
 								</view>
 							</block>
-							<t-tr><t-td><view style="color:black;font-weight:bold;font-size:28upx;">{{profile.totalNum||0}}笔 实际金额¥{{profile.totalAmount||0}}</view></t-td></t-tr>
+							<t-tr><t-td><view style="color:black;font-weight:bold;font-size:28upx;">{{profile.totalNum||0}}笔¥{{profile.totalAmount||0}} 成本¥{{ profile.totalCost||0 }} 利润¥{{ profile.totalProfit||0 }}</view></t-td></t-tr>
+							<t-tr><t-td>
+								<view style="color:#1c89e0;font-size:28upx;">
+									从2025年11月20号起是准确数据,之前的数据不准确
+								</view>
+							</t-td></t-tr>
+							<t-tr><t-td>
+								<view style="color:#1c89e0;font-size:28upx;">
+									扎数没有减掉售后的数量,只能作为参考数据。金额、成本和利润已经减掉了售后部分,是准确的。
+								</view>
+							</t-td></t-tr>
 					</t-table>
 				</block>
 			</view>

+ 195 - 0
ghsApp/src/admin/stat/distSale.vue

@@ -0,0 +1,195 @@
+<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-th>利润</t-th>
+						</t-tr>
+							<block v-if="profile.list && !$util.isEmpty(profile.list)">
+								<view v-for="(item, index) in profile.list" :key="index">
+									<t-tr>
+										<t-td><view style="color:#333333;font-size:28upx;">{{item.distName?item.distName:'-'}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">{{parseFloat(item.num)}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">{{item.count?parseFloat(item.count):0}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.amount)}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.cost)}}</view></t-td>
+										<t-td><view style="color:#333333;font-size:28upx;">¥{{parseFloat(item.profit)}}</view></t-td>
+									</t-tr>
+								</view>
+							</block>
+							<t-tr><t-td><view style="color:black;font-weight:bold;font-size:28upx;">{{profile.totalNum||0}}笔¥{{profile.totalAmount||0}} 成本¥{{ profile.totalCost||0 }} 利润¥{{ profile.totalProfit||0 }}</view></t-td></t-tr>
+							<t-tr><t-td>
+								<view style="color:#1c89e0;font-size:28upx;">
+									从2025年11月20号起是准确数据,之前的数据不准确
+								</view>
+							</t-td></t-tr>
+							<t-tr><t-td>
+								<view style="color:#1c89e0;font-size:28upx;">
+									扎数没有减掉售后的数量,只能作为参考数据。金额、成本和利润已经减掉了售后部分,是准确的。
+								</view>
+							</t-td></t-tr>
+					</t-table>
+				</block>
+			</view>
+		</view>
+
+	</view>
+</view>
+</template>
+<script>
+import AppWrapperEmpty from "@/components/app-wrapper-empty";
+import SelectList from "@/components/plugin/selectList";
+import { getStatDist } from "@/api/stat";
+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 {
+			params:{
+				searchTime:'',
+				startTime: "",
+				endTime: "",
+			},
+			profile:[],
+			searchText:'',
+		};
+	},
+	onPullDownRefresh() {
+		this.resetList();
+		this.getList().then(res => {
+			uni.stopPullDownRefresh();
+		});
+	},
+	methods: {
+		...mapActions(['setUserShopAll']),
+		searchFn(e){
+			this.searchText = e;
+		},
+		selectDateFn(val) {
+			this.params = {...this.params,...val}
+			this.init();			
+		},
+		async init() {
+			this.getList();
+		},
+		getList() {
+			let that = this
+			uni.showLoading()
+			getStatDist(this.params).then(res => {
+				uni.hideLoading()
+				that.profile = res.data
+			});
+		}
+	}
+};
+</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:130upx;
+		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: 90upx;
+		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 {
+			::v-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>

+ 1 - 1
ghsApp/src/admin/stat/profit.vue

@@ -37,7 +37,7 @@
 							<t-tr>
 								<t-td align="center">
 									<view style="font-weight:bold;font-size:30upx;">
-										花材损耗 ¥{{profit.wastagePrice||0}}
+										花材报损 成本¥{{profit.wastageCost||0}} 售价¥{{profit.wastagePrice||0}}
 									</view>
 								</t-td>
 							</t-tr>

+ 8 - 7
ghsApp/src/admin/stat/stock.vue

@@ -10,7 +10,10 @@
 					<button class="admin-button-com middle default" @click="downStock()">下载Excel</button>
 				</view>
 			</view>
-			<view class="top-bar" style="margin-left:80upx;">实时库存</view>
+			<view class="top-bar" style="margin-left:80upx;font-size:34upx;padding:30upx 0 20upx 0;">
+				<text @click="showStock">实时库存</text>
+			</view>
+			<view style="margin-left:30upx;padding-top:10upx;padding-bottom:10upx;font-size:28upx;">这个页面,请使用app打开,小程序打开会卡死</view>
 			<scroll-view scroll-y scroll-with-animation class="main-view">
 				<view class="space-view ex-table">
 					<t-table :headerBackgroundColor="'#F0F2F6'">
@@ -77,7 +80,7 @@
 												</t-td>
 												<t-td>
 													<view style="font-size:28upx;color:red;" @click="pageTo({url:'/admin/item/detail?id='+productItem.id})">
-														¥{{productItem.cost?parseFloat(productItem.cost):0}}
+														¥{{productItem.avCost?parseFloat(productItem.avCost):0}}
 													</view>
 												</t-td>
 											</t-tr>
@@ -206,7 +209,9 @@ export default {
 			this.shopId = this.getMyShopInfo.id;
 			let type = '';
 			let that = this
+			uni.showLoading()
 			getProductDataApi({ type, shopId: this.shopId,status:0,requestType:'hasStockList'}).then(res=>{
+				uni.hideLoading()
 				if(res.code == 1){
 					that.classItemData = res.data.classItem ? res.data.classItem : []
 				}
@@ -230,11 +235,7 @@ export default {
 		}
 	}
 	.top-bar {
-		position: absolute;
-		left: 0;
-		display: flex;
 		width: 100%;
-		top:130upx;
 		z-index: 20;
 		.bar{
 			width: 50%;
@@ -246,7 +247,7 @@ export default {
 		}
 	}
 	.main-view {
-		margin-top: 90upx;
+		margin-top:10upx;
 		flex: 1;
 		background-color: #f9fbfc;
 		.space-view {

+ 12 - 0
ghsApp/src/api/custom/index.js

@@ -114,4 +114,16 @@ export const copyCumtomer = data => {
 
 export const changeDelStatus = data => {
 	return https.get('/custom/change-del-status', data)
+}
+
+export const allCredit = data => {
+	return https.get('/custom/all-credit', data)
+}
+
+export const allSetLookStock = data => {
+	return https.get('/custom/all-set-look-stock', data)
+}
+
+export const allSetLookSale = data => {
+	return https.get('/custom/all-set-look-sale', data)
 }

+ 25 - 0
ghsApp/src/api/dist/index.js

@@ -0,0 +1,25 @@
+import https from '@/plugins/luch-request_0.0.7/request'
+
+export const getList = data => {
+	return https.get('/dist/get-list', data)
+}
+
+export const addDist = data => {
+	return https.post('/dist/add', data)
+}
+
+export const updateDist = data => {
+	return https.post('/dist/update', data)
+}
+
+export const delDist = data => {
+	return https.get('/dist/delete', data)
+}
+
+export const getAllDist = data => {
+	return https.get('/dist/get-all-dist', data)
+}
+
+export const changeDist = data => {
+	return https.get('/dist/change-dist', data)
+}

+ 5 - 1
ghsApp/src/api/order/index.js

@@ -277,4 +277,8 @@ export const scanPay = data => https.get("/order/scan-pay", data);
 //扫码付款结果查询
 export const scanPayCheck = data => https.get("/order/scan-pay-check", data);
 
-export const getScanPayList = data => https.get("/scan-pay/list", data);
+export const getScanPayList = data => https.get("/scan-pay/list", data);
+
+export const modifyAddress = data => {
+	return https.post('/order/modify-address', data)
+}

+ 5 - 0
ghsApp/src/api/product/index.js

@@ -138,4 +138,9 @@ export const generateBarcodeTable = data => {
 
 export const changeBelongCost = data => {
 	return https.get("/product/change-belong-cost", data);
+};
+
+//修改平均成本
+export const modifyAvCost = data => {
+	return https.get("/product/modify-av-cost", data);
 };

+ 4 - 0
ghsApp/src/api/stat/index.js

@@ -75,6 +75,10 @@ export const getStatKhCgProfile = data => {
 	return https.get('/stat-kh-cg/profile', data)
 }
 
+export const getStatDist = data => {
+	return https.get('/stat-kh-cg/dist', data)
+}
+
 //客户下单排行
 export const getStatCgGhsProfile = data => {
 	return https.get('/stat-cg-ghs/profile', data)

+ 2 - 2
ghsApp/src/manifest.json

@@ -2,8 +2,8 @@
     "name" : "销花宝",
     "appid" : "__UNI__BD781B0",
     "description" : "鲜花批发销售管理系统",
-    "versionName" : "1.2.55",
-    "versionCode" : 1255,
+    "versionName" : "1.2.62",
+    "versionCode" : 1262,
     "transformPx" : true,
     /* 5+App特有相关 */
     "app-plus" : {

+ 20 - 4
ghsApp/src/mixins/product2.js

@@ -40,7 +40,8 @@ export default {
 			globalScrollTopOldPlace:0,
 			globalIsRequesting:false,
 			globalCgMyCharge:0,
-			globalLookStock:0
+			globalLookStock:0,
+			globalDefaultClassId:0
 		};
 	},
 	onLoad(options) {
@@ -146,6 +147,7 @@ export default {
 				if(res.code == 1){
 					that.globalClassData = res.data.class ? res.data.class : []
 					that.globalClassDataIndex = res.data.classIndex ? res.data.classIndex : []
+					that.globalDefaultClassId = res.data.defaultClassId?res.data.defaultClassId:0
 					if(that.globalClassData[0]){
 						that.globalClassId = that.globalClassData[0].id
 						//保存到仓库
@@ -183,10 +185,24 @@ export default {
 				}
 			})
         },
-		sorts_fun(arr) {
+		sorts_fun(arr, lastValue = null) {
 			return function(a, b) {
 				var v1 = a[arr];
 				var v2 = b[arr];
+				
+				// 如果两个都是要排到最后的值
+				if (v1 === lastValue && v2 === lastValue) {
+					return 0;
+				}
+				// 如果 a 是要排到最后的值,就排后面
+				if (v1 === lastValue) {
+					return 1;
+				}
+				// 如果 b 是要排到最后的值,就排后面
+				if (v2 === lastValue) {
+					return -1;
+				}
+				// 其他情况正常升序排列
 				return v1 - v2;
 			}
 		},
@@ -203,8 +219,8 @@ export default {
 			}
 			//修改数据需要复制一份,否则不会生效
 			that.globalItemData = copyObject(that.globalItemData);
-
-			that.globalItemData = that.globalItemData.sort(this.sorts_fun('classId'))
+			//搜索花材时,属于默认分类的花材要排在最后面,才不会影响批发店做事,所以传入一个默认分类的id
+			that.globalItemData = that.globalItemData.sort(this.sorts_fun('classId', that.globalDefaultClassId))
 			let hasExists = []
 			for (let i=0;i<that.globalItemData.length;i++){
 				let currentProduct = that.globalItemData[i]

+ 8 - 4
ghsApp/src/pages.json

@@ -68,7 +68,9 @@
 				{"path": "rechargeChange","style": {"navigationBarTitleText": "充值记录","enablePullDownRefresh": false}},
 				{"path": "addStaff","style": {"navigationBarTitleText": "帮客户添加员工"}},
 				{"path": "invitePay","style": {"navigationBarTitleText": "付款结账"}},
-				{"path": "noExpend","style": {"navigationBarTitleText": "最近未下单","enablePullDownRefresh": false}}
+				{"path": "noExpend","style": {"navigationBarTitleText": "最近未下单","enablePullDownRefresh": false}},
+				{"path": "dist","style": {"navigationBarTitleText": "片区划分","enablePullDownRefresh": false}},
+				{"path": "distCustom","style": {"navigationBarTitleText": "设置片区","enablePullDownRefresh": false}}
 			]
 		},
 		{
@@ -117,7 +119,8 @@
 				{"path": "refundAllList","style": {"navigationBarTitleText": "售后记录", "enablePullDownRefresh": false}},
 				{"path": "bookChange","style": {"navigationBarTitleText": "变动记录", "enablePullDownRefresh": false}},
 				{"path": "combine","style": {"navigationBarTitleText": "分配结果", "enablePullDownRefresh": false}},
-				{"path": "printWlList","style": {"navigationBarTitleText": "打印物流列表", "enablePullDownRefresh": false}}
+				{"path": "printWlList","style": {"navigationBarTitleText": "打印物流列表", "enablePullDownRefresh": false}},
+				{"path": "modify","style": {"navigationBarTitleText": "修改地址", "enablePullDownRefresh": false}}
 			]
 		},
 		{
@@ -222,7 +225,7 @@
 				{"path": "selectShop","style": {"navigationBarTitleText": "选择门店"}},
 				{"path": "wl","style": {"navigationBarTitleText": "物流列表"}},
 				{"path": "myShop","style": {"navigationBarTitleText": "我的门店"}},
-				{"path": "renew","style": {"navigationBarTitleText": "续期"}},
+				{"path": "renew","style": {"navigationBarTitleText": "续期与购买"}},
 				{"path": "expressSet","style": {"navigationBarTitleText": "跑腿设置"}}
 			]
 		},
@@ -293,7 +296,8 @@
 				{"path": "classProfit","style": {"navigationBarTitleText": "收支分类"}},
 				{"path": "productSale","style": {"navigationBarTitleText": "花材销量"}},
 				{"path": "kdIncome","style": {"navigationBarTitleText": "收入统计"}},
-				{"path": "customSale","style": {"navigationBarTitleText": "客户下单排行"}},
+				{"path": "customSale","style": {"navigationBarTitleText": "客户业绩"}},
+				{"path": "distSale","style": {"navigationBarTitleText": "片区业绩"}},
 				{"path": "clear","style": {"navigationBarTitleText": "结账跟踪"}},
 				{"path": "incomeStat","style": {"navigationBarTitleText": "应收款"}},
 				{"path": "cgStat","style": {"navigationBarTitleText": "供货业绩"}},

+ 91 - 12
ghsApp/src/pagesClient/member/detail.vue

@@ -11,17 +11,19 @@
                       <text style="font-weight:bold;" @click="changeNameFn()">{{userInfo.name}}</text> <text @click="changeNameFn()" style="color:#3385ff;margin-left:32upx;font-size:30upx;">修改</text>
                   </view>
                   <view>{{userInfo.originName}}</view>
-                  <view>
+                  <view style="font-size:26upx;">
                     ID {{userInfo.sn}}
-                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 10000" style="margin-left:40upx;color:green;font-weight:bold;">没有下过单</text>
-                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 7" style="margin-left:40upx;color:green;font-weight:bold;">超1周未下单</text>
-                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 30" style="margin-left:40upx;color:green;font-weight:bold;">超1个月未下单</text>
-                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 180" style="margin-left:40upx;color:green;font-weight:bold;">超半年未下单</text>
-                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 365" style="margin-left:40upx;color:green;font-weight:bold;">超1年未下单</text>
+                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 10000" style="margin-left:18upx;color:green;font-weight:bold;">没有下过单</text>
+                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 7" style="margin-left:18upx;color:green;font-weight:bold;">超1周未下单</text>
+                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 30" style="margin-left:18upx;color:green;font-weight:bold;">超1个月未下单</text>
+                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 180" style="margin-left:18upx;color:green;font-weight:bold;">超半年未下单</text>
+                    <text v-if="userInfo.overTimeUnExpend && userInfo.overTimeUnExpend == 365" style="margin-left:18upx;color:green;font-weight:bold;">超1年未下单</text>
 
-                    <text v-if="Number(userInfo.black)==2" style="color:red;font-weight:bold;margin-left:40upx;">黑名单</text>
-                    <text v-if="Number(userInfo.delStatus)==1" style="color:red;font-weight:bold;margin-left:40upx;">已删除</text>
+                    <text v-if="Number(userInfo.black)==2" style="color:red;font-weight:bold;margin-left:18upx;">黑名单</text>
+                    <text v-if="Number(userInfo.delStatus)==1" style="color:red;font-weight:bold;margin-left:18upx;">已删除</text>
 
+                    <text v-if="userInfo.distName!=''" style="margin-left:18upx;color:#ceb8b8;" @click="openDistSelect">{{ userInfo.distName }}</text>
+                    <text v-else style="margin-left:18upx;color:#ceb8b8;" @click="openDistSelect">请设片区</text>
                   </view>
                 </view>
             </view>
@@ -282,14 +284,14 @@
         </div>
 
         <div class="inp-list-line" style="margin-top:35upx;" v-if="rechargeType == 0">
-						<div class="line-label">付款方式</div>
-						<div class="line-input">
+					<div class="line-label">付款方式</div>
+					<div class="line-input">
                 <button style="margin-right:2upx;" class="admin-button-com middle" :class="[payWay == 0 ? 'blue' : '']" @click="payWay = 0">微 信</button>
                 <button style="margin-right:2upx;" class="admin-button-com middle" :class="[payWay == 1 ? 'blue' : '']" @click="payWay = 1">支付宝</button>
                 <button style="margin-right:2upx;" class="admin-button-com middle" :class="[payWay == 4 ? 'blue' : '']" @click="payWay = 4">现 金</button>
                 <button class="admin-button-com middle" :class="[payWay == 5 ? 'blue' : '']" @click="payWay = 5">银行卡</button>
-						</div>
 					</div>
+				</div>
         </div>
 
         <div class="inp-list-line">
@@ -302,6 +304,27 @@
       </template>
 		</modal-module>
 
+    <!-- 配送区域选择弹框 -->
+    <uni-popup ref="distSelectRef" background-color="#fff" type="center" :animation="false" class="class-popup-style">
+      <view style="max-height:90vh;overflow: scroll;">
+        <view style="margin-left:30upx;margin-top:19upx;font-size:27upx;font-weight:bold;">请选择片区</view>
+        <view style="display:flex;padding:20upx;height:auto;justify-content: flex-start;align-items:center;flex-wrap:wrap;max-height:100vh;overflow:auto;">
+          <view v-for="(item, index) in allDist" :key="index" style="margin-bottom:20upx;margin-left:3upx;">
+            <button
+              class="admin-button-com staff-btn"
+              @click.stop="selectDist(item)"
+              :class="{'selected': currentDist.id === item.id}"
+            >
+              {{ item.name }}
+            </button>
+          </view>
+        </view>
+        <view style="text-align:center;padding:10upx 0 10upx 0;">
+          <button class="admin-button-com big blue" style="width:210upx;" @click="cancelDistSelect()">取消</button>
+        </view>
+      </view>
+    </uni-popup>
+
   </view>
 </template>
 <script>
@@ -313,6 +336,7 @@ import { IMGHOST } from '@/config'
 import { mapGetters } from "vuex"
 import { changeShowStock,changePassStatus,toChangeHome,changeWlName,modifyShortName,modifyHomeAmount,changeLevel,createSeatSnFn,modifySeatSnFn,changeDelStatus } from "@/api/custom"
 import { updateDebtLimit,updateCustomBlack,changeDiscount,changeName,rechargeFn,getGatheringCode} from "@/api/custom";
+import { getAllDist,changeDist } from "@/api/dist"
 export default {
   name: "detail",
   components: {
@@ -382,7 +406,9 @@ export default {
       payWay:-1,
       rechargeType:0,
       title:'付款结账',
-      needRefresh:0
+      needRefresh:0,
+      allDist:[],
+      currentDist:{}
     };
   },
 	computed: {
@@ -402,6 +428,11 @@ export default {
     if(this.option.name && !this.$util.isEmpty(this.option.name)){
       uni.setNavigationBarTitle({title:this.option.name})
     }
+    getAllDist().then(res=>{
+      if(res.code == 1){
+        this.allDist = res.data.list?res.data.list:[]
+      }
+    })
   },
   onShow(){
 
@@ -706,6 +737,26 @@ export default {
           this.title = name+' ¥'+res.data.remainDebtAmount
         }
       })
+    },
+    // 打开配送区域选择弹框
+    openDistSelect() {
+      this.currentDist = { id: this.userInfo.distId } || {};
+      this.$refs.distSelectRef.open('center');
+    },
+    // 选择配送区域
+    selectDist(dist) {
+      this.$refs.distSelectRef.close();
+      changeDist({customId:this.userInfo.id,distId:dist.id}).then(res=>{
+        if(res.code == 1){
+          this.$msg('设置成功')
+          this.userInfo.distName = dist.name
+          this.userInfo.distId = dist.id
+        }
+      })
+    },
+    // 关闭弹框
+    cancelDistSelect() {
+      this.$refs.distSelectRef.close();
     }
   }
 };
@@ -847,4 +898,32 @@ export default {
     color: #8c8989;
   }
 }
+
+.class-popup-style{
+  z-index:99999;
+}
+
+.staff-btn {
+  min-width: 160upx;
+  padding: 0 27upx;
+  height: 80upx;
+  font-size: 40upx;
+  font-weight: bold;
+  margin: 8upx 8upx 0 0;
+  border-radius: 16upx;
+  background: #f0f2f6;
+  color: #333;
+  border: 2upx solid #e0e0e0;
+  transition: none;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.staff-btn.selected,
+.staff-btn:active {
+  background: #f0f2f6;
+  color: #333;
+  border-color: #e0e0e0;
+}
 </style>

+ 22 - 5
ghsApp/src/pagesOrder/detail.vue

@@ -16,8 +16,9 @@
 						<i @click.stop="callUp(detailInfo.customMobile)" class="iconfont icondianhua1"></i>
 						<i @click.stop="navigateTo(detailInfo.lat,detailInfo.long,detailInfo.customName)" class="iconfont icondianhua"></i>
 					</view>
-					<button class="admin-button-com bule middle copy-address" @click.stop="copyCustom(detailInfo)">复制地址</button>
 				</view>
+				<button class="admin-button-com bule middle copy-address" style="position: absolute;top:90upx;right:28upx;" @click.stop="copyCustom(detailInfo)">复制地址</button>
+				<button class="admin-button-com default middle" style="position: absolute;top:180upx;right:28upx;" @click.stop="modifyAddress(detailInfo)">修改地址</button>
 			</view>
 
 			<view class="flex-space title" v-if="Number(detailInfo.sendStatus)>-4">配送进度</view>
@@ -336,7 +337,7 @@
 						</div>
 					</tui-list-cell>
 					<tui-list-cell class="line-cell" v-if="detailInfo.packCost > 0" :hover="false">
-						<div class="tui-title">包费</div>
+						<div class="tui-title">包费</div>
 						<div class="detail-price_box" style="font-size: 28upx">
 							¥{{ detailInfo.packCost?parseFloat(detailInfo.packCost):0 }}
 						</div>
@@ -368,9 +369,18 @@
 						<div class="detail-price_box" style="font-size: 28upx">-¥{{ detailInfo.orderReachDiscountPrice?parseFloat(detailInfo.orderReachDiscountPrice):0 }}</div>
 					</tui-list-cell>
 					<tui-list-cell class="line-cell" :hover="false">
-						<div class="tui-title">实际金额</div>
-						<div class="detail-price_box" style="font-size: 32upx;">¥{{ parseFloat(detailInfo.realPrice)}}</div>
+						<div class="tui-title" style="color:#3385FF;">实际金额</div>
+						<div class="detail-price_box" style="font-size: 34upx;color:#3385FF;">¥{{ parseFloat(detailInfo.realPrice)}}</div>
+					</tui-list-cell>
+
+				<block v-if="detailInfo.staffFinance==1">
+					<tui-list-cell class="line-cell" :hover="false" @click="toggleFinanceInfo">
+						<div class="tui-title">财务信息</div>
+						<div v-if="showFinanceInfo" class="detail-price_box" style="font-weight:normal;font-size:30upx;">成本¥{{ detailInfo.remainCost?parseFloat(detailInfo.remainCost):0 }} 利润¥{{ detailInfo.profit?parseFloat(detailInfo.profit):0 }}</div>
+						<div v-else class="detail-price_box" style="color:#ada8a8;font-size:30upx;font-weight:normal;">点击查看</div>
 					</tui-list-cell>
+				</block>
+
 				</div>
 			</view>
 
@@ -383,7 +393,7 @@
 						</div>
 					</tui-list-cell>
 					<tui-list-cell class="line-cell" :hover="false">
-						<div class="tui-title">包费</div>
+						<div class="tui-title">包费</div>
 						<div class="detail-price_box" style="font-size: 28upx">
 							¥{{ detailInfo.packCost?parseFloat(detailInfo.packCost):0 }}
 						</div>
@@ -646,6 +656,7 @@ export default {
 			cancelReasonList: [],
 			selectedCancelReasonCode: null,
 			otherCancelReason: '',
+			showFinanceInfo:false,
 			currentExpressInfo: {},
 			// 小费弹窗相关
 			showTipModal: false,
@@ -712,6 +723,9 @@ export default {
 		}
 	},
 	methods: {
+		toggleFinanceInfo() {
+			this.showFinanceInfo = !this.showFinanceInfo
+		},
 		showMySimPop() {
 			this.simModal = true
 		},
@@ -1065,6 +1079,9 @@ export default {
 		goCustom(){
 			this.$util.pageTo({url: '/pagesClient/member/detail?id='+this.detailInfo.customId})
 		},
+		modifyAddress(){
+			this.$util.pageTo({url: '/pagesOrder/modify?id='+this.detailInfo.id})
+		},
 		copyCustom(detailInfo){
 			let customName = detailInfo.customName
 			let customMobile = detailInfo.customMobile

+ 205 - 0
ghsApp/src/pagesOrder/modify.vue

@@ -0,0 +1,205 @@
+<template>
+	<view class="app-content">
+		<form @submit="formSubmit">
+			<view class="module-com input-line-wrap">
+
+				<tui-list-cell class="line-cell" :hover="false" v-if="hasMap == 1">
+					<view class="tui-title">地址类型</view>
+					<button :class="[couldNavigation==1?'blue':'default']" class="admin-button-com middle" @click.stop="setStyle(1)" style="width:180upx;">支持导航</button>
+					<button :class="[couldNavigation==0?'blue':'default']" class="admin-button-com middle" style="width:180upx;margin-left:70upx;" @click.stop="setStyle(0)">不用导航</button>
+				</tui-list-cell>
+
+				<tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="openAddres">
+					<view class="tui-title">城市</view>
+					<view class="tui-input" v-if="form.province || form.city">{{ form.province + '-' + form.city }}</view>
+					<view class="tui-placeholder" v-else>请选择</view>
+					<input v-model="form.province" name="province" hidden />
+				</tui-list-cell>
+
+				<tui-list-cell v-if="couldNavigation == 1" class="line-cell" :hover="false" :arrow="true" @click="selectRegion">
+					<view class="tui-title">地址</view>
+					<view v-if="form.address" class="tui-input">{{ form.address }}</view>
+					<view v-else class="tui-placeholder">请填写地址</view>
+					<input v-model="form.address" name="address" hidden />
+				</tui-list-cell>
+				<tui-list-cell v-else class="line-cell" :hover="false">
+					<view class="tui-title">地址</view>
+					<input v-model="form.address" placeholder-class="phcolor" class="tui-input" name="address" placeholder="请填写地址" />
+				</tui-list-cell>
+				<tui-list-cell class="line-cell" :hover="false">
+					<view class="tui-title ">门牌</view>
+					<input v-model="form.floor" placeholder-class="phcolor" class="tui-input" name="floor" placeholder="楼号门牌号,建议填写,方便查找"/>
+				</tui-list-cell>
+			</view>
+			<view class="confirm-btn">
+				<button class="admin-button-com big blue" formType="submit">提交</button>
+			</view>
+		</form>
+		<!-- 省市联动 -->
+		<simple-address ref="simpleAddress" :pickerValueDefault="cityPickerValueDefault" @onConfirm="onCityConfirm"></simple-address>
+		<!-- 选择地区 -->
+		<app-area-sel :show.sync="showRegion" :city="form.city" @change="changeAreaFn" />
+	</view>
+</template>
+
+<script>
+import TuiListCell from '@/components/plugin/list-cell'
+import SimpleAddress from '@/components/plugin/simple-address'
+import AppAreaSel from '@/components/app-area-sel'
+const form = require('@/utils/formValidation.js')
+import { modifyAddress } from '@/api/order'
+import {getHasMap} from "@/api/express"
+export default {
+	name: 'modify',
+	components: {
+		TuiListCell,
+		SimpleAddress,
+		AppAreaSel
+	},
+	data() {
+		return {
+			form: {
+				province: '',
+				city: '',
+				dist: '',
+				address: '',
+				floor: '',
+				showAddress:''
+			},
+			region:{lat:'',long:''},
+			regionData: {
+				lat: 0,
+				long: 0
+			},
+			cityPickerValueDefault: [0, 0],
+			showRegion: false,
+			hasMap: 0,
+			couldNavigation:1
+		}
+	},
+	onLoad() {
+	},
+	methods: {
+		setStyle(flag){
+			this.couldNavigation = flag
+			this.form.address = ''
+		},
+		onHere(){
+			this.form.province = '云南省'
+			this.form.city = '昆明市'
+		},
+		init() {
+			getHasMap().then(res=>{
+				this.hasMap = res.data.hasMap
+				if(this.hasMap == 0){
+					this.couldNavigation = 0
+				}else{
+					this.couldNavigation = 1
+				}
+			})
+		},
+		//省市联动
+		openAddres() {
+			this.$refs.simpleAddress.open()
+		},
+		onCityConfirm(e) {
+			this.form.province = e.provinceName
+			this.form.city = e.cityName
+			this.form.address = ''
+			this.form.showAddress = ''
+			this.region.lat = ''
+			this.region.long = ''
+		},
+		selectRegion() {
+			if (!this.form.city) {
+				this.$msg('请先选择城市!')
+				return false
+			}
+			this.showRegion = true
+		},
+		changeAreaFn(e) {
+			let locationStr = e.location
+			let fruits = locationStr.split(",").map(fruit => fruit.trim())
+
+			this.region.lat = fruits[1]
+			this.region.long = fruits[0]
+			this.form.showAddress = e.address
+			this.form.address = e.name
+
+			// 提取地区信息,按遇到第一个"市"字后,把"市"后面的字符串作为地区
+			const districtStr = e.district || '';
+			const cityIndex = districtStr.indexOf('市');
+			this.form.dist = cityIndex !== -1 ? districtStr.substring(cityIndex + 1) : districtStr;
+		},
+		confirmFn() {
+			let that = this
+			this.form.id = this.option.id ? this.option.id : 0
+			this.form = {...this.form, ...this.region}
+			uni.showLoading({mask:true})
+			modifyAddress(this.form).then(res=>{
+				if(res.code == 1){
+					that.$msg('修改成功')
+					setTimeout(() => {
+						uni.navigateBack({})
+					}, 1200)
+				}
+			})
+		},
+		formSubmit(e) {
+			let rules = [
+				{
+					name: 'province',
+					rule: ['required'],
+					msg: ['请选择城市']
+				},
+				{
+					name: 'address',
+					rule: ['required'],
+					msg: ['请填选地址']
+				}
+			]
+			let formData = e.detail.value
+			let checkRes = form.validation(formData, rules)
+			if (!checkRes) {
+				this.confirmFn()
+			} else {
+				this.$msg(checkRes)
+			}
+		},
+	}
+}
+</script>
+<style lang="scss" scoped>
+	.app-content {
+		min-height: calc(100vh - 20upx);
+		padding-top: 20upx;
+	}
+	.prompt-text {
+		color: $fontColor3;
+		padding-left: 30upx;
+		margin-bottom: 30upx;
+	}
+	.module-com {
+		margin-bottom: 20upx;
+		.member-wrap {
+			.member-det {
+				font-size: 24upx;
+				margin-left: 20upx;
+			}
+		}
+		.remark-wrap {
+			align-items: flex-start;
+			.remark {
+				height: 180upx;
+			}
+		}
+	}
+	// 按钮
+	.confirm-btn {
+		width: calc(100% - 60upx);
+		margin: 60upx 30upx 20upx;
+		.admin-button-com {
+			width: 100%;
+		}
+	}
+</style>

+ 651 - 190
ghsApp/src/pagesOrder/refund.vue

@@ -1,112 +1,204 @@
 <template>
-	<view class="app-content">
-		<view class="flex refund-item">
-			<view class="refund-label">退款方式:</view>
-			<view class="flex list">
-				<view class="flex" @tap="refundType=1" >
-					<view class="flex-center radioBtn" :class="refundType==1?'active':''">
-					</view>退货并退款</view>
-				<view style="margin-left: 30upx" class="flex" @tap="refundType=2">
-					<view class="flex-center radioBtn" :class="refundType==1?'':'active'">
-						</view>只退款</view>
+	<view class="refund-page">
+		<!-- 红色提示信息 - 待结账单 -->
+		<view class="warning-tip" v-if="!$util.isEmpty(unClear)" @click="goClear(unClear)">
+			<view class="warning-icon">⚠</view>
+			<view class="warning-content">
+				<text class="warning-text">有待结账单</text>
+				<text class="warning-amount">¥{{unClear.actPrice?parseFloat(unClear.actPrice):0}}</text>
 			</view>
+			<text class="warning-action">查看</text>
 		</view>
-		<view class="refund-item-list" v-if="refundType==1">
-			<view class="refund-label"><text></text>选择商品:</view>
-			<view>
-				<view class="list" v-for="(res,i) in product" :key="i">
-				<view class="flex list-title" >
-					<text class="product-name">{{res.name}}</text>
-					<text class="product-num">{{ `${parseFloat(res.xhNum)}` }}{{res.xhUnitName}}</text>
-					<text class="product-price">{{`${parseFloat(res.xhUnitPrice)}`}}元/{{res.xhUnitName}}</text>
-				</view>
-				<view class="flex list-val" style="font-size:26upx;font-weight:bold;">
-					<input type="number" placeholder="退货数" v-model="res.refundCount" placeholder-style="color:#CCCCCC" style="height:60upx;width:160upx;" />
-					<text style="margin-left:10upx;">{{res.xhUnitName}}</text>
-					<text style="color:green;margin-left:20upx;">可退{{Number(res.xhNum)-Number(res.refundNum)}}{{res.xhUnitName}}</text>
-				</view>
+
+		<!-- 退款方式选择卡片 -->
+		<view class="card-section">
+			<view class="section-title">
+				<text class="title-text">退款方式</text>
+			</view>
+			<view class="refund-type-buttons">
+				<button 
+					class="type-button" 
+					:class="refundType==1?'active':''" 
+					@tap="refundType=1">
+					退货并退款
+				</button>
+				<button 
+					class="type-button" 
+					:class="refundType==2?'active':''" 
+					@tap="refundType=2">
+					只退款
+				</button>
+			</view>
+		</view>
+
+		<!-- 商品选择卡片 -->
+		<view class="card-section" v-if="refundType==1">
+			<view class="section-title">
+				<text class="title-text">选择商品</text>
 			</view>
+			<view class="product-list">
+				<view class="product-row" v-for="(res,i) in product" :key="i">
+					<view class="product-basic-info">
+						<text class="product-name">{{res.name}}</text>
+						<view class="product-meta">
+							<text class="stock-info">{{parseFloat(res.xhNum)}}{{res.xhUnitName}} X ¥{{parseFloat(res.xhUnitPrice)}}</text>
+							<text class="available-info">可退 {{Number(res.xhNum)-Number(res.refundNum)}}{{res.xhUnitName}}</text>
+						</view>
+					</view>
+					<view class="refund-control">
+						<view class="input-item">
+							<input 
+								class="refund-input" 
+								type="number" 
+								placeholder="0" 
+								v-model="res.refundCount" 
+								placeholder-style="color:#ccc" />
+							<text class="unit-label">{{res.xhUnitName}}</text>
+						</view>
+					</view>
+				</view>
 			</view>
 		</view>
-		<view class="refund-item-list" v-if="Number(orderInfo.packCost)>0||Number(orderInfo.sendCost)>0">
-			<view class="refund-label"><text></text>其他可退:</view>
-			<view>
-				<view class="list" v-if="Number(orderInfo.packCost)>0">
-					<view class="flex list-title" >
-						<text class="product-name">打包费</text>
-						<text class="product-num">{{ orderInfo.packCost?parseFloat(orderInfo.packCost):0 }}元</text>
 
+		<!-- 其他可退卡片 -->
+		<view class="card-section" v-if="Number(orderInfo.packCost)>0||Number(orderInfo.sendCost)>0">
+			<view class="section-title">
+				<text class="title-text">其他可退</text>
+			</view>
+			<view class="other-fee-list">
+				<view class="fee-row" v-if="Number(orderInfo.packCost)>0">
+					<view class="fee-info">
+						<text class="fee-name">打包费</text>
+						<view>
+						<text class="fee-amount">{{ orderInfo.packCost?parseFloat(orderInfo.packCost):0 }}元</text>
+						<text class="available-fee">可退{{parseFloat((Number(orderInfo.packCost)-Number(orderInfo.refundPackCost)).toFixed(2))}}元</text>
+						</view>
 					</view>
-					<view class="flex list-val" style="font-size:26upx;font-weight:bold;">
-						<input type="digit" placeholder="金额" v-model="orderInfo.refundPackCostAmount" placeholder-style="color:#CCCCCC" />
-						<text style="margin-left:10upx;">元</text>
-						<text style="color:green;margin-left:20upx;">可退{{parseFloat((Number(orderInfo.packCost)-Number(orderInfo.refundPackCost)).toFixed(2))}}元</text>
+					<view class="fee-control">
+						<view class="input-item">
+							<input 
+								class="refund-input" 
+								type="digit" 
+								placeholder="0.00" 
+								v-model="orderInfo.refundPackCostAmount" 
+								placeholder-style="color:#ccc" />
+							<text class="unit-label">元</text>
+						</view>
 					</view>
 				</view>
-				<view class="list" v-if="Number(orderInfo.sendCost)>0">
-					<view class="flex list-title" >
-						<text class="product-name">运费</text>
-						<text class="product-num">{{ orderInfo.sendCost?parseFloat(orderInfo.sendCost):0 }}元</text>
+				<view class="fee-row" v-if="Number(orderInfo.sendCost)>0">
+					<view class="fee-info">
+						<text class="fee-name">运费</text>
+						<view>
+							<text class="fee-amount">{{ orderInfo.sendCost?parseFloat(orderInfo.sendCost):0 }}元</text>
+							<text class="available-fee">可退{{parseFloat((Number(orderInfo.sendCost)-Number(orderInfo.refundSendCost)).toFixed(2))}}元</text>
+						</view>
 					</view>
-					<view class="flex list-val" style="font-size:26upx;font-weight:bold;">
-						<input type="digit" placeholder="金额" v-model="orderInfo.refundSendCostAmount" placeholder-style="color:#CCCCCC" />
-						<text style="margin-left:10upx;">元</text>
-						<text style="color:green;margin-left:20upx;">可退{{parseFloat((Number(orderInfo.sendCost)-Number(orderInfo.refundSendCost)).toFixed(2))}}元</text>
+					<view class="fee-control">
+						<view class="input-item">
+							<input 
+								class="refund-input" 
+								type="digit" 
+								placeholder="0.00" 
+								v-model="orderInfo.refundSendCostAmount" 
+								placeholder-style="color:#ccc" />
+							<text class="unit-label">元</text>
+						</view>
 					</view>
 				</view>
 			</view>
 		</view>
-		<view class="flex refund-item">
-			<view class="refund-label">退款原因:</view>
-			<view class="flex list">
-				<view class="flex" @tap="cause=0" >
-					<view class="flex-center radioBtn" :class="cause==0? 'active' : ''">
-					</view>质量问题</view>
-				<view style="margin-left: 30upx" class="flex" @tap="cause=1">
-					<view class="flex-center radioBtn" :class="cause==1 ? 'active' : ''">
-				</view>多开错开</view></view>
-		</view>
-		<view class="flex refund-item">
-			<view class="refund-label">订单金额:</view>
-			<view class="list">
-				<block>¥{{orderInfo.orderPrice ? parseFloat(orderInfo.orderPrice):0}}</block>
-				<text style="margin-left:25upx;font-size:25upx;color:green;" v-if="Number(orderInfo.tkPrice)>0">已退¥{{orderInfo.tkPrice ? parseFloat(orderInfo.tkPrice) : 0}}</text>
+
+		<!-- 金额信息卡片 -->
+		<view class="card-section">
+			<view class="section-title">
+				<text class="title-text">金额信息</text>
+			</view>
+			<view class="amount-info">
+				<view class="amount-row">
+					<text class="amount-label">订单金额</text>
+					<view class="amount-value">
+						<text class="price-text">¥{{parseFloat(orderInfo.orderPrice)||0}}</text>
+					</view>
+				</view>
+				<view class="amount-row" v-if="Number(orderInfo.tkPrice)>0">
+					<text class="amount-label">已退金额</text>
+					<view class="amount-value">
+						<text class="refunded-text">¥{{orderInfo.tkPrice ? parseFloat(orderInfo.tkPrice) : 0}}</text>
+					</view>
+				</view>
+				<view class="amount-row">
+					<text class="amount-label">可退金额</text>
+					<text class="amount-value available-amount">¥{{couldRefundPrice}}</text>
+				</view>
+				<view class="amount-row">
+					<text class="amount-label">预计退款</text>
+					<text class="amount-value estimate-amount">¥{{refundPrice}}</text>
+				</view>
+				<view class="amount-row input-row">
+					<text class="amount-label required">实际退款</text>
+					<view class="amount-input-wrapper">
+						<text class="currency-symbol">¥</text>
+						<input 
+							class="amount-input" 
+							type="digit" 
+							v-model="refundMoney" 
+							placeholder="请输入"
+							placeholder-style="color:#999"
+							@focus="refundMoney=''" />
+					</view>
+				</view>
 			</view>
 		</view>
-		<view class="flex refund-item">
-			<view class="refund-label">可退金额:</view>
-			<view class="list">¥{{couldRefundPrice}}</view>
-		</view>
-		<view class="flex refund-item">
-			<view class="refund-label">预计退款:</view>
-			<view class="list">¥{{refundPrice}}</view>
-		</view>
-		<view class="flex refund-item">
-			<view class="refund-label"><text></text>实际退款:</view>
-			<input type="digit" v-model="refundMoney" @focus="refundMoney=''">
+
+		<!-- 退款原因卡片 -->
+		<view class="card-section">
+			<view class="section-title">
+				<text class="title-text">退款原因</text>
+			</view>
+			<view class="refund-reason-buttons">
+				<button 
+					class="reason-button" 
+					:class="cause==0?'active':''" 
+					@tap="cause=0">
+					质量问题
+				</button>
+				<button 
+					class="reason-button" 
+					:class="cause==1?'active':''" 
+					@tap="cause=1">
+					多开错开
+				</button>
+			</view>
 		</view>
-		<view class="refund-item">
-			<view class="refund-label">备注:</view>
-			<textarea v-model="remark" />
+
+		<!-- 备注卡片 -->
+		<view class="card-section">
+			<view class="section-title">
+				<text class="title-text">备注</text>
+			</view>
+			<view class="remark-container">
+				<textarea 
+					class="remark-textarea" 
+					v-model="remark" 
+					placeholder="选填"
+					placeholder-style="color:#999" />
+			</view>
 		</view>
-		<view style="padding:20upx 0 20upx 0;font-size:30upx;font-weight:bold;">
-			<text v-if="orderInfo.onlinePay == 2" style="color:green;">此单线上付款,提交后,钱会原路自动退回给客户</text>
+
+		<!-- 提示信息 -->
+		<view class="tip-section">
+			<text v-if="orderInfo.onlinePay == 2" class="tip-text online-tip">此单线上付款,提交后,钱会原路自动退回给客户</text>
 			<block v-else>
-				<text v-if="Number(orderInfo.debtPrice)>0" style="color:#3385ff;">
-				此单为欠款单,提交后,欠款金额会自动减少
-				</text>
-				<text v-else style="color:red;">此单线下付款,提交后钱不会原路退回,请线下转账给客户</text>
+				<text v-if="Number(orderInfo.debtPrice)>0" class="tip-text debt-tip">此单为欠款单,提交后,欠款金额会自动减少</text>
+				<text v-else class="tip-text offline-tip">此单线下付款,提交后钱不会原路退回,请线下转账给客户</text>
 			</block>
 		</view>
-		<view class="flex-center btn-box" style="margin-bottom:50upx;margin-top:20upx;padding-bottom:10upx;">
-			<view class="flex-center btn" @tap="cancelRefund">取消</view>
-			<view class="flex-center btn active" @tap="confirmRefund" style="margin-left: 80upx">确定</view>
-		</view>
 
-		<view style="font-size:32upx;z-index:9999;color:red;text-align:center;font-weight:bold;margin-bottom:30upx;" 
-		v-if="!$util.isEmpty(unClear)" @click="goClear(unClear)">
-			<text>有一个待结账单 ¥{{unClear.actPrice?parseFloat(unClear.actPrice):0}}</text>
-			<text style="font-weight:bold;margin-left:15upx;">查看</text>
+		<!-- 底部操作按钮 -->
+		<view class="bottom-actions">
+			<button class="action-btn cancel-btn" @tap="cancelRefund">取消</button>
+			<button class="action-btn confirm-btn" @tap="confirmRefund">确定</button>
 		</view>
 
 	</view>
@@ -297,115 +389,484 @@ export default {
 };
 </script>
 <style lang="scss" scoped>
-	.app-content{
-		height: calc(100vh - 30upx * 2);
-		padding: 30upx;
-		background: #FFFFFF;
+.refund-page {
+	min-height: 100vh;
+	background: #f5f6f8;
+	padding: 20upx 0 200upx;
+}
+
+// 红色提示样式
+.warning-tip {
+	background: #fff2f0;
+	border: 1upx solid #ffccc7;
+	border-radius: 12upx;
+	margin: 20upx 20upx 20upx 20upx;
+	padding: 20upx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	gap: 15upx;
+	
+	.warning-icon {
+		font-size: 40upx;
+		color: #ff4757;
+		font-weight: bold;
+		line-height: 1;
+		min-width: 50upx;
+	}
+	
+	.warning-content {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		gap: 8upx;
+	}
+	
+	.warning-text {
+		font-size: 28upx;
+		color: #ff4757;
+		font-weight: 600;
+	}
+	
+	.warning-amount {
+		font-size: 32upx;
+		color: #ff4757;
+		font-weight: bold;
+	}
+	
+	.warning-action {
+		font-size: 26upx;
+		color: #ff4757;
+		font-weight: 600;
+		background: rgba(255, 71, 87, 0.1);
+		padding: 10upx 20upx;
+		border-radius: 6upx;
+		min-width: 60upx;
+		text-align: center;
+	}
+}
+
+// 卡片样式
+.card-section {
+	background: #fff;
+	margin: 0 20upx 20upx;
+	border-radius: 16upx;
+	box-shadow: 0 2upx 12upx rgba(0, 0, 0, 0.08);
+	overflow: hidden;
+}
+
+// 节标题
+.section-title {
+	padding: 30upx 30upx 20upx;
+	border-bottom: 1upx solid #f0f0f0;
+	display: flex;
+	align-items: center;
+	
+	.title-text {
+		font-size: 32upx;
+		font-weight: 600;
+		color: #333;
+	}
+}
+
+// 退款方式按钮
+.refund-type-buttons {
+	padding: 30upx 30upx 20upx;
+	display: flex;
+	gap: 30upx;
+	
+	.type-button {
+		flex: 1;
+		height: 80upx;
+		border-radius: 12upx;
 		font-size: 30upx;
-		.radioBtn{
-			width: 30upx;
-			height: 30upx;
-			margin-right: 10upx;
-			border: 1upx solid #ddd;
-			border-radius: 50%;
-			&.active{
-				position: relative;
-				border: 1upx solid #3385ff;
-				&:after{
-					content: '';
-					position: absolute;
-					width: 18upx;
-					height: 18upx;
-					background: #3385ff;
-					border-radius: 50%;
-				}
-			}
+		font-weight: 500;
+		border: 1upx solid #ddd;
+		background: #f8f9fa;
+		color: #666;
+		transition: all 0.3s ease;
+		
+		&.active {
+			background: linear-gradient(135deg, #3385ff 0%, #2b74e6 100%);
+			color: #fff;
+			border: none;
+			box-shadow: 0 4upx 12upx rgba(51, 133, 255, 0.3);
 		}
-		.refund-item-list{
-			display: flex;
-			padding-bottom: 30upx;
-			padding-top: 30upx;
-			border-top: 1upx solid #e6e4e4;
-			border-bottom: 1upx solid #e6e4e4;
-			.refund-label{
-				width: 200upx;
-				color:#666666;
-				font-size:26upx;
-				text{color: red;}
-			}
-			.list{
-				margin-bottom:18upx;
-				border-bottom:1upx solid #CCCCCC;
-				padding-bottom:14upx;
-				.list-title{
-					height: 60upx;
-					padding-bottom: 20upx;
-					font-size:26upx;
-					font-weight:bold;
-					.product-name{
-						overflow: hidden;
-						text-overflow:ellipsis;
-						white-space: nowrap;
-						width:190upx;
-					}
-					.product-price{
-						overflow: hidden;
-						text-overflow:ellipsis;
-						white-space: nowrap;
-						width:130upx;
-						margin-left:10upx;
-					}
-					.product-num{
-						width:90upx;
-						overflow: hidden;
-						text-overflow:ellipsis;
-						white-space: nowrap;
-						margin-left:10upx;
-					}
-				}
-				.list-val{
-					input{
-						width: 200upx;
-						border: 1upx solid #ddd;
-						text-align: center;
-						font-weight: normal;
-					}
-				}
-			}
+		
+		&:active:not(.active) {
+			background: #eff5f8;
 		}
-		.refund-item{
+	}
+}
+
+// 商品列表
+.product-list {
+	margin-top: 15upx;
+	padding: 0 20upx 20upx;
+}
+
+.product-row {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 20upx;
+	margin-bottom: 8upx;
+	background: #fafbfc;
+	border-radius: 8upx;
+	border: 1upx solid #eef0f2;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+}
+
+.product-basic-info {
+	flex: 1;
+	margin-right: 20upx;
+	
+	.product-name {
+		font-size: 32upx;
+		font-weight: 600;
+		color: #333;
+		line-height: 1.3;
+		display: block;
+		margin-bottom: 8upx;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		width: 300upx;
+	}
+	
+	.product-meta {
+		display: flex;
+		gap: 12upx;
+		flex-wrap: wrap;
+		
+		.stock-info {
+			font-size: 26upx;
+			color: #666;
+			background: #f5f5f5;
+			padding: 4upx 8upx;
+			border-radius: 4upx;
+		}
+		
+		.available-info {
+			font-size: 26upx;
+			color: #3385ff;
+			background: rgba(51, 133, 255, 0.1);
+			padding: 4upx 8upx;
+			border-radius: 4upx;
+		}
+	}
+}
+
+.refund-control {
+	display: flex;
+	align-items: center;
+	gap: 8upx;
+	
+	.input-item {
+		display: flex;
+		align-items: center;
+		gap: 8upx;
+	}
+}
+
+.refund-input {
+	width: 100upx;
+	height: 60upx;
+	background: #fff;
+	border: 1upx solid #ddd;
+	border-radius: 6upx;
+	text-align: center;
+	font-size: 26upx;
+	color: #333;
+	font-weight: 500;
+	
+	&:focus {
+		border-color: #3385ff;
+	}
+}
+
+.unit-label {
+	font-size: 24upx;
+	color: #666;
+	min-width: 40upx;
+}
+
+// 其他可退列表
+.other-fee-list {
+	padding: 20upx;
+}
+
+.fee-row {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 16upx;
+	margin-bottom: 12upx;
+	background: #fafbfc;
+	border-radius: 8upx;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+	
+	.fee-info {
+		display: flex;
+		flex-direction: column;
+		gap: 8upx;
+		
+		.fee-name {
+			font-size: 28upx;
+			font-weight: 600;
+			color: #333;
+		}
+		
+		.fee-amount {
+			font-size: 26upx;
+			color: #666;
+		}
+		.available-fee {
+			font-size: 26upx;
+			color: #3385ff;
+			margin-left:15upx;
+		}
+	}
+	
+	.fee-control {
+		display: flex;
+		flex-direction: column;
+		align-items: flex-start;
+		gap: 8upx;
+		
+		.input-item {
 			display: flex;
-			padding: 18upx 0;
-			.refund-label{
-				width: 200upx;
-				color:#666666;
-				font-size:26upx;
-				text{
-					color: red;
-				}
-			}
-			input{
-				border: 1upx solid #ddd;
-			}
-			textarea{
-				width: calc(100% - 210upx);
-				height:150upx;
-				border: 1upx solid #ddd;
-			}
+			align-items: center;
+			gap: 8upx;
 		}
-		.btn-box{
-			.btn{
-				width: 220upx;
-				height: 90upx;
-				border: 1upx solid #666666;
-				border-radius: 10upx;
-				color:#666666;
-				&.active{
-					background: #3385ff;
-					color: #fff;
-					border: 1upx solid #3385ff;
-				}
-			}
+		
+	}
+}
+
+// 金额信息
+.amount-info {
+	padding: 30upx;
+}
+
+.amount-row {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	padding: 20upx 0;
+	border-bottom: 1upx solid #f0f0f0;
+	
+	&:last-child {
+		border-bottom: none;
+	}
+	
+	&.input-row {
+		align-items: flex-start;
+		padding-top: 30upx;
+	}
+	
+	.amount-label {
+		font-size: 28upx;
+		color: #666;
+		
+		&.required::after {
+			content: "*";
+			color: #ff4757;
+			margin-left: 5upx;
+		}
+	}
+	
+	.amount-value {
+		display: flex;
+		align-items: center;
+		
+		.price-text {
+			font-size: 32upx;
+			font-weight: 600;
+			color: #333;
+		}
+		
+		.refunded-text {
+			font-size: 32upx;
+			font-weight: 600;
+			color: #999;
+		}
+		
+		&.available-amount {
+			font-size: 32upx;
+			font-weight: 600;
+			color: #3385ff;
+		}
+		
+		&.estimate-amount {
+			font-size: 32upx;
+			font-weight: 600;
+			color: #3385ff;
+		}
+	}
+}
+
+.amount-input-wrapper {
+	display: flex;
+	align-items: center;
+	background: #fafbfc;
+	border: 1upx solid #ddd;
+	border-radius: 8upx;
+	padding: 0 20upx;
+	width: 200upx;
+	height: 80upx;
+	
+	.currency-symbol {
+		font-size: 28upx;
+		color: #666;
+		margin-right: 10upx;
+	}
+	
+	.amount-input {
+		flex: 1;
+		height: 80upx;
+		font-size: 28upx;
+		color: #333;
+		font-weight: 500;
+		border: none;
+		background: transparent;
+	}
+}
+
+// 退款原因按钮
+.refund-reason-buttons {
+	padding: 30upx 30upx 20upx;
+	display: flex;
+	gap: 30upx;
+	
+	.reason-button {
+		flex: 1;
+		height: 80upx;
+		border-radius: 12upx;
+		font-size: 30upx;
+		font-weight: 500;
+		border: 1upx solid #ddd;
+		background: #f8f9fa;
+		color: #666;
+		transition: all 0.3s ease;
+		
+		&.active {
+			background: #3385ff;
+			color: #e3f2fd;
+			border: 1upx solid #498ff8;
+		}
+		
+		&:active:not(.active) {
+			background: #eff5f8;
+		}
+	}
+}
+
+// 备注输入框
+.remark-container {
+	padding: 20upx 30upx 30upx;
+}
+
+.remark-textarea {
+	width: 100%;
+	height: 120upx;
+	background: #fafbfc;
+	border: 1upx solid #ddd;
+	border-radius: 8upx;
+	padding: 15upx;
+	font-size: 28upx;
+	color: #333;
+	line-height: 1.2;
+	box-sizing: border-box;
+	resize: none;
+}
+
+// 提示信息
+.tip-section {
+	margin: 20upx;
+	padding: 20upx;
+	border-radius: 12upx;
+	
+	.tip-text {
+		display: block;
+		font-size: 32upx;
+		line-height: 1.5;
+		font-weight: 600;
+		
+		&.online-tip {
+			background: rgba(51, 133, 255, 0.1);
+			color: #3385ff;
+			padding: 15upx;
+			border-radius: 8upx;
+			border-left: 4upx solid #3385ff;
+		}
+		
+		&.debt-tip {
+			background: rgba(51, 133, 255, 0.1);
+			color: #3385ff;
+			padding: 15upx;
+			border-radius: 8upx;
+			border-left: 4upx solid #3385ff;
+		}
+		
+		&.offline-tip {
+			background: rgba(255, 71, 87, 0.1);
+			color: #ff4757;
+			padding: 15upx;
+			border-radius: 8upx;
+			border-left: 4upx solid #ff4757;
+		}
+	}
+}
+
+// 底部操作按钮
+.bottom-actions {
+	z-index: 39;
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background: #fff;
+	padding: 30upx;
+	border-top: 1upx solid #eee;
+	display: flex;
+	gap: 30upx;
+	box-shadow: 0 -4upx 12upx rgba(0, 0, 0, 0.1);
+}
+
+.action-btn {
+	flex: 1;
+	height: 88upx;
+	border-radius: 12upx;
+	font-size: 32upx;
+	font-weight: 600;
+	border: none;
+	transition: all 0.3s ease;
+	
+	&.cancel-btn {
+		background: #f8f9fa;
+		color: #666;
+		border: 1upx solid #ddd;
+		
+		&:active {
+			background: #e9ecef;
+		}
+	}
+	
+	&.confirm-btn {
+		background: linear-gradient(135deg, #3385ff 0%, #2b74e6 100%);
+		color: #fff;
+		box-shadow: 0 4upx 12upx rgba(51, 133, 255, 0.3);
+		
+		&:active {
+			transform: translateY(2upx);
+			box-shadow: 0 2upx 8upx rgba(51, 133, 255, 0.3);
 		}
 	}
+}
 </style>

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

@@ -28,7 +28,7 @@
       </block>
     </view>
 
-		<modal-module :show="wastageShow" @click="confirmWastage" :maskClosable="true" title="减少数量" padding="30rpx 30rpx" >
+		<modal-module :show="wastageShow" @click="confirmWastage" :maskClosable="true" title="报损数量" padding="30rpx 30rpx" >
 		<template v-slot:content>
 			<div class="app-modal-input-wrap">
 			<div class="inp-list-line">
@@ -40,7 +40,7 @@
 		</template>
 		</modal-module>
 
-		<modal-module :show="reduceShow" @click="confirmReduce" :maskClosable="true" title="报损数量" padding="30rpx 30rpx" >
+		<modal-module :show="reduceShow" @click="confirmReduce" :maskClosable="true" title="减少数量" padding="30rpx 30rpx" >
       <template v-slot:content>
         <div class="app-modal-input-wrap">
         <div class="inp-list-line">

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

@@ -335,9 +335,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
ghsApp/src/pagesPurchase/add.vue

@@ -362,9 +362,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 32upx;
+		font-weight:bold;
+		color: #0f6cd6;
 	}
 	.select-view {
 		margin-bottom: 30upx;

+ 2 - 2
ghsApp/src/pagesPurchase/bookProduct.vue

@@ -796,9 +796,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 20 - 11
ghsApp/src/pagesPurchase/components/pageSuccess.vue

@@ -10,11 +10,19 @@
 				<view class="pre-save-price" v-if="info.hasSavePrice && info.hasSavePrice == 1">预存价格已导入</view>
 
 				<template>
-					<view style="width:670upx;overflow:hidden;padding-left:50upx;">
+					<view style="width:690upx;overflow:hidden;padding-left:30upx;">
 						<view class="flex title" v-if="info.status == 3"> 入库前请确认售价: </view>
 						<view class="flex title" v-else> 确认售价: </view>
 						<view class="flex title">
-							<text style="font-size:22upx;font-weight:normal;color:green;">花材名称 / 进货价 / 成本价 / 旧批发价 / 入库数 / 原库存</text>
+							<text style="font-size:24upx;font-weight:normal;color:#CCCCCC;">
+								<text style="color:black;font-weight:bold;margin:0 3upx 0 0;">花材名称</text>/
+								<text style="color:red;font-weight:normal;margin:0 3upx 0 3upx;">进价</text>/
+								<text style="color:black;font-weight:normal;margin:0 3upx 0 3upx;">本次成本</text>/
+								<text style="color:#3385FF;font-weight:normal;margin:0 3upx 0 3upx;">平均成本</text>/
+								<text style="color:#CCCCCC;margin:0 3upx 0 3upx;">旧批发价</text>/
+								<text style="color:#CCCCCC;margin:0 3upx 0 3upx;">入库数</text>/
+								<text style="color:#CCCCCC;margin:0 0upx 0 3upx;">原库存</text>
+							</text>
 						</view>
 
 						<view v-for="(res,i) in flowersList" :key="i">
@@ -23,12 +31,13 @@
 									<view style="margin-bottom:6upx;">
 										<text class="name" @click="pageTo({url:'/admin/item/detail?id='+ res.productId})">
 											{{res.name?res.name.substr(0,11):''}}
-											<text style="color:red;margin-left:13upx;font-weight:normal;font-size:26upx;">¥{{res.bigPrice?parseFloat(res.bigPrice):0}}</text>
-											<text style="color:red;margin-left:13upx;font-weight:normal;font-size:26upx;">¥{{res.cost?parseFloat(res.cost):0}}</text>
-											<text style="color:#CCCCCC;margin-left:13upx;font-weight:normal;font-size:26upx;">旧¥{{res.beforeModifyPrice?parseFloat(res.beforeModifyPrice):0}}</text>
-											<text style="color:#CCCCCC;margin-left:13upx;font-weight:normal;font-size:26upx;">{{res.itemNum?parseFloat(res.itemNum):0}}{{res.bigUnit}}</text>
-											<text style="color:#CCCCCC;margin-left:13upx;font-weight:normal;font-size:26upx;">{{res.beforeModifyStock?parseFloat(res.beforeModifyStock):0}}{{res.bigUnit}}</text>
-											<text style="color:green;margin-left:13upx;font-weight:normal;">...</text>
+											<text style="color:red;margin-left:9upx;font-weight:normal;font-size:26upx;">¥{{res.bigPrice?parseFloat(res.bigPrice):0}}</text>
+											<text style="color:black;margin-left:9upx;font-size:26upx;font-weight:normal;">¥{{res.currentCost?parseFloat(res.currentCost):0}}</text>
+											<text style="color:#3385FF;margin-left:9upx;font-weight:normal;font-size:26upx;">¥{{res.cost?parseFloat(res.cost):0}}</text>
+											<text style="color:#CCCCCC;margin-left:9upx;font-weight:normal;font-size:26upx;">旧¥{{res.beforeModifyPrice?parseFloat(res.beforeModifyPrice):0}}</text>
+											<text style="color:#CCCCCC;margin-left:9upx;font-weight:normal;font-size:26upx;">{{res.itemNum?parseFloat(res.itemNum):0}}{{res.bigUnit}}</text>
+											<text style="color:#CCCCCC;margin-left:9upx;font-weight:normal;font-size:26upx;">{{res.beforeModifyStock?parseFloat(res.beforeModifyStock):0}}{{res.bigUnit}}</text>
+											<text style="color:green;margin-left:9upx;font-weight:normal;">...</text>
 										</text>
 									</view>
 									<view>
@@ -182,7 +191,7 @@ export default {
 		confirmIn(){
 			let that = this
 			that.$util.confirmModal({content:'确认只入库不改价?'},() => {
-				uni.showLoading({mask:true})
+				uni.showLoading()
 				confirmPutIn({id:that.option.id}).then(res=>{
 					uni.hideLoading()
 					if(res.code == 1){
@@ -235,7 +244,7 @@ export default {
 				let newProduct = this.flowersList.map((ele) => {
 					return {id:ele.id,savePrice:ele.suggestPrice,saveSkPrice:ele.suggestSkPrice,saveHjPrice:ele.suggestHjPrice}
 				})
-				uni.showLoading({mask:true})
+				uni.showLoading()
 				saveCgPrice({data:JSON.stringify(newProduct),cgId:targetId}).then(res => {
 					uni.hideLoading()
 					if(res.code == 1){
@@ -289,7 +298,7 @@ export default {
 			let newProduct = this.flowersList.map((ele) => {
 				return {id:ele.productId,price:ele.suggestPrice,skPrice:ele.suggestSkPrice,hjPrice:ele.suggestHjPrice}
 			})
-			uni.showLoading({mask:false})
+			uni.showLoading()
 			batchChangePrice({data:JSON.stringify(newProduct),changeType:'cg',targetId:targetId,appVersion:1}).then(res => {
 				uni.hideLoading()
 				if(res.code == 1){

+ 2 - 2
ghsApp/src/pagesStorehouse/allot/exSelect.vue

@@ -248,9 +248,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/pagesStorehouse/inventory/select.vue

@@ -284,9 +284,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 2 - 2
ghsApp/src/pagesStorehouse/inventory/select2.vue

@@ -270,9 +270,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 64 - 17
ghsApp/src/pagesStorehouse/stockWarn/detailed.vue

@@ -1,22 +1,35 @@
 <template>
 <view class="app-content">
 	<view class="ex-page">
-		<view class="top-bar">
+		<!-- 固定顶部栏 -->
+		<view class="top-bar fixed">
 			 <DateSelect class="bar" top="0" @selectDateFn="selectDateFn" defaultShowName='选日期' /> 
 		</view>
+		
+		<!-- 固定的表头和按钮区域 -->
+		<view class="fixed-header-wrapper">
+			<view style="width:100%;">
+				<t-table :headerBackgroundColor="'#F0F2F6'">
+				<t-tr header>
+					<t-th><view style="width:130upx;color:#333333;font-size:30upx;font-weight:bold;">时间</view></t-th>
+					<t-th><view style="width:120upx;color:#333333;font-size:30upx;font-weight:bold;">名称</view></t-th>
+					<t-th><view style="width:190upx;color:#333333;font-size:30upx;font-weight:bold;">事项</view></t-th>
+					<t-th><view style="color:#333333;font-size:30upx;font-weight:bold;">变动</view></t-th>
+					<t-th><view style="color:#333333;font-size:30upx;font-weight:bold;">剩余</view></t-th>
+				</t-tr>
+				</t-table>
+			</view>
+			<view style="margin:20upx 0 0 70upx;background-color:#F0F2F6;padding-bottom:15upx;">
+				<button class="admin-button-com" :class="[hideCost==0?'blue':'']" style="margin-right:20upx;" @click="hideCost=0">开启成本</button>
+				<button class="admin-button-com" :class="[hideCost==1?'blue':'']" @click="hideCost=1">关闭成本</button>
+			</view>
+		</view>
+		
+		<!-- 滚动内容区域 -->
 		<scroll-view scroll-y scroll-with-animation class="main-view">
 			<view class="space-view ex-table">
 				<block v-if="!$util.isEmpty(list.data)">
 					<t-table :headerBackgroundColor="'#F0F2F6'">
-						<view style="width:100%;">
-						<t-tr header>
-							<t-th><view style="width:130upx;color:#333333;font-size:30upx;font-weight:bold;">时间</view></t-th>
-							<t-th><view style="width:120upx;color:#333333;font-size:30upx;font-weight:bold;">名称</view></t-th>
-							<t-th><view style="width:190upx;color:#333333;font-size:30upx;font-weight:bold;">事项</view></t-th>
-							<t-th><view style="color:#333333;font-size:30upx;font-weight:bold;">变动</view></t-th>
-							<t-th><view style="color:#333333;font-size:30upx;font-weight:bold;">剩余</view></t-th>
-						</t-tr>
-						</view>
 						<view style="margin-top:20upx;">
 							<view v-for="(item, index) in list.data" :key="index">
 								<t-tr>
@@ -55,10 +68,10 @@
 									<td>
 										<view style="color:#9c9595;margin-left:50upx;">
 											<view v-if="!$util.isEmpty(item.remark)" style="color:red;">{{ item.remark }}</view>
-											<view v-if="Number(item.avCost)>0"> 
+											<view v-if="Number(item.avCost)>0 && hideCost ==0"> 
 												<text v-if="item.io == 1">+成本</text><text v-else>-成本</text>¥{{ item.unitCost?parseFloat(item.unitCost):0 }}x{{ item.itemNum?parseFloat(item.itemNum):0 }}=¥{{ item.changeCost?parseFloat(item.changeCost):0 }}
-												累计成本 ¥{{item.totalCost?parseFloat(item.totalCost):0}} 
-												<view>累计数量 {{item.totalStock?parseFloat(item.totalStock):0}} 平均成本 <text style="margin-left:8upx;">{{ item.avCost?parseFloat(item.avCost):0 }}</text></view>
+												当前成本 ¥{{item.totalCost?parseFloat(item.totalCost):0}} 
+												<view>当前数量 {{item.totalStock?parseFloat(item.totalStock):0}} 平均成本 <text style="margin-left:8upx;">{{ item.avCost?parseFloat(item.avCost):0 }}</text></view>
 											</view>
 										</view>
 									</td>
@@ -93,7 +106,8 @@ export default {
 		return {
 			searchTime:'',
 			startTime: "",
-			endTime: ""
+			endTime: "",
+			hideCost:0
 		};
 	},
 	onPullDownRefresh() {
@@ -160,11 +174,23 @@ export default {
 	height: 100%;
 	display: flex;
 	flex-direction: column;
+	position: relative;
+	
 	.top-bar {
-		margin-bottom:30px;
 		display: flex;
 		width: 100%;
-		z-index: 20;
+		z-index: 100;
+		background-color: white;
+		margin-bottom:0;
+		height:60upx;
+		// 微信小程序和 APP 中的固定定位
+		&.fixed {
+			position: fixed;
+			top: 0;
+			left: 0;
+			right: 0;
+		}
+		
 		.bar{
 			width: 50%;
 			height: 100%;
@@ -174,10 +200,31 @@ export default {
 			}
 		}
 	}
+	
+	// 固定的表头和按钮区域
+	.fixed-header-wrapper {
+		position: fixed;
+		top: 60upx;
+		left: 0;
+		right: 0;
+		z-index: 99;
+		background-color: #F0F2F6;
+		width: 100%;
+		
+		// #ifdef MP-WEIXIN
+		// 微信小程序特殊处理
+		// #endif
+		
+		// #ifdef APP-PLUS
+		// App 特殊处理
+		// #endif
+	}
+	
 	.main-view {
-		/*margin-top: 80upx;*/
 		flex: 1;
 		background-color: #f9fbfc;
+		margin-top: 200upx;
+		
 		.space-view {
 			background-color: #fff;
 		}

+ 2 - 2
ghsApp/src/pagesStorehouse/stockWarn/manage.vue

@@ -192,9 +192,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
+		font-size: 30upx;
 		font-weight: 600;
-		color: #666666;
+		color: #3385FF;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 16 - 2
ghsPad/src/mixins/product.js

@@ -321,9 +321,23 @@ export default {
 					this.customData.property = 0
 					this.$refs.selectNumPriceRef.open('center')
 				}
+			}else if (code.indexOf('#') == 0){
+				//成品
+				const res = await getBySn({sn:code})
+				if(res.code == 1){
+					current = res.data
+					if(this.$util.isEmpty(current)){
+						return false
+					}
+					unitName = '份'
+					unitPrice = Number(res.data.price)
+					this.customData = current
+					this.customData.currentNum = 1
+					this.customData.unitPrice = unitPrice
+					this.customData.property = 0
+					this.$refs.selectNumPriceRef.open('center')
+				}
 			}else{
-				console.log('---000---')
-				console.log(this.globalAllProduct)
 				//花材
 				current = this.globalAllProduct.find(function(val){
 					return Number(val.itemId) == Number(code)

+ 3 - 3
hdApp/src/admin/billing/customerPlace.vue

@@ -374,9 +374,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/billing/goods.vue

@@ -404,9 +404,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/billing/hs.vue

@@ -285,9 +285,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/billing/index.vue

@@ -274,9 +274,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/billing/index2.vue

@@ -330,9 +330,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 4
hdApp/src/admin/billing/priceChange.vue

@@ -135,10 +135,10 @@ export default {
     }
   }
   .item_list_title {
-    margin-bottom: 20upx;
-    font-size: 24upx;
-    font-weight: 600;
-    color: #666666;
+		margin-bottom: 20upx;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
   }
   .select-cmd_bx {
     & .kc {

+ 3 - 3
hdApp/src/admin/billing/train.vue

@@ -447,9 +447,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/breakage/index.vue

@@ -241,9 +241,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 1 - 1
hdApp/src/admin/cg/item.vue

@@ -4,7 +4,7 @@
     <view class="img_box" style="margin-top:30upx;">
       <image :src="flowerUrl" mode="heightFix" class="img_url"></image>
     </view>
-    <view style="margin:20upx auto 20upx auto;width:50vw;font-size:35upx;font-weight:bold;text-align:center;">绿植花材</view>
+    <view style="margin:20upx auto 20upx auto;width:50vw;font-size:35upx;font-weight:bold;text-align:center;">花材</view>
     <div class="confirm-btn" style="margin-top:60upx;">
       <button class="admin-button-com big blue" style="width:60vw;" @click="downloadImg(flowerUrl)">保存图片</button>
     </div>

+ 1 - 1
hdApp/src/admin/cg/mall.vue

@@ -5,7 +5,7 @@
       <image :src="goodsUrl" mode="heightFix" class="img_url"></image>
     </view>
 
-    <view style="margin:20upx auto 20upx auto;width:50vw;font-size:35upx;font-weight:bold;text-align:center;">花束花篮</view>
+    <view style="margin:20upx auto 20upx auto;width:50vw;font-size:35upx;font-weight:bold;text-align:center;">绿植花束</view>
 
     <view class="confirm-btn" style="margin-top:60upx;">
       <button class="admin-button-com big blue" style="width:60vw;" @click="downloadImg(goodsUrl)">保存图片</button>

+ 3 - 3
hdApp/src/admin/changePrice/list.vue

@@ -296,9 +296,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/changePrice/list2.vue

@@ -345,9 +345,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 5 - 5
hdApp/src/admin/goods/add.vue

@@ -47,8 +47,8 @@
         <tui-list-cell class="line-cell" :hover="false">
           <view class="tui-title">价格类型</view>
           <view class="btn-group">
-            <button class="admin-button-com middle" :class="[form.priceType === '0' ? '' : 'default']" @click="setPriceType('0')">无价</button>
-            <button class="admin-button-com middle" :class="[form.priceType === '1' ? '' : 'default']" @click="setPriceType('1')">有价</button>
+            <button class="admin-button-com middle" :class="[form.priceType === '1' ? '' : 'default']" @click="setPriceType('1')">有价格</button>
+            <button class="admin-button-com middle" :class="[form.priceType === '0' ? '' : 'default']" @click="setPriceType('0')">无价格</button>
           </view>
         </tui-list-cell>
 
@@ -96,8 +96,8 @@
         <tui-list-cell class="line-cell" :hover="false">
           <view class="tui-title">运费</view>
           <view class="btn-group">
-            <button class="admin-button-com middle" :class="[form.freightType === '0' ? '' : 'default']" @click="freightChange({detail:{value:'0'}})">不包运费</button>
             <button class="admin-button-com middle" :class="[form.freightType === '1' ? '' : 'default']" @click="freightChange({detail:{value:'1'}})">包运费</button>
+            <button class="admin-button-com middle" :class="[form.freightType === '0' ? '' : 'default']" @click="freightChange({detail:{value:'0'}})">不包运费</button>
           </view>
         </tui-list-cell>
 
@@ -151,13 +151,13 @@ export default {
         sold: "",
         stock: 0,
         stockSet: '0', // 默认库存充足
-        priceType: '0', // 默认没价格
+        priceType: '1',
         flowerNum: 0,
         weight: 1,
         catIds: [],
         autoRise: "1",
         needSend: "0",
-        freightType: "0",
+        freightType: "1",
         shopImg: [],
         briefContent: "",
         status: 1,

+ 65 - 11
hdApp/src/admin/goods/category.vue

@@ -18,8 +18,8 @@
               </view>
               <view class="info-details">
                 <text class="detail-text">序号: {{ item.inTurn }}</text>
-                <text class="detail-text status-text" :class="{ 'active': item.status == 1 }">
-                  {{ item.status == 1 ? '显示' : '隐藏' }}
+                <text class="detail-text status-text active">
+                  {{ item.flower == 0 ? '鲜花' : item.flower ==1?'绿植':'仿真花' }}
                 </text>
               </view>
             </view>
@@ -72,7 +72,7 @@
       :maskClosable="false"
       @cancel="modalCancel"
       @click="modifyModalClick"
-      width="90%"
+      width="96%"
       :title="modifyTitle + '分类'"
       padding="40rpx"
     >
@@ -97,7 +97,7 @@
 
           <view class="form-group">
             <view class="form-label">
-              <text class="label-text">排序权重</text>
+              <text class="label-text">排序</text>
             </view>
             <view class="form-input">
               <input
@@ -126,6 +126,22 @@
               </text>
             </view>
           </view>
+
+          <view class="form-group">
+            <view class="form-label">
+              <text class="label-text">类型</text>
+            </view>
+            <radio-group @change="modifyForm.flower = $event.detail.value" class="form-radio-group">
+              <label class="radio-label" v-for="item in flowerTypes" :key="item.value">
+                <radio 
+                  :value="item.value" 
+                  :checked="modifyForm.flower == item.value"
+                  color="#52c41a"
+                />
+                <text class="radio-text">{{ item.label }}</text>
+              </label>
+            </radio-group>
+          </view>
         </view>
       </template>
     </modal-module>
@@ -155,13 +171,19 @@ export default {
         categoryId: 0,
         categoryName: '',
         inTurn: '',
-        status: 1
+        status: 1,
+        flower: 0
       },
       delModal: false,
       operateData: {},
       operateIndex: null,
       operateTop: 0,
-      catDisabled: false
+      catDisabled: false,
+      flowerTypes: [
+        { label: '鲜花', value: 0 },
+        { label: '绿植', value: 1 },
+        { label: '仿真花', value: 2 }
+      ]
     }
   },
   computed: {},
@@ -191,7 +213,7 @@ export default {
     edit(item) {
       this.modifyModal = true;
       this.modifyTitle = '编辑';
-      this.modifyForm = { categoryId: item.id, categoryName: item.categoryName, inTurn: item.inTurn, status: item.status };
+      this.modifyForm = { categoryId: item.id, categoryName: item.categoryName, inTurn: item.inTurn, status: item.status, flower: item.flower };
       this.catDisabled = true;
     },
     addCategoryFn() {
@@ -201,7 +223,7 @@ export default {
       this.catDisabled = false;
     },
     resetForm() {
-      this.modifyForm = { categoryId: 0, categoryName: '', inTurn: '', status: 1 }
+      this.modifyForm = { categoryId: 0, categoryName: '', inTurn: '', status: 1, flower: 0 }
     },
     async init() {
       this._list();
@@ -394,7 +416,7 @@ export default {
             font-weight: 500;
             
             &.active {
-              color: #34C759;
+              color: #383a39;
             }
             
             &:not(.active) {
@@ -459,8 +481,7 @@ export default {
   padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); // 适配刘海屏
   border-top: 1rpx solid #e5e5e5;
   box-shadow: 0 -2rpx 8rpx rgba(0, 0, 0, 0.06);
-  z-index: 1000;
-  
+  z-index: 2;
   .add-category-btn {
     width: 100%;
     background: #52c41a;
@@ -558,6 +579,39 @@ export default {
         }
       }
     }
+
+    .form-radio-group {
+      display: flex;
+      flex-direction: row;
+      gap: 20rpx;
+      justify-content: space-between;
+      
+      .radio-label {
+        display: flex;
+        align-items: center;
+        flex: 1;
+        padding: 12rpx 16rpx;
+        border: 1rpx solid #e0e0e0;
+        border-radius: 8rpx;
+        background: #fff;
+        transition: all 0.2s ease;
+        justify-content: center;
+        
+        &:active {
+          background: #f5f5f5;
+        }
+        
+        radio {
+          margin-right: 8rpx;
+        }
+        
+        .radio-text {
+          font-size: 28rpx;
+          color: #333;
+          font-weight: 500;
+        }
+      }
+    }
   }
 }
 

+ 8 - 13
hdApp/src/admin/goods/categorySort.vue

@@ -11,7 +11,7 @@
               transition: isDragging ? 'none' : 'transform 0.3s ease',
               zIndex: draggedIndex === index ? 999 : 1
             }"
-            @click="navigateToGoodsSort(item.id)"
+            @click="navigateToGoodsSort(item)"
           >
             <view class="list-img">
               <image :src="item.img" mode="aspectFit"></image>
@@ -45,7 +45,7 @@
             -->
 
             <view class="confirm-btn">
-              <button class="admin-button-com middle blue" style="position:absolute;top:50rpx;right: 10rpx">排序</button>
+              <button class="admin-button-com middle blue" style="position:absolute;top:50rpx;right: 10rpx">开始排序</button>
             </view>
           </view>
         </block>
@@ -85,13 +85,13 @@ export default {
   },
   onPullDownRefresh() {
     this.resetList();
-    this._list().then(() => {
+    this.getCategoryList().then(() => {
       uni.stopPullDownRefresh();
     });
   },
   onReachBottom() {
     if (!this.list.finished) {
-      this._list().then(() => {
+      this.getCategoryList().then(() => {
         uni.stopPullDownRefresh();
       });
     } else {
@@ -100,23 +100,18 @@ export default {
   },
   methods: {
     // 跳转到商品排序页面
-    navigateToGoodsSort(categoryId) {
-      uni.navigateTo({
-        url: '/admin/goods/goodsSort?id=' + categoryId
-      });
+    navigateToGoodsSort(item) {
+      uni.navigateTo({ url: '/admin/goods/goodsSort?id=' + item.id+"&name="+item.categoryName })
     },
-
     async init() {
-      this._list();
+      this.getCategoryList();
     },
-
-    _list() {
+    getCategoryList() {
       return categoryListInfo().then((res) => {
         let data = { code: res.code, msg: res.msg, data: { list: res.data } };
         this.completes(data);
       });
     },
-
     // 拖拽相关方法
     transformStyle(index) {
       if (index === this.draggedIndex) {

+ 20 - 77
hdApp/src/admin/goods/detail.vue

@@ -1,12 +1,5 @@
 <template>
   <view class="app-content">
-    <!-- 加载状态 -->
-    <!-- <view v-if="loading" class="loading-overlay">
-      <view class="loading-content">
-        <view class="loading-spinner"></view>
-        <text class="loading-text">加载中...</text>
-      </view>
-    </view> -->
     
     <form @submit="formSubmit">
       <view class="module-com input-line-wrap">
@@ -58,8 +51,9 @@
         <tui-list-cell class="line-cell" :hover="false">
           <view class="tui-title">价格类型</view>
           <view class="btn-group">
-            <button class="admin-button-com middle" :class="[form.priceType === '0' ? '' : 'default']" @click="setPriceType('0')">无价</button>
-            <button class="admin-button-com middle" :class="[form.priceType === '1' ? '' : 'default']" @click="setPriceType('1')">有价</button>
+            <button class="admin-button-com middle" :class="[form.priceType === '1' ? '' : 'default']" @click="setPriceType('1')">有价格</button>
+            <button class="admin-button-com middle" :class="[form.priceType === '0' ? '' : 'default']" @click="setPriceType('0')">无价格</button>
+            <text v-if="sn && Number(sn)>0" style="margin-left:10upx;font-size:50upx;color:#CCCCCC;font-weight: normal;">#{{ sn }}</text>
           </view>
         </tui-list-cell>
 
@@ -113,8 +107,8 @@
         <tui-list-cell class="line-cell" :hover="false">
           <view class="tui-title">运费</view>
           <view class="btn-group">
-            <button class="admin-button-com middle" :class="[form.freightType === '0' ? '' : 'default']" @click="freightChange({detail:{value:'0'}})">不包运费</button>
             <button class="admin-button-com middle" :class="[form.freightType === '1' ? '' : 'default']" @click="freightChange({detail:{value:'1'}})">包运费</button>
+            <button class="admin-button-com middle" :class="[form.freightType === '0' ? '' : 'default']" @click="freightChange({detail:{value:'0'}})">不包运费</button>
           </view>
         </tui-list-cell>
 
@@ -137,8 +131,8 @@
       </view>
 
       <view class="app-footer">
-        <button class="admin-button-com middle default" @click="goBack" :disabled="loading">取消</button>
-        <button class="admin-button-com middle blue" formType="submit" :disabled="loading">{{ loading ? '保存中...' : '保存' }}</button>
+        <button class="admin-button-com middle default" @click="goBack">取消</button>
+        <button class="admin-button-com middle blue" formType="submit">保存</button>
       </view>
 
     </form>
@@ -148,7 +142,7 @@
 import TuiListCell from "@/components/plugin/list-cell";
 const form = require("@/utils/formValidation.js");
 import { getClass } from "@/api/category";
-import { getGoodsDetail, updateGoodsData } from "@/api/goods";
+import { getGoodsDetail, updateGoodsData,createSn } from "@/api/goods";
 import { delImages } from "@/api/pic-text";
 //图片上传插件来源:https://ext.dcloud.net.cn/plugin?id=2922 已改造,不能再升级 shish 20211228
 import htzImageUpload from '@/components/htz-image-upload/htz-image-upload.vue'
@@ -167,19 +161,17 @@ export default {
       currentImgData: [],
       // 收集待删除的小图URL,提交时批量删除
       delImgQueue: [],
-      loading: false, // 添加加载状态
-
       form: {
         id:0,
         name: "",
         price: "",
         sold: "",
-        priceType: "1", // 默认有价格
+        priceType: "1",
         stockSet: "0", // 默认库存充足
         categoryIdList: [],
         autoRise: "1",
         needSend: "0",
-        freightType: "0",
+        freightType: "1",
         shopImg: [],
         status: "1",
         flower:1,
@@ -190,7 +182,8 @@ export default {
         shortCover: ""
       },
       categoryData:[],
-      categoryIds:[]
+      categoryIds:[],
+      sn:0
     };
   },
   onLoad() {
@@ -315,7 +308,7 @@ export default {
       this.form.needSend = e;
     },
     getDetail() {
-      this.loading = true;
+      let that = this
       return getGoodsDetail({ id: this.option.id }) .then(res => {
         if (this.$util.isEmpty(res.data)) {
           this.$msg('商品信息不存在');
@@ -371,23 +364,17 @@ export default {
               }
             }
           }
-        }).catch(err => {
-          console.error('获取分类失败:', err);
-          this.$msg('获取分类信息失败');
-        }).finally(() => {
-          this.loading = false;
         })
-      }).catch(err => {
-        console.error('获取商品详情失败:', err);
-        this.$msg('获取商品信息失败');
-        this.loading = false;
+
+        //如果没有商品编号,生成商品编号
+        this.sn = res.data.sn?res.data.sn:0
+        if(Number(this.sn)<=0){
+          createSn({id:that.option.id})
+        }
+
       })
     },
     formSubmit(e) {
-      // 防止重复提交
-      if (this.loading) {
-        return;
-      }
       
       let rules = [
         {
@@ -491,7 +478,6 @@ export default {
         return false
       }
 
-      this.loading = true;
       let form = JSON.parse(JSON.stringify(this.form))
       // 修复封面处理逻辑
       if (this.form.shopImg.length > 0) {
@@ -565,12 +551,7 @@ export default {
         }
         
         uni.navigateBack({})
-      }).catch(err => {
-        console.error('保存商品失败:', err);
-        this.$msg('保存失败,请重试');
-      }).finally(() => {
-        this.loading = false;
-      });
+      })
     },
     selCategoryFn(item) {
       let index = this.form.categoryIdList.findIndex(e => e == item.id);
@@ -631,44 +612,6 @@ export default {
   padding-bottom: 100upx;
 }
 
-/* 加载状态样式 */
-.loading-overlay {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background-color: rgba(0, 0, 0, 0.5);
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  z-index: 999999;
-}
-
-.loading-content {
-  background-color: #fff;
-  border-radius: 20upx;
-  padding: 40upx;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-}
-
-.loading-spinner {
-  width: 60upx;
-  height: 60upx;
-  border: 4upx solid #f3f3f3;
-  border-top: 4upx solid #09C567;
-  border-radius: 50%;
-  animation: spin 1s linear infinite;
-  margin-bottom: 20upx;
-}
-
-.loading-text {
-  font-size: 28upx;
-  color: #666;
-}
-
 @keyframes spin {
   0% { transform: rotate(0deg); }
   100% { transform: rotate(360deg); }

+ 53 - 26
hdApp/src/admin/goods/goodsSort.vue

@@ -27,12 +27,12 @@
             </view>
 
             <view class="list-det" style="position: absolute; bottom: 15upx; left: 122upx">
-              <view v-if="item.priceType == 1" class="app-size-28 app-color-0" style="font-size: 24upx">¥{{ item.price?parseFloat(item.price):0 }}</view>
-              <view v-else>--</view>
+              <view v-if="item.priceType == 1" class="app-size-28 app-color-0" style="font-size:30upx;color:red;font-weight:bold;">¥{{ item.price?parseFloat(item.price):0 }}</view>
+              <view v-else></view>
             </view>
             <view
               v-if="index > 0"
-              style="right: 375upx"
+              style="right: 375upx; top: 87upx"
               class="move-btn move-btn-top"
               :class="{ disabled: isOperating }"
               @click.stop="topFn(item.id)"
@@ -43,7 +43,7 @@
 
             <view
               v-if="index < list.data.length - 1"
-              style="right: 290upx"
+              style="right: 290upx; top: 87upx"
               class="move-btn move-btn-bottom"
               :class="{ disabled: isOperating }"
               @click.stop="bottomFn(item.id)"
@@ -52,11 +52,11 @@
               <zui-svg-icon icon="general-bottom-line" color="#fff" :width="22" :height="22" style="margin-top: 10upx" />
             </view>
 
-            <text style="right: 205upx" class="move-btn move-btn-up" :class="{ disabled: isOperating }" @click.stop="upFn(item.id)" title="上移一位"
+            <text style="right: 205upx; top: 87upx" class="move-btn move-btn-up" :class="{ disabled: isOperating }" @click.stop="upFn(item.id)" title="上移一位"
               >↑</text
             >
             <text
-              style="right: 120upx"
+              style="right: 120upx; top: 87upx"
               class="move-btn move-btn-down"
               :class="{ disabled: isOperating }"
               @click.stop="downFn(item.id)"
@@ -65,7 +65,6 @@
             >
 
             <view
-              style="position: absolute; top: 50upx; right: 14upx; cursor: move"
               class="drag-handle"
               :data-index="index"
               :data-id="item.id"
@@ -73,7 +72,8 @@
               @touchmove="dragMove"
               @touchend="dragEnd"
             >
-              <text style="color: #666666; font-size: 48upx; padding: 8upx 6upx; line-height: 1">≡</text>
+              <text class="drag-tip">按住</text>
+              <text class="drag-tip">拖拽</text>
             </view>
           </view>
         </block>
@@ -117,7 +117,7 @@ export default {
   },
   onPullDownRefresh() {
     this.resetList();
-    this._list()
+    this.getGoodsList()
       .then((res) => {
         uni.stopPullDownRefresh();
       })
@@ -128,7 +128,7 @@ export default {
   },
   onReachBottom() {
     if (!this.list.finished) {
-      this._list().then((res) => {
+      this.getGoodsList().then((res) => {
         uni.stopPullDownRefresh();
       });
     } else {
@@ -141,9 +141,14 @@ export default {
       if (!Array.isArray(this.list.data)) {
         this.list.data = [];
       }
-      this._list();
+      this.getGoodsList();
+
+      if(this.option.name){
+        uni.setNavigationBarTitle({ title: this.option.name+" 排序" })
+      }
+
     },
-    _list() {
+    getGoodsList() {
       // 传递分类ID参数和分页参数到API
       const params = {
         cId: this.option.id,
@@ -291,7 +296,7 @@ export default {
       sort({ cId: this.option.id, items: sortData })
         .then((res) => {
           if (res.code === 1) {
-            this.$msg('已更新');
+
           } else {
             this.$msg('排序更新失败');
             // 恢复原始顺序
@@ -608,7 +613,7 @@ export default {
 }
 .move-btn {
   position: absolute;
-  top: 60upx;
+  top: 88upx;
   display: inline-flex;
   align-items: center;
   justify-content: center;
@@ -750,24 +755,46 @@ export default {
 }
 
 .drag-handle {
+  position: absolute;
+  top: 75upx;
+  right: 12upx;
   display: flex;
+  flex-direction: column;
   align-items: center;
   justify-content: center;
-  width: 80upx;
-  height: 75upx;
-  border-radius: 12upx;
-  background-color: rgba(0, 0, 0, 0.03);
-  transition: all 0.2s ease;
-  -webkit-touch-callout: none; /* 禁用长按菜单 */
-  -webkit-user-select: none; /* 禁用文本选择 */
+  width: 76upx;
+  height: 76upx;
+  border-radius: 50%;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  box-shadow: 0 4upx 16upx rgba(102, 126, 234, 0.4);
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
   user-select: none;
-  touch-action: none; /* 禁用浏览器默认触摸行为 */
+  touch-action: none;
+  border: 2px solid rgba(255, 255, 255, 0.3);
+  transition: all 0.2s ease;
+  cursor: grab;
 
-  /* 增加触摸反馈 */
   &:active {
-    transform: scale(1.1);
-    background-color: rgba(0, 122, 255, 0.1);
-    box-shadow: 0 4upx 16upx rgba(0, 122, 255, 0.2);
+    transform: scale(0.92);
+    cursor: grabbing;
+    box-shadow: 0 2upx 10upx rgba(102, 126, 234, 0.5);
+  }
+
+  &:hover {
+    transform: translateY(-3upx);
+    box-shadow: 0 6upx 20upx rgba(102, 126, 234, 0.45);
+  }
+
+  .drag-tip {
+    font-size: 19upx;
+    color: rgba(255, 255, 255, 0.95);
+    font-weight: 700;
+    letter-spacing: 0.5upx;
+    line-height: 1.4;
+    text-align: center;
+    word-break: break-word;
+    display: block;
   }
 }
 

+ 263 - 73
hdApp/src/admin/goods/list.vue

@@ -5,35 +5,34 @@
       <view class="modern-tabs">
         <view class="modern-tab" :class="{ 'active': priceType === -1 }" @click="switchPriceTab(-1)" >
           <view class="tab-content">
-            <text class="tab-icon">📋</text>
             <text class="tab-text">全部</text>
           </view>
         </view>
-        <view class="modern-tab" :class="{ 'active': priceType === 0 }" @click="switchPriceTab(0)" >
+        <view class="modern-tab" :class="{ 'active': priceType === 1 }" @click="switchPriceTab(1)" >
           <view class="tab-content">
-            <text class="tab-icon">🏷️</text>
-            <text class="tab-text">无价</text>
+            <text class="tab-text">有价</text>
           </view>
         </view>
-        <view class="modern-tab" :class="{ 'active': priceType === 1 }" @click="switchPriceTab(1)" >
+        <view class="modern-tab" :class="{ 'active': priceType === 0 }" @click="switchPriceTab(0)" >
           <view class="tab-content">
-            <text class="tab-icon">💰</text>
-            <text class="tab-text">有价</text>
+            <text class="tab-text">无价</text>
           </view>
         </view>
       </view>
     </view>
 
-		<view class="input-wrap" >
+		<view class="input-wrap">
+      <view>
+        <button class="admin-button-com middle " :class="[searchType == 0 ? 'blue' : 'default']" style="width:100upx;margin-right:7upx;" @click="changeSearchType(0)">名称</button>
+        <button class="admin-button-com middle " :class="[searchType == 1 ? 'blue' : 'default']" style="width:100upx;margin-right:7upx;" @click="changeSearchType(1)">编号</button>
+      </view>
 			<view class="search-bar">
-				<app-search-module v-model="searchText" placeholder="输入名称" @input="searchFn" />
+				<app-search-module v-model="searchText" placeholder="输入" @input="searchFn" />
 			</view>
-			<view style="padding-left:10upx; display:flex; flex-wrap:nowrap;" class="button-group">
-        <button class="admin-button-com middle blue filter-btn" style="margin-right:10upx; width:150upx;" @click.stop="openFilterPanel">
-          筛选
-          <text v-if="hasActiveFilters" class="filter-dot"></text>
-        </button>
-        <button class="admin-button-com middle blue" style="width:150upx;" @click="addGoods()">新增</button>
+			<view>
+        <button class="admin-button-com middle blue" style="margin-right:7upx;margin-left:7upx;width:100upx;" @click="openFilterPanel">筛选</button>
+        <button class="admin-button-com middle blue" style="margin-right:7upx;width:100upx;" @click="rank">排序</button>
+        <button class="admin-button-com middle blue" style="width:100upx;" @click="addGoods()">新增</button>
 			</view>
 		</view>
     <view class="app-middle">
@@ -77,6 +76,7 @@
                     </view>
                     <view class="operate-wrap">
                       <view style="font-size:23upx;">
+                        <text v-if="Number(goodsItem.sn)>0" style="color:#078c4a;font-weight:bold;margin-right:15upx;font-size:25upx;">#{{ goodsItem.sn }}</text>
                         <text>库存</text> <text style="font-weight:bold;margin-left:8upx;">{{goodsItem.stock}}</text>
                         <text style="margin-left:18upx;color:#CCCCCC;">已售 {{ goodsItem.actualSold }}</text>
                       </view>
@@ -84,7 +84,7 @@
                   </view>
                 </view>
                 <view class="goods-list-bottom flex-center-between">
-                  <text @click.stop="moreToDo(goodsItem)">更多</text>
+                  <text @click.stop="printLabel(goodsItem)">打标签</text>
                   <text @click.stop="getStockChange(goodsItem)">库存明细</text>
                   <text @click.stop="editDesc(goodsItem)">编辑简介</text>
                 </view>
@@ -147,6 +147,40 @@
       </view>
     </view>
 
+    <!-- 打标签弹框 -->
+    <view v-if="showPrintModal" class="print-modal-overlay" @click="closePrintModal">
+      <view class="print-modal-content" @click.stop>
+        <view class="print-modal-header">
+          <text class="print-modal-title">打印标签</text>
+          <text class="print-modal-close" @click="closePrintModal">×</text>
+        </view>
+        
+        <view class="print-modal-body">
+          <view class="print-modal-item">
+            <text class="print-modal-label">商品名称:</text>
+            <text class="print-modal-value">{{ currentPrintItem.name }}</text>
+          </view>
+          
+          <view class="print-modal-item">
+            <text class="print-modal-label">打印数量:</text>
+            <input 
+              v-model.number="printQuantity" 
+              type="number" 
+              class="print-modal-input" 
+              placeholder="请输入打印数量"
+              min="1"
+              @focus="clearInput"
+            />
+          </view>
+        </view>
+        
+        <view class="print-modal-footer">
+          <button class="print-modal-btn cancel-btn" @click="closePrintModal">取消</button>
+          <button class="print-modal-btn confirm-btn" @click="confirmPrint">打印</button>
+        </view>
+      </view>
+    </view>
+
   </view>
 </template>
 <script>
@@ -167,8 +201,10 @@ export default {
       currentTab: 0,
       scrollTop: 0,
       catId: "",
+      catName:"",
       flowerNum:0,
       searchText:'',
+      searchType:0,
       lastSearchText:'', // 上次的搜索内容
       searchTimer: null, // 搜索防抖定时器
       riseData: {}, // 价格上涨配置
@@ -176,10 +212,14 @@ export default {
       priceType:-1,// 0 没价,1 有价 
       // 新增筛选相关数据
       showFilterPanel: false,
+      // 打标签弹框相关数据
+      showPrintModal: false,
+      currentPrintItem: {},
+      printQuantity: '',
       // 价格筛选已移至顶部标签页
       stockOptions: [
         { label: '有库存', value: 1 },
-        { label: '无库存', value: 0 }
+        { label: '库存', value: 0 }
       ],
       flowerNumOptions: [
         { label: '6支', value: 6 },
@@ -223,7 +263,11 @@ export default {
     init(){
       this.getCategoryData()
     },
-    
+    rank(){
+      if(Number(this.catId)>0){
+        this.$util.pageTo({url: "/admin/goods/goodsSort?id="+this.catId+"&name="+this.catName})
+      }
+    },
     // 新的筛选相关方法
     openFilterPanel() {
       this.showFilterPanel = true;
@@ -272,25 +316,41 @@ export default {
       this.getGoodsList();
     },
 
-    // 保留原有方法以保持兼容性(暂时保留)
-		// 兼容保留:旧筛选弹窗相关方法已不再使用
-		moreToDo(item){
-			let that=this;
-			let doList = ['打1个标签', '打2个标签','打5个标签', '打10个标签']
-			let doNum = [1,2,5,10,20]
-			uni.showActionSheet({
-				itemList: doList,
-				success: function (respond) {
-					let index = respond.tapIndex
-          let currentNum = Number(doNum[index])
-          print({id:item.id,num:currentNum}).then(res=>{
-            if(res.code == 1){
-              that.$msg(res.msg)
-            }
-          })
-				}
-			})
-		},
+    // 打标签弹框相关方法
+    printLabel(item){
+      this.currentPrintItem = item;
+      this.printQuantity = '';
+      this.showPrintModal = true;
+    },
+
+    closePrintModal(){
+      this.showPrintModal = false;
+      this.currentPrintItem = {};
+      this.printQuantity = '';
+    },
+
+    confirmPrint(){
+      if (!this.printQuantity || this.printQuantity <= 0) {
+        this.$msg('请输入有效的打印数量');
+        return;
+      }
+      
+      let that = this;
+      print({id: this.currentPrintItem.id, num: this.printQuantity}).then(res => {
+        if(res.code == 1){
+          that.$msg(res.msg);
+          that.closePrintModal();
+        } else {
+          that.$msg(res.msg || '打印失败');
+        }
+      }).catch(err => {
+        that.$msg('打印请求失败');
+      });
+    },
+
+    clearInput(){
+      this.printQuantity = '';
+    },
     getStockChange(item){
       this.$util.pageTo({url: "/admin/goods/stockChange?id="+item.id+'&name='+item.name})
     },
@@ -313,14 +373,19 @@ export default {
         this.$util.pageTo({ url: "/admin/goods/detail", query: { id: id } })
     },
     getCategoryData() {
-      categoryListInfo({flower:1}).then(res => {
+      categoryListInfo().then(res => {
         this.tabbar = res.data;
         if(this.tabbar && this.tabbar[0] && this.tabbar[0].id){
           this.catId = this.tabbar[0].id
+          this.catName = this.tabbar[0].categoryName
           this.getGoodsList()
         }
       })
     },
+    changeSearchType(i){
+      this.searchType=i
+      this.searchFn()
+    },
     searchFn(){
       // 清除之前的定时器
       if (this.searchTimer) {
@@ -351,6 +416,7 @@ export default {
         this.searchTimer = setTimeout(() => {
           this.lastSearchText = this.searchText;
           this.catId = 0
+          this.catName = ""
           this.currentTab = 0
           this.resetList()
           this.getGoodsList()
@@ -358,7 +424,7 @@ export default {
       }
     },
     getGoodsList() {
-      return getCategoryToGoods({page: this.list.page,searchText:this.lastSearchText,catId:this.catId, flowerNum:this.flowerNum, priceType:this.priceType, hasStock:this.hasStock,requestType:'goodsList'}).then(res => {
+      return getCategoryToGoods({page: this.list.page,searchText:this.lastSearchText,searchType:this.searchType,catId:this.catId, flowerNum:this.flowerNum, priceType:this.priceType, hasStock:this.hasStock,requestType:'goodsList'}).then(res => {
         this.completes(res)
       })
     },
@@ -369,6 +435,7 @@ export default {
       } else {
         this.currentTab = cur;
         this.catId = item.id;
+        this.catName = item.categoryName
         this.resetList();
         this.getGoodsList();
       }
@@ -403,13 +470,13 @@ export default {
 .modern-tab {
   flex: 1;
   text-align: center;
-  padding: 16upx 0;
+  padding: 22upx 0;
   position: relative;
   transition: all 0.35s cubic-bezier(0.25, 1, 0.5, 1);
   border-radius: 12upx;
   margin: 0 2upx;
-  background-color: #fafafa; /* 未选中态背景 */
-  border: 2upx solid #f2f4f7; /* 未选中态边框 */
+  background-color: #e4e6e9; /* 未选中态背景 */
+  border: 2upx solid #e4e6e9; /* 未选中态边框 */
   box-shadow: none;
   
   .tab-content {
@@ -419,22 +486,10 @@ export default {
     justify-content: center;
   }
   
-  .tab-icon {
-    font-size: 32upx;
-    margin-bottom: 4upx;
-    display: block;
-    opacity: 0.85; /* 未选中态图标降低对比 */
-  }
-  
-  &.active .tab-icon {
-    filter: brightness(1.15);
-    opacity: 1;
-  }
-  
   .tab-text {
-    font-size: 26upx;
+    font-size: 30upx;
     color: #666;
-    font-weight: 600;
+    font-weight: 700;
   }
   
   &.active {
@@ -446,7 +501,7 @@ export default {
     .tab-text {
       color: #ffffff;
       font-weight: 700;
-      font-size: 28upx;
+      font-size: 30upx;
     }
   }
   
@@ -627,25 +682,10 @@ page {
 }
 .input-wrap {
 		display: flex;
-		padding: 10upx 20upx 22upx 13upx;
+		padding: 10upx 10upx 12upx 13upx;
 		.search-bar {
 			flex: 1;
 		}
-	}
-
-/* 筛选按钮样式 */
-.filter-btn {
-  position: relative;
-  .filter-dot {
-    position: absolute;
-    top: 5upx;
-    right: 5upx;
-    width: 15upx;
-    height: 15upx;
-    background-color: white;
-    border-radius: 50%;
-    animation: filterDotBlink 2s infinite;
-  }
 }
 
 @keyframes filterDotBlink {
@@ -765,4 +805,154 @@ page {
     color: #fff;
   }
 }
+
+/* 打标签弹框样式 */
+.print-modal-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+  z-index: 10000;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.print-modal-content {
+  background-color: #fff;
+  border-radius: 20upx;
+  width: 80%;
+  max-width: 600upx;
+  animation: scaleIn 0.3s ease-out;
+  box-shadow: 0 8upx 24upx rgba(0, 0, 0, 0.15);
+}
+
+@keyframes scaleIn {
+  from {
+    opacity: 0;
+    transform: scale(0.8);
+  }
+  to {
+    opacity: 1;
+    transform: scale(1);
+  }
+}
+
+.print-modal-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 24upx 24upx;
+  border-bottom: 1upx solid #f0f0f0;
+}
+
+.print-modal-title {
+  font-size: 32upx;
+  font-weight: 600;
+  color: #333;
+}
+
+.print-modal-close {
+  font-size: 40upx;
+  color: #999;
+  font-weight: 300;
+  line-height: 1;
+  cursor: pointer;
+  transition: color 0.3s ease;
+  
+  &:active {
+    color: #333;
+  }
+}
+
+.print-modal-body {
+  padding: 30upx 24upx;
+}
+
+.print-modal-item {
+  display: flex;
+  align-items: center;
+  margin-bottom: 24upx;
+  
+  &:last-child {
+    margin-bottom: 0;
+  }
+}
+
+.print-modal-label {
+  font-size: 28upx;
+  color: #666;
+  font-weight: 500;
+  min-width: 140upx;
+}
+
+.print-modal-value {
+  font-size: 28upx;
+  color: #333;
+  flex: 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.print-modal-input {
+  flex: 1;
+  padding: 0;
+  height: 80upx;
+  border: 2upx solid #e0e0e0;
+  border-radius: 8upx;
+  font-size: 36upx;
+  color: #333;
+  background-color: #fafafa;
+  transition: border-color 0.3s ease;
+  text-align: center;
+  line-height: 80upx;
+  
+  &::placeholder {
+    text-align: center;
+    color: #ccc;
+  }
+  
+  &:focus {
+    border-color: #09C567;
+    background-color: #fff;
+  }
+}
+
+.print-modal-footer {
+  display: flex;
+  gap: 16upx;
+  padding: 24upx 24upx;
+  border-top: 1upx solid #f0f0f0;
+}
+
+.print-modal-btn {
+  flex: 1;
+  padding: 16upx 0;
+  border-radius: 12upx;
+  font-size: 28upx;
+  border: none;
+  font-weight: 600;
+  transition: all 0.3s ease;
+  
+  &.cancel-btn {
+    background-color: #f5f5f5;
+    color: #666;
+    
+    &:active {
+      background-color: #e8e8e8;
+    }
+  }
+  
+  &.confirm-btn {
+    background-color: #09C567;
+    color: #fff;
+    
+    &:active {
+      background-color: #07A850;
+    }
+  }
+}
 </style>

+ 3 - 3
hdApp/src/admin/goods/selectItem.vue

@@ -219,9 +219,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 4 - 5
hdApp/src/admin/home/apply.vue

@@ -30,17 +30,16 @@ export default {
     return {
       menuList: [
         {
-            title:'花束',
+            title:'绿植花束',
             list:[
                 { name: "列表", img: `${this.$constant.hostUrl}/image/ghs/home/hcgl2.png`, url: "/admin/goods/list",pf:1},
                 { name: "分类", img: `${this.$constant.hostUrl}/image/ghs/home/hcgl2.png`, url: "/admin/goods/category",pf:1},
                 { name: "排序", img: `${this.$constant.hostUrl}/image/ghs/home/hcgl2.png`, url: "/admin/goods/categorySort",pf:1},
-                { name: "涨价设置", img: `${this.$constant.hostUrl}/image/ghs/home/gj2.png`, url: "/admin/goods/price-increase",pf:1},
-                { name: "新建任务", img: `${this.$constant.hostUrl}/image/ghs/home/hcgl2.png`, url: "/admin/order/workOrder",pf:1},
+                { name: "涨价设置", img: `${this.$constant.hostUrl}/image/ghs/home/gj2.png`, url: "/admin/goods/price-increase",pf:1}
             ]
         },
         {
-            title:'绿植花材',
+            title:'花材',
             list:[
                 {name: "列表",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl2.png`,url: "/admin/item/list2",pf:1},
                 {name: "分类",img: `${this.$constant.hostUrl}/image/ghs/home/hcgl2.png`,url: "/admin/itemClass/list",pf:1},
@@ -50,7 +49,7 @@ export default {
                 { name: "库存预警", img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs2.png`, url: "/pagesStorehouse/stockWarn/manage",pf:1},
                 { name: "买花", img: `${this.$constant.hostUrl}/image/ghs/home/icon_ghs2.png`, url: "/pagesPurchase/order",pf:1},
                 { name: "买花记录", img: `${this.$constant.hostUrl}/image/ghs/home/icon_caigou2.png`, url: "/pagesPurchase/shopping",pf:1},
-                { name: "损", img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs2.png`, url: "/admin/breakage/list",pf:1},
+                { name: "损", img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs2.png`, url: "/admin/breakage/list",pf:1},
                 { name: "拆散", img: `${this.$constant.hostUrl}/image/ghs/home/kcyjs2.png`, url: "/admin/part/list",pf:1}
             ]
         },

+ 107 - 17
hdApp/src/admin/home/workbench.vue

@@ -91,22 +91,33 @@
         </view>
       </view>
 
-      <view style="text-align: center;font-size:42upx;font-weight:bold;color:red;margin-bottom:30upx;margin-top:10upx;" @click="setMemberLevel" v-if="shopInfo.memberLevelSet == 0">
-        请设置会员等级
-        <text style="color:#3385ff;text-decoration: underline;margin-left:10upx;">去设置</text>
+      <!-- 警告提示区域 -->
+      <view v-if="shopInfo.memberLevelSet == 0" class="alert-card alert-card-warning" @click="setMemberLevel">
+        <view class="alert-content">
+          <view class="alert-title">请设置会员等级</view>
+          <view class="alert-action">去设置</view>
+        </view>
+      </view>
+
+      <view v-if="shopInfo.rechargeWeal == 0" class="alert-card alert-card-warning" @click="setRecharge">
+        <view class="alert-content">
+          <view class="alert-title">请设置充值规则</view>
+          <view class="alert-action">去设置</view>
+        </view>
       </view>
-      <view style="text-align: center;font-size:42upx;font-weight:bold;color:red;margin-bottom:30upx;margin-top:10upx;" @click="setRecharge" v-if="shopInfo.rechargeWeal == 0">
-        请设置充值规则
-        <text style="color:#3385ff;text-decoration: underline;margin-left:10upx;">去设置</text>
+
+      <view v-if="!$util.isEmpty(data.warning)" class="alert-card alert-card-error">
+        <view class="alert-content">
+          <view class="alert-text">{{ data.warning }}</view>
+        </view>
       </view>
-      <view v-if="!$util.isEmpty(data.warning)" style="background-color: #fff2f0; color: #ff4d4f; font-size: 36upx; font-weight: bold; text-align: center; margin: 0 -30upx 15upx -30upx; padding: 20upx 30upx; border-left: 4upx solid #ff4d4f;">{{ data.warning }}</view>
 
       <view class="module-com flower-module">
         <!-- 花束 -->
         <view class="flower-section">
           <view class="section-header">
             <view class="header-line"></view>
-            <view class="header-title">花束花篮</view>
+            <view class="header-title">绿植花束</view>
             <view class="header-line"></view>
           </view>
           <view class="icon-grid">
@@ -144,28 +155,28 @@
               <view class="icon-wrapper">
                 <image class="icon-image" :src="`${constant.hostUrl}/image/ghs/home/hcgl2.png`" mode="aspectFit"></image>
               </view>
-              <view class="icon-text">花束排序</view>
+              <view class="icon-text">排序</view>
             </view>
             <view class="icon-item" @click="goPage({url: '/admin/goods/list'})">
               <view class="icon-wrapper">
                 <image class="icon-image" :src="`${constant.hostUrl}/image/ghs/home/hcgl2.png`" mode="aspectFit"></image>
               </view>
-              <view class="icon-text">花束</view>
+              <view class="icon-text">绿植花束</view>
             </view>
             <view class="icon-item" @click="goPage({url: '/admin/goods/add'})">
               <view class="icon-wrapper">
                 <image class="icon-image" :src="`${constant.hostUrl}/image/ghs/home/hcgl2.png`" mode="aspectFit"></image>
               </view>
-              <view class="icon-text">添加花束</view>
+              <view class="icon-text">新增</view>
             </view>
           </view>
         </view>
 
-        <!-- 绿植花材 -->
+        <!-- 花材 -->
         <view class="flower-section">
           <view class="section-header">
             <view class="header-line"></view>
-            <view class="header-title">绿植花材</view>
+            <view class="header-title">花材</view>
             <view class="header-line"></view>
           </view>
           <view class="icon-grid">
@@ -203,7 +214,7 @@
               <view class="icon-wrapper">
                 <image class="icon-image" :src="`${constant.hostUrl}/image/ghs/home/hcgl2.png`" mode="aspectFit"></image>
               </view>
-              <view class="icon-text">绿植花材</view>
+              <view class="icon-text">花材</view>
             </view>
             <view class="icon-item" @click="goPage({url: '/pagesPurchase/shopping'})">
               <view class="icon-wrapper">
@@ -221,7 +232,7 @@
               <view class="icon-wrapper">
                 <image class="icon-image" :src="`${constant.hostUrl}/image/ghs/home/kcyjs2.png`" mode="aspectFit"></image>
               </view>
-              <view class="icon-text">损</view>
+              <view class="icon-text">损</view>
             </view>
             <view class="icon-item" @click="goPage({url: '/admin/itemClass/list'})">
               <view class="icon-wrapper">
@@ -888,7 +899,7 @@ export default {
               clearLogin().then(res=>{
                 if(res.code == 1){
                   uni.clearStorage()
-                  that.$store.commit("setLoginInfo", {})
+                  that.$store.commit("setLoginInfo", {})
                   uni.reLaunch({url:'/admin/home/workbench'})
                 }
               })
@@ -1157,7 +1168,7 @@ export default {
   padding-bottom: 10upx;
 }
 .module-com {
-  margin-bottom: 20upx;
+  margin-bottom: 37upx;
   background-color: #fff;
 }
 
@@ -1948,4 +1959,83 @@ export default {
   border-radius: 26upx;
   display: inline-block;
 }
+
+// 警告提示区域样式
+.alert-card {
+  margin: 15upx 10upx;
+  border-radius: 16upx;
+  overflow: hidden;
+  box-shadow: 0 4upx 12upx rgba(0, 0, 0, 0.08);
+  transition: all 0.3s ease;
+  border: 3upx solid;
+  
+  &:active {
+    transform: translateY(2upx);
+    box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.06);
+  }
+  
+  .alert-content {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 30upx 24upx;
+    min-height: 100upx;
+    
+    .alert-title {
+      font-size: 38upx;
+      font-weight: 600;
+      flex: 1;
+      line-height: 1.4;
+    }
+    
+    .alert-action {
+      font-size: 32upx;
+      font-weight: 600;
+      white-space: nowrap;
+      margin-left: 20upx;
+      padding: 12upx 24upx;
+      border-radius: 8upx;
+      transition: all 0.2s ease;
+      
+      &:active {
+        background-color: rgba(255, 255, 255, 0.6);
+      }
+    }
+    
+    .alert-text {
+      font-size: 36upx;
+      font-weight: 600;
+      line-height: 1.6;
+      text-align: center;
+      width: 100%;
+    }
+  }
+}
+
+.alert-card-warning {
+  background: #fffbf0;
+  border-color: #fffbf0;
+  
+  .alert-content {
+    .alert-title {
+      color: #d48806;
+    }
+    
+    .alert-action {
+      color: #ffa940;
+      border: 2upx solid #ffa940;
+    }
+  }
+}
+
+.alert-card-error {
+  background: linear-gradient(135deg, #fff2f0 0%, #fff7f5 100%);
+  border-color: #fff7f5;
+  
+  .alert-content {
+    .alert-text {
+      color: #d9363e;
+    }
+  }
+}
 </style>

+ 0 - 8
hdApp/src/admin/item/add.vue

@@ -168,13 +168,6 @@
           <input v-model="form.inTurn" placeholder-class="phcolor" class="tui-input" name="inTurn" @focus="form.inTurn=''" placeholder="请填写数字" type="number" />
         </tui-list-cell>
 
-        <tui-list-cell class="line-cell" :hover="false">
-          <view class="tui-title">拆散单价</view>
-          <input v-model="form.smallRatio" @focus="form.smallRatio=''" placeholder-class="phcolor" class="tui-input" name="smallRatio" placeholder="请填写" maxlength="50" 
-          type="number" style="width:160upx;border:1upx solid #cccccc;text-align:center;" />
-          <text style="margin-left:12upx;" v-if="Number(form.ratio)>0">X ¥{{parseFloat((Number(form.price)/Number(form.ratio)).toFixed(2))}} = ¥{{parseFloat((Number(form.smallRatio)*((Number(form.price)/Number(form.ratio)).toFixed(2))).toFixed(2))}}</text>
-        </tui-list-cell>
-
       </view>
 
       <view class="app-footer">
@@ -260,7 +253,6 @@ export default {
         stockWarning:5,
         status:2,
         itemId:0,
-        smallRatio:1,
         ratioType:0,
         inTurn:100,
         cpInfo:[]

+ 0 - 23
hdApp/src/admin/item/detail.vue

@@ -237,13 +237,6 @@
             <input v-model="form.inTurn" placeholder-class="phcolor" class="tui-input" name="inTurn" @focus="form.inTurn=''" placeholder="请填写数字" type="number" />
           </tui-list-cell>
 
-          <tui-list-cell class="line-cell" :hover="false">
-            <view class="tui-title">拆散单价</view>
-            <input v-model="form.smallRatio" @focus="form.smallRatio=''" placeholder-class="phcolor" class="tui-input" name="smallRatio" placeholder="填写数值" 
-            type="number" style="width:160upx;border:1upx solid #cccccc;text-align:center;" />
-            <text style="margin-left:12upx;" v-if="Number(form.ratio)>0">X ¥{{parseFloat((Number(form.price)/Number(form.ratio)).toFixed(2))}} = ¥{{parseFloat((Number(form.smallRatio)*((Number(form.price)/Number(form.ratio)).toFixed(2))).toFixed(2))}}</text>
-          </tui-list-cell>
-
           <tui-list-cell class="line-cell" :hover="false">
             <view class="tui-title">商城端隐藏</view>
             <view class="switch_bx">
@@ -281,10 +274,6 @@
             </radio-group>
           </tui-list-cell>
 
-          <tui-list-cell class="line-cell" :hover="false">
-            <view class="tui-title">处理区花材</view>
-            <button v-if="productData.id > 0" class="admin-button-com default" @click="makeLose(productData)">设为处理花材</button>
-          </tui-list-cell>
 
       </view>
 
@@ -496,7 +485,6 @@ export default {
         stockWarning:5,
         status:2,
         itemId:0,
-        smallRatio:1,
         frontHide:0,
         virtualStock:0,
         ratioType:0,
@@ -819,16 +807,6 @@ export default {
 		closeMoreDoPop(){
 			this.$refs.rightShowMore.close()
 		},
-    makeLose(item){
-      let that = this
-      that.$util.confirmModal({content:'确认设为处理用花材?不了解此功能请勿操作?'},() => {
-        setLosing({id:item.id}).then(res=>{
-          if(res.code == 1){
-            this.$msg('设置成功')
-          }
-        })
-      })
-    },
     showChangeOnStock(item){
       let that = this
       that.$util.confirmModal({content:'确认了解修改后的影响,确认要修改?'},() => {
@@ -1101,7 +1079,6 @@ export default {
         this.form.hjAddPrice = 3
         this.form.discountPrice = 0
         this.form.cost = 0
-        this.form.smallRatio = 1
         this.form.frontHide = 0
         this.form.virtualStock = 0
         this.form.limitBuy = 0

+ 3 - 3
hdApp/src/admin/item/list.vue

@@ -396,9 +396,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 22 - 10
hdApp/src/admin/item/list2.vue

@@ -123,10 +123,10 @@
 					<button class="action-button" @click="editDesc()">图文介绍</button>
 				</view>
 				<view class="action-button-item">
-					<button class="action-button" @click="shareItem()">查看商品</button>
+					<button class="action-button" @click="shareItem()">分享商品</button>
 				</view>
 				<view class="action-button-item">
-					<button class="action-button" @click="getHdPosterFn()">生成海报</button>
+					<button class="action-button" @click="getMyPoster()">生成海报</button>
 				</view>
 				<view class="action-button-item">
 					<button class="action-button" @click="orderRecord()">下单记录</button>
@@ -409,11 +409,11 @@ export default {
 		closePoster(){
 			this.$refs.posterShow.close()
 		},
-		getHdPosterFn(){
+		getMyPoster(){
 			this.closeRightShow()
 			let that = this
 			uni.showLoading({mask:true})
-			getHdPoster({id:this.currentInfo.id}).then(res=>{
+			getPoster({id:this.currentInfo.id}).then(res=>{
 				uni.hideLoading()
 				if(res.code == 1){
 					that.posterUrl = res.data.imgUrl
@@ -633,12 +633,25 @@ export default {
 </script>
 
 <style lang="scss" scoped>
+.app-content {
+	display: flex;
+	flex-direction: column;
+	height: 100vh;
+	overflow: hidden;
+}
+
+.modern-tabs-container {
+	flex-shrink: 0;
+}
+
 .billing_box_bg {
-	height: 100%;
+	flex: 1;
 	display: flex;
 	background:white;
 	flex-direction: column;
+	overflow: hidden;
 	.input-wrap {
+		flex-shrink: 0;
 		display: flex;
 		padding: 10upx 20upx 22upx 13upx;
 		.search-bar {
@@ -653,7 +666,6 @@ export default {
 		overflow: hidden;
 	}
 	.tab-view {
-		height: calc(100vh - 140upx);
 		width: 170upx;
 		flex-shrink: 0;
 		background-color: #f0f2f6;
@@ -689,7 +701,6 @@ export default {
 		}
 	}
 	.right-box {
-		height: calc(100vh - 140upx);
 		flex: 1;
 		box-sizing: border-box;
 	}
@@ -698,9 +709,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 }
 .class-popup-style{
@@ -723,6 +734,7 @@ export default {
   padding: 0;
   background-color: #f8f9fa;
   width: 100%;
+  flex-shrink: 0;
 }
 
 .modern-tabs {

+ 3 - 3
hdApp/src/admin/item/xj.vue

@@ -241,9 +241,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/item/xjSelect.vue

@@ -270,9 +270,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 1 - 1
hdApp/src/admin/member/detail.vue

@@ -134,7 +134,7 @@
     <view class="module-com content_box user-open_bx">
       <view class="input-line-wrap">
         <tui-list-cell @click="pageTo({ url: '/admin/order/debtList?id='+data.id })" class="line-cell" :hover="false" :arrow="true" >
-            <view class="tui-title">账订单</view>
+            <view class="tui-title">账订单</view>
         </tui-list-cell>
         <tui-list-cell @click="pageTo({ url: '/admin/settle/list?customId='+data.id })" class="line-cell" :hover="false" :arrow="true" >
             <view class="tui-title">结账记录</view>

+ 13 - 4
hdApp/src/admin/member/level.vue

@@ -60,8 +60,8 @@
 
 		<!-- 底部按钮 -->
 		<view class="app-footer">
-			<view class="admin-button-com big default" @click="goBack()">返回上页</view>
-			<view style="margin-left:50rpx;" class="admin-button-com big blue" @click="saveData">提交修改</view>
+			<view class="footer-btn admin-button-com big default" @click="goBack()">返回上页</view>
+			<view class="footer-btn admin-button-com big blue" @click="saveData">提交修改</view>
 		</view>
 	</view>
 </template>
@@ -409,7 +409,14 @@ export default {
 	display: flex;
 	align-items: center;
 	justify-content: center;
+	gap: 30rpx;
 	min-height: 120rpx;
+	flex-wrap: wrap;
+}
+
+.footer-btn {
+	flex: 0 1 calc(50% - 15rpx);
+	min-width: 150rpx;
 }
 
 
@@ -439,9 +446,11 @@ export default {
 	
 	.app-footer {
 		padding: 30rpx 20rpx 35rpx;
-		flex-direction: column;
 		gap: 16rpx;
-		min-height: 140rpx;
+	}
+	
+	.footer-btn {
+		flex: 0 1 calc(50% - 8rpx);
 	}
 }
 

+ 3 - 14
hdApp/src/admin/order/components/detail-goods.vue

@@ -1,25 +1,15 @@
 <template>
   <view class="goods-item" v-if="!$util.isEmpty(info)">
-    <!-- 商品图片和信息 -->
     <view class="goods-main">
       <view class="goods-image">
-        <image 
-          :src="info.smallCover" 
-          mode="aspectFit" 
-          class="goods-thumb">
-        </image>
+        <image :src="info.smallCover" mode="aspectFit" class="goods-thumb"> </image>
       </view>
-      
       <view class="goods-info">
-        <view 
-          class="goods-title" 
-          @click="pageTo({url: '/admin/goods/detail?id=' + info.goodsId})">
-          {{ info.name || '' }}
+        <view class="goods-title" @click="pageTo({url: '/admin/goods/detail?id=' + info.goodsId})">
+          <text v-if="Number(info.sn)>0" style="color:#2f9433;margin-right:10upx;font-weight:bold;">#{{ info.sn }}</text> {{ info.name || '' }}
         </view>
       </view>
     </view>
-    
-    <!-- 价格和数量信息 -->
     <view class="goods-pricing">
       <view class="total-price">
         ¥{{ info.price ? parseFloat(info.price) : 0 }}
@@ -43,7 +33,6 @@ export default {
 		return {}
 	},
 	methods: {
-
 	}
 }
 </script>

+ 3 - 3
hdApp/src/admin/part/index.vue

@@ -241,9 +241,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 3 - 3
hdApp/src/admin/ptItem/itemList.vue

@@ -254,9 +254,9 @@ export default {
 	}
 	.item_list_title {
 		margin-bottom: 20upx;
-		font-size: 24upx;
-		font-weight: 600;
-		color: #666666;
+		font-size: 30upx;
+		font-weight: bold;
+		color: #067a40;
 	}
 	.select-cmd_bx {
 		& .kc {

+ 250 - 9
hdApp/src/admin/shop/sk.vue

@@ -79,10 +79,61 @@
             </radio-group>
           </tui-list-cell>
 
+          <!-- 花材批发和零售 -->
+          <view class="action-btn" style="border-top:1upx solid #2bb931;margin-top:20upx;">
+            <text style="font-size: 30upx;font-weight: bold;">【花材】跑腿费计算方式</text>
+          </view>
+          <view style="display: flex; align-items: center; margin-left:30upx;">
+            <input class="input-field" type="number" v-model="hcFreeKm" placeholder="0" style="width:100upx;" @focus="hcFreeKm = ''" />
+            <text style="margin-left: 20upx;font-size:30upx;">公里内免费配送</text>
+          </view>
+          <view class="action-btn">
+            <button class="btn-add" @click="addFlowerMaterial">添加</button>
+          </view>
+          <view class="material-list">
+            <view v-for="(item, index) in flowerMaterials" :key="index" class="material-item">
+              <view class="material-info">
+                <view class="info-row">
+                  <text>满</text>
+                  <input class="input-field" v-model="item.num" type="number" placeholder="0" @focus="clearItemField(item, 'num')" />
+                  <text>扎,</text>
+                  <input class="input-field" v-model="item.price" type="digit" placeholder="0" @focus="clearItemField(item, 'price')" />
+                  <text>元,</text>
+                  <input class="input-field" v-model="item.distance" type="digit" placeholder="0" @focus="clearItemField(item, 'distance')" />
+                  <text>公里内免费配送</text>
+                </view>
+              </view>
+              <button class="btn-delete" @click="deleteFlowerMaterial(index)">删除</button>
+            </view>
+          </view>
+
+          <view class="warning-text">如不符合以上情况的,按实际跑腿费计算</view>
+
+          <!-- 花束 -->
+          <view class="section-title" style="border-top:1upx solid #2bb931;">【花束】跑腿费计算方式</view>
+
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">包配送的</view>
+            <input class="input-field" v-model="hsFreeKm" type="number" placeholder="0" @focus="hsFreeKm = ''" />
+            <view>公里内免费配送</view>
+          </tui-list-cell>
+
+          <tui-list-cell class="line-cell" :hover="false">
+            <view class="tui-title">{{hsFreeKm}}公里以上</view>
+            <view class="input-row">
+              <text>每公里加收</text>
+              <input class="input-field" v-model="hsAddFee" type="digit" placeholder="0" @focus="hsAddFee = ''" />
+              <text>元</text>
+            </view>
+          </tui-list-cell>
+
+          <view class="warning-text">没有包配送的花束,按实际跑腿费计算</view>
 
         </view>
+
         <view class="confirm-btn">
-          <button class="admin-button-com big blue" @click="goBack">返回</button>
+          <button class="admin-button-com big default" @click="goBack">返回</button>
+          <button class="admin-button-com big blue" @click="commitSave">提交</button>
         </view>
     </view>
   </view>
@@ -111,9 +162,18 @@ export default {
       thirdSend:0,
       thirdSendFee:0,
       wxStoreId:'',
-      needWork:0
+      needWork:0,
+      // 花材批发和零售配置
+      flowerMaterials: [{num:0,price:0,distance:0}],
+      // 花束配置
+      hsFreeKm: 0,
+      hsAddFee: 0,
+      hcFreeKm:0
     };
   },
+  onLoad() {
+    this.init()
+  },
   onShow() {
       let that = this
       if(that.form.customId != 0 && !that.$util.isEmpty(that.form.customId) && that.form.selectCustomOk==1){
@@ -174,16 +234,23 @@ export default {
       })
       getMyExtInfo().then(res=>{
         if(res.code == 1){
-          this.losingItem = res.data.losingItem
-          this.zjGatheringItem = res.data.zjGatheringItem
-          this.losingItemName = res.data.losingItemName
-          this.zjGatheringItemName = res.data.zjGatheringItemName
+          this.losingItem = res.data.losingItem?res.data.losingItem:0
+          this.losingItemName = res.data.losingItemName?res.data.losingItemName:''
+          this.zjGatheringItem = res.data.zjGatheringItem?res.data.zjGatheringItem:0
+          this.zjGatheringItemName = res.data.zjGatheringItemName?res.data.zjGatheringItemName:''
           this.orderFlow = res.data.orderFlow
           this.thirdSend = res.data.thirdSend
           this.thirdSendFee = res.data.thirdSendFee
           this.needWork = res.data.needWork
           let main = res.data.main?res.data.main:[]
           this.wxStoreId = main.wxStoreId
+          // 加载花材批发和零售配置
+          this.flowerMaterials = res.data.hcMap ? JSON.parse(res.data.hcMap) : [{num:0,price:0,distance:0}]
+          console.log(this.flowerMaterials)
+          console.log(typeof this.flowerMaterials)
+          this.hcFreeKm = res.data.hcFreeKm ? res.data.hcFreeKm : 0
+          this.hsFreeKm = res.data.hsFreeKm ? res.data.hsFreeKm : 0
+          this.hsAddFee = res.data.hsAddFee ? res.data.hsAddFee : 0
         }
       })
     },
@@ -198,6 +265,75 @@ export default {
       }else{
         //先操作
       }
+    },
+    commitSave(){
+      let that = this
+      modifyExt({
+        hcMap: JSON.stringify(this.flowerMaterials),
+        hsFreeKm: this.hsFreeKm,
+        hsAddFee: this.hsAddFee,
+        hcFreeKm: this.hcFreeKm
+      }).then(res=>{
+        if(res.code == 1){
+          this.$msg(res.msg)
+          setTimeout(() => {
+            that.goBack()
+          }, 1200)
+        }
+      })
+    },
+    // 花材批发和零售 - 添加
+    addFlowerMaterial() {
+      this.flowerMaterials.push({
+        num: '',
+        price: '',
+        distance: ''
+      })
+    },
+    // 花材批发和零售 - 删除
+    deleteFlowerMaterial(index) {
+      uni.showModal({
+        title: '确认删除',
+        content: '确认删除该配置吗?',
+        success: (res) => {
+          if (res.confirm) {
+            this.flowerMaterials.splice(index, 1)
+            this.saveFlowerMaterials()
+          }
+        }
+      })
+    },
+    // 保存花材配置
+    saveFlowerMaterials() {
+      if (this.flowerMaterials.length === 0) {
+        return
+      }
+      modifyExt({
+        flowerMaterials: this.flowerMaterials
+      }).then(res => {
+        if (res.code === 1) {
+          this.$msg('花材配置保存成功')
+        } else {
+          this.$msg(res.msg || '保存失败')
+        }
+      })
+    },
+    // 保存花束配置
+    saveBundleConfig() {
+      modifyExt({
+        hsFreeKm: this.hsFreeKm,
+        hsAddFee: this.hsAddFee
+      }).then(res => {
+        if (res.code === 1) {
+          this.$msg('花束配置保存成功')
+        } else {
+          this.$msg(res.msg || '保存失败')
+        }
+      })
+    },
+    // 清空循环中的item字段
+    clearItemField(item, fieldName) {
+      this.$set(item, fieldName, '')
     }
   },
 };
@@ -207,6 +343,7 @@ export default {
 .app-content {
   min-height: calc(100vh - 20upx);
   padding-top: 20upx;
+  padding-bottom: 140upx;
 }
 .prompt-text {
   color: $fontColor3;
@@ -230,10 +367,114 @@ export default {
 }
 // 按钮
 .confirm-btn {
-  width: calc(100% - 60upx);
-  margin: 60upx 30upx 20upx;
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  width: 100%;
+  padding: 20upx 30upx;
+  display: flex;
+  gap: 20upx;
+  background-color: #fff;
+  box-shadow: 0 -2upx 10upx rgba(0, 0, 0, 0.1);
+  z-index: 100;
+  /* 兼容 iOS safe area */
+  padding-bottom: max(20upx, env(safe-area-inset-bottom));
   .admin-button-com {
-    width: 100%;
+    flex: 1;
   }
 }
+
+// 新增样式
+.section-title {
+  padding: 20upx 30upx;
+  font-size: 28upx;
+  font-weight: bold;
+  color: #333;
+  margin-top: 20upx;
+  background-color: #f5f5f5;
+}
+
+.action-btn {
+  padding: 20upx 30upx;
+  .btn-add {
+    background-color: #09C567;
+    color: white;
+    padding: 10upx 20upx;
+    border-radius: 4upx;
+    border: none;
+    font-size: 20upx;
+  }
+}
+
+.material-list {
+  padding: 20upx 30upx;
+  
+  .material-item {
+    background-color: #f9f9f9;
+    padding: 20upx;
+    margin-bottom: 15upx;
+    border-radius: 4upx;
+    border: 1upx solid #e0e0e0;
+    
+    .material-info {
+      margin-bottom: 15upx;
+      
+      .info-row {
+        display: flex;
+        align-items: center;
+        flex-wrap: wrap;
+        gap: 8upx;
+        
+        .input-field {
+          width: 80upx;
+          height: 36upx;
+          padding: 0 8upx;
+          border: 1upx solid #ddd;
+          border-radius: 4upx;
+          font-size: 24upx;
+          text-align: center;
+          line-height: 36upx;
+        }
+      }
+    }
+    
+    .btn-delete {
+      background-color:#09C567;
+      color: white;
+      padding: 8upx 16upx;
+      border-radius: 4upx;
+      border: none;
+      font-size: 22upx;
+      width: 100%;
+    }
+  }
+}
+
+.warning-text {
+  color: #FF0000;
+  font-size: 30upx;
+  padding: 0 30upx 15upx;
+  font-weight: bold;
+}
+
+.input-row {
+  display: flex;
+  align-items: center;
+  gap: 8upx;
+}
+
+.input-field {
+  width: 100upx;
+  height: 44upx;
+  padding: 0 10upx;
+  border: 1upx solid #ddd;
+  border-radius: 4upx;
+  font-size: 24upx;
+  text-align: center;
+  line-height: 44upx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
 </style>

+ 4 - 0
hdApp/src/api/goods/index.js

@@ -206,3 +206,7 @@ export const categoryDelB = data => {
 export const categoryStatusB = data => {
 	return https.get('/category/change-status', data)
 }
+
+export const createSn = data => {
+	return https.get('/goods/create-sn', data)
+}

+ 4 - 0
hdApp/src/api/item/index.js

@@ -18,4 +18,8 @@ export const getCostChangeList = data => {
 
 export const getPoster = data => {
 	return https.get('/item/get-poster', data)
+}
+
+export const changeFrontHide = data => {
+	return https.get('/item/change-front-hide', data)
 }

+ 2 - 2
hdApp/src/manifest.json

@@ -2,8 +2,8 @@
     "name" : "花掌柜",
     "appid" : "__UNI__4079DC1",
     "description" : "花店管家婆",
-    "versionName" : "2.0.5",
-    "versionCode" : 205,
+    "versionName" : "2.1.0",
+    "versionCode" : 210,
     "transformPx" : true,
     /* 5+App特有相关 */
     "app-plus" : {

Некоторые файлы не были показаны из-за большого количества измененных файлов