dct 8 ay önce
ebeveyn
işleme
8592406c6b

+ 5 - 0
src/api/order.js

@@ -78,6 +78,11 @@ export function cancelOrder (params) {
   return http.post('/admin/order/cancelOrder', { data: params })
 }
 
+// 门票补打
+export function reprintTicket (params) {
+  return http.post('/admin/order/secondPrintTicket', { data: params })
+}
+
 // 人工检票
 export function checkTickets (params) {
   return http.post('/admin/order/manualCheck', { data: params })

+ 43 - 6
src/components/GlobalComponents/OrderDetail.vue

@@ -140,6 +140,29 @@
             {{ orderData.ticketNum || 0 }}
           </el-form-item>
           <el-table border :data="orderData.ticketList" :max-height="400">
+            <el-table-column type="expand">
+              <template slot-scope="props">
+                <div class="title">检票景点明细</div>
+                <el-table :data="props.row.ticketCheckScenicList" :max-height="200">
+                  <el-table-column
+                    prop="scenicName"
+                    label="景点"
+                  ></el-table-column>
+                  <el-table-column
+                    prop="checkLimitTimes"
+                    label="可检票次数"
+                  >
+                    <template slot-scope="scope">
+                      {{ scope.row.checkLimitTimes === -1 ? "无限制" : scope.row.checkLimitTimes }}
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    prop="checkedTimes"
+                    label="已检票次数"
+                  ></el-table-column>
+                </el-table>
+              </template>
+            </el-table-column>
             <el-table-column width="160" prop="ticketNo" label="票号"> </el-table-column>
             <el-table-column width="100" prop="ticketTypeName" label="票种"> </el-table-column>
             <el-table-column width="80" prop="price" label="票价(¥)">
@@ -186,6 +209,9 @@
         <el-tab-pane class="block-title" label="修改记录" name="orderUpdateLog">
           <el-table border :data="orderData.orderUpdateLogList" :max-height="400">
             <el-table-column prop="updateType" label="修改类型">
+              <template slot-scope="scope">
+                {{ scope.row.updateType | updateTypeFilter }}
+              </template>
             </el-table-column>
             <el-table-column prop="orderNo" label="订单号">
             </el-table-column>
@@ -224,10 +250,6 @@
               prop="checkedTimes"
               label="已检票次数"
             ></el-table-column>
-            <el-table-column
-              prop="createTime"
-              label="创建时间"
-            ></el-table-column>
           </el-table>
           <div class="title">门票检票日志</div>
           <el-table border :data="orderData.ticketCheckLogList" :max-height="200">
@@ -244,14 +266,12 @@
             <el-table-column prop="checkAdminName" label="检票员"> </el-table-column>
             <el-table-column prop="checkerName" label="检票设备名称"> </el-table-column>
             <el-table-column prop="checkTime" label="检票时间"> </el-table-column>
-            <el-table-column prop="createTime" label="创建时间"> </el-table-column>
           </el-table>
         </el-tab-pane>
         <el-tab-pane class="block-title" label="补打信息" name="secondPrintInfo">
           <el-table border :data="orderData.ticketSecondPrintLogList" :max-height="400">
             <el-table-column prop="printAdminName" label="操作人"> </el-table-column>
             <el-table-column prop="printTime" label="操作时间"> </el-table-column>
-            <el-table-column prop="createTime" label="创建时间"> </el-table-column>
           </el-table>
         </el-tab-pane>
       </el-tabs>
@@ -355,6 +375,18 @@ export default {
         default:
           break
       }
+    },
+    updateTypeFilter (input) {
+      switch (input) {
+        case 'updateOrderPayChannel':
+          return '订单修改支付方式'
+        case 'updatePlayDate':
+          return '门票修改游玩日期'
+        case 'updateScenicTimes':
+          return '门票修改检票次数'
+        default:
+          break
+      }
     }
   },
   methods: {
@@ -425,6 +457,11 @@ export default {
 }
 </script>
 
+<style lang="scss">
+.el-table__expanded-cell[class*=cell] {
+  padding: 10px 20px !important;
+}
+</style>
 <style lang="scss" scoped>
 .dialog-info {
   .el-form-item {

+ 121 - 3
src/pages/queryReport/salesQuery.vue

@@ -374,6 +374,13 @@
               @click="showOrderDetail(scope.row)">
               详情
             </el-link>
+            <el-link
+              type="primary"
+              v-if="scope.row.status !== 'CANCELED'"
+              @click="editOrder(scope.row)">
+              修改
+            </el-link>
+            <br>
             <el-link
               type="primary"
               v-if="scope.row.status !== 'CANCELED'"
@@ -389,8 +396,8 @@
             <el-link
               type="primary"
               v-if="scope.row.status !== 'CANCELED'"
-              @click="editOrder(scope.row)">
-              修改
+              @click="secondPrint(scope.row)">
+              补打
             </el-link>
             <!--
             <el-link
@@ -801,6 +808,84 @@
           @click="submitRefundOrder">确定</el-button>
       </span>
     </el-dialog>
+    <el-dialog
+      title="补打"
+      :visible.sync="secondPrintDialogVisible"
+      width="80%"
+      @close="secondPrintDialogVisible=false">
+      <!-- <div class="">
+        <div class="tag">退票金额</div>
+        <el-input-number
+          v-model="refundOrderInfo.cancelPrice"
+          :min="0"
+          :precision="0.01"></el-input-number>
+      </div> -->
+      <el-table
+        border
+        :data="currentOrder.ticketList"
+        @selection-change="handleSelectionChange">
+        <el-table-column
+          type="selection"
+          :selectable="selectable"
+          width="55">
+        </el-table-column>
+        <el-table-column prop="ticketNo" label="票号"> </el-table-column>
+        <el-table-column prop="ticketTypeName" label="票种"> </el-table-column>
+        <el-table-column prop="guestName" label="游客姓名">
+        </el-table-column>
+        <el-table-column prop="guestPhone" label="游客手机号">
+        </el-table-column>
+        <el-table-column prop="guestIdentifyType" label="证件类型">
+          <template slot-scope="scope">
+            {{ papersType[scope.row.guestIdentifyType] }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="guestIdentify" label="证件号码">
+          <template slot-scope="scope">
+            {{ scope.row.guestIdentify }}
+          </template>
+        </el-table-column>
+
+        <el-table-column width="100" prop="checkNum" label="检票人数">
+        </el-table-column>
+
+        <el-table-column width="100" prop="payDateBegin" label="游玩时间">
+          <template slot-scope="scope">
+            {{ scope.row.playDateBegin || scope.row.playDateEnd ? `${scope.row.playDateBegin || ''} - ${scope.row.playDateEnd || ''}` : "无限制" }}
+          </template>
+        </el-table-column>
+        <el-table-column width="80" label="取票状态">
+          <template slot-scope="scope">
+            <el-tag :type="scope.row.isPrint ? 'success' : 'info'">
+              {{ scope.row.isPrint ? "已取票" : "未取票" }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column width="80" label="状态">
+          <template slot-scope="scope">
+            <OrderStatusTag :value="scope.row.status"></OrderStatusTag>
+          </template>
+        </el-table-column>
+        <el-table-column width="80" prop="price" label="小计">
+        </el-table-column>
+        <el-table-column width="80" label="检票景点">
+          <template slot-scope="scope">
+            <el-button
+              v-if="scope.row.ticketListScenic"
+              @click="showDetail(scope.row)"
+            >
+              明细
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer">
+        <el-button @click="secondPrintDialogVisible = false">取消</el-button>
+        <el-button
+          type="primary"
+          @click="submitSecondPrint">确定</el-button>
+      </span>
+    </el-dialog>
     <el-dialog
       title="修改"
       :visible.sync="editOrderDialogVisible"
@@ -943,7 +1028,7 @@
 
 <script>
 /* eslint-disable no-unused-vars */
-import { apiOrderList, pickInvoice, getInvoice, cancelOrder, checkTickets, updateOrder, getSaleChannelList, getSingleOrder } from '@/api/order'
+import { apiOrderList, pickInvoice, getInvoice, cancelOrder, reprintTicket, checkTickets, updateOrder, getSaleChannelList, getSingleOrder } from '@/api/order'
 import { orderStatusDic, ticketStatusDic, channelList, papersType, orderCategories } from '@/assets/staticData'
 import { getPayStatus } from '@/utils/index'
 import Ellipsis from '@/components/Ellipsis'
@@ -1054,6 +1139,11 @@ export default {
         orderId: '',
         ticketIdList: []
       },
+      secondPrintDialogVisible: false,
+      secondPrintInfo: {
+        orderId: '',
+        ticketIdList: []
+      },
       updateTypes: [
         { value: 'updateOrderPayChannel', label: '支付方式' },
         { value: 'updatePlayDate', label: '游玩日期' },
@@ -1256,6 +1346,11 @@ export default {
       this.refundOrderDialogVisible = true
       this.refundOrderInfo.orderId = order.id
     },
+    async secondPrint (order) {
+      await this.getOrderDetail(order)
+      this.secondPrintDialogVisible = true
+      this.secondPrintInfo.orderId = order.id
+    },
     submitRefundOrder () {
       if (!this.multipleSelection?.length) {
         return this.$message.error('请选择退单门票')
@@ -1284,6 +1379,29 @@ export default {
         })
       })
     },
+    submitSecondPrint () {
+      if (!this.multipleSelection?.length) {
+        return this.$message.error('请选择打印门票')
+      }
+
+      this.secondPrintInfo.ticketIdList = this.multipleSelection.map(v => v.id)
+
+      this.$confirm('确定要打印吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        reprintTicket(this.secondPrintInfo).then(res => {
+          if (res.code === '999999') {
+            this.$message.warning(res.msg || '打印失败')
+            return
+          }
+          this.$message.success('打印成功')
+          this.secondPrintDialogVisible = false
+          this.getOrderList()
+        })
+      })
+    },
     async showOrderDetail (order) {
       await this.getOrderDetail(order)
       this.$refs.orderDetail.show(this.currentOrder)

+ 12 - 5
src/pages/ticketSetting/ticket/Dialog.vue

@@ -420,6 +420,7 @@
           >
             <el-input v-model="form.checkVoice">
             </el-input>
+            <el-tag type="warning" style="margin-left: 10px;">如果为空 默认播报票种名称</el-tag>
           </el-form-item>
 
           <el-form-item
@@ -666,6 +667,8 @@
             添加适用景点
           </div>
           <div>
+            <el-tag type="warning" style="margin-left: 10px;">景点检票次数不限制为-1</el-tag>
+
             <div class="btn-wrap-left">
               <el-button
                 plain
@@ -936,11 +939,10 @@ export default {
     //   this.form.price = val && val.capital
     // },
     'form.category' (val) {
-      // 预售会员,价格不可编辑;名字自动填入会员类型名
-      if (val !== 3 && val !== 5) {
-        // this.form.name = ''
-        // this.form.price = 0
-        this.form.memberType = null
+      if (val === 'member') {
+        this.form.useDays = 365
+      } else {
+        this.form.useDays = 1
       }
     },
     // 满x减y
@@ -1140,6 +1142,11 @@ export default {
         // 会员不检查景点
 
         if (valid) {
+          if (this.form.price <= 0) {
+            this.$message.error('请填写销售价格')
+            return
+          }
+
           if (moment(this.form.useDateStart).isAfter(this.form.useDateEnd)) {
             this.$message.error('游玩开始时间不可晚于游玩截止时间')
             return

+ 34 - 12
src/pages/ticketSetting/ticket/PriceCalendar.vue

@@ -2,13 +2,13 @@
   <el-dialog
     :visible.sync="visible"
     title="价格方案"
-    width="780px"
+    width="980px"
     append-to-body
     @close="handleCancel"
   >
     <div
       class="wrap">
-      <el-alert type="warning" :closable="false" title="当前价格优先级:日期段价格 > 周价格 > 日常价格" />
+      <el-alert type="warning" :closable="false" title="当前价格优先级:特定日期 > 周期性规则 > 日常价格" />
       <!-- <div v-loading="loading">
         <div class="block-title">
           基础价格
@@ -38,6 +38,14 @@
               class="priceInput"
               v-model="item.value"
             />
+            <el-switch
+              style="margin-top: 10px"
+              v-model="item.isSale"
+              :inactive-value="0"
+              :active-value="1"
+              active-text="在售"
+              inactive-text="禁售">
+            </el-switch>
           </div>
         </div>
       </div>
@@ -61,7 +69,7 @@
         >
           暂无
         </div>
-        <ul class="priceList">
+        <ul class="price-list">
           <li
             v-for="(item,index) in priceList"
             :key="index"
@@ -78,6 +86,15 @@
               v-model="item.price"
             />
 
+            <el-switch
+              style="margin-top: 10px"
+              v-model="item.isSale"
+              :inactive-value="0"
+              :active-value="1"
+              active-text="在售"
+              inactive-text="禁售">
+            </el-switch>
+
             <el-button
               type="danger"
               icon="el-icon-close"
@@ -151,7 +168,8 @@ export default {
       this.weekDayPriceList = week.map((val, index) => {
         return {
           label: val,
-          value: null
+          value: null,
+          isSale: 1
         }
       })
       getPricePlan({
@@ -171,10 +189,11 @@ export default {
           })
 
           this.priceList = list.filter(l => !l.weekdays).map(l => {
-            const { startDate, endDate, specificDate, price } = l
+            const { startDate, endDate, specificDate, price, isSale } = l
             return {
               dateRange: [moment(specificDate || startDate), moment(specificDate || endDate)],
-              price: price
+              price,
+              isSale
             }
           }).reverse()
         }
@@ -211,25 +230,26 @@ export default {
 
       this.priceList.push({
         ...lastPrice,
-        isEdit: true
+        isEdit: true,
+        isSale: 1
       })
     },
     handleOk () {
       this.confirmLoading = true
-      const { id, isSale } = this.ticketInfo
+      const { id } = this.ticketInfo
       const planList = []
       const weekPriceList = []
       let priority = 0
       const wpList = this.weekDayPriceList.filter(wp => wp.value !== null || wp.value !== undefined)
       wpList.forEach(wp => {
-        const hasPrice = weekPriceList.find(item => wp.value === item.price)
+        const hasPrice = weekPriceList.find(item => wp.value === item.price && wp.isSale === item.isSale)
 
         if (hasPrice) {
           hasPrice.weekdays += `,${weekMap[wp.label]}`
         } else {
           weekPriceList.push({
             ticketTypeId: id,
-            isSale,
+            isSale: wp.isSale,
             priority,
             price: wp.value,
             weekdays: weekMap[wp.label]
@@ -240,7 +260,7 @@ export default {
 
       this.priceList.forEach(item => {
         priority--
-        const { start, end, price } = item
+        const { start, end, price, isSale } = item
         const startDate = moment(start).format('YYYY-MM-DD')
         const endDate = moment(end).format('YYYY-MM-DD')
 
@@ -284,10 +304,12 @@ export default {
 .btn-wrap{
   text-align: right; margin-top: 20px;
 }
-.priceList {
+.price-list {
   font-variant: tabular-nums;
   li {
     margin-bottom: 15px;
+    display: flex;
+    justify-content: space-around;
   }
   .calendarTxt {
     display: inline-block; width: 332px; box-sizing: border-box; padding-right: 30px;margin-right: 20px;text-align: center;