浏览代码

1. 优化

MONSTER-ygh 1 年之前
父节点
当前提交
b0d84d4264

+ 1 - 1
src/utils/request.js

@@ -17,7 +17,7 @@ const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: process.env.VUE_APP_BASE_API,
   // 超时
-  timeout: 20000
+  timeout: 200000
 })
 
 // request拦截器

+ 7 - 0
src/views/device/printer/dialog/dataBox.vue

@@ -35,6 +35,10 @@
           <el-input v-if="type!=3" v-model="form.deviceAddress" placeholder="请输入所在位置" />
           <span v-else>{{ form.deviceAddress }}</span>
         </el-form-item>
+        <el-form-item label="连接IP:" prop="connectIp">
+          <el-input v-if="type!=3" v-model="form.connectIp" placeholder="请输入连接IP" />
+          <span v-else>{{ form.connectIp }}</span>
+        </el-form-item>
         <el-form-item label="设备类型:" prop="deviceType">
           <dict-tag :options="dict.type.device_sys_type" :value="form.deviceType"/>
         </el-form-item>
@@ -81,6 +85,9 @@ export default {
         deviceAddress: [
           { required: true, message: "请输入所在位置", trigger: ["change","blur"] },
         ],
+        connectIp: [
+          { required: true, message: "请输入连接IP", trigger: ["change","blur"] },
+        ]
       },
     };
   },

+ 1 - 0
src/views/device/printer/index.vue

@@ -18,6 +18,7 @@
       <el-table-column label="设备名称" align="center" prop="deviceName" />
       <el-table-column label="设备编码" align="center" prop="deviceNo" />
       <el-table-column label="所在位置" align="center" prop="deviceAddress" />
+      <el-table-column label="连接IP" align="center" prop="connectIp" />
       <el-table-column label="设备类型" align="center" prop="deviceType">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.device_sys_type" :value="scope.row.deviceType"/>

+ 120 - 1
src/views/order/groupBuyingMr/index.vue

@@ -112,6 +112,12 @@
             @click="openDetails(scope.row)"
             v-hasPermi="['groupBuyingMr:groupBuyingMr:details']"
           >详情</el-button>
+          <el-button
+              size="mini"
+              type="text"
+              @click="handleOpen([scope.row])"
+              v-hasPermi="['orderMr:orderMr:print']"
+            >打印小票</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -127,6 +133,24 @@
     <!-- 详情 -->
     <details-dia ref="detailsDia" :dict="dict" @getList="getList"></details-dia>
 
+
+    <el-dialog
+        title="选择小票机"
+        :visible.sync="dialogVisible"
+        width="30%"
+        :before-close="handleClose">
+        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+          <el-form-item label="小票机" prop="region">
+            <el-select v-model="ruleForm.region" placeholder="选择小票机">
+              <el-option :label="item.deviceName" :key="item.id" :value="item.id" v-for="(item,index) in printList"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="dialogVisible = false">取 消</el-button>
+          <el-button type="primary" :loading="dialogVisibleLoading" @click="print(viewerList)">{{ dialogVisibleLoading?'打印中...':'打印' }}</el-button>
+        </span>
+      </el-dialog>
   </div>
 </template>
 
@@ -135,6 +159,8 @@
 import { pageList } from '@/api/order/groupBuyingMr'
 import detailsDia from "./dialog/details.vue";
 
