4 Commits 661749a5f5 ... 3d864f5a3e

Tác giả SHA1 Thông báo Ngày
  LaveyD 3d864f5a3e 下单打印票联调 1 tháng trước cách đây
  LaveyD fc19335069 sort 1 tháng trước cách đây
  LaveyD d3285d0e1c 排序 1 tháng trước cách đây
  LaveyD fa11c849dd bug修改 1 tháng trước cách đây

+ 5 - 5
src/api/systemConfig.js

@@ -23,7 +23,7 @@ export function getPayChannel () {
     }
   }).then(res => {
     let item = res.data.find(item => item.configKey === 'payChannel')
-    return item.configValue.split(',')
+    return item?.configValue?.split(',') || []
   })
 }
 
@@ -35,7 +35,7 @@ export function getCustomerType () {
     }
   }).then(res => {
     let item = res.data.find(item => item.configKey === 'customerType')
-    return item.configValue.split(',')
+    return item?.configValue?.split(',') || []
   })
 }
 
@@ -47,7 +47,7 @@ export function getTravelAgencyType () {
     }
   }).then(res => {
     let item = res.data.find(item => item.configKey === 'travel_agency_type')
-    return item.configValue.split(',')
+    return item?.configValue?.split(',') || []
   })
 }
 
@@ -60,8 +60,8 @@ export function getManualTicketCheckScenic () {
     }
   }).then(res => {
     let item = res.data.find(item => item.configKey === 'manual_ticket_check_scenic')
-    console.log('系统配置里的人工检票是否开启景点选择:', JSON.stringify(item), 'Y/N:', item.configValue)
+    console.log('系统配置里的人工检票是否开启景点选择:', JSON.stringify(item), 'Y/N:', item?.configValue)
     /* item.configValue.split(',') 为 [1] 这种数组, item.configValue为1或9 */
-    return item.configValue /* 1 or 0 */
+    return item?.configValue /* 1 or 0 */
   })
 }

+ 35 - 39
src/components/PrintTemplate.vue

@@ -46,7 +46,7 @@
           :style="elementStyle.singlePrice">
           <i style="font-size:0.8em; font-style:normal">{{ elementStyle.singlePrice&&elementStyle.singlePrice.format }}</i> ¥ {{ currentTicket.isPrint_price_active ? currentTicket.print_price : $NP.divide(currentTicket.price, currentTicket.checkNum) }} <span v-if="showUnit">元</span>
         </span>
-         -->
+        -->
 
         <!-- 三河古镇定制:线上订单也打印价格 -->
         <template v-if="'三河古镇' === scenicName">
@@ -79,14 +79,14 @@
           </span>
         </template>
 
-        <div :style="elementStyle.orderId">
-          {{ elementStyle.orderId&&elementStyle.orderId.format || '订单号:' }}{{ currentTicket.orderNo }}
+        <div :style="elementStyle.orderNo">
+          {{ elementStyle.orderNo&&elementStyle.orderNo.format || '订单号:' }}{{ currentTicket.orderNo }}
         </div>
 
         <div
-          :style="elementStyle.seller"
-          v-if="currentTicket.manager_name">
-          售票员:{{ currentTicket.manager_name }}
+          :style="elementStyle.saleAdminName"
+          v-if="currentTicket.saleAdminName">
+          售票员:{{ currentTicket.saleAdminName }}
         </div>
 
         <div
@@ -97,25 +97,18 @@
         </div>
 
         <div
-          :style="elementStyle.agency"
+          :style="elementStyle.teamName"
           v-if="currentTicket.travelAgencyName">
-          {{ elementStyle.agency&&elementStyle.agency.format||'旅行社:' }} {{ currentTicket.travelAgencyName }}
+          {{ elementStyle.teamName&&elementStyle.teamName.format||'旅行社:' }} {{ currentTicket.travelAgencyName }}
         </div>
 
         <div :style="elementStyle.ticketId">
-          {{ elementStyle.ticketId&&elementStyle.ticketId.format || '票号:' }}{{ currentTicket.qrcode }}
-          <!-- {{ elementStyle.ticketId&&elementStyle.ticketId.format || '票号:' }}{{ '大陈岛景区' !== scenicName ? currentTicket.qrcode : currentTicket.id }} -->
-        </div>
-        <!-- 大陈岛定制的打印连续序列号 -->
-        <div
-          :style="elementStyle.ticketSeqId"
-          v-if="'大陈岛景区' === scenicName">
-          {{ elementStyle.ticketSeqId&&elementStyle.ticketSeqId.format || '序列号:' }}{{ currentTicket.id }}
+          {{ elementStyle.ticketId&&elementStyle.ticketId.format || '票号:' }}{{ currentTicket.ticketNo }}
         </div>
         <div
           :style="elementStyle.createTime"
           v-if="currentTicket.createTime">
