Ver Fonte

Merge branch 'redesign‌-260706' of http://git.huaml.com/zhh/front-end into redesign‌-260706

ouyang há 19 horas atrás
pai
commit
ef96be5de0

+ 118 - 71
hdApp/src/admin/goods/add.vue

@@ -1,7 +1,7 @@
 <!--
   花店后台新增商品
   谁用:hdApp 管理端创建花束
-  解决问题:单规格写主记录;开启多规格时隐藏卡片外主图/封面,改在规格卡片内编辑(规格1回写主记录),其余规格提交 specList 由后端拆子行;多规格用可横滑 tab 切换卡片编辑
+  解决问题:单规格写主记录;开启多规格时隐藏卡片外主图/封面,改在规格卡片内编辑(规格1回写主记录),其余规格提交 specList 由后端拆子行;多规格用可横滑 pill tab 切换;表单区视觉层次与开关/规格卡片统一美化
 -->
 <template>
   <view class="app-content">
@@ -17,14 +17,13 @@
         <view class="spec-switch-card">
           <view class="spec-switch-left">
             <view class="spec-switch-icon">▦</view>
-            <view>
-              <view class="spec-switch-title">启用多规格</view>
-              <view class="spec-switch-desc">开启后可设置商品多规格属性</view>
+            <view class="spec-switch-copy">
+              <view class="spec-switch-title">多规格</view>
             </view>
           </view>
           <view class="spec-switch-right">
-            <switch :checked="form.specEnabled == 1" @change="toggleSpecs" color="#09C567" />
-            <text>{{ form.specEnabled == 1 ? '已开启' : '未开启' }}</text>
+            <text class="spec-switch-status">{{ form.specEnabled == 1 ? '已启用' : '未启用' }}</text>
+            <switch class="spec-switch-ctrl" :checked="form.specEnabled == 1" @change="toggleSpecs" color="#09C567" />
           </view>
         </view>
 
@@ -148,10 +147,6 @@
           </view>
         </tui-list-cell>
 
-        <tui-list-cell class="line-cell category-wrap" :hover="false">
-          <view class="tui-title">使用场景</view><view class="tui-input"><block v-for="item in useCaseData" :key="item.id"><button class="admin-button-com" :class="[form.useCaseIdList.includes(item.id) ? '' : 'default']" @click="toggleUseCase(item)">{{ item.useCaseName }}</button></block></view>
-        </tui-list-cell>
-
         <tui-list-cell class="line-cell category-wrap" :hover="false">
           <view class="tui-title required">分类</view>
           <view class="tui-input">
@@ -162,6 +157,10 @@
           </view>
         </tui-list-cell>
 
+        <tui-list-cell class="line-cell category-wrap" :hover="false">
+          <view class="tui-title">使用场景</view><view class="tui-input"><block v-for="item in useCaseData" :key="item.id"><button class="admin-button-com" :class="[form.useCaseIdList.includes(item.id) ? '' : 'default']" @click="toggleUseCase(item)">{{ item.useCaseName }}</button></block></view>
+        </tui-list-cell>
+
         <tui-list-cell v-if="form.specEnabled != 1" class="line-cell" :hover="false">
           <view class="tui-title">价格类型</view>
           <view class="btn-group">
@@ -200,11 +199,11 @@
 
        <tui-list-cell v-if="form.specEnabled != 1" class="line-cell" :hover="false">
           <view class="tui-title">已售数量</view>
-          <input v-model="form.sold" placeholder-class="phcolor" class="tui-input" name="sold" placeholder="客户端展示:已售数量+实售数量" maxlength="10" type="number" />
+          <input v-model="form.sold" placeholder-class="phcolor" class="tui-input" name="sold" placeholder="客户看到:已售数量+实售数量" maxlength="10" type="number" />
         </tui-list-cell>
 
         <tui-list-cell class="line-cell" :hover="false">
-          <view class="tui-title">节日涨价管理</view>
+          <view class="tui-title">节日涨价</view>
           <view class="btn-group">
             <button class="admin-button-com middle" :class="[form.autoRise === '1' ? '' : 'default']" @click="autoRiseChange('1')">参与涨价</button>
             <button class="admin-button-com middle" :class="[form.autoRise === '0' ? '' : 'default']" @click="autoRiseChange('0')">不要涨价</button>