+import { printApi } from '@/api/order/orderMr'
+import { pageList as getPrintListApi } from "@/api/device/pda";
 export default {
   name: "agreement",
   dicts: ['agreement_type', 'team_type'],
@@ -219,7 +245,19 @@ export default {
       ],
       visibleStatus: false,
       newObj: {},
-      visibleType: ''
+      visibleType: '',
+
+
+      viewerList: [],
+        printList: [],
+        dialogVisible: false,
+        ruleForm: {},
+        rules: {
+          region: [
+            { required: true, message: '请选择打印机', trigger: ['change','blur' ]}
+          ],
+        },
+        dialogVisibleLoading: false,
     };
   },
   created() {
@@ -267,6 +305,87 @@ export default {
     openDetails(row, type) {
       this.$refs["detailsDia"].openDialog("详情", row, type);
     },
+    handleOpen(list=[]){
+          if(!list||list.length==0) return
+          let idList = []
+          list.forEach((item,index)=>{
+            idList.push(item.id)
+          }) 
+          this.viewerList = idList
+          this.getPrintListApi()
+          this.$set(this.ruleForm, 'region', '');
+          this.$nextTick(()=>{
+            this.$refs.ruleForm.clearValidate('region')
+          })
+          this.dialogVisible = true
+        },
+        handleClose(){
+          this.dialogVisible = false
+        },
+        /** 查询打印机列表 */
+        getPrintListApi() {
+          getPrintListApi({deviceType:5,pageNum: 1,
+          pageSize: 999,})
+          .then(response => {
+              this.printList = response.data.rows;
+            }
+          );
+        },
+        /**  选择打印机  */
+        selectPrint(){
+
+        },
+        // 打印 
+        async print(list = []){
+          this.$refs.ruleForm.validate(async (valid) => {
+            if (valid) {
+              this.dialogVisibleLoading = true
+              try {
+                let res = await printApi({
+                  viewerList:list,
+                  source: 2,
+                  deviceId: this.ruleForm.region
+                })
+                if(res.code == 200) {
+                  let url = res.data.linkIp
+                  let printInfo = res.data.printInfo
+                  this.connectPrint(url,printInfo)
+                }else {
+                  throw new Error(res)
+                }
+              } catch (error) {
+                this.dialogVisible = false
+                this.dialogVisibleLoading = false
+                console.error("error=====",error)
+              }
+            } else {
+              console.log('error submit!!');
+              return false;
+            }
+          });
+          
+        },
+        /**  连接打印机  */
+        connectPrint(url,data){
+          let xhr = new XMLHttpRequest();
+          xhr.onreadystatechange = ()=>{
+          if(xhr.readyState == 4){ // 监听请求完成
+              if((xhr.status >=200 && xhr.status <300) || xhr.status == 304){
+                console.log(xhr.responseText)
+                this.dialogVisible = false
+                this.dialogVisibleLoading = false
+              }else{
+                console.log('请求失败')
+                this.dialogVisible = false
+                this.dialogVisibleLoading = false
+              }
+            }
+          }
+          xhr.open("post", url, true); // 异步请求
+          xhr.send(JSON.stringify(data));
+
+
+        }
   }
 };
 </script>

+ 2 - 2
src/views/team/ticketMr/index.vue

@@ -37,12 +37,12 @@
       <el-table-column label="座位类型" align="center" prop="seatTypeName" />
       <el-table-column label="销售价" align="center" prop="brokerageTotal">
         <template slot-scope="scope">
-          <span v-if="scope.row.originalSalePrice">¥{{ scope.row.originalSalePrice }}</span>
+          <span v-if="scope.row.originalSalePrice || scope.row.originalSalePrice==0">¥{{ scope.row.originalSalePrice }}</span>
         </template>
       </el-table-column>
       <el-table-column label="团购单价" align="center" prop="withdrawTotal">
         <template slot-scope="scope">
-          <span v-if="scope.row.salePrice">¥{{ scope.row.salePrice }}</span>
+          <span v-if="scope.row.salePrice || scope.row.salePrice==0">¥{{ scope.row.salePrice }}</span>
         </template>
       </el-table-column>
       <el-table-column label="成团人数" align="center" prop="teamPersonNum" />

+ 125 - 17
src/views/ticket/ticketMr/dialog/FreightMgrIndexMi.js

@@ -17,6 +17,8 @@ export default {
                 children: 'zones',
                 isLeaf: 'leaf'
             },