-          {{ elementStyle.createTime&&elementStyle.createTime.format || '出票时间:' }}{{ currentTicket.createTime }}
+          {{ elementStyle.createTime&&elementStyle.createTime.format || '出票时间:' }}{{ currentTicket.buyTime }}
         </div>
 
         <div :style="elementStyle.scenics">
@@ -127,20 +120,20 @@
             <template v-if="elementStyle.scenic.number==='0'">
               <span
                 style="margin-right:5px"
-                v-for="(item,index) in currentTicket.ticketScenic"
+                v-for="(item,index) in scenicList"
                 :key="index">
-                {{ item.scenic_name }} {{ item.checkLimitTimes }}次<span v-if="index!==(currentTicket.ticketScenic.length-1)">,</span>
+                {{ item.scenicName }} {{ item.checkLimitTimes }}次<span v-if="index!==(scenicList.length-1)">,</span>
               </span>
             </template>
             <template v-else>
               <span
                 style="margin-right:5px"
-                v-for="(item,index) in currentTicket.ticketScenic.slice(0,elementStyle.scenic.number||2)"
+                v-for="(item,index) in scenicList.slice(0,elementStyle.scenic.number||2)"
                 :key="index">
-                {{ item.scenic_name }} {{ item.checkLimitTimes }}次<span v-if="elementStyle.scenic.number>currentTicket.ticketScenic.length?index!==(currentTicket.ticketScenic.length-1):index!==(elementStyle.scenic.number||2)-1">,</span>
+                {{ item.scenicName }} {{ item.checkLimitTimes }}次<span v-if="elementStyle.scenic.number>scenicList.length?index!==(scenicList.length-1):index!==(elementStyle.scenic.number||2)-1">,</span>
               </span>
 
-              <span v-if="elementStyle.scenic.number<currentTicket.ticketScenic.length">...(多景点门票)</span>
+              <span v-if="elementStyle.scenic.number<scenicList.length">...(多景点门票)</span>
             </template>
           </div>
         </div>
@@ -156,20 +149,20 @@
             <td>票号:</td>
             <td>{{ currentTicket.qrcode }}</td>
           </tr>
-          <tr v-if="currentTicket.ticketScenic && currentTicket.ticketScenic.length>0">
-            <td>{{ currentTicket.ticketScenic[0].scenic_name }}</td>
+          <tr v-if="scenicList && scenicList.length>0">
+            <td>{{ scenicList[0].scenicName }}</td>
             <td>
-              可检 {{ currentTicket.ticketScenic[0].checkLimitTimes }} 次
-              单次可过人数: {{ currentTicket.ticketScenic[0].single_pass_times }} 人 <br>
-              <span v-if="currentTicket.ticketScenic.length>1">
+              可检 {{ scenicList[0].checkLimitTimes }} 次
+              单次可过人数: {{ scenicList[0].single_pass_times }} 人 <br>
+              <span v-if="scenicList.length>1">
                 (多景点门票)
               </span>
             </td>
           </tr>
         </table> -->
 
-        <div :style="elementStyle.ticketTitle">
-          {{ elementStyle.ticketTitle&&elementStyle.ticketTitle.format || '' }}{{ currentTicket.tname }}
+        <div :style="elementStyle.ticketTypeName">
+          {{ elementStyle.ticketTypeName&&elementStyle.ticketTypeName.format || '' }}{{ currentTicket.ticketTypeName }}
         </div>
 
         <div
@@ -191,7 +184,7 @@
             {{ elementStyle.invoiceQrcode&&elementStyle.invoiceQrcode.format }}
           </div>
         </div>
-         -->
+        -->
         <!-- 不需要再设置display,否则它会覆盖elementStyle里设置的display -->
         <div
           v-if="currentTicket.invoiceQrcode"
@@ -260,9 +253,9 @@
         </div>
 
         <div
-          :style="elementStyle.batch"
+          :style="elementStyle.batchConfigName"
           v-if="currentTicket.batchConfigName">