@@ -295,6 +294,8 @@ export default {
   onLoad() {
     const token = uni.getStorageSync('token')
     this.headers.token = token
+    // 新增默认填入随机已售,商城展示不显得冷清
+    this.form.sold = this.randomSold()
   },
   computed: {
     // 根据上传的图片数量动态生成封面选项
@@ -429,6 +430,13 @@ export default {
       useCaseList().then(res => { if (res.code == 1) this.useCaseData = res.data || [] })
     },
     toggleUseCase(item) { const i=this.form.useCaseIdList.indexOf(item.id); i<0?this.form.useCaseIdList.push(item.id):this.form.useCaseIdList.splice(i,1) },
+    /**
+     * 生成 150~360 的随机已售数量(含两端)
+     * @returns {number}
+     */
+    randomSold() {
+      return Math.floor(Math.random() * (360 - 150 + 1)) + 150
+    },
     createSpecData(data = {}) {
       const shopImg = Array.isArray(data.shortImgList) ? data.shortImgList : (Array.isArray(data.shopImg) ? data.shopImg : []);
       const currentImgData = Array.isArray(data.currentImgData) ? data.currentImgData : (Array.isArray(data.smallImgList) ? data.smallImgList : []);
@@ -932,6 +940,13 @@ export default {
   .module-det {
     padding: 0 30upx;
   }
+  &.goods-wrap {
+    margin: 0 24upx 20upx;
+    padding-bottom: 16upx;
+    border-radius: 16upx;
+    border: 1px solid #f0f0f0;
+    overflow: hidden;
+  }
 }
 .category-wrap {
   align-items: flex-start;
@@ -940,18 +955,20 @@ export default {
     @include disFlex(center, flex-start);
     flex-wrap: wrap;
     .admin-button-com {
-      margin-right: 30rpx;
-      margin-bottom: 20upx;
+      margin-right: 16rpx;
+      margin-bottom: 16upx;
       position: relative;
       z-index: 9999;
+      border-radius: 12upx;
     }
   }
 }
 .use-img{
   font-size: 22rpx;
   color: #999999;
-  padding-left: 4rpx 8rpx;
+  padding: 4rpx 0 8rpx;
   line-height: 1.5;
+  width: 100%;
 }
 .no-img-tip {
   font-size: 26rpx;
@@ -962,77 +979,96 @@ export default {
 .btn-group {
   display: flex;
   justify-content: flex-start;
+  flex-wrap: wrap;
   .admin-button-com {
-    margin-right: 35rpx;
-    
+    margin-right: 20rpx;
+    margin-bottom: 8upx;
+    border-radius: 12upx;
     &:last-child {
       margin-right: 0;
     }
   }
 }
 .spec-switch-card {
-  margin: 0 20upx 20upx;
-  padding: 28upx 30upx;
-  border: 1px solid #e5f5ec;
-  border-radius: 12upx;
-  background: linear-gradient(90deg, #f3fff8 0%, #ffffff 100%);
+  margin: 16upx 24upx 24upx;
+  padding: 10upx 28upx;
+  border: 1px solid #dff5e8;
+  border-radius: 20upx;
+  background: linear-gradient(135deg, #f2fff8 0%, #ffffff 55%);
   display: flex;
   align-items: center;
   justify-content: space-between;
   box-sizing: border-box;
+  box-shadow: 0 6upx 20upx rgba(9, 197, 103, 0.06);
 }
 .spec-switch-left {
   display: flex;
   align-items: center;
   min-width: 0;
+  flex: 1;
 }
 .spec-switch-icon {
-  width: 72upx;
-  height: 72upx;
-  margin-right: 22upx;
-  border-radius: 50%;
+  width: 40upx;
+  height: 40upx;
+  margin-right: 18upx;
+  border-radius: 16upx;
   background: #09C567;
   color: #ffffff;
-  font-size: 46upx;
-  line-height: 72upx;
-  text-align: center;
+  font-size: 22upx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+}
+.spec-switch-copy {
+  min-width: 0;
+  flex: 1;
 }
 .spec-switch-title {
-  font-size: 34upx;
-  color: #222222;
+  font-size: 30upx;
+  color: #1f1f1f;
   font-weight: 700;
-  line-height: 44upx;
+  line-height: 40upx;
 }
 .spec-switch-desc {
-  margin-top: 6upx;
-  font-size: 24upx;
-  color: #999999;
+  margin-top: 4upx;
+  font-size: 22upx;
+  color: #8c8c8c;
+  line-height: 32upx;
 }
 .spec-switch-right {
   display: flex;
   align-items: center;
   flex-shrink: 0;
-  color: #999999;
-  font-size: 24upx;
-  text {
-    margin-left: 12upx;
+  margin-left: 16upx;
+  .spec-switch-status {
+    margin-right: 8upx;
+    color: #8c8c8c;
+    font-size: 22upx;
+  }
+  .spec-switch-ctrl {
+    transform: scale(0.75);
+    transform-origin: center right;
   }
 }
 .spec-wrap {
-  padding: 0 20upx 20upx;
+  padding: 0 24upx 24upx;
 }
 .spec-card {
   margin-bottom: 20upx;
   background: #ffffff;
-  border: 4px solid #e8e8e8;
-  border-radius: 16upx;
+  border: 1px solid #eef0f2;
+  border-radius: 20upx;
   overflow: hidden;
+  box-shadow: 0 4upx 18upx rgba(0, 0, 0, 0.04);
 }
 .spec-card-head {
   display: flex;
   align-items: center;
   justify-content: space-between;
-  padding: 20upx 24upx 12upx;
+  padding: 24upx 24upx 16upx;
+  background: #fafbfc;
+  border-bottom: 1px solid #f0f0f0;
 }
 .spec-card-head-left {
   display: flex;
@@ -1042,33 +1078,32 @@ export default {
 }
 .spec-card-title {
   font-size: 30upx;
-  color: #222222;
+  color: #1f1f1f;
   font-weight: 700;
   flex-shrink: 0;
 }
 .spec-remove {
   margin: 0 0 0 16upx;
-  padding: 0 20upx;
+  padding: 0 22upx;
   height: 52upx;
   line-height: 52upx;
-  border: 1px solid #eeeeee;
-  border-radius: 8upx;
+  border: 1px solid #eadede;
+  border-radius: 26upx;
   background: #ffffff;
   color: #999999;
   font-size: 24upx;
   flex-shrink: 0;
 }
 .spec-add-btn {
-  margin: 0 0 0 16upx;
-  padding: 0 20upx;
+  margin: 0 0 0 20upx;
+  padding: 0 22upx;
   height: 52upx;
   line-height: 52upx;
-  border-radius: 8upx;
+  border-radius: 26upx;
   background: #09C567;
   color: #ffffff;
   font-size: 24upx;
   flex-shrink: 0;
-  margin-left: 40upx;
 }
 .spec-add-btn::after,
 .spec-remove::after {
@@ -1076,25 +1111,25 @@ export default {
 }
 .spec-tab-scroll {
   width: 100%;
-  height: 80upx;
+  height: 88upx;
   white-space: nowrap;
-  border-bottom: 1px solid #f0f0f0;
+  background: #f7f8fa;
 }
 .spec-tab-list {
   display: inline-flex;
   flex-direction: row;
   align-items: center;
-  height: 80upx;
-  padding: 0 12upx;
+  height: 88upx;
+  padding: 0 16upx;
 }
 .spec-tab-item {
   display: inline-flex;
   align-items: center;
   justify-content: center;
-  height: 80upx;
-  padding: 0 28upx;
-  margin-right: 8upx;
-  font-size: 28upx;
+  height: 56upx;
+  padding: 0 24upx;
+  margin-right: 12upx;
+  font-size: 26upx;
   color: #666666;
   flex-shrink: 0;
   max-width: 240upx;
@@ -1102,11 +1137,15 @@ export default {
   white-space: nowrap;
   text-overflow: ellipsis;
   box-sizing: border-box;
+  border-radius: 28upx;
+  background: #ffffff;
+  border: 1px solid #ececec;
 }
 .spec-tab-item.active {
   color: #09C567;
   font-weight: 700;
-  border-bottom: 4upx solid #09C567;
+  background: rgba(9, 197, 103, 0.12);
+  border-color: rgba(9, 197, 103, 0.35);
 }
 .spec-tab-text {
   overflow: hidden;
@@ -1117,22 +1156,25 @@ export default {
   margin-top: 0;
 }
 .spec-image-wrap {
-  padding: 10upx 0 20upx;
-  border-bottom: 1px solid #eeeeee;
+  margin: 8upx 16upx 16upx;
+  padding: 8upx 0 16upx;
+  border-radius: 16upx;
+  background: #fafbfc;
+  border: 1px solid #f0f0f0;
   .module-tit {
-    padding: 20upx 30upx;
+    padding: 16upx 24upx 8upx;
   }
   .module-det {
-    padding: 0 30upx;
+    padding: 0 24upx;
   }
 }
 .spec-cover-row {
   display: flex;
   align-items: flex-start;
-  padding: 20upx 30upx 0;
+  padding: 16upx 24upx 0;
 }
 .spec-cover-title {
-  width: 200upx;
+  width: 120upx;
   flex-shrink: 0;
   font-size: 28upx;
   color: #333333;
@@ -1143,8 +1185,9 @@ export default {
   display: flex;
   flex-wrap: wrap;
   .admin-button-com {
-    margin-right: 30upx;
-    margin-bottom: 16upx;
+    margin-right: 16upx;
+    margin-bottom: 12upx;
+    border-radius: 12upx;
   }
 }
 
@@ -1162,10 +1205,14 @@ export default {
 .app-footer {
   justify-content: space-evenly;
   z-index: 9999;
+  padding-top: 16upx;
+  padding-bottom: calc(16upx + env(safe-area-inset-bottom));
+  box-shadow: 0 -6upx 20upx rgba(0, 0, 0, 0.04);
   .admin-button-com {
-    width: 46%;
-    padding-top:30upx;
-    padding-bottom:30upx;
+    width: 44%;
+    padding-top: 26upx;
+    padding-bottom: 26upx;
+    border-radius: 44upx;
     
     &:disabled {
       opacity: 0.6;

+ 117 - 76
hdApp/src/admin/goods/detail.vue

@@ -1,7 +1,7 @@
 <!--
   花店后台编辑商品
   谁用:hdApp 管理端修改花束
-  解决问题:详情 specList 首项即主记录自身;开启多规格时隐藏卡片外主图/封面,改在规格卡片内编辑(规格1回写主记录);提交时把首规格名称回写主表单 specName;多规格用可横滑 tab 切换卡片编辑
+  解决问题:详情 specList 首项即主记录自身;开启多规格时隐藏卡片外主图/封面,改在规格卡片内编辑(规格1回写主记录);提交时把首规格名称回写主表单 specName;多规格用可横滑 pill tab;表单区视觉层次与开关/规格卡片统一美化
 -->
 <template>
   <view class="app-content">
@@ -18,14 +18,13 @@
         <view class="spec-switch-card">
           <view class="spec-switch-left">
             <view class="spec-switch-icon">▦</view>
-            <view>
-              <view class="spec-switch-title">启用多规格</view>
-              <view class="spec-switch-desc">开启后可设置商品多规格属性</view>
+            <view class="spec-switch-copy">
+              <view class="spec-switch-title">多规格</view>
             </view>
           </view>
           <view class="spec-switch-right">
-            <switch :checked="form.specEnabled == 1" @change="toggleSpecs" color="#09C567" />
-            <text>{{ form.specEnabled == 1 ? '已开启' : '未开启' }}</text>
+            <text class="spec-switch-status">{{ form.specEnabled == 1 ? '已启用' : '未启用' }}</text>
+            <switch class="spec-switch-ctrl" :checked="form.specEnabled == 1" @change="toggleSpecs" color="#09C567" />
           </view>
         </view>
 
@@ -162,15 +161,6 @@
           </view>
         </tui-list-cell>
 
-        <tui-list-cell class="line-cell category-wrap" :hover="false">
-          <view class="tui-title">使用场景</view>
-          <view class="tui-input">
-            <block v-for="item in useCaseData" :key="item.id"><button class="admin-button-com"
-                :class="[(form.useCaseIdList.includes(item.id + '') || form.useCaseIdList.includes(item.id * 1)) ? '' : 'default']"
-                @click="toggleUseCase(item)">{{ item.useCaseName }}</button></block>
-          </view>
-        </tui-list-cell>
-
         <tui-list-cell class="line-cell category-wrap" :hover="false">
           <view class="tui-title required">分类</view>
           <view class="tui-input">
@@ -182,6 +172,15 @@
           </view>
         </tui-list-cell>
 
+        <tui-list-cell class="line-cell category-wrap" :hover="false">
+          <view class="tui-title">使用场景</view>
+          <view class="tui-input">
+            <block v-for="item in useCaseData" :key="item.id"><button class="admin-button-com"
+                :class="[(form.useCaseIdList.includes(item.id + '') || form.useCaseIdList.includes(item.id * 1)) ? '' : 'default']"
+                @click="toggleUseCase(item)">{{ item.useCaseName }}</button></block>
+          </view>
+        </tui-list-cell>
+
         <tui-list-cell v-if="form.specEnabled != 1" class="line-cell" :hover="false">
           <view class="tui-title">价格类型</view>
           <view class="btn-group">
@@ -237,11 +236,11 @@
         <tui-list-cell v-if="form.specEnabled != 1" class="line-cell" :hover="false">
           <view class="tui-title">已售数量</view>
           <input v-model="form.sold" placeholder-class="phcolor" @focus="soldFocusHandler" @blur="soldBlurHandler"
-            class="tui-input" name="sold" placeholder="客户端展示:已售数量+实售数量" maxlength="10" type="number" />
+            class="tui-input" name="sold" placeholder="客户看到:已售数量+实售数量" maxlength="10" type="number" />
         </tui-list-cell>
 
         <tui-list-cell class="line-cell" :hover="false">
-          <view class="tui-title">节日涨价管理</view>
+          <view class="tui-title">节日涨价</view>
           <view class="btn-group">
             <button class="admin-button-com middle" :class="[form.autoRise === '1' ? '' : 'default']"
               @click="autoRiseChange('1')">参与涨价</button>
@@ -1128,6 +1127,14 @@ export default {
   .module-det {
     padding: 0 30upx;
   }
+
+  &.goods-wrap {
+    margin: 0 24upx 20upx;
+    padding-bottom: 16upx;
+    border-radius: 16upx;
+    border: 1px solid #f0f0f0;
+    overflow: hidden;
+  }
 }
 
 .category-wrap {
@@ -1139,10 +1146,11 @@ export default {
     flex-wrap: wrap;
 
     .admin-button-com {
-      margin-right: 30rpx;
-      margin-bottom: 20upx;
+      margin-right: 16rpx;
+      margin-bottom: 16upx;
       position: relative;
       z-index: 9999;
+      border-radius: 12upx;
     }
   }
 }
@@ -1150,8 +1158,9 @@ export default {
 .use-img {
   font-size: 22rpx;
   color: #999999;
-  padding-left: 4rpx 8rpx;
+  padding: 4rpx 0 8rpx;
   line-height: 1.5;
+  width: 100%;
 }
 
 .no-img-tip {
@@ -1164,9 +1173,12 @@ export default {
 .btn-group {
   display: flex;
   justify-content: flex-start;
+  flex-wrap: wrap;
 
   .admin-button-com {
-    margin-right: 35rpx;
+    margin-right: 20rpx;
+    margin-bottom: 8upx;
+    border-radius: 12upx;
 
     &:last-child {
       margin-right: 0;
@@ -1175,77 +1187,96 @@ export default {
 }
 
 .spec-switch-card {
-  margin: 0 20upx 20upx;
-  padding: 28upx 30upx;
-  border: 1px solid #e5f5ec;
-  border-radius: 12upx;
-  background: linear-gradient(90deg, #f3fff8 0%, #ffffff 100%);
+  margin: 16upx 24upx 24upx;
+  padding: 10upx 28upx;
+  border: 1px solid #dff5e8;
+  border-radius: 20upx;
+  background: linear-gradient(135deg, #f2fff8 0%, #ffffff 55%);
   display: flex;
   align-items: center;
   justify-content: space-between;
   box-sizing: border-box;
+  box-shadow: 0 6upx 20upx rgba(9, 197, 103, 0.06);
 }
 
 .spec-switch-left {
   display: flex;
   align-items: center;
   min-width: 0;
+  flex: 1;
 }
 
 .spec-switch-icon {
-  width: 72upx;
-  height: 72upx;
-  margin-right: 22upx;
-  border-radius: 50%;
+  width: 40upx;
+  height: 40upx;
+  margin-right: 18upx;
+  border-radius: 16upx;
   background: #09C567;
   color: #ffffff;
-  font-size: 46upx;
-  line-height: 72upx;
-  text-align: center;
+  font-size: 22upx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+}
+
+.spec-switch-copy {
+  min-width: 0;
+  flex: 1;
 }
 
 .spec-switch-title {
-  font-size: 34upx;
-  color: #222222;
+  font-size: 30upx;
+  color: #1f1f1f;
   font-weight: 700;
-  line-height: 44upx;
+  line-height: 40upx;
 }
 
 .spec-switch-desc {
-  margin-top: 6upx;
-  font-size: 24upx;
-  color: #999999;
+  margin-top: 4upx;
+  font-size: 22upx;
+  color: #8c8c8c;
+  line-height: 32upx;
 }
 
 .spec-switch-right {
   display: flex;
   align-items: center;
   flex-shrink: 0;
-  color: #999999;
-  font-size: 24upx;
+  margin-left: 16upx;
+
+  .spec-switch-status {
+    margin-right: 8upx;
+    color: #8c8c8c;
+    font-size: 22upx;
+  }
 
-  text {
-    margin-left: 12upx;
+  .spec-switch-ctrl {
+    transform: scale(0.75);
+    transform-origin: center right;
   }
 }
 
 .spec-wrap {
-  padding: 0 20upx 20upx;
+  padding: 0 24upx 24upx;
 }
 
 .spec-card {
   margin-bottom: 20upx;
   background: #ffffff;
-  border: 3px solid #e8e8e8;
-  border-radius: 16upx;
+  border: 1px solid #eef0f2;
+  border-radius: 20upx;
   overflow: hidden;
+  box-shadow: 0 4upx 18upx rgba(0, 0, 0, 0.04);
 }
 
 .spec-card-head {
   display: flex;
   align-items: center;
   justify-content: space-between;
-  padding: 20upx 24upx 12upx;
+  padding: 24upx 24upx 16upx;
+  background: #fafbfc;
+  border-bottom: 1px solid #f0f0f0;
 }
 
 .spec-card-head-left {
@@ -1257,18 +1288,18 @@ export default {
 
 .spec-card-title {
   font-size: 30upx;
-  color: #222222;
+  color: #1f1f1f;
   font-weight: 700;
   flex-shrink: 0;
 }
 
 .spec-remove {
   margin: 0 0 0 16upx;
-  padding: 0 20upx;
+  padding: 0 22upx;
   height: 52upx;
   line-height: 52upx;
-  border: 1px solid #eeeeee;
-  border-radius: 8upx;
+  border: 1px solid #eadede;
+  border-radius: 26upx;
   background: #ffffff;
   color: #999999;
   font-size: 24upx;
@@ -1276,16 +1307,15 @@ export default {
 }
 
 .spec-add-btn {
-  margin: 0 0 0 16upx;
-  padding: 0 20upx;
+  margin: 0 0 0 20upx;
+  padding: 0 22upx;
   height: 52upx;
   line-height: 52upx;
-  border-radius: 8upx;
+  border-radius: 26upx;
   background: #09C567;
   color: #ffffff;
   font-size: 24upx;
   flex-shrink: 0;
-  margin-left: 40upx;
 }
 
 .spec-add-btn::after,
@@ -1295,27 +1325,27 @@ export default {
 
 .spec-tab-scroll {
   width: 100%;
-  height: 80upx;
+  height: 88upx;
   white-space: nowrap;
-  border-bottom: 1px solid #f0f0f0;
+  background: #f7f8fa;
 }
 
 .spec-tab-list {
   display: inline-flex;
   flex-direction: row;
   align-items: center;
-  height: 80upx;
-  padding: 0 12upx;
+  height: 88upx;
+  padding: 0 16upx;
 }
 
 .spec-tab-item {
   display: inline-flex;
   align-items: center;
   justify-content: center;
-  height: 80upx;
-  padding: 0 28upx;
-  margin-right: 8upx;
-  font-size: 28upx;
+  height: 56upx;
+  padding: 0 24upx;
+  margin-right: 12upx;
+  font-size: 26upx;
   color: #666666;
   flex-shrink: 0;
   max-width: 240upx;
@@ -1323,12 +1353,16 @@ export default {
   white-space: nowrap;
   text-overflow: ellipsis;
   box-sizing: border-box;
+  border-radius: 28upx;
+  background: #ffffff;
+  border: 1px solid #ececec;
 }
 
 .spec-tab-item.active {
   color: #09C567;
   font-weight: 700;
-  border-bottom: 4upx solid #09C567;
+  background: rgba(9, 197, 103, 0.12);
+  border-color: rgba(9, 197, 103, 0.35);
 }
 
 .spec-tab-text {
@@ -1342,26 +1376,29 @@ export default {
 }
 
 .spec-image-wrap {
-  padding: 10upx 0 20upx;
-  border-bottom: 1px solid #eeeeee;
+  margin: 8upx 16upx 16upx;
+  padding: 8upx 0 16upx;
+  border-radius: 16upx;
+  background: #fafbfc;
+  border: 1px solid #f0f0f0;
 
   .module-tit {
-    padding: 20upx 30upx;
+    padding: 16upx 24upx 8upx;
   }
 
   .module-det {
-    padding: 0 30upx;
+    padding: 0 24upx;
   }
 }
 
 .spec-cover-row {
   display: flex;
   align-items: flex-start;
-  padding: 20upx 30upx 0;
+  padding: 16upx 24upx 0;
 }
 
 .spec-cover-title {
-  width: 200upx;
+  width: 120upx;
   flex-shrink: 0;
   font-size: 28upx;
   color: #333333;
@@ -1374,12 +1411,12 @@ export default {
   flex-wrap: wrap;
 
   .admin-button-com {
-    margin-right: 30upx;
-    margin-bottom: 16upx;
+    margin-right: 16upx;
+    margin-bottom: 12upx;
+    border-radius: 12upx;
   }
 }
 
-
 /* 确保所有选中的按钮都使用相同的颜色 */
 .admin-button-com:not(.default) {
   background-color: #09C567 !important;
@@ -1396,11 +1433,15 @@ export default {
 .app-footer {
   justify-content: space-evenly;
   z-index: 9999;
+  padding-top: 16upx;
+  padding-bottom: calc(16upx + env(safe-area-inset-bottom));
+  box-shadow: 0 -6upx 20upx rgba(0, 0, 0, 0.04);
 
   .admin-button-com {
-    width: 46%;
-    padding-top: 30upx;
-    padding-bottom: 30upx;
+    width: 44%;
+    padding-top: 26upx;
+    padding-bottom: 26upx;
+    border-radius: 44upx;
 
     &:disabled {
       opacity: 0.6;

+ 500 - 12
hdApp/src/admin/goods/result.vue

@@ -1,27 +1,308 @@
-<!--
-  花店后台新增商品成功页
-  谁用:hdApp 管理端创建花束后跳转
-  解决问题:提示添加成功,并提供返回入口
--->
 <template>
 	<view class="app-content">
 		<view class="billing_box_bg">
-			<view class="top-view"></view>
+			<view class="top-view"> </view>
 			<view class="result-view">
-				<view class="iconfont iconchenggong"></view>
-				<view class="result-title">添加成功</view>
-				<button class="admin-button-com middle blue" style="width:20vw;" @click="goBack">返回</button>
+			<view class="iconfont iconchenggong"></view>
+			<view class="result-title">添加成功</view>
+			<button class="admin-button-com middle blue" style="width:20vw;" @click="goBack">返回</button>
+			<view class="form-container">
+				<form>
+					<view class="module-com input-line-wrap">
+
+						<tui-list-cell class="line-cell" :hover="false">
+							<view class="tui-title">名称</view>
+							<view>{{ goodsName }}</view>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false">
+							<view class="tui-title">数量</view>
+							<input v-model="form.num" placeholder-class="phcolor" class="tui-input" name="num" @focus="form.num=''" placeholder="填写数量" maxlength="50" type="number" />
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false" :arrow="false" >
+							<view class="tui-title">单价</view>
+							<input type="digit" @focus="goodsPrice=''" style="width:260upx;" v-model="goodsPrice" placeholder-class="tui-placeholder" placeholder="填写金额" />
+							<text style="color:#3385FF;font-weight:bold;">合计 ¥<text>{{orderTotalPrice}}</text></text>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false" :arrow="false">
+							<view class="tui-title">收款方式</view>
+                			<button @click="form.hasPay = 4" class="admin-button-com middle" :class="form.hasPay == 4 ? 'blue' : 'default'">余额</button>
+                			<button @click="form.hasPay = 0" class="admin-button-com middle" :class="form.hasPay == 0 ? 'blue' : 'default'" style="margin-left:6upx;">扫码</button>
+							<button @tap="form.hasPay = 1" class="admin-button-com middle" :class="form.hasPay == 1 ? 'blue' : 'default'" style="margin-left:6upx;">线下</button>
+							<button @tap="form.hasPay = 2" class="admin-button-com middle" :class="form.hasPay == 2 ? 'blue' : 'default'" style="margin-left:6upx;">挂账</button>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :arrow="true" v-if="form.hasPay == 1">
+							<view class="tui-title">线下渠道</view>
+							<picker mode="selector" :value="form.payWay" :range="payWayList" range-key="name" @change="payWayChange" class="tui-input" >
+								<input v-model="form.payWay" name="payWay" type="text" hidden />
+								<view style="padding:6upx 0 6upx 0;">{{payWayList[payWayindex].name}}</view>
+							</picker>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false">
+							<view class="tui-title">配送方式</view>
+							<button @tap="setSendType(0)" class="admin-button-com middle" :class="form.sendType == 0 ? 'blue' : 'default'">送货</button>
+							<button @tap="setSendType(1)" class="admin-button-com middle" :class="form.sendType == 1 ? 'blue' : 'default'" style="margin-left:6upx;">自取</button>
+							<button @click="setSendType(2)" class="admin-button-com middle" :class="form.sendType == 2 ? 'blue' : 'default'" style="margin-left:6upx;">跑腿</button>
+							<button @click="setSendType(3)" class="admin-button-com middle" :class="form.sendType == 3 ? 'blue' : 'default'" style="margin-left:6upx;">物流</button>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false" :arrow="true">
+							<view class="tui-title" v-if="form.sendType == 1">取花日期</view>
+							<view class="tui-title" v-else>配送日期</view>
+							<view class="uni-input" v-if="form.reachDate==''" @click="bindReachDateChange">
+								<view style="width:410upx;font-size:32upx;color:#CCCCCC;">今天</view>
+							</view>
+							<view class="uni-input" @click="bindReachDateChange">
+								<view style="width:410upx;font-size:32upx;">{{form.reachDate}}</view>
+							</view>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false" :arrow="true">
+							<view class="tui-title" v-if="form.sendType == 1">取花时间</view>
+							<view class="tui-title" v-else>配送时间</view>
+							<view class="uni-input" style="width:450upx;font-size:32upx;" @click="openTimePopup">{{form.reachPeriod}}</view>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false">
+							<view class="tui-title">备注内容</view>
+							<input v-model="form.remark" placeholder-class="phcolor" class="tui-input" placeholder-style="color:#ccc" name="remark" placeholder="选填" />
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false">
+							<view class="tui-title">客户</view>
+							<view>快捷开单</view>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false">
+							<view class="tui-title">制作</view>
+							<button @tap="form.needWork = 1" class="admin-button-com middle" :class="form.needWork == 1 ? 'blue' : 'default'">需要</button>
+							<button @tap="form.needWork = 0" class="admin-button-com middle" :class="form.needWork == 0 ? 'blue' : 'default'" style="margin-left:30upx;">不要</button>
+						</tui-list-cell>
+
+						<tui-list-cell class="line-cell" :hover="false" :arrow="false">
+							<view class="tui-title">打印小票</view>
+							<button @tap="form.needPrint = 2" class="admin-button-com middle" :class="form.needPrint == 2? 'blue' : 'default'">不打</button>
+							<button @click="form.needPrint = 1" class="admin-button-com middle" :class="form.needPrint == 1 ? 'blue' : 'default'" style="margin-left:30upx;">打印</button>
+						</tui-list-cell>
+
+				</view>
+			</form>
+			<view class="button-group">
+				<button class="admin-button-com big default" @click="goBack" style="width:200upx;">取消</button>
+				<button class="admin-button-com big blue" @click="confirmOrder" style="width:200upx;margin-left:50upx;">确认</button>
 			</view>
 		</view>
+		</view>
+	</view>
+
+	<!-- 配送时间选择弹框 -->
+	<uni-popup ref="timePopup" type="bottom" background-color="#fff">
+		<view class="time-picker-popup">
+			<view class="popup-header">
+				<text class="popup-title">选择配送时间</text>
+				<text class="popup-close" @click="closeTimePopup">×</text>
+			</view>
+			
+			<view class="time-sections">
+				<!-- 小时选择 -->
+				<view class="time-section">
+					<view class="section-title">小时</view>
+					<view class="hours-wrapper">
+						<scroll-view 
+							scroll-y="true" 
+							class="hours-scroll"
+							enhanced="true"
+							show-scrollbar="true"
+						>
+							<view class="hours-buttons">
+								<button 
+									v-for="(hour, index) in timeOptions[0]" 
+									:key="index"
+									class="time-button" 
+									:class="{ active: selectedHour == hour }"
+									@click="selectedHour = hour"
+								>{{ hour }}</button>
+							</view>
+						</scroll-view>
+					</view>
+				</view>
+				
+				<!-- 分钟选择 -->
+				<view class="time-section">
+					<view class="section-title">分钟</view>
+					<view class="minutes-wrapper">
+						<scroll-view 
+							scroll-y="true" 
+							class="minutes-scroll"
+							enhanced="true"
+							show-scrollbar="true"
+						>
+							<view class="minutes-buttons">
+								<button 
+									v-for="(minute, index) in timeOptions[1]" 
+									:key="index"
+									class="time-button" 
+									:class="{ active: selectedMinute == minute }"
+									@click="selectedMinute = minute"
+								>{{ minute }}</button>
+							</view>
+						</scroll-view>
+					</view>
+				</view>
+			</view>
+			
+			<!-- 操作按钮 -->
+			<view class="popup-footer">
+				<button class="footer-button default" @click="closeTimePopup">取消</button>
+				<button class="footer-button blue" @click="confirmTime">确认</button>
+			</view>
+		</view>
+	</uni-popup>
+
+	<!-- 配送日期选择器蒙板 -->
+	<view v-if="reachDatePickerShow" class="date-picker-mask" @click="reachDatePickerShow = false"></view>
+
+	<mx-date-picker :show="reachDatePickerShow" format="yyyy-mm-dd" type="date" :value="reachDatePickerValue" :show-tips="true" @confirm="confirmReachDatePicker" @cancel="reachDatePickerShow = false" />
 	</view>
 </template>
 <script>
+import TuiListCell from "@/components/plugin/list-cell";
+import { createOrder } from "@/api/order";
+import { mapGetters } from "vuex";
+import MxDatePicker from '@/components/mx-datepicker/mx-datepicker.vue';
+
 export default {
 	name: "result",
+	components: {
+		TuiListCell,
+		MxDatePicker
+	},
+		data() {
+			return {
+				form: {
+					hasPay: 4,
+					payWay: 0,
+					num: 1,
+					sendType: 0,
+					reachDate: '',
+					reachPeriod: "12:00",
+					remark: '',
+					needWork:1,
+					needPrint:2
+				},
+				goodsPrice: '',
+				payWayindex: 0,
+				payWayList: [
+					{name: "线下微信", id: 0},
+					{name: "线下支付宝", id: 1},
+					{name: "现金", id: 4},
+					{name: "银行卡", id: 5}
+				],
+				timeOptions: [
+					['00', '01', '02','03','04','05','06','07','08','09','10','11','12','13', '14','15','16','17','18','19','20','21','22','23'],
+					['00', '05', '10','15','20','25','30','35','40','45','50','55']
+				],
+				goodsName:'',
+				goodsId:0,
+				selectedHour: '12', // 选中的小时
+				selectedMinute: '00', // 选中的分钟
+				reachDatePickerShow: false,
+				reachDatePickerValue: ''
+			};
+		},
+	computed: {
+		...mapGetters(["getLoginInfo", "getMyShopInfo"]),
+		orderTotalPrice() {
+			let price = 0;
+			if (Number(this.goodsPrice) > 0 && Number(this.form.num) > 0) {
+				price = Number(this.goodsPrice) * Number(this.form.num);
+				price = parseFloat(price.toFixed(2));
+			}
+			return price;
+		}
+	},
+	onLoad(options) {
+		this.goodsName = options.name?options.name:''
+		this.goodsId = options.id?options.id:0
+	},
 	methods: {
-		// 返回上一页,关闭当前成功提示
+		init() {
+
+		},
+		setSendType (type) {
+			this.form.sendType = type
+		},
 		goBack() {
 			uni.navigateBack({})
+		},
+		confirmOrder() {
+			let product = [{productId:this.goodsId,bigNum:this.form.num,smallNum:null,property:0,num:this.form.num,unitType:0,unitPrice:this.goodsPrice}]
+			let json = JSON.stringify(product)
+			let customId = this.getMyShopInfo && Number(this.getMyShopInfo.defaultCustomId)>0 ? this.getMyShopInfo.defaultCustomId : 0
+			if(Number(customId)<=0){
+				this.$msg('请设置快捷开单的客户')
+				return false
+			}
+			//dealPrice=1 表示花束卖的价跟原价不一致,也要强制提交
+      		let params = {...this.form,modifyPrice: this.orderTotalPrice,version:3,orderType:1,product:json,customId:customId,dealPrice:1};
+
+			this.$util.confirmModal({content:'确认提交'},() => {        
+				uni.showLoading({mask:true})
+				createOrder(params).then((res) => {
+					uni.hideLoading()
+					if(res.code == 1){
+						const {data: { id, orderSn,actPrice }} = res;
+						if(this.form.hasPay == 0){
+							this.$util.pageTo({ url: '/admin/billing/toPay',type:2,query: {orderId:id,orderSn:orderSn,actPrice:actPrice}})
+						}else{
+							this.$util.pageTo({ url: '/admin/billing/result?orderId='+id,type:2})					
+						}
+					}
+				})
+			})
+		},
+		payWayChange(e) {
+			let index = e.detail.value;
+			this.payWayindex = index;
+			this.form.payWay = this.payWayList[index].id;
+		},
+		selTimeFn(e) {
+			this.form.reachDate = e.detail.value;
+		},
+		bindReachDateChange(){
+			this.reachDatePickerShow = true
+			this.reachDatePickerValue = this.form.reachDate
+		},
+		confirmReachDatePicker(e) {
+			this.form.reachDate = e.value
+			this.reachDatePickerShow = false
+		},
+		bindTimeChange(event) {
+			let val = event.detail.value;
+			let before = Number(val[0]);
+			let after = Number(val[1]);
+			let timeOptions = this.timeOptions;
+			this.form.reachPeriod = timeOptions[0][before]+':'+timeOptions[1][after];
+		},
+		openTimePopup() {
+			// 初始化为当前选中的时间
+			const [hour, minute] = this.form.reachPeriod.split(':')
+			this.selectedHour = hour
+			this.selectedMinute = minute
+			this.$refs.timePopup.open()
+		},
+		// 关闭时间选择弹框
+		closeTimePopup() {
+			this.$refs.timePopup.close()
+		},
+		// 确认时间选择
+		confirmTime() {
+			this.form.reachPeriod = `${this.selectedHour}:${this.selectedMinute}`
+			this.closeTimePopup()
 		}
 	}
 };
@@ -40,7 +321,7 @@ export default {
 		left: 0;
 		width: 100%;
 		height: 299upx;
-		background: #09C567;
+		background: #3385ff;
 		border-radius: 0upx 0upx 83upx 83upx;
 	}
 	.result-view {
@@ -61,6 +342,213 @@ export default {
 			margin: 10upx 0 10upx;
 			font-size: 32upx;
 		}
+		.form-container {
+			width: 100%;
+			.line-cell {
+				.tui-title {
+					width: 210upx;
+					color: $fontColor2;
+				}
+				.tui-input {
+					width: calc(100% - 210upx);
+					font-size: 28upx;
+				}
+				.phcolor {
+					color: #ccc;
+				}
+			}
+			.button-group {
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				margin-top: 40upx;
+				padding: 0 30upx;
+			}
+		}
+	}
+}
+
+/* 时间选择弹窗样式 */
+.time-picker-popup {
+	width: 100%;
+	background: #fff;
+	border-radius: 20upx 20upx 0 0;
+	display: flex;
+	flex-direction: column;
+	max-height: 94vh;
+	padding: 0 0 120upx 0;
+}
+
+.popup-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 0;
+	padding: 30upx 20upx 20upx 20upx;
+	border-bottom: 2upx solid #f0f2f6;
+	flex-shrink: 0;
+}
+
+.popup-title {
+	font-size: 36upx;
+	color: #333;
+	font-weight: bold;
+}
+
+.popup-close {
+	font-size: 48upx;
+	color: #999;
+	line-height: 1;
+	cursor: pointer;
+}
+
+.time-sections {
+	display: flex;
+	flex-direction: column;
+	gap: 20upx;
+	margin-bottom: 0;
+	flex: 1;
+	padding: 20upx 20upx 0 20upx;
+	overflow: hidden;
+}
+
+.time-section {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	min-height: 200upx;
+	
+	.section-title {
+		font-size: 28upx;
+		color: #333;
+		font-weight: 600;
+		margin-bottom: 12upx;
+		text-align: left;
+	}
+}
+
+.hours-wrapper {
+	width: 100%;
+	flex: 1;
+	background: #f8f9fa;
+	border: 2upx solid #e9ecef;
+	border-radius: 8upx;
+	position: relative;
+	overflow: hidden;
+	display: flex;
+	flex-direction: column;
+	min-height: 150upx;
+}
+
+.minutes-wrapper {
+	width: 100%;
+	flex: 1;
+	background: #f8f9fa;
+	border: 2upx solid #e9ecef;
+	border-radius: 8upx;
+	position: relative;
+	overflow: hidden;
+	display: flex;
+	flex-direction: column;
+	min-height: 150upx;
+}
+
+.hours-scroll,
+.minutes-scroll {
+	width: 100%;
+	height: 100%;
+	padding: 8upx;
+	box-sizing: border-box;
+}
+
+.hours-buttons,
+.minutes-buttons {
+	display: flex;
+	flex-wrap: wrap;
+	gap: 8upx;
+	justify-content: flex-start;
+}
+
+.time-button {
+	width: calc(25% - 6upx);
+	height: 73upx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	background: #ffffff;
+	border: 2upx solid #e9ecef;
+	border-radius: 6upx;
+	font-size: 26upx;
+	color: #666;
+	box-sizing: border-box;
+	transition: all 0.2s;
+	flex-shrink: 0;
+	
+	&.active {
+		background: #3385FF;
+		border-color: #3385FF;
+		color: #fff;
+		font-weight: 500;
+	}
+	
+	&:active {
+		background: #e8f5ff;
+	}
+}
+
+.popup-footer {
+	display: flex;
+	gap: 12upx;
+	padding: 15upx 20upx 20upx 20upx;
+	border-top: 2upx solid #f0f2f6;
+	flex-shrink: 0;
+	
+	.footer-button {
+		flex: 1;
+		height: 93upx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		border: none;
+		border-radius: 8upx;
+		font-size: 28upx;
+		font-weight: 500;
+		transition: all 0.2s;
+		
+		&.default {
+			background: #f5f5f5;
+			color: #666;
+		}
+		
+		&.blue {
+			background: #3385FF;
+			color: #fff;
+		}
+		
+		&:active {
+			opacity: 0.8;
+		}
+	}
+}
+
+/* 日期选择器蒙板 */
+.date-picker-mask {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	background-color: rgba(0, 0, 0, 0.5);
+	z-index: 98;
+	animation: fadeIn 0.3s ease-in-out;
+}
+
+@keyframes fadeIn {
+	from {
+		opacity: 0;
+	}
+	to {
+		opacity: 1;
 	}
 }
-</style>
+</style>

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

@@ -109,9 +109,9 @@
                 <text class="field-label">收花:</text>
                 <text class="field-value">{{ item.receiveUserName || '' }}</text>
               </view>
-              <view class="info-row">
+              <view class="info-row" v-if="item.shopAdminName">
                 <text class="field-label">下单:</text>
-                <text class="field-value">{{ item.shopAdminName || '' }}</text>
+                <text class="field-value">{{ item.shopAdminName }}</text>
               </view>
               <view class="info-row">
                 <text class="field-label">时间:</text>

+ 2 - 2
hdApp/src/admin/tools/calculator.vue

@@ -47,7 +47,7 @@
 									class="customer-strip-name-txt"
 									:class="{ 'customer-strip-name-txt--with-balance': showBalanceRow }"
 									>{{ customerDisplayName }}</text>
-								<text v-if="showBalanceRow" class="customer-strip-balance">¥{{ formatMoney(customInfo.balance) }}</text>
+								<text v-if="showBalanceRow" class="customer-strip-balance">余额 ¥{{ formatMoney(customInfo.balance) }}</text>
 							</text>
 						</view>
 					</view>
@@ -67,7 +67,7 @@
 							</view>
 						</view>
 						<view v-if="selHasPay === 0" class="rcv-pay-hint">
-							<text class="rcv-pay-hint-text">扫码付款、分享小程序付款</text>
+							<text class="rcv-pay-hint-text">扫客户付款码;分享小程序让客户付款</text>
 						</view>
 						<view v-if="selHasPay === 2" class="rcv-pay-hint">
 							<text class="rcv-pay-hint-text">客户赊账请选挂账</text>