+
+            selectCityListAll: [],
         }
     },
     created() {
@@ -37,8 +39,18 @@ export default {
         selectDeliveryAreaDialogCancel(){
             this.selectDeliveryAreaDialogOpe = false;
         },
+        /**  确认弹窗  */
         selectDeliveryAreaDialogSubmitForm(){
-            
+            let list = []
+            this.selectDeliveryAreaDialogList.forEach((item)=>{
+                if(item.selectCityList && item.selectCityList.length>0) {
+                    item.selectCityList.forEach((item1,index1)=>{
+                        list.push(item.name+'-'+item1.join('-'))
+                    })
+                    
+                }
+            })
+            console.log("list====",list)
         },
         /**  获取行政区划  */
         async basePositionFun(upCode) {
@@ -47,28 +59,124 @@ export default {
                     upCode,
                 })
                 if(res.code == 200) {
-                    this.selectDeliveryAreaDialogList = [].concat(res.data)
+                    let list = []
+                    let listApi = []
+                    res.data.forEach((item,index) => {
+                        if(item.code!='#') {
+                            list.push({
+                                ...item,
+                                countyList: [],
+                                selectCityList: [],
+                                cityList: []
+                            })
+                            listApi.push(basePositionApi({
+                                upCode: item.code?item.code : '#',
+                            }))
+                        }
+                        
+                    });
+                    let res1 = await Promise.all(listApi)
+                    if(res1) {
+                        res1.forEach((item,index)=>{
+                            list[index].cityList = [].concat(item.data)
+                        })
+                    }
+                    
+                    this.selectDeliveryAreaDialogList = [].concat(list)
+                    console.log("res1=====",res1,this.selectDeliveryAreaDialogList)
                 }
             } catch (error) {
                 console.error("error====",error)
             }
         },
+        async basePositionFunCopy(upCode) {
+            try {
+                let res = await basePositionApi({
+                    upCode,
+                })
+                if(res.code == 200) {
+                    return res.data
+                }
+            } catch (error) {
+                return []
+            }
+        },
         loadNode(node, resolve) {
-            if (node.level === 0) {
-              return resolve([{ name: 'region' }]);
+            console.log(node,resolve)
+            // if(){
+
+            // }
+        },
+        /**  展开某个   */
+        urrentEchoedRegionsFun(areaItem){
+            this.urrentEchoedRegions = areaItem.areaCode
+        },
+       
+        handleChangeAreaCity(){
+
+        },
+         /**  懒加载 配置   */
+        areaCascaderProps(areaItem, areaIndex) {
+            return {
+              lazy: true,
+              lazyLoad: (node, resolve) => this.areaLazyLoad(node, resolve, areaItem, areaIndex),
+              multiple: true,
+              children: 'countyList',
+              label: 'name',
+              value: 'name',
+              expandTrigger: 'hover'
+            };
+        },
+        /**  懒加载 函数   */
+        areaLazyLoad(node, resolve, areaItem, provinceIndex) {
+            const { level } = node;
+            console.log(node, resolve, areaItem, provinceIndex)
+            if (level === 0) {
+              resolve([])
+            } else if(level == 1 ) {
+                //console.log(node, resolve, areaItem, provinceIndex)
+                if(node.data && node.data.code){
+                    basePositionApi({
+                        upCode: node.data.code,
+                    }).then((res)=>{
+                        let list = []
+                        //let listLable = []
+                        res.data.forEach((item,index)=>{
+                            //listLable.push([node.label,item.name])
+                            list.push({
+                                ...item,
+                                leaf: true,
+                            })
+                        })
+                        // if(areaItem.selected) {
+                        //     this.selectDeliveryAreaDialogList[provinceIndex].selectCityList = list
+                        // }
+                        resolve(list)
+                    })
+                }else {
+                    resolve([])
+                }   
+            }else {
+                resolve([])
             }
-            if (node.level > 1) return resolve([]);
-    
-            setTimeout(() => {
-              const data = [{
-                name: 'leaf',
-                leaf: true
-              }, {
-                name: 'zone'
-              }];
-    
-              resolve(data);
-            }, 500);
-          }
+        },
+        // 当选中节点变化时触发
+        changeCascader(data){
+            console.log(data)
+            console.log('selectDeliveryAreaDialogList====',this.selectDeliveryAreaDialogList)
+        },
+        // 下拉框出现/隐藏时触发
+        handleCascaderVisibleChangeCity(isVisible, areaItem, provinceIndex){
+            console.log(isVisible, areaItem, provinceIndex)
+            if(areaItem.selected){
+                let list = ['市辖区','东城区']
+                // this.selectDeliveryAreaDialogList[provinceIndex].cityList.forEach((item,index)=>{
+                //     list.push([item.name])
+                // })
+                console.log("dsfsdfsdf===",list)
+                this.$set(this.selectDeliveryAreaDialogList[provinceIndex],'selectCityList',[].concat(list))
+            }
+            
+        }
     }
 }

