LaveyD 3 tháng trước cách đây
mục cha
commit
d6b8709f87

+ 5 - 0
src/api/otaticketsale.js

@@ -92,3 +92,8 @@ export function ksCategoryQuery (poiId, categoryId) {
 export function picUpload (poiId, { data: params }) {
   return http.post(`/otaks/picUpload/${poiId}`, {image_list: params})
 }
+
+// 景点列表
+export function getScenicList () {
+  return http.post('/tenant/otaScenic', { data: {} })
+}

+ 88 - 2
src/views/goodsCenter/priceList/EditDialog.vue

@@ -210,6 +210,67 @@
         </el-date-picker>
       </el-form-item>
 
+      <div class="block-title">
+        添加分账子景点
+      </div>
+      <div>
+        <div class="btn-wrap-left">
+          <el-button
+            plain
+            class="add-btn"
+            type="primary"
+            @click="handleAddScenicSplit">
+            添加
+          </el-button>
+        </div>
+        <div class="table-box">
+          <el-table
+            border
+            stripe
+            :data="form.otaTicketTypeScenicSplitRequests">
+            <el-table-column
+              label="适用景点">
+              <template slot-scope="scope">
+                <el-select
+                  v-model="scope.row.scenicId">
+                  <el-option
+                    v-for="item in scenicList"
+                    :key="item.scenicId"
+                    :label="item.name"
+                    :value="item.scenicId"
+                  >
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="应分金额"
+              min-width="90">
+              <template slot-scope="scope">
+                <el-input-number
+                  controls-position="right"
+                  :min="0"
+                  v-model="scope.row.price"
+                ></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column
+              width="90"
+              class-name="align-item"
+              label="操作">
+              <template slot-scope="scope">
+                <span
+                  class="el-button el-button--primary el-button--small"
+                  @click="delScenicSplit(scope.$index)">
+                  <i class="el-icon-delete"></i>
+                  删除
+                </span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+
     </div>
     <div class="dialog-btn-wrap">
       <el-button @click="reset">重置</el-button>
@@ -221,7 +282,7 @@
 </template>
 
 <script>
-import { addOTATicketSale, updateOTATicketSale } from '@/api/otaTicketSale'
+import { addOTATicketSale, updateOTATicketSale, getScenicList } from '@/api/otaTicketSale'
 import moment from 'moment'
 import { CategoryDict } from '@/const'
 
@@ -274,6 +335,7 @@ export default {
       seatAreaList: [],
       seatAreas: [],
       batches: [],
+      scenicList: [],
       projectName: localStorage.getItem('otaProject'),
       dateOption: {
         disabledDate (theTime) {
@@ -295,7 +357,8 @@ export default {
         useDateStart: moment().format('YYYY-MM-DD'),
         useDateEnd: moment().add(30, 'years').endOf('year').format('YYYY-MM-DD'),
         totalStock: -1, // -1代表不限库存
-        xcRealNameType: ''
+        xcRealNameType: '',
+        otaTicketTypeScenicSplitRequests: []
       },
       showDeletedOption: false,
       deletedOption: {
@@ -310,7 +373,9 @@ export default {
   watch: {
     visible (val) {
       this.reset()
+
       if (val) {
+        this.getScenicList()
         this.showDeletedOption = false
         if (this.dialogType === 'edit' && this.currentItem) {
           this.form = Object.assign({}, this.form, this.currentItem)
@@ -333,12 +398,26 @@ export default {
     }
   },
   methods: {
+    getScenicList () {
+      getScenicList().then(res => {
+        this.scenicList = res.data || []
+      })
+    },
     handleClose () {
       this.$parent.handleClose()
     },
     reset () {
       this.$refs.form.resetFields()
     },
+    handleAddScenicSplit () {
+      this.form.otaTicketTypeScenicSplitRequests.push({
+        scenicId: '',
+        price: 0
+      })
+    },
+    delScenicSplit (index) {
+      this.form.otaTicketTypeScenicSplitRequests.splice(index, 1)
+    },
     submit () {
       this.$refs.form.validate((valid) => {
         if (valid) {
@@ -395,4 +474,11 @@ export default {
     width: 90px;
   }
 }
+.table-box {
+  width: 100%;
+
+  table {
+    width: 100% !important;
+  }
+}
 </style>

+ 66 - 2
src/views/queryReport/checkAndPrintReport.vue

@@ -63,6 +63,24 @@
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item
+          label="分组筛选"
+          style="width:100%">
+          <el-checkbox-group
+            v-model="selectKeys"
+            :min="0"
+            :max="4">
+            <draggable :list="groupKeys">
+              <el-checkbox
+                :key="item.value"
+                :label="item.value"
+                v-for="(item) in groupKeys"
+              >
+                {{ item.label }}
+              </el-checkbox>
+            </draggable>
+          </el-checkbox-group>
+        </el-form-item>
       </el-form>
       <div class="btn-wrap">
         <el-button @click="reset">重置</el-button>
@@ -84,7 +102,14 @@
         :data="tableData"
         stripe
         row-class-name="is-center"
-        v-loading="loading">
+        v-loading="loading"
+        :span-method="objectSpanMethod">
+        <el-table-column
+          v-for="(item) in finalGroup"
+          :key="item.value"
+          :prop="item.prop || item.value"
+          :label="item.label">
+        </el-table-column>
         <el-table-column
           prop="otaSourceName"
           label="订单渠道">
@@ -124,10 +149,15 @@ import { getTicketTypeList } from '@/api/ticketType'
 import { getOtaProjectList } from '@/api/ota'
 import moment from 'moment'
 
+const groupKeys = [
+  { value: 'orderDateDay', label: '日期' }
+]
+
 export default {
   name: 'checkAndPrintReport',
   data () {
     return {
+      groupKeys,
       ticketTypeList: [],
       otaList: [],
       projectName: localStorage.getItem('otaProject'),
@@ -138,8 +168,13 @@ export default {
         otaSourceNameList: [], // 分销商名称
         ticketTypeIdList: [], // 票种名称
         pageNum: 1,
-        pageSize: 10
+        pageSize: 10,
+        groupByList: []
       },
+      selectKeys: [],
+      finalGroup: [],
+      tableIndex: 1,
+      OrderIndexArr: [],
       tableData: [],
       total: 0,
       loading: false,
@@ -215,6 +250,31 @@ export default {
       })
       this.form.export = false
     },
+    objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex < this.finalGroup.length) {
+        if (!(this.OrderIndexArr[columnIndex] && this.OrderIndexArr[columnIndex].length)) return
+
+        for (let i = 0; i < this.OrderIndexArr[columnIndex].length; i++) {
+          let element = this.OrderIndexArr[columnIndex][i]
+          for (let j = 0; j < element.length; j++) {
+            let item = element[j]
+            if (rowIndex === item) {
+              if (j === 0) {
+                return {
+                  rowspan: element.length,
+                  colspan: 1
+                }
+              } else if (j !== 0) {
+                return {
+                  rowspan: 0,
+                  colspan: 0
+                }
+              }
+            }
+          }
+        }
+      }
+    },
     getData () {
       this.loading = true
       if (this.form.checkTimeBegin) {
@@ -229,6 +289,10 @@ export default {
       if (!this.form.ticketTypeIdList || this.form.ticketTypeIdList.length === 0) {
         this.form.ticketTypeIdList = []
       }
+      this.finalGroup = this.groupKeys.filter(i => {
+        return this.selectKeys.includes(i.value)
+      })
+      this.form.groupByList = this.finalGroup.map(i => i.value)
       getCheckAndPrintStatistics(this.form).then(res => {
         res.data.forEach(item => {
           if (item.ticketTypeName === '总计') {

+ 69 - 2
src/views/queryReport/salesReport.vue

@@ -57,6 +57,24 @@
             </el-option>
           </el-select>
         </el-form-item>
+        <el-form-item
+          label="分组筛选"
+          style="width:100%">
+          <el-checkbox-group
+            v-model="selectKeys"
+            :min="0"
+            :max="4">
+            <draggable :list="groupKeys">
+              <el-checkbox
+                :key="item.value"
+                :label="item.value"
+                v-for="(item) in groupKeys"
+              >
+                {{ item.label }}
+              </el-checkbox>
+            </draggable>
+          </el-checkbox-group>
+        </el-form-item>
       </el-form>
       <div class="btn-wrap">
         <el-button
@@ -78,7 +96,14 @@
         :data="tableData"
         stripe
         row-class-name="is-center"
-        v-loading="loading">
+        v-loading="loading"
+        :span-method="objectSpanMethod">
+        <el-table-column
+          v-for="(item) in finalGroup"
+          :key="item.value"
+          :prop="item.prop || item.value"
+          :label="item.label">
+        </el-table-column>
         <el-table-column
           prop="otaSourceName"
           label="订单渠道">
@@ -177,6 +202,10 @@ import TicketInfo from './orderList/TicketInfo'
 import { orderStatus } from '@/const'
 import moment from 'moment'
 
+const groupKeys = [
+  { value: 'orderDateDay', label: '日期' }
+]
+
 export default {
   name: 'salesReport',
   components: {
@@ -187,6 +216,7 @@ export default {
   },
   data () {
     return {
+      groupKeys,
       ticketTypeList: [],
       otaSourceList: [],
       projectName: localStorage.getItem('otaProject'),
@@ -199,8 +229,13 @@ export default {
         otaSourceNameList: [], // 订单渠道
         export: false,
         pageNum: 1,
-        pageSize: 10
+        pageSize: 10,
+        groupByList: []
       },
+      selectKeys: [],
+      finalGroup: [],
+      tableIndex: 1,
+      OrderIndexArr: [],
       orderStatusDic: orderStatus,
       loading: false,
       tableData: [],
@@ -276,12 +311,44 @@ export default {
       if (!this.form.otaSourceNameList) {
         this.form.otaSourceNameList = []
       }
+
+      this.finalGroup = this.groupKeys.filter(i => {
+        return this.selectKeys.includes(i.value)
+      })
+
+      this.form.groupByList = this.finalGroup.map(i => i.value)
+
       this.loading = true
       getOrderStatistics(this.form).then(res => {
         this.tableData = res.data
         this.loading = false
       })
     },
+    objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
+      if (columnIndex < this.finalGroup.length) {
+        if (!(this.OrderIndexArr[columnIndex] && this.OrderIndexArr[columnIndex].length)) return
+
+        for (let i = 0; i < this.OrderIndexArr[columnIndex].length; i++) {
+          let element = this.OrderIndexArr[columnIndex][i]
+          for (let j = 0; j < element.length; j++) {
+            let item = element[j]
+            if (rowIndex === item) {
+              if (j === 0) {
+                return {
+                  rowspan: element.length,
+                  colspan: 1
+                }
+              } else if (j !== 0) {
+                return {
+                  rowspan: 0,
+                  colspan: 0
+                }
+              }
+            }
+          }
+        }
+      }
+    },
     showOrderInfo (item, type) {
       if ((item.otaSourceCode === 'CLEARWX' || item.otaSourceCode === 'CLEARWXDEV') && type === 'cancel') return this.$message.info('自营平台订单请到自营后台办理退票')
       this.currentItem = item