-          {{ elementStyle.batch&&elementStyle.batch.format||'场次:' }}{{ currentTicket.batchConfigName }}
+          {{ elementStyle.batchConfigName&&elementStyle.batchConfigName.format||'场次:' }}{{ currentTicket.batchConfigName }}
         </div>
 
         <div
@@ -319,9 +312,9 @@
         </div>
 
         <div
-          :style="elementStyle.batch"
+          :style="elementStyle.batchConfigName"
           v-if="currentTicket.batchConfigName">
-          {{ elementStyle.batch&&elementStyle.batch.format||'场次:' }}{{ currentTicket.batchConfigName }}
+          {{ elementStyle.batchConfigName&&elementStyle.batchConfigName.format||'场次:' }}{{ currentTicket.batchConfigName }}
         </div>
 
         <div
@@ -337,7 +330,7 @@
         </div>
 
         <div :style="elementStyle.checkNum">
-          {{ elementStyle.checkNum&&elementStyle.checkNum.format||'检票人数:' }}{{ currentTicket.person_number }} 人
+          {{ elementStyle.checkNum&&elementStyle.checkNum.format||'检票人数:' }}{{ currentTicket.checkNum }} 人
         </div>
 
         <div :style="elementStyle.remark">
@@ -375,9 +368,12 @@ export default {
       }
       return this.customStyle ? style : null
     },