+ 56 - 16
src/views/ticket/ticketMr/dialog/addAndEdit.vue

@@ -31,7 +31,7 @@
             <el-form-item label="实名信息:" prop="isAuth">
               <el-radio v-model="form.isAuth" label="1">全部观影人员均实名</el-radio>
             </el-form-item>
-            <!-- <el-form-item label="停止售卖时间:" prop="stopSaleTime">
+            <el-form-item label="停止售卖时间:" prop="stopSaleTime">
               <span style="margin-right: 5px">开演前</span>
               <el-input
                 v-model="form.stopSaleTime"
@@ -42,7 +42,7 @@
               >
               </el-input>
               <span style="margin-left: 5px">分钟内<i style="font-size: 12px;margin-left: 5px;">注:必须大于核销时间至少30秒</i></span>
-            </el-form-item> -->
+            </el-form-item>
             <el-form-item label="核销时间:" prop="beforeTime">
               <span style="margin-right: 5px">开演前</span>
               <el-input
@@ -113,8 +113,8 @@
               <el-checkbox v-model="form.channelWindow">窗口</el-checkbox>
               <el-checkbox v-model="form.channelAutoSale">自助售/取票机</el-checkbox>
             </el-form-item>
-            <el-form-item label="可售区域:" required label-width="100px">
-              <span @click="deliverableAreaDialogCancel">请选择</span>
+            <el-form-item label="可售区域:" label-width="100px">
+              <span @click="deliverableAreaDialogCancel" style="cursor: pointer;color: #1890ff;">请选择</span>
             </el-form-item>
           </el-tab-pane>
 
@@ -187,24 +187,24 @@
                 @change="handleChangeProvince(areaIndex, areaItem)"
               >
                 <template #default>
-                  <el-popover
-                    placement="right"
-                    width="400"
-                    trigger="click">
-                      <el-tree
-                        :props="props"
-                        :load="loadNode"
-                        lazy
-                        show-checkbox>
-                      </el-tree>
-                    <span
+                  <span
                     slot="reference"
                       :class="areaItem.hasChildrenSelect ? 'area-province-label' : ''"
                     >{{ areaItem.name }}</span>
-                  </el-popover>
                   
                 </template>
               </el-checkbox>
+              <el-cascader
+                v-model="areaItem.selectCityList"
+                :options="areaItem.cityList"
+                :props="areaCascaderProps(areaItem, areaIndex)"
+                :clearable="false"
+                collapse-tags
+                class="area-wrap-city"
+                popper-class="area-city-popper"
+                @visible-change="(isVisible)=>handleCascaderVisibleChangeCity(isVisible, areaItem, areaIndex)"
+                @change="changeCascader"
+              />
             </el-col>
           </el-row>
         </div>
@@ -515,4 +515,44 @@ export default {
     cursor: pointer;
   }
 }
