فهرست منبع

产品编辑页

licailing 4 سال پیش
والد
کامیت
48d1ac8ecc

+ 15 - 9
src/main/java/com/izouma/jiashanxia/domain/Package.java

@@ -67,15 +67,6 @@ public class Package extends BaseEntity {
     @ApiModelProperty(value = "是否单独分销")
     private boolean separateDistribution;
 
-    @ApiModelProperty(value = "108将奖励比例")
-    private BigDecimal generalRatio;
-
-    @ApiModelProperty(value = "创客奖励比例")
-    private BigDecimal makerRatio;
-
-//    @ApiModelProperty(value = "创客和108将奖励比例")
-//    private BigDecimal generalMakerRatio;
-
     @ApiModelProperty(value = "直推奖励比例")
     private BigDecimal personalRatio0;
 
@@ -104,6 +95,7 @@ public class Package extends BaseEntity {
     private String workflow;
 
     @ApiModelProperty(value = "注意事项")
+    @Column(columnDefinition = "TEXT")
     private String note;
 
     private boolean IDNo;
@@ -121,10 +113,24 @@ public class Package extends BaseEntity {
     @ApiModelProperty(value = "分享数")
     private int shareNum;
 
+
+//    private String eventDate;
+//    private String eventTime;
+//    private String eventAddress;
+//    private String eventObject;
+
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty(value = "费用说明")
+    private String expenseDescription;
+
     @Transient
     private String attractionsName;
 
     @Transient
     private String categoryName;
 
+    @Transient
+    @ApiModelProperty(value = "分享得")
+    private BigDecimal shareAmount;
+
 }

+ 4 - 2
src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java

@@ -520,13 +520,15 @@ public class OrderInfoService {
      */
     public void makerGeneralDistribution(User parent, BigDecimal amount, Long orderId, Long userId, Package aPackage) {
         // 创客比例
-        BigDecimal makerRatio = aPackage.getMakerRatio();
+//        BigDecimal makerRatio = aPackage.getMakerRatio();
+        BigDecimal makerRatio = BigDecimal.ZERO;
         if (ObjectUtil.isNull(makerRatio) || !aPackage.isSeparateDistribution()) {
             makerRatio = sysConfigService.getBigDecimal("MAKER_RATIO");
         }
         BigDecimal maker = amount.multiply(makerRatio);
         // 108将比例
-        BigDecimal generalRatio = aPackage.getMakerRatio();
+//        BigDecimal generalRatio = aPackage.getMakerRatio();
+        BigDecimal generalRatio = BigDecimal.ZERO;
         if (ObjectUtil.isNull(generalRatio) || !aPackage.isSeparateDistribution()) {
             generalRatio = sysConfigService.getBigDecimal("GENERAL_RATIO");
         }

+ 146 - 50
src/main/vue/src/components/PackageEdit.vue

@@ -4,10 +4,10 @@
             :model="formData"
             :rules="rules"
             ref="form"
-            label-width="90px"
+            label-width="120px"
             label-position="right"
             size="small"
-            style="max-width: 900px;"
+            style="max-width: 800px;"
         >
             <el-form-item prop="attractionsId" label="景区">
                 <el-select
@@ -35,7 +35,7 @@
             <el-form-item prop="img" label="图">
                 <multi-upload v-model="formData.img"></multi-upload>
             </el-form-item>
-            <el-form-item prop="tag" label="套餐标签">
+            <!-- <el-form-item prop="tag" label="套餐标签">
                 <el-tag
                     :key="i"
                     v-for="(tag, i) in formData.tag"
@@ -57,26 +57,21 @@
                 >
                 </el-input>
                 <el-button v-else class="button-new-tag" size="small" @click="showInput">新建标签</el-button>
-            </el-form-item>
-            <el-form-item prop="repeatedly" label="使用次数">
+            </el-form-item> -->
+            <!-- <el-form-item prop="repeatedly" label="使用次数">
                 <el-radio-group v-model="formData.repeatedly">
                     <el-radio :label="false">单次使用</el-radio>
                     <el-radio :label="true">多次使用</el-radio>
                 </el-radio-group>
+            </el-form-item> -->
+            <el-form-item prop="originalPrice" label="原价" v-if="stockList.length <= 0">
+                <el-input-number type="number" v-model="formData.originalPrice" class="select-width"></el-input-number>
             </el-form-item>
-            <el-form-item prop="amount" label="金额">
+            <el-form-item prop="amount" label="金额" v-if="stockList.length <= 0">
                 <el-input-number type="number" v-model="formData.amount" class="select-width"></el-input-number>
             </el-form-item>
-            <el-form-item prop="categoryId" label="套餐类型">
-                <el-select v-model="formData.categoryId" clearable filterable placeholder="请选择" class="select-width">
-                    <el-option
-                        v-for="item in categoryOptions"
-                        :key="item.value"
-                        :label="item.label"
-                        :value="item.value"
-                    >
-                    </el-option>
-                </el-select>
+            <el-form-item prop="inventory" label="库存" v-if="stockList.length <= 0">
+                <el-input-number type="number" v-model="formData.inventory" class="select-width"></el-input-number>
             </el-form-item>
             <el-form-item label="规格">
                 <el-button @click="addStockForm">添加规格</el-button>
@@ -84,7 +79,7 @@
                     <div class="spec" v-if="!item.del">
                         <el-row>
                             <el-col :span="8">
-                                <span>规格</span>
+                                <span>规格{{ index + 1 }}</span>
                                 <el-input placeholder="规格" class="input" v-model="item.specification"></el-input>
                             </el-col>
                             <el-col :span="8">
@@ -110,39 +105,52 @@
                         </el-row>
                         <el-row>
                             <el-col :span="8">
-                                <span>价</span>
+                                <span>价</span>
                                 <el-input-number
                                     type="number"
                                     :min="0"
                                     class="input"
-                                    v-model="item.originalPrice"
+                                    v-model="item.price"
                                 ></el-input-number>
                             </el-col>
                             <el-col :span="8">
-                                <span>价</span>
+                                <span>价</span>
                                 <el-input-number
                                     type="number"
                                     :min="0"
                                     class="input"
-                                    v-model="item.price"
+                                    v-model="item.originalPrice"
                                 ></el-input-number>
                             </el-col>
-                            <el-button
-                                class="del"
-                                type="danger"
-                                size="small"
-                                icon="el-icon-delete"
-                                @click="deleteStockForm(item, index)"
-                            ></el-button>
+                            <el-col :span="8">
+                                <el-button
+                                    class="del"
+                                    type="danger"
+                                    size="small"
+                                    icon="el-icon-delete"
+                                    @click="deleteStockForm(item, index)"
+                                ></el-button>
+                            </el-col>
                         </el-row>
                     </div>
                 </div>
             </el-form-item>
-            <el-form-item prop="detail" label="详情">
-                <rich-text v-model="formData.detail"></rich-text>
+            <el-form-item prop="categoryId" label="产品类型">
+                <el-select v-model="formData.categoryId" clearable filterable placeholder="请选择" class="select-width">
+                    <el-option
+                        v-for="item in categoryOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
             </el-form-item>
-            <el-form-item prop="separateDistribution" label="单独分销">
-                <el-switch v-model="formData.separateDistribution"> </el-switch>
+            <el-form-item prop="separateDistribution" label="分销模式">
+                <el-radio-group v-model="formData.separateDistribution">
+                    <el-radio :label="true">自主分销</el-radio>
+                    <el-radio :label="false">系统分销</el-radio>
+                </el-radio-group>
             </el-form-item>
             <el-form-item prop="personalRatio0" label="直推比例" v-if="formData.separateDistribution">
                 <el-input-number
@@ -194,7 +202,7 @@
                     :step="0.01"
                 ></el-input-number>
             </el-form-item> -->
-            <el-form-item label="优惠券" prop="couponId">
+            <el-form-item label="核销赠送优惠券" prop="couponId">
                 <el-select multiple v-model="formData.couponId" class="select-width">
                     <el-option v-for="item in coupons" :key="item.id" :label="item.name" :value="item.id">
                         <span style="float: left">{{ item.name }}</span>
@@ -202,8 +210,8 @@
                     </el-option>
                 </el-select>
             </el-form-item>
-            <el-form-item label="分享海报" prop="poster">
-                <!-- <poster-upload
+            <!-- <el-form-item label="分享海报" prop="poster">
+                <poster-upload
                     v-model="formData.poster"
                     :width="80"
                     :height="160"
@@ -213,12 +221,66 @@
                     name="poster"
                 >
                     <div slot="tips" class="tips">尺寸120x240px</div>
-                </poster-upload> -->
+                </poster-upload> 
                 <crop-upload v-model="formData.poster"></crop-upload>
-            </el-form-item>
-            <el-form-item label="小程序海报" prop="smallPoster">
+            </el-form-item> -->
+            <!-- <el-form-item label="分享图" prop="smallPoster">
                 <multi-upload v-model="formData.smallPoster"></multi-upload>
+            </el-form-item> -->
+            <!-- <el-form-item prop="detail" label="详情">
+                <rich-text v-model="formData.detail"></rich-text>
+            </el-form-item> -->
+            <el-form-item label="购买者信息">
+                <el-checkbox v-model="formData.realName">真实姓名</el-checkbox>
+                <el-checkbox v-model="formData.buyPhone">电话</el-checkbox>
+                <el-checkbox v-model="formData.IDNo">身份证</el-checkbox>
+            </el-form-item>
+            <el-form-item label="活动日期">
+                <el-input class="select-width" placeholder="请输入活动日期,例:2021年2月24日"></el-input>
+            </el-form-item>
+            <el-form-item label="活动时间">
+                <el-input class="select-width" placeholder="请输入活动日期,例:09:00-17:30"></el-input>
+            </el-form-item>
+            <el-form-item label="活动地点">
+                <el-input class="select-width" placeholder="请输入详细的活动地址"></el-input>
+            </el-form-item>
+            <el-form-item label="活动对象">
+                <el-input class="select-width" placeholder="请输入活动对象,例:3-10岁亲子家庭"></el-input>
             </el-form-item>
+            <el-form-item label="费用说明" style="width: 500px">
+                <simple-rich-text v-model="formData.note" class="select-width"></simple-rich-text>
+            </el-form-item>
+            <el-form-item prop="note" label="注意事项" style="width: 500px">
+                <simple-rich-text v-model="formData.note" class="select-width"></simple-rich-text>
+            </el-form-item>
+            <!-- <el-form-item prop="content" label="流程" style="width:800px">
+                <div>
+                    <el-form
+                        v-for="(item, i) in list"
+                        :key="i"
+                        :model="item"
+                        ref="subform"
+                        label-position="right"
+                        label-width="60px"
+                        class="subform"
+                        :rules="subrule"
+                    >
+                        <el-form-item label="时间" prop="name">
+                            <el-input v-model="item.name"></el-input>
+                        </el-form-item>
+                        <el-form-item label="描述" prop="desc">
+                            <el-input v-model="item.desc" :rows="2" type="textarea"></el-input>
+                        </el-form-item>
+                        <el-form-item label="图片" prop="img">
+                            <multi-upload v-model="item.img"></multi-upload>
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button @click="delItem(i)">删除</el-button>
+                        </el-form-item>
+                    </el-form>
+                    <el-button @click="list.push({ name: '', desc: '', img: [] })">添加</el-button>
+                </div>
+            </el-form-item> -->
             <el-form-item>
                 <el-button @click="onSave" :loading="saving" type="primary" v-if="$route.query.id">保存</el-button>
                 <el-button @click="onSave" :loading="saving" type="primary" v-else>下一步</el-button>
@@ -296,7 +358,22 @@ export default {
                 img: [],
                 tag: [],
                 repeatedly: false,
-                couponId: []
+                couponId: [],
+                separateDistribution: false,
+                note:
+                    '<p>1、休闲着装,穿运动鞋参加活动;</p>' +
+                    '<p>2、自带适量饮用水及零食,需喝热水家庭的自带水杯;</p>' +
+                    '<p>3、手机充电设备、相机等自带;</p>' +
+                    '<p>4、注意防晒,防晒霜/帽子/遮阳伞等视自身情况携带,</p>' +
+                    '<p>5、保护环境,为孩子树立榜样,活动过程中不乱扔乱丢;</p>' +
+                    '<p>6、如因迟到等个人原因造成无法参加某项活动,主办方不予退款;</p>' +
+                    '<p>7、如遇交通堵塞、天气变化、场地等突发情况等不可抗拒因素,为保证活动顺利完成,教练有权对活动行程做出调整,全员需配合教练统一安排;</p>' +
+                    '<p>8、如因交通、天气、场地等突发情况,领队有权对活动行程进行调整;</p>' +
+                    '<p>9、负责好自身及孩子的安全,如因他人受伤,请向他人索赔;如有意外受伤,医疗费用自行垫付,主办方负责协助保险理赔;</p>' +
+                    '<p>10、请保管好自身财务,如有丢失,与组织无关;</p>' +
+                    '<p>11、活动费用不含发票,如需发票额外自补费用4%的税点;</p>' +
+                    '<p>12、报名则代表同意活动中的照片可用于天游佳处相关宣传;</p>' +
+                    '<p>13、报名参加活动即视为已阅读同意以上条款。</p>'
             },
             rules: {
                 attractionsId: [
@@ -313,13 +390,13 @@ export default {
                         trigger: 'blur'
                     }
                 ],
-                amount: [
-                    {
-                        required: true,
-                        message: '请输入金额',
-                        trigger: 'blur'
-                    }
-                ],
+                // amount: [
+                //     {
+                //         required: true,
+                //         message: '请输入金额',
+                //         trigger: 'blur'
+                //     }
+                // ],
                 categoryId: [
                     {
                         required: true,
@@ -338,7 +415,9 @@ export default {
             categoryOptions: [],
             stockList: [],
             packageId: 0,
-            coupons: []
+            coupons: [],
+            list: [],
+            subrule: {}
         };
     },
     computed: {
@@ -365,6 +444,15 @@ export default {
                     return false;
                 }
             });
+            // Promise.all(this.$refs.subform.map(i => i.validate())).then(() => {
+            //     this.$refs.form.validate(valid => {
+            //         if (valid) {
+            //             this.submit();
+            //         } else {
+            //             return false;
+            //         }
+            //     });
+            // });
         },
         submit() {
             let data = { ...this.formData };
@@ -452,6 +540,9 @@ export default {
                     this.$message.success('删除成功');
                 })
                 .catch(e => {});
+        },
+        delItem(i) {
+            this.list.splice(i, 1);
         }
     }
 };
@@ -495,14 +586,12 @@ export default {
     .el-button {
         height: 34px;
         border-width: 0;
-        margin-right: 30px;
-        float: right;
+        margin-top: 23px;
 
         &.del {
             width: 34px;
             padding: 9px 5px;
             font-size: 16px;
-            margin-left: 10px;
         }
     }
 }
@@ -540,4 +629,11 @@ export default {
         }
     }
 }