+    scenicList () {
+      return this.currentTicket?.ticketScenic || this.currentTicket?.ticketCheckScenicList || []
+    },
     scenics () {
       if (this.currentTicket) {
-        const scenics = this.currentTicket.ticketScenic.map(i => i.scenic_name)
+        const scenics = this.scenicList.map(i => i.scenicName)
         return scenics.join(' - ')
       } else {
         return ''
@@ -410,7 +406,7 @@ export default {
     },
     currentTicket: {
       type: Object,
-      default: () => {}
+      default: () => ({})
     }
   },
   methods: {
@@ -472,8 +468,8 @@ export default {
             }
           }
 
-          if (this.currentTicket.qrcode) {
-            this.qrImg = await QRCode.toDataURL(this.currentTicket.qrcode, opts)
+          if (this.currentTicket.ticketNo) {
+            this.qrImg = await QRCode.toDataURL(this.currentTicket.ticketNo, opts)
           }
 
           if (this.currentTicket.invoiceQrcode) {

+ 4 - 3
src/components/SmallTicketPrintTemplate.vue

@@ -101,7 +101,7 @@ export default {
   methods: {
     startPrint () {
       const webview = document.querySelector('#printSmallTicketWebview')
-      let printDoc = this.$refs.printMe.outerHTML
+      let printDoc = this.$refs.printMe?.outerHTML
       if (this.preview) {
         console.log(printDoc)
         // return
@@ -125,7 +125,7 @@ export default {
     getOrderInfo () {
       const orderInfo = []
 
-      this.currentOrder.tickets.forEach(ticket => {
+      this.currentOrder.ticketList.forEach(ticket => {
         let target = orderInfo.find(i => i.ticketTypeId === ticket.ticketTypeId)
 
         if (target) {
@@ -140,7 +140,7 @@ export default {
 
       this.orderInfo = orderInfo
 
-      const { performName, batchConfigName, ticket_price_plan_name } = this.currentOrder.tickets[0]
+      const { performName, batchConfigName, ticket_price_plan_name } = this.currentOrder.ticketList[0]
 
       this.currentOrder.createTime = moment(this.currentOrder.createTime).format('YYYY-MM-DD HH:mm:ss')
 
@@ -156,6 +156,7 @@ export default {
     printTemplate: {
       handler (val) {
         if (val) {
+          console.log('printTemplate', val)
           this.customStyle = val
         }
       },

+ 16 - 6
src/globalData.vue

@@ -14,8 +14,8 @@ export default {
   created () {
     getIp()
     // 获取打印模板
-    // this.getReceiptPrintModel()
-    // this.getTicketPrintModelList()
+    this.getReceiptPrintModel()
+    this.getTicketPrintModelList()
 
     this.$store.dispatch('setTravelAgencyType')
 
@@ -56,11 +56,16 @@ export default {
         content: ''
       }
       getTicketPrintModelList(params).then(res => {
-        const list = res.data.records
+        const list = res.data.records || []
         let id = this.$localStore.get('defaultTemplate')
-        let target = list.find(i => i.id === id)
+        let target = id ? list.find(i => i.id === id) : list.find(i => i.isDefault)
         // 设置当前打印模板
         this.$store.commit('SET_PRINT_TEMPLATE', target ? JSON.parse(target.content) : whitePaper)
+
+        if (target) {
+          this.$localStore.set('defaultTemplate', target.id)
+        }
+
         // 设置打印模板列表
         list.length > 0 && this.$store.commit('SET_PRINT_TEMPLATE_LIST', list)
       })
@@ -68,10 +73,15 @@ export default {
     getReceiptPrintModel () {
       getReceiptPrintModel().then(res => {
         let id = this.$localStore.get('defaultSmallTicketTemplate')
-        const list = res.data.records
-        let target = list.find(i => i.id === id)
+        const list = res.data.records || []
+        let target = id ? list.find(i => i.id === id) : list.find(i => i.isDefault)
         // 设置当前打印模板
         target && this.$store.commit('SET_SMALL_TICKET_TEMPLATE', target ? JSON.parse(target.content) : defaultSmallTicket)
+
+        if (target) {
+          this.$localStore.set('defaultSmallTicketTemplate', target.id)
+        }
+
         // 设置打印模板列表
         list.length > 0 && this.$store.commit('SET_SMALL_TICKET_TEMPLATE_LIST', res.list)
       })

+ 1 - 1
src/main.js

@@ -143,7 +143,7 @@ Vue.mixin({
     transformUrl () {
       const configs = this.$store.state.app.systemConfig || []
       const item = configs.find(i => i.configKey === 'reportfile_url_serverip_replace') || {}
-      const value = item.configValue
+      const value = item?.configValue
       console.log('reportfile_url_serverip_replace', value, typeof value)
       return value === '1'
     }

+ 12 - 6
src/pages/queryReport/salesQuery.vue

@@ -241,11 +241,15 @@
         >
           搜索
         </el-button>
-        <el-button
-          type="primary"
-          @click="reportExport">
-          导出
-        </el-button>
+        <el-dropdown @command="reportExport" style="margin-left: 10px;">
+          <el-button type="primary">
+            导出<i class="el-icon-arrow-down el-icon--right"></i>
+          </el-button>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item command="order">订单级别</el-dropdown-item>
+            <el-dropdown-item command="ticket">门票级别</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
 
         <i class="el-icon-setting" style="cursor: pointer; margin-left: 10px;" title="设置显示列" @click="showColumnConfig" />
       </div>
@@ -1974,7 +1978,7 @@ export default {
       })
       this.reset()
     },
-    reportExport () {
+    reportExport (exportType) {
       this.$confirm(`是否要导出明细数据`, '确认提示', {
         confirmButtonText: '是',
         cancelButtonText: '否',
@@ -1982,12 +1986,14 @@ export default {
       }).then(() => {
         this.handleExport({
           ...this.form,
+          exportType: exportType || 'ticket',
           export: true,
           exportDetail: true
         })
       }).catch(() => {
         this.handleExport({
           ...this.form,
+          exportType: exportType || 'ticket',
           export: true,
           exportDetail: false
         })

+ 13 - 7
src/pages/sellManage/common/TicketList.vue

@@ -123,6 +123,7 @@
           </i>
         </el-input>
         <el-button
+          v-if="category !== 'batch'"
           size="small"
           class="sort-btn"
           icon="el-icon-sort"
@@ -221,7 +222,7 @@
 </template>
 
 <script>
-import { getTicketTypeList, getTicketTypeByDate, getTicketTypeSort, saveTicketTypeSort } from '@/api/ticketType'
+import { getTicketTypeList, getTicketTypeByDate, saveTicketTypeSort } from '@/api/ticketType'
 import draggable from 'vuedraggable'
 import { getBatchList } from '@/api/batch'
 import moment from 'moment'
@@ -396,8 +397,11 @@ export default {
       if (this.category === 'batch') {
         this.getBatchList()
       } else {
-        this.changeTicket(this.currentTicket)
+        // this.changeTicket(this.currentTicket)
       }
+
+      this.currentTicket = {}
+      this.$emit('update', null)
     })
   },
   methods: {
@@ -428,7 +432,9 @@ export default {
         isSale: 1,
         pageSize: 1000,
         ticketTypeName: '',
-        category: this.ticketType
+        orderBy: true,
+        category: this.ticketType,
+        sortType: this.sortType
       }
       // 根据售票类型筛选团散票种:(散客)筛选0和1,(团队)筛选0和2
       if (this.ticketType === 'ticket') {
@@ -469,7 +475,7 @@ export default {
                 batchConfigId: this.currentBatch.batchConfigId
               }
             })
-            this.changeTicket(this.tableData[0])
+            // this.changeTicket(this.tableData[0])
             this.$emit('set-batch', this.currentBatch)
           }
         }
@@ -639,10 +645,10 @@ export default {
       this.sortDialogVisible = true
       this.sortLoading = true
       try {
-        const sortRes = await getTicketTypeSort(this.sortType)
-        const sortData = sortRes?.data || []
+        // const sortRes = await getTicketTypeSort(this.sortType)
+        // const sortData = sortRes?.data || []
         // 用排序接口的顺序排列 tableData
-        const sortMap = new Map(sortData.map(s => [s.ticketTypeId, s.sort]))
+        const sortMap = new Map(this.tableData.map(s => [s.ticketTypeId, s.sort]))
         this.sortList = [...this.tableData]
           .map(item => ({
             ticketTypeId: item.id,

+ 13 - 21
src/pages/sellManage/retail/FormInfo.vue

@@ -269,12 +269,6 @@ export default {
     ReaderInput
   },
   computed: {
-    category () {
-      return this.$route.meta.category || 'ticket'
-    },
-    isTeam () {
-      return this.$route.meta.type === 'team'
-    },
     totalPrice () {
       if (!this.currentTicket) {
         return 0
@@ -306,7 +300,12 @@ export default {
     }
   },
   data () {
+    const category = this.$route.meta.category || 'ticket'
+    const type = this.$route.meta.type
+    console.log('category', category, type)
     return {
+      category,
+      isTeam: type === 'team',
       loading: false,
       keyControl: 2, // 键盘控制:1,2,3标识选中顺序
       isFocus: false, // 当前组件是否选中
@@ -315,17 +314,7 @@ export default {
       pricePlan: [],
       currentPrice: 0,
       currentPlan: null,
-      saleType: (() => {
-        const category = this.$route.meta.category || 'ticket'
-        const type = this.$route.meta.type
-        if (category === 'batch') return 'batch'
-        if (category === 'member') return 'member'
-        if (type === 'team') return 'team'
-        return 'single'
-      })(),
       retailLockCheckStyle: (() => {
-        const category = this.$route.meta.category || 'ticket'
-        const type = this.$route.meta.type
         let prefix = 'single'
         if (category === 'batch') prefix = 'batch'
         else if (category === 'member') prefix = 'member'
@@ -333,15 +322,18 @@ export default {
         return this.$localStore.get(`${prefix}_lockCheckStyle`) || false
       })(),
       identifyLockCheckStyle: (() => {
-        const category = this.$route.meta.category || 'ticket'
-        const type = this.$route.meta.type
         let prefix = 'single'
         if (category === 'batch') prefix = 'batch'
         else if (category === 'member') prefix = 'member'
         else if (type === 'team') prefix = 'team'
         return this.$localStore.get(`${prefix}_identifyLockCheckStyle`) || false
       })(),
-
+      saleType: (() => {
+        if (category === 'batch') return 'batch'
+        else if (category === 'member') return 'member'
+        else if (type === 'team') return 'team'
+        else return 'single'
+      })(),
       touristList: [{
         batchConfigId: randomString(),
         guestName: '',
@@ -361,7 +353,7 @@ export default {
         buyerIdentifyType: 0,
         buyerPhone: '',
         groupIndividual: 1,
-        teamIndividual: 1,
+        teamIndividual: type === 'team' ? 2 : 1,
         count: this.$localStore.get('initNum') === '空' ? undefined : 1,
         payChannel: '现金',
         playDateBegin: new Date(moment().startOf('day').valueOf()),
@@ -369,7 +361,7 @@ export default {
         price: 0,
         teamId: '',
         guideId: '',
-        checkWay: this.isTeam ? 2 : 1,
+        checkWay: type === 'team' ? 2 : 1,
         actualMoney: 0 // 实付金额,不需要传给后台
       },
       Certificate: {

+ 1 - 1
src/store/modules/permission.js

@@ -18,7 +18,7 @@ function filterAsyncRouter (asyncRouterMap, menuList, permissionList) {
         // 过滤子路由
         route.children = route.children.filter(i => {
           if (i.meta && i.meta.permissionName) {
-            return permissionCodes.find((code) => i.meta.permissionName.indexOf(code) > -1)
+            return permissionCodes.find((code) => i.meta.permissionName.indexOf(`:${code}`) > -1)
           } else {
             return true
           }