+
+::v-deep .area-wrap-city.el-cascader {
+  line-height: normal;
+  .el-input {
+    cursor: pointer;
+    width: 100% !important;
+    height: 28px !important;
+    .el-input__inner {
+      display: none !important;
+    }
+    span.el-input__suffix {
+      position: inherit !important;
+      i.el-input__icon {
+        line-height: inherit;
+        margin-left: 5px;
+      }
+    }
+
+    .el-input__wrapper {
+      box-shadow: none;
+      input {
+        display: none;
+      }
+    }
+  }
+
+  .el-cascader__tags {
+    display: none;
+  }
+}
+
+.area-city-popper {
+  .el-cascader-panel {
+    .el-scrollbar.el-cascader-menu {
+      .el-cascader-menu__wrap.el-scrollbar__wrap {
+        height: 315px;
+      }
+    }
+  }
+}
 </style>

+ 56 - 18
src/views/windowTicketSales/ticketingCollection.vue

@@ -135,6 +135,8 @@
   
   import { pageList,printApi } from '@/api/windowTicketSales/ticketingCollection'
   import { pageList as getPrintListApi } from "@/api/device/pda";
+  const https = require('https');
+  const axios = require('axios');
   export default {
     name: "distributionapplication",
     dicts: ['order_form_type','order_status_type'],
@@ -312,28 +314,64 @@
         },
         /**  连接打印机  */
         connectPrint(url,data){
-          let xhr = new XMLHttpRequest();
-          xhr.withCredentials = true
+          // let xhr = new XMLHttpRequest();
+          // xhr.withCredentials = true
           
-          xhr.onreadystatechange = ()=>{
-          if(xhr.readyState == 4){ // 监听请求完成
-              if((xhr.status >=200 && xhr.status <300) || xhr.status == 304){
-                console.log(xhr.responseText)
-                this.dialogVisible = false
-                this.dialogVisibleLoading = false
-              }else{
-                console.log('请求失败')
-                this.dialogVisible = false
-                this.dialogVisibleLoading = false
-              }
-            }
-          }
+          // xhr.onreadystatechange = ()=>{
+          // if(xhr.readyState == 4){ // 监听请求完成
+          //     if((xhr.status >=200 && xhr.status <300) || xhr.status == 304){
+          //       console.log(xhr.responseText)
+          //       this.dialogVisible = false
+          //       this.dialogVisibleLoading = false
+          //     }else{
+          //       console.log('请求失败')
+          //       this.dialogVisible = false
+          //       this.dialogVisibleLoading = false
+          //     }
+          //   }
+          // }
          
-          xhr.open("post", url, true); // 异步请求
-          xhr.setRequestHeader('Content-Type', 'application/json')
-          xhr.send(JSON.stringify(data));
+          // xhr.open("post", url, true); // 异步请求
+          // xhr.setRequestHeader('Content-Type', 'application/json')
+          // xhr.send(JSON.stringify(data));
 
+          
 
+          // 创建忽略 SSL 的 axios 实例
+          const ignoreSSL = axios.create({
+            httpsAgent: new https.Agent({  
+              rejectUnauthorized: false
+            }),
+            withCredentials: true, // 跨域请求时发送Cookie
+            timeout: 60000, // 请求超时
+            headers: {
+              "Content-Type": "application/json; charset=UTF-8;"
+            }
+          });
+          ignoreSSL.post(url, 
+            { ...data }
+            ).then(()=>{
+            this.dialogVisible = false
+            this.dialogVisibleLoading = false
+          }).catch(()=>{
+            this.dialogVisible = false
+            this.dialogVisibleLoading = false
+          })
+          // 在 axios 请求时,选择性忽略 SSL
+          // const agent = new https.Agent({  
+          //   rejectUnauthorized: false
+          // });
+          // axios.post(
+          //   url, 
+          //   { httpsAgent: agent,...data }
+          //   ).then(()=>{
+          //   this.dialogVisible = false
+          //   this.dialogVisibleLoading = false
+          // })
+          // .catch(()=>{
+          //   this.dialogVisible = false
+          //   this.dialogVisibleLoading = false
+          // })
         }
     }
   };