+.subform {
+    padding: 16px 16px 1px 16px;
+    background: #f2f3f5;
+    border-radius: 8px;
+    border: 1px solid #eee;
+    margin-bottom: 20px;
+}
 </style>

+ 613 - 0
src/main/vue/src/components/PackageEdit2.vue

@@ -0,0 +1,613 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="90px"
+            label-position="right"
+            size="small"
+            style="max-width: 800px;"
+        >
+            <el-form-item prop="attractionsId" label="景区">
+                <el-select
+                    v-model="formData.attractionsId"
+                    clearable
+                    filterable
+                    placeholder="请选择景区"
+                    class="select-width"
+                >
+                    <el-option
+                        v-for="item in attractionsOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="name" label="套餐标题">
+                <el-input v-model="formData.name" class="input-title"></el-input>
+            </el-form-item>
+            <el-form-item prop="title" label="副标题">
+                <el-input v-model="formData.title" class="input-title"></el-input>
+            </el-form-item>
+            <el-form-item prop="img" label="图">
+                <multi-upload v-model="formData.img"></multi-upload>
+            </el-form-item>
+            <el-form-item prop="tag" label="套餐标签">
+                <el-tag
+                    :key="i"
+                    v-for="(tag, i) in formData.tag"
+                    closable
+                    :disable-transitions="false"
+                    @close="removeTag(i)"
+                    size="medium"
+                >
+                    {{ tag }}
+                </el-tag>
+                <el-input
+                    class="input-new-tag"
+                    v-if="inputVisible"
+                    v-model="inputValue"
+                    ref="saveTagInput"
+                    size="small"
+                    @keyup.enter.native="handleInputConfirm"
+                    @blur="handleInputConfirm"
+                >
+                </el-input>
+                <el-button v-else class="button-new-tag" size="small" @click="showInput">新建标签</el-button>
+            </el-form-item>
+            <el-form-item prop="repeatedly" label="使用次数">
+                <el-radio-group v-model="formData.repeatedly">
+                    <el-radio :label="false">单次使用</el-radio>
+                    <el-radio :label="true">多次使用</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item prop="originalPrice" label="原价" v-if="stockList.length <= 0">
+                <el-input-number type="number" v-model="formData.originalPrice" class="select-width"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="amount" label="金额" v-if="stockList.length <= 0">
+                <el-input-number type="number" v-model="formData.amount" class="select-width"></el-input-number>
+            </el-form-item>
+            <el-form-item label="规格">
+                <el-button @click="addStockForm">添加规格</el-button>
+                <div v-for="(item, index) in stockList" :key="index">
+                    <div class="spec" v-if="!item.del">
+                        <el-row>
+                            <el-col :span="8">
+                                <span>规格</span>
+                                <el-input placeholder="规格" class="input" v-model="item.specification"></el-input>
+                            </el-col>
+                            <el-col :span="8">
+                                <span>日期</span>
+                                <el-date-picker
+                                    type="date"
+                                    value-format="yyyy-MM-dd"
+                                    placeholder="选择日期"
+                                    class="input"
+                                    v-model="item.day"
+                                >
+                                </el-date-picker>
+                            </el-col>
+                            <el-col :span="8">
+                                <span>库存</span>
+                                <el-input-number
+                                    type="number"
+                                    :min="0"
+                                    class="input"
+                                    v-model="item.inventory"
+                                ></el-input-number>
+                            </el-col>
+                        </el-row>
+                        <el-row>
+                            <el-col :span="8">
+                                <span>原价</span>
+                                <el-input-number
+                                    type="number"
+                                    :min="0"
+                                    class="input"
+                                    v-model="item.originalPrice"
+                                ></el-input-number>
+                            </el-col>
+                            <el-col :span="8">
+                                <span>价格</span>
+                                <el-input-number
+                                    type="number"
+                                    :min="0"
+                                    class="input"
+                                    v-model="item.price"
+                                ></el-input-number>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-button
+                                    class="del"
+                                    type="danger"
+                                    size="small"
+                                    icon="el-icon-delete"
+                                    @click="deleteStockForm(item, index)"
+                                ></el-button>
+                            </el-col>
+                        </el-row>
+                    </div>
+                </div>
+            </el-form-item>
+            <el-form-item prop="categoryId" label="产品类型">
+                <el-select v-model="formData.categoryId" clearable filterable placeholder="请选择" class="select-width">
+                    <el-option
+                        v-for="item in categoryOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="separateDistribution" label="分销模式">
+                <el-switch v-model="formData.separateDistribution"> </el-switch>
+            </el-form-item>
+            <el-form-item prop="personalRatio0" label="直推比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.personalRatio0"
+                    class="select-width"
+                    :max="1"
+                    :min="0"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item>
+            <el-form-item prop="personalRatio1" label="二级比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.personalRatio1"
+                    class="select-width"
+                    :max="1"
+                    :min="0"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item>
+            <el-form-item prop="personalRatio2" label="三级比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.personalRatio2"
+                    class="select-width"
+                    :max="1"
+                    :min="0"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item>
+            <!-- <el-form-item prop="makerRatio" label="创客比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.makerRatio"
+                    class="select-width"
+                    :max="1"
+                    :min="0"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item>
+            <el-form-item prop="generalRatio" label="108将比例" v-if="formData.separateDistribution">
+                <el-input-number
+                    type="number"
+                    v-model="formData.generalRatio"
+                    class="select-width"
+                    :min="0"
+                    :max="1"
+                    :step="0.01"
+                ></el-input-number>
+            </el-form-item> -->
+            <el-form-item label="核销赠送优惠券" prop="couponId">
+                <el-select multiple v-model="formData.couponId" class="select-width">
+                    <el-option v-for="item in coupons" :key="item.id" :label="item.name" :value="item.id">
+                        <span style="float: left">{{ item.name }}</span>
+                        <span style="float: right; color: #8492a6; font-size: 13px">{{ item.attractionsName }}</span>
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="分享海报" prop="poster">
+                <!-- <poster-upload
+                    v-model="formData.poster"
+                    :width="80"
+                    :height="160"
+                    :ratio="[1, 2]"
+                    :imgWidth="224"
+                    key="22"
+                    name="poster"
+                >
+                    <div slot="tips" class="tips">尺寸120x240px</div>
+                </poster-upload> -->
+                <crop-upload v-model="formData.poster"></crop-upload>
+            </el-form-item>
+            <el-form-item label="分享图" prop="smallPoster">
+                <multi-upload v-model="formData.smallPoster"></multi-upload>
+            </el-form-item>
+            <el-form-item prop="detail" label="详情">
+                <rich-text v-model="formData.detail"></rich-text>
+            </el-form-item>
+            <el-form-item prop="detail" label="注意事项">
+                <rich-text></rich-text>
+            </el-form-item>
+            <el-form-item label="活动日期">
+                <el-input></el-input>
+            </el-form-item>
+            <el-form-item label="活动时间">
+                <el-input></el-input>
+            </el-form-item>
+            <el-form-item label="活动地点">
+                <el-input></el-input>
+            </el-form-item>
+            <el-form-item label="活动对象">
+                <el-input></el-input>
+            </el-form-item>
+            <el-form-item label="费用说明">
+                <rich-text></rich-text>
+            </el-form-item>
+            <el-form-item prop="content" label="流程" style="width:800px">
+                <div>
+                    <el-form
+                        v-for="(item, i) in list"
+                        :key="i"
+                        :model="item"
+                        ref="subform"
+                        label-position="right"
+                        label-width="60px"
+                        class="subform"
+                        :rules="subrule"
+                    >
+                        <el-form-item label="时间" prop="name">
+                            <el-input v-model="item.name"></el-input>
+                        </el-form-item>
+                        <el-form-item label="描述" prop="desc">
+                            <el-input v-model="item.desc" :rows="2" type="textarea"></el-input>
+                        </el-form-item>
+                        <el-form-item label="图片" prop="img">
+                            <multi-upload v-model="item.img"></multi-upload>
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button @click="delItem(i)">删除</el-button>
+                        </el-form-item>
+                    </el-form>
+                    <el-button @click="list.push({ name: '', desc: '', img: [] })">添加</el-button>
+                </div>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary" v-if="$route.query.id">保存</el-button>
+                <el-button @click="onSave" :loading="saving" type="primary" v-else>下一步</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'PackageEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.packageId = this.$route.query.id;
+            this.$http
+                .get('package/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+            this.$http.get('/stock/byPackageId', { packageId: this.$route.query.id }).then(res => {
+                this.stockList = res;
+            });
+        }
+        this.$http
+            .post('/attractions/all', { size: 1000, query: { del: false, brand: false } }, { body: 'json' })
+            .then(res => {
+                if (res.content.length > 0) {
+                    res.content.forEach(item => {
+                        this.attractionsOptions.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+        this.$http
+            .post('/category/getChildren', { id: 731 })
+            .then(res => {
+                if (res.length > 0) {
+                    res.forEach(item => {
+                        this.categoryOptions.push({
+                            label: item.name,
+                            value: item.id
+                        });
+                    });
+                }
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+        this.$http
+            .post('/coupon/all', { size: 1000, query: { del: false } }, { body: 'json' })
+            .then(res => {
+                this.coupons = res.content;
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {
+                img: [],
+                tag: [],
+                repeatedly: false,
+                couponId: []
+            },
+            rules: {
+                attractionsId: [
+                    {
+                        required: true,
+                        message: '请选择景区',
+                        trigger: 'blur'
+                    }
+                ],
+                name: [
+                    {
+                        required: true,
+                        message: '请输入套餐名称',
+                        trigger: 'blur'
+                    }
+                ],
+                // amount: [
+                //     {
+                //         required: true,
+                //         message: '请输入金额',
+                //         trigger: 'blur'
+                //     }
+                // ],
+                categoryId: [
+                    {
+                        required: true,
+                        message: '请选择类型',
+                        trigger: 'blur'
+                    }
+                ]
+            },
+            typeOptions: [
+                { label: '团队', value: 'TEAM' },
+                { label: '个人', value: 'PERSONAL' }
+            ],
+            inputVisible: false,
+            inputValue: '',
+            attractionsOptions: [],
+            categoryOptions: [],
+            stockList: [],
+            packageId: 0,
+            coupons: [],
+            list: [],
+            subrule: {}
+        };
+    },
+    computed: {
+        saveOtherJson() {
+            const stockList = [...this.stockList]
+                .filter(item => {
+                    return !!item.inventory > 0 || item.price > 0 || !!item.specification;
+                })
+                .map(item => {
+                    return {
+                        ...item,
+                        packageId: this.packageId
+                    };
+                });
+            return JSON.stringify(stockList);
+        }
+    },
+    methods: {
+        onSave() {
+            // this.$refs.form.validate(valid => {
+            //     if (valid) {
+            //         this.submit();
+            //     } else {
+            //         return false;
+            //     }
+            // });
+            Promise.all(this.$refs.subform.map(i => i.validate())).then(() => {
+                this.$refs.form.validate(valid => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            this.saving = true;
+            this.$http
+                .post('/package/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    // this.$message.success('成功');
+                    this.packageId = res.id;
+                    this.$nextTick(() => {
+                        this.$http.post('/stock/batchSave', {
+                            stocks: this.saveOtherJson
+                        });
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    });
+                    this.$emit('next', 'second');
+                    this.$router.replace({
+                        name: 'PackageEdit',
+                        query: {
+                            id: res.id,
+                            attractionsId: res.attractionsId
+                        }
+                    });
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/package/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        removeTag(i) {
+            this.formData.tag.splice(i, 1);
+        },
+        showInput() {
+            this.inputVisible = true;
+            this.$nextTick(_ => {
+                this.$refs.saveTagInput.$refs.input.focus();
+            });
+        },
+        handleInputConfirm() {
+            let inputValue = this.inputValue;
+            if (inputValue) {
+                this.formData.tag.push(inputValue);
+            }
+            this.inputVisible = false;
+            this.inputValue = '';
+        },
+        addStockForm() {
+            this.stockList.push({
+                specification: '',
+                day: '',
+                price: 0,
+                inventory: 0
+            });
+        },
+        deleteStockForm(info, index) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'warning' })
+                .then(() => {
+                    const stockList = [...this.stockList];
+                    if (info.id) {
+                        info.del = true;
+                        stockList[index] = info;
+                    } else {
+                        stockList.splice(index, 1);
+                    }
+                    this.stockList = stockList;
+                    this.$message.success('删除成功');
+                })
+                .catch(e => {});
+        },
+        delItem(i) {
+            this.list.splice(i, 1);
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.el-tag + .el-tag {
+    margin-left: 10px;
+}
+.button-new-tag {
+    margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+}
+.input-new-tag {
+    width: 100px;
+    margin-left: 10px;
+    vertical-align: bottom;
+}
+.input-title {
+    width: 350px;
+}
+.select-width {
+    width: 350px;
+}
+.spec {
+    margin-top: 15px;
+    background-color: #f7f7f7;
+    padding: 20px 20px 15px 20px;
+    span {
+        font-size: 13px;
+        color: #565b66;
+        line-height: 16px;
+        padding: 0 15px 0 15px;
+    }
+    .input {
+        width: 180px;
+        margin: 0 10px 5px 0;
+    }
+    .el-button {
+        height: 34px;
+        border-width: 0;
+        margin-top: 23px;
+
+        &.del {
+            width: 34px;
+            padding: 9px 5px;
+            font-size: 16px;
+        }
+    }
+}
+.stock {
+    display: flex;
+    align-items: center;
+    margin-top: 20px;
+    .name {
+        width: 200px;
+    }
+    .name2 {
+        width: 180px;
+    }
+
+    .value {
+        width: 180px;
+    }
+
+    span {
+        font-size: 12px;
+        color: #565b66;
+        line-height: 16px;
+        padding: 0 20px 0 20px;
+    }
+
+    .el-button {
+        height: 36px;
+        border-width: 0;
+
+        &.del {
+            width: 36px;
+            padding: 9px 5px;
+            font-size: 16px;
+            margin-left: 10px;
+        }
+    }
+}
+.subform {
+    padding: 16px 16px 1px 16px;
+    background: #f2f3f5;
+    border-radius: 8px;
+    border: 1px solid #eee;
+    margin-bottom: 20px;
+}
+</style>

+ 96 - 0
src/main/vue/src/components/SimpleRichText.vue

@@ -0,0 +1,96 @@
+<template>
+    <tinymce-editor :init="init" :value="value" @input="onInput"> </tinymce-editor>
+</template>
+<script>
+import Editor from '@tinymce/tinymce-vue';
+import tinymce from 'tinymce/tinymce';
+import './zh_CN';
+import 'tinymce/themes/silver';
+import 'tinymce/plugins/advlist';
+import 'tinymce/plugins/autolink';
+import 'tinymce/plugins/lists';
+import 'tinymce/plugins/link';
+import 'tinymce/plugins/image';
+import 'tinymce/plugins/charmap';
+import 'tinymce/plugins/print';
+import 'tinymce/plugins/preview';
+import 'tinymce/plugins/anchor';
+import 'tinymce/plugins/textcolor';
+import 'tinymce/plugins/searchreplace';
+import 'tinymce/plugins/visualblocks';
+import 'tinymce/plugins/code';
+import 'tinymce/plugins/fullscreen';
+import 'tinymce/plugins/insertdatetime';
+import 'tinymce/plugins/media';
+import 'tinymce/plugins/table';
+import 'tinymce/plugins/contextmenu';
+import 'tinymce/plugins/paste';
+import 'tinymce/plugins/code';
+import 'tinymce/plugins/help';
+import 'tinymce/plugins/imagetools';
+import 'tinymce/skins/ui/oxide/skin.css';
+import 'tinymce/icons/default/index';
+
+export default {
+    props: ['value', 'disabled'],
+    created() {},
+    data() {
+        return {
+            init: {
+                language: 'zh_CN',
+                skin: 'oxide-dark',
+                menubar: false,
+                branding: false,
+                statusbar: false,
+                height: 300,
+                toolbar: '',
+                plugins: [
+                    'advlist autolink lists link image charmap print preview anchor textcolor',
+                    'searchreplace visualblocks code fullscreen',
+                    'insertdatetime media table contextmenu paste code help imagetools'
+                ],
+                imagetools_cors_hosts: ['localhost', '192.168.50.210:8081', 'aliyuncs.com'],
+                imagetools_credentials_hosts: ['aliyuncs.com'],
+                images_upload_url: this.$baseUrl + '/upload/file',
+                images_upload_handler: (blobInfo, success, failure) => {
+                    let formData = new FormData();
+                    formData.append('file', blobInfo.blob(), blobInfo.filename());
+                    this.$axios
+                        .post('/upload/file', formData)
+                        .then(res => {
+                            success(res.data);
+                        })
+                        .catch(e => {
+                            failure(e);
+                        });
+                },
+                init_instance_callback: editor => {
+                    this.editor = editor;
+                },
+                image_class_list: [{ title: '默认', value: 'rich-text-img-default' }],
+                fontsize_formats:
+                    '10pt 11pt 12pt 13pt 14pt 15pt 16pt 17pt 18pt 19pt 20pt 21pt 22pt 23pt 24pt 25pt 26pt 27pt 28pt 29pt 30pt 31pt 32pt 33pt 34pt 35pt 36pt 37pt 38pt 39pt'
+            },
+            editor: null,
+            content: ''
+        };
+    },
+    methods: {
+        onInput(val) {
+            this.$emit('input', val);
+        }
+    },
+    watch: {},
+    components: {
+        'tinymce-editor': Editor // <- Important part
+    }
+};
+</script>
+<style lang="less" scoped>
+.preview {
+    overflow: auto;
+    border: 1px solid #ebebeb;
+    background-color: #fbfdff;
+    border-radius: 4px;
+}
+</style>

+ 2 - 0
src/main/vue/src/main.js

@@ -11,6 +11,7 @@ import SingleUpload from '@/components/SingleUpload';
 import FileUpload from '@/components/FileUpload';
 import VideoUpload from '@/components/VideoUpload';
 import RichText from '@/components/RichText';
+import SimpleRichText from '@/components/SimpleRichText';
 import CropUpload from '@/components/CropUpload';
 import DistrictChoose from '@/components/DistrictChoose';
 import PosterUpload from '@/components/PosterUpload';
@@ -51,6 +52,7 @@ Vue.component('single-upload', SingleUpload);
 Vue.component('file-upload', FileUpload);
 Vue.component('video-upload', VideoUpload);
 Vue.component('rich-text', RichText);
+Vue.component('simple-rich-text', SimpleRichText);
 Vue.component('crop-upload', CropUpload);
 Vue.component('district-choose', DistrictChoose);
 Vue.component('poster-upload', PosterUpload);

+ 4 - 4
src/main/vue/src/views/PackageEdit.vue

@@ -4,15 +4,15 @@
             <el-tab-pane label="套餐信息" name="first">
                 <PackageEdit @next="goNext" />
             </el-tab-pane>
-            <el-tab-pane label="套餐内容" :disabled="!id" name="second">
+            <!-- <el-tab-pane label="套餐内容" :disabled="!id" name="second">
                 <PackageGoodsTable ref="setGoodsList" />
-            </el-tab-pane>
+            </el-tab-pane> -->
         </el-tabs>
     </div>
 </template>
 <script>
 import PackageEdit from '../components/PackageEdit';
-import PackageGoodsTable from '../components/PackageGoodsTable';
+// import PackageGoodsTable from '../components/PackageGoodsTable';
 
 export default {
     name: 'PackageMain',
@@ -63,7 +63,7 @@ export default {
         }
     },
     components: {
-        PackageGoodsTable,
+        // PackageGoodsTable,
         PackageEdit
     },
     watch: {

+ 2 - 1
src/main/vue/src/views/PackageList.vue

@@ -49,7 +49,8 @@
                     ></el-image>
                 </template>
             </el-table-column>
-            <el-table-column prop="tag" label="套餐标签" show-overflow-tooltip> </el-table-column>
+            <el-table-column prop="sale" label="销量"> </el-table-column>
+            <el-table-column prop="inventory" label="库存"> </el-table-column>
             <el-table-column prop="amount" label="金额(元)"> </el-table-column>
             <!-- <el-table-column prop="detail" label="详情"> </el-table-column> -->
             <!-- <el-table-column prop="type" label="套餐类型" :formatter="typeFormatter"> </el-table-column> -->