小票打印机
This commit is contained in:
		
							parent
							
								
									854c120920
								
							
						
					
					
						commit
						36aef6744f
					
				| 
						 | 
				
			
			@ -0,0 +1,192 @@
 | 
			
		|||
var port = 18080;
 | 
			
		||||
var connectionMode = "ws:";
 | 
			
		||||
var wsPrint = null;
 | 
			
		||||
let wsGetPrinterList = null;
 | 
			
		||||
var CHUNK_SIZE = 1024 * 64;
 | 
			
		||||
 | 
			
		||||
const WebSocketPrint = function (serverURL, strPrinterName, request, callback) {
 | 
			
		||||
  var _websocket;
 | 
			
		||||
  var _callback = callback;
 | 
			
		||||
  var _request = request;
 | 
			
		||||
  var _connectedsocket = false;
 | 
			
		||||
 | 
			
		||||
  var onMessage = function (msg) {
 | 
			
		||||
    if (_websocket.readyState == 1) {
 | 
			
		||||
      var res = JSON.parse(msg.data);
 | 
			
		||||
      var ret = res.statusMessage;
 | 
			
		||||
      var printerStatus;
 | 
			
		||||
      if (res.printerStatus !== undefined) {
 | 
			
		||||
        printerStatus = res.printerStatus.message;
 | 
			
		||||
        ret += ":" + printerStatus;
 | 
			
		||||
      }
 | 
			
		||||
      _callback(res);
 | 
			
		||||
    } else {
 | 
			
		||||
      _callback(msg.data);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  var onClose = function (msg) {
 | 
			
		||||
    if (!_connectedsocket) {
 | 
			
		||||
      _callback("Cannot connect to server");
 | 
			
		||||
    }
 | 
			
		||||
    _websocket.close();
 | 
			
		||||
    _connectedsocket = false;
 | 
			
		||||
    wsPrint = null;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  var webSocketInit = function (uri) {
 | 
			
		||||
    _websocket = new WebSocket(uri);
 | 
			
		||||
    _websocket.binaryType = "arraybuffer";
 | 
			
		||||
    _websocket.onopen = function (event) {
 | 
			
		||||
      console.log("open : " + uri);
 | 
			
		||||
    };
 | 
			
		||||
    _websocket.onerror = function (event) {
 | 
			
		||||
      wsPrint = null;
 | 
			
		||||
      if (_websocket.readyState == 3) {
 | 
			
		||||
        _callback("Cannot connect to server");
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    _websocket.onmessage = function (msg) {
 | 
			
		||||
      onMessage(msg);
 | 
			
		||||
    };
 | 
			
		||||
    _websocket.onclose = function (msg) {
 | 
			
		||||
      onClose(msg);
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  webSocketInit(serverURL + strPrinterName + _request);
 | 
			
		||||
 | 
			
		||||
  this.send = function (data) {
 | 
			
		||||
    const sendData = () => {
 | 
			
		||||
      for (let i = 0; i < data.length; i += CHUNK_SIZE) {
 | 
			
		||||
        const chunk = data.slice(i, i + CHUNK_SIZE);
 | 
			
		||||
        _websocket.send(chunk);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (_websocket.readyState === WebSocket.OPEN) {
 | 
			
		||||
      sendData();
 | 
			
		||||
    } else if (_websocket.readyState === WebSocket.CONNECTING) {
 | 
			
		||||
      const originalOnOpen = _websocket.onopen;
 | 
			
		||||
      _websocket.onopen = function(event) {
 | 
			
		||||
        if (originalOnOpen) originalOnOpen(event);
 | 
			
		||||
        sendData();
 | 
			
		||||
        _connectedsocket = true;
 | 
			
		||||
      };
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  this.disconnect = function () {
 | 
			
		||||
    if (_websocket && _websocket.readyState === WebSocket.OPEN) {
 | 
			
		||||
      console.log("Closing WebSocket connection...");
 | 
			
		||||
      _websocket.close();
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const WebSocketGetPrinterList = function (serverURL, callback) {
 | 
			
		||||
  var _websocket;
 | 
			
		||||
  var _callback = callback;
 | 
			
		||||
  var _connectedsocket = false;
 | 
			
		||||
 | 
			
		||||
  var onMessage = function (msg) {
 | 
			
		||||
    if (_websocket.readyState == 1) {
 | 
			
		||||
      var res = JSON.parse(msg.data);
 | 
			
		||||
      _callback(res);
 | 
			
		||||
    } else {
 | 
			
		||||
      a;
 | 
			
		||||
      _callback(msg.data);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  var onClose = function (msg) {
 | 
			
		||||
    if (!_connectedsocket) {
 | 
			
		||||
      _callback("Cannot connect to server");
 | 
			
		||||
    }
 | 
			
		||||
    _websocket.close();
 | 
			
		||||
    _connectedsocket = false;
 | 
			
		||||
    wsGetPrinterList = null;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  var webSocketInit = function (uri) {
 | 
			
		||||
    _websocket = new WebSocket(uri);
 | 
			
		||||
    _websocket.onopen = function (event) {
 | 
			
		||||
      console.log("open : " + uri);
 | 
			
		||||
    };
 | 
			
		||||
    _websocket.onerror = function (event) {
 | 
			
		||||
      wsGetPrinterList = null;
 | 
			
		||||
      if (_websocket.readyState == 3) {
 | 
			
		||||
        _callback("Cannot connect to server");
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    _websocket.onmessage = function (msg) {
 | 
			
		||||
      onMessage(msg);
 | 
			
		||||
    };
 | 
			
		||||
    _websocket.onclose = function (msg) {
 | 
			
		||||
        console.log("WebSocket connection closed");
 | 
			
		||||
      onClose(msg);
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  webSocketInit(serverURL);
 | 
			
		||||
 | 
			
		||||
  this.send = function (strSubmit) {
 | 
			
		||||
    if (_websocket.readyState == 1) {
 | 
			
		||||
      _websocket.send(strSubmit);
 | 
			
		||||
    } else {
 | 
			
		||||
      _websocket.onopen = function () {
 | 
			
		||||
        if (_websocket.readyState == 1) {
 | 
			
		||||
          _websocket.send(strSubmit);
 | 
			
		||||
          _connectedsocket = true;
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function setPort(serverPort) {
 | 
			
		||||
  port = serverPort;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getServerURL() {
 | 
			
		||||
  var localAddress = `//127.0.0.1:${port}/WebSDK/`;
 | 
			
		||||
  var serverURL = connectionMode + localAddress;
 | 
			
		||||
  return {
 | 
			
		||||
    url: serverURL,
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setConnectionMode(mode) {
 | 
			
		||||
  connectionMode = mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function requestPrint(strPrinterName, strSubmit, _callback) {
 | 
			
		||||
  _callback("");
 | 
			
		||||
  var serverURL = getServerURL().url;
 | 
			
		||||
  console.log(serverURL);
 | 
			
		||||
 | 
			
		||||
  if (wsPrint == null)
 | 
			
		||||
    wsPrint = new WebSocketPrint(serverURL, strPrinterName, "", _callback);
 | 
			
		||||
  const encoder = new TextEncoder();
 | 
			
		||||
  const bytesSubmit = encoder.encode(strSubmit);
 | 
			
		||||
  wsPrint.send(bytesSubmit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getPrinterList(category, _callback) {
 | 
			
		||||
  var serverURL = getServerURL().url + "getPrinterList";
 | 
			
		||||
  if (wsGetPrinterList == null) {
 | 
			
		||||
    wsGetPrinterList = new WebSocketGetPrinterList(serverURL, _callback);
 | 
			
		||||
  }
 | 
			
		||||
  wsGetPrinterList.send(JSON.stringify(category));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  setPort,
 | 
			
		||||
  getServerURL,
 | 
			
		||||
  setConnectionMode,
 | 
			
		||||
  requestPrint,
 | 
			
		||||
  getPrinterList,
 | 
			
		||||
  wsPrint,
 | 
			
		||||
  WebSocketPrint,
 | 
			
		||||
  WebSocketGetPrinterList
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
				
			
			@ -11,17 +11,24 @@
 | 
			
		|||
          start-placeholder="开始日期"
 | 
			
		||||
          end-placeholder="结束日期"
 | 
			
		||||
          format="yyyy-MM-dd" style="width: 220px"
 | 
			
		||||
              :picker-options="pickerOptions" >
 | 
			
		||||
          :picker-options="pickerOptions"
 | 
			
		||||
        >
 | 
			
		||||
        </el-date-picker>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item label="关键字">
 | 
			
		||||
          <el-input v-model="queryParams.custSearchInfo" placeholder="请输入用户姓名,编号,手机号" maxlength="20" clearable style="width: 220px"/>
 | 
			
		||||
        <el-input v-model="queryParams.custSearchInfo" placeholder="请输入用户姓名,编号,手机号" maxlength="20" clearable
 | 
			
		||||
                  style="width: 220px"
 | 
			
		||||
        />
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item label="订单号">
 | 
			
		||||
          <el-input v-model.number="queryParams.orderId" placeholder="请输入订单号" maxlength="20" clearable style="width: 220px" @input="(v)=>(queryParams.orderId=v.replace(/[^\d]/g,''))"/>
 | 
			
		||||
        <el-input v-model.number="queryParams.orderId" placeholder="请输入订单号" maxlength="20" clearable
 | 
			
		||||
                  style="width: 220px" @input="(v)=>(queryParams.orderId=v.replace(/[^\d]/g,''))"
 | 
			
		||||
        />
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item label="菜品名称">
 | 
			
		||||
          <el-input v-model="queryParams.goodsSearchInfo" placeholder="请输入菜品名称" maxlength="20" clearable style="width: 220px"/>
 | 
			
		||||
        <el-input v-model="queryParams.goodsSearchInfo" placeholder="请输入菜品名称" maxlength="20" clearable
 | 
			
		||||
                  style="width: 220px"
 | 
			
		||||
        />
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item label="餐次">
 | 
			
		||||
        <el-select v-model="queryParams.mealtimeTypeList" multiple style="width: 220px" clearable collapse-tags>
 | 
			
		||||
| 
						 | 
				
			
			@ -39,11 +46,14 @@
 | 
			
		|||
              emitPath: false,// 若设置 false,则只返回该节点的值,只返回最后选择的id
 | 
			
		||||
              checkStrictly: false,//来设置父子节点取消选中关联,从而达到选择任意一级选项的目的
 | 
			
		||||
              value:'id',label:'label'
 | 
			
		||||
          }" clearable collapse-tags @change="handleAreaChange">
 | 
			
		||||
          }" clearable collapse-tags @change="handleAreaChange"
 | 
			
		||||
        >
 | 
			
		||||
        </el-cascader>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item label="所属食堂" prop="canteenId">
 | 
			
		||||
          <el-select v-model="queryParams.canteenId" clearable collapse-tags placeholder="请选择所属食堂" style="width: 220px" @change="handleCanteenChange">
 | 
			
		||||
        <el-select v-model="queryParams.canteenId" clearable collapse-tags placeholder="请选择所属食堂"
 | 
			
		||||
                   style="width: 220px" @change="handleCanteenChange"
 | 
			
		||||
        >
 | 
			
		||||
          <el-option v-for="item in canteenOptions"
 | 
			
		||||
                     :key="item.canteenId"
 | 
			
		||||
                     :label="item.canteenName"
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +62,9 @@
 | 
			
		|||
        </el-select>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item label="所属档口" prop="stallId">
 | 
			
		||||
          <el-select v-model="queryParams.stallId" clearable collapse-tags placeholder="请选择所属档口" style="width: 220px" >
 | 
			
		||||
        <el-select v-model="queryParams.stallId" clearable collapse-tags placeholder="请选择所属档口"
 | 
			
		||||
                   style="width: 220px"
 | 
			
		||||
        >
 | 
			
		||||
          <el-option v-for="item in stallOptions"
 | 
			
		||||
                     :key="item.stallId"
 | 
			
		||||
                     :label="item.stallName"
 | 
			
		||||
| 
						 | 
				
			
			@ -61,7 +73,9 @@
 | 
			
		|||
        </el-select>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
      <el-form-item label="订单状态">
 | 
			
		||||
          <el-select v-model="queryParams.orderStateList" clearable multiple collapse-tags style="width: 220px"> 
 | 
			
		||||
        <el-select v-model="queryParams.orderStateList" clearable multiple collapse-tags style="width: 220px"
 | 
			
		||||
                   @change="changePrint"
 | 
			
		||||
        >
 | 
			
		||||
          <el-option
 | 
			
		||||
            v-for="dict in dict.type.sm_order_status"
 | 
			
		||||
            :key="dict.value"
 | 
			
		||||
| 
						 | 
				
			
			@ -98,9 +112,20 @@
 | 
			
		|||
                emitPath: false,// 若设置 false,则只返回该节点的值,只返回最后选择的id
 | 
			
		||||
                checkStrictly: false,//来设置父子节点取消选中关联,从而达到选择任意一级选项的目的
 | 
			
		||||
                value:'id',label:'label'
 | 
			
		||||
            }" clearable collapse-tags >
 | 
			
		||||
            }" clearable collapse-tags
 | 
			
		||||
        >
 | 
			
		||||
        </el-cascader>
 | 
			
		||||
      </el-form-item>
 | 
			
		||||
<!--      <el-form-item label="小票打印机" prop="deptIdList">-->
 | 
			
		||||
<!--        <el-select v-model="printerName" clearable collapse-tags style="width: 220px">-->
 | 
			
		||||
<!--          <el-option-->
 | 
			
		||||
<!--            v-for="item in printList"-->
 | 
			
		||||
<!--            :key="item.value"-->
 | 
			
		||||
<!--            :label="item.name"-->
 | 
			
		||||
<!--            :value="item.value"-->
 | 
			
		||||
<!--          />-->
 | 
			
		||||
<!--        </el-select>-->
 | 
			
		||||
<!--      </el-form-item>-->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      <el-form-item>
 | 
			
		||||
| 
						 | 
				
			
			@ -115,14 +140,25 @@
 | 
			
		|||
          type="primary"
 | 
			
		||||
          size="mini" :disabled="multiple"
 | 
			
		||||
          @click="handleBatchWriteOff"
 | 
			
		||||
            >批量核销</el-button>
 | 
			
		||||
        >批量核销
 | 
			
		||||
        </el-button>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <el-col :span="1.5">
 | 
			
		||||
        <el-button
 | 
			
		||||
          type="primary"
 | 
			
		||||
          size="mini" :disabled="multiple"
 | 
			
		||||
          @click="handleBatchRefund"
 | 
			
		||||
            >批量退单</el-button>
 | 
			
		||||
        >批量退单
 | 
			
		||||
        </el-button>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <el-col :span="1.5" style="display: flex">
 | 
			
		||||
        <el-button
 | 
			
		||||
          type="primary"
 | 
			
		||||
          size="mini" :disabled="multiple"
 | 
			
		||||
          @click="handleBatchPrint"
 | 
			
		||||
          style="margin-left: 5px;"
 | 
			
		||||
        >批量打印小票
 | 
			
		||||
        </el-button>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <!--
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -136,7 +172,9 @@
 | 
			
		|||
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
 | 
			
		||||
    </el-row>
 | 
			
		||||
 | 
			
		||||
    <el-table v-loading="loading" :data="tableListData" height="800" ref="multipleTable" :row-key="(row)=>{return row.orderId}" @selection-change="handleOrderSelectionChange">
 | 
			
		||||
    <el-table v-loading="loading" :data="tableListData" height="800" ref="multipleTable"
 | 
			
		||||
              :row-key="(row)=>{return row.orderId}" @selection-change="handleOrderSelectionChange"
 | 
			
		||||
    >
 | 
			
		||||
      <el-table-column type="selection" width="50" align="center" :reserve-selection="true"/>
 | 
			
		||||
      <el-table-column label="序号" align="center" width="80" type="index" fixed="left">
 | 
			
		||||
        <template slot-scope="scope">
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +190,9 @@
 | 
			
		|||
      <el-table-column label="餐次" align="center" prop="mealtimeName" :show-overflow-tooltip="true" width="80"/>
 | 
			
		||||
      <el-table-column label="菜品明细" align="center" prop="orderDetailList" :show-overflow-tooltip="true" width="120">
 | 
			
		||||
        <template slot-scope="scope">
 | 
			
		||||
              <span v-for="item in scope.row.orderDetailList" :key="item.detailId">{{ item.goodsName }}*{{ item.quantity }};</span>
 | 
			
		||||
          <span v-for="item in scope.row.orderDetailList" :key="item.detailId">{{ item.goodsName }}*{{
 | 
			
		||||
              item.quantity
 | 
			
		||||
            }};</span>
 | 
			
		||||
        </template>
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
      <el-table-column label="订单金额" align="center" prop="payableAmount" :show-overflow-tooltip="true" width="80">
 | 
			
		||||
| 
						 | 
				
			
			@ -198,27 +238,32 @@
 | 
			
		|||
            size="mini"
 | 
			
		||||
            type="text"
 | 
			
		||||
            @click="handleView(scope.row)"
 | 
			
		||||
          >详情</el-button>
 | 
			
		||||
          >详情
 | 
			
		||||
          </el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            size="mini"
 | 
			
		||||
            type="text" v-if="scope.row.orderState==1||scope.row.orderState==2||scope.row.orderState==5"
 | 
			
		||||
            @click="handleRefundPart(scope.row)"
 | 
			
		||||
          >部分退款</el-button>
 | 
			
		||||
          >部分退款
 | 
			
		||||
          </el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            size="mini"
 | 
			
		||||
            type="text" v-if="scope.row.orderState==1||scope.row.orderState==2||scope.row.orderState==4"
 | 
			
		||||
            @click="handleRefund(scope.row)"
 | 
			
		||||
          >退单</el-button>
 | 
			
		||||
          >退单
 | 
			
		||||
          </el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            size="mini"
 | 
			
		||||
            type="text" v-if="scope.row.orderState==1"
 | 
			
		||||
            @click="writeOffOrder(scope.row)"
 | 
			
		||||
          >核销</el-button>
 | 
			
		||||
          >核销
 | 
			
		||||
          </el-button>
 | 
			
		||||
          <el-button
 | 
			
		||||
            size="mini"
 | 
			
		||||
            type="text" v-if="scope.row.commentState==1"
 | 
			
		||||
            @click="checkEvaluate(scope.row)"
 | 
			
		||||
          >评价</el-button>  
 | 
			
		||||
          >评价
 | 
			
		||||
          </el-button>
 | 
			
		||||
        </template>
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
    </el-table>
 | 
			
		||||
| 
						 | 
				
			
			@ -386,7 +431,9 @@
 | 
			
		|||
          </el-col>
 | 
			
		||||
      </el-row> -->
 | 
			
		||||
 | 
			
		||||
          <el-table :data="orderDetailList" ref="multiplePartTable" @selection-change="handleSelectionChange" :row-key="(row)=>{return row.detailId}" v-if="refundType==1">
 | 
			
		||||
      <el-table :data="orderDetailList" ref="multiplePartTable" @selection-change="handleSelectionChange"
 | 
			
		||||
                :row-key="(row)=>{return row.detailId}" v-if="refundType==1"
 | 
			
		||||
      >
 | 
			
		||||
        <el-table-column type="selection" width="50" align="center" :selectable="selectable"/>
 | 
			
		||||
        <el-table-column label="菜品名称" align="center" prop="goodsName" :show-overflow-tooltip="true"/>
 | 
			
		||||
        <el-table-column label="菜品单价" align="center" prop="salePrice" :show-overflow-tooltip="true">
 | 
			
		||||
| 
						 | 
				
			
			@ -410,7 +457,10 @@
 | 
			
		|||
 | 
			
		||||
        <el-table-column label="退款数量" align="center" prop="goRefundNum" :show-overflow-tooltip="true">
 | 
			
		||||
          <template slot-scope="scope">
 | 
			
		||||
                      <el-input v-model="scope.row.goRefundNum" placeholder="退款数量" maxlength="20" clearable style="width: 100%" @change="inputNum(scope.row)"  @input="(v)=>(scope.row.goRefundNum=v.replace(/[^\d]/g,''))"/> 
 | 
			
		||||
            <el-input v-model="scope.row.goRefundNum" placeholder="退款数量" maxlength="20" clearable
 | 
			
		||||
                      style="width: 100%" @change="inputNum(scope.row)"
 | 
			
		||||
                      @input="(v)=>(scope.row.goRefundNum=v.replace(/[^\d]/g,''))"
 | 
			
		||||
            />
 | 
			
		||||
          </template>
 | 
			
		||||
        </el-table-column>
 | 
			
		||||
        <el-table-column label="退款金额" align="center" prop="refundMoney" :show-overflow-tooltip="true">
 | 
			
		||||
| 
						 | 
				
			
			@ -434,7 +484,10 @@
 | 
			
		|||
            <span>{{ (rowData.refundAmount / 100).toFixed(2) }}</span>
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
          <el-form-item label="本次退款金额:" prop="refundMoney">
 | 
			
		||||
                      <el-input v-model="rowData.refundMoney" placeholder="请输入本次退款金额" maxlength="20" clearable @input="(v)=>(rowData.refundMoney=v.replace(/[^\d.]/g, '').replace(/^(\d*\.\d{2}).*$/, '$1'))" style="width: 200px;"/>
 | 
			
		||||
            <el-input v-model="rowData.refundMoney" placeholder="请输入本次退款金额" maxlength="20" clearable
 | 
			
		||||
                      @input="(v)=>(rowData.refundMoney=v.replace(/[^\d.]/g, '').replace(/^(\d*\.\d{2}).*$/, '$1'))"
 | 
			
		||||
                      style="width: 200px;"
 | 
			
		||||
            />
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
        </el-form>
 | 
			
		||||
      </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -446,19 +499,28 @@
 | 
			
		|||
    <!-- 评价弹窗 -->
 | 
			
		||||
    <el-dialog title="订单评价" :visible.sync="openEva" width="500px" append-to-body>
 | 
			
		||||
      <div style="width: 100%;height: auto;padding-left: 30px;margin-bottom: 20px;">
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;">用户姓名:</span>{{evaluateData.createBy}}</div>
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;">评价内容:</span>{{evaluateData.description}}</div>
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;" v-if="evaluateData.pictureList&&evaluateData.pictureList.length>0">评价图片:</span></div> 
 | 
			
		||||
        <div style="margin-bottom: 10px;width: 96%;padding: 5px;display: flex;flex-wrap: wrap;" v-if="evaluateData.pictureList&&evaluateData.pictureList.length>0">
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;">用户姓名:</span>{{ evaluateData.createBy }}
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;">评价内容:</span>{{ evaluateData.description }}
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;"
 | 
			
		||||
                                                v-if="evaluateData.pictureList&&evaluateData.pictureList.length>0"
 | 
			
		||||
        >评价图片:</span></div>
 | 
			
		||||
        <div style="margin-bottom: 10px;width: 96%;padding: 5px;display: flex;flex-wrap: wrap;"
 | 
			
		||||
             v-if="evaluateData.pictureList&&evaluateData.pictureList.length>0"
 | 
			
		||||
        >
 | 
			
		||||
          <div v-for="(item,index) in evaluateData.pictureList" :key="index">
 | 
			
		||||
            <img :src="item" style="width: 80px;height: 80px;" alt="">
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;">评价时间:</span>{{evaluateData.createTime}}</div>
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;">评价时间:</span>{{ evaluateData.createTime }}
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style="margin-bottom: 10px;"><span style="font-weight: 600;">菜品评分:</span></div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div style="width: 100%;height: 200px;overflow-y: auto;">
 | 
			
		||||
        <div v-for="(item,index) in evaluateData.detailList" :key="index" style="display: flex;width: 100%;margin-bottom: 15px;align-items: center;">
 | 
			
		||||
        <div v-for="(item,index) in evaluateData.detailList" :key="index"
 | 
			
		||||
             style="display: flex;width: 100%;margin-bottom: 15px;align-items: center;"
 | 
			
		||||
        >
 | 
			
		||||
          <div style="width: 35%;word-break: break-all;font-size: 16px;text-align: center;">
 | 
			
		||||
            {{ item.dishesName }}
 | 
			
		||||
          </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -475,12 +537,30 @@
 | 
			
		|||
 | 
			
		||||
    <!-- 提醒对话框 -->
 | 
			
		||||
    <el-dialog :title="handleType+'提醒'" :visible.sync="openRemind" width="40%" append-to-body>
 | 
			
		||||
      <div>
 | 
			
		||||
        <el-select v-model="printerName" clearable collapse-tags style="width: 220px">
 | 
			
		||||
          <el-option
 | 
			
		||||
            v-for="item in printList"
 | 
			
		||||
            :key="item.value"
 | 
			
		||||
            :label="item.name"
 | 
			
		||||
            :value="item.value"
 | 
			
		||||
          />
 | 
			
		||||
        </el-select>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="remind-question">请问是否对以下可{{ handleType }}订单进行{{ handleType }}操作?</div>
 | 
			
		||||
      <div class="remind-title">可{{ handleType }}订单 {{ ableList.length }} 笔</div>
 | 
			
		||||
      <div v-for="(item,index) in ableList" :key="item.orderId">{{ (index+1) }}. 订单编号:{{item.orderId}},用户姓名:{{item.nickName}},用户编号:{{item.userId}},订单金额:{{(item.payableAmount/100).toFixed(2)}}</div>
 | 
			
		||||
      <div v-for="(item,index) in ableList" :key="item.orderId">{{ (index + 1) }}.
 | 
			
		||||
        订单编号:{{ item.orderId }},用户姓名:{{ item.nickName }},用户编号:{{
 | 
			
		||||
          item.userId
 | 
			
		||||
        }},订单金额:{{ (item.payableAmount / 100).toFixed(2) }}
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="remind-title">不可{{ handleType }}订单 {{ unableList.length }} 笔</div>
 | 
			
		||||
      <div v-for="(item,index) in unableList" :key="item.orderId">{{ (index+1) }}. 订单编号:{{item.orderId}},用户姓名:{{item.nickName}},用户编号:{{item.userId}},订单金额:{{(item.payableAmount/100).toFixed(2)}}</div>
 | 
			
		||||
      <div v-for="(item,index) in unableList" :key="item.orderId">{{ (index + 1) }}.
 | 
			
		||||
        订单编号:{{ item.orderId }},用户姓名:{{ item.nickName }},用户编号:{{
 | 
			
		||||
          item.userId
 | 
			
		||||
        }},订单金额:{{ (item.payableAmount / 100).toFixed(2) }}
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div slot="footer" class="dialog-footer">
 | 
			
		||||
        <el-button type="primary" @click="confirmRemind" :disabled="ableList.length==0">确 定</el-button>
 | 
			
		||||
| 
						 | 
				
			
			@ -493,11 +573,21 @@
 | 
			
		|||
 | 
			
		||||
<script>
 | 
			
		||||
import { deptTreeSelect } from '@/api/system/user'
 | 
			
		||||
import { systemAreaTreeApi,getCanteenByAreaApi,getStallByCanteenApi } from "@/api/base/stall";
 | 
			
		||||
import { orderPageListApi,refundOrderPartApi,refundOrderApi,writeOffOrderApi,syncOrderPayStateApi,getEvaluaOrderDetailApi } from "@/api/order/reserve";
 | 
			
		||||
import { decryptWithSM4,encryptWithSM4 } from '@/utils/sm';
 | 
			
		||||
import { systemAreaTreeApi, getCanteenByAreaApi, getStallByCanteenApi } from '@/api/base/stall'
 | 
			
		||||
import {
 | 
			
		||||
  orderPageListApi,
 | 
			
		||||
  refundOrderPartApi,
 | 
			
		||||
  refundOrderApi,
 | 
			
		||||
  writeOffOrderApi,
 | 
			
		||||
  syncOrderPayStateApi,
 | 
			
		||||
  getEvaluaOrderDetailApi
 | 
			
		||||
} from '@/api/order/reserve'
 | 
			
		||||
import { decryptWithSM4, encryptWithSM4 } from '@/utils/sm'
 | 
			
		||||
import { WebSDK } from '@/utils/printer/WebSDK'
 | 
			
		||||
import { setPort, getPrinterList, requestPrint, wsPrint, WebSocketPrint } from '@/utils/printer/Common'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "",
 | 
			
		||||
  name: '',
 | 
			
		||||
  dicts: ['sys_user_type', 'sm_order_type', 'sm_order_status', 'sm_order_pay_type'],
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
| 
						 | 
				
			
			@ -522,26 +612,26 @@ export default {
 | 
			
		|||
        shortcuts: [{
 | 
			
		||||
          text: '最近一周',
 | 
			
		||||
          onClick(picker) {
 | 
			
		||||
              const start = new Date();
 | 
			
		||||
              const end = new Date();
 | 
			
		||||
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 6);
 | 
			
		||||
              picker.$emit('pick', [start, end]);
 | 
			
		||||
            const start = new Date()
 | 
			
		||||
            const end = new Date()
 | 
			
		||||
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 6)
 | 
			
		||||
            picker.$emit('pick', [start, end])
 | 
			
		||||
          }
 | 
			
		||||
        }, {
 | 
			
		||||
          text: '最近一个月',
 | 
			
		||||
          onClick(picker) {
 | 
			
		||||
              const start = new Date();
 | 
			
		||||
              const end = new Date();
 | 
			
		||||
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
 | 
			
		||||
              picker.$emit('pick', [start, end]);
 | 
			
		||||
            const start = new Date()
 | 
			
		||||
            const end = new Date()
 | 
			
		||||
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
 | 
			
		||||
            picker.$emit('pick', [start, end])
 | 
			
		||||
          }
 | 
			
		||||
        }, {
 | 
			
		||||
          text: '最近三个月',
 | 
			
		||||
          onClick(picker) {
 | 
			
		||||
              const start = new Date();
 | 
			
		||||
              const end = new Date();
 | 
			
		||||
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 91);
 | 
			
		||||
              picker.$emit('pick', [start, end]);
 | 
			
		||||
            const start = new Date()
 | 
			
		||||
            const end = new Date()
 | 
			
		||||
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 91)
 | 
			
		||||
            picker.$emit('pick', [start, end])
 | 
			
		||||
          }
 | 
			
		||||
        }]
 | 
			
		||||
      },
 | 
			
		||||
| 
						 | 
				
			
			@ -567,7 +657,7 @@ export default {
 | 
			
		|||
        stallId: null,//档口-单选
 | 
			
		||||
        orderStateList: [],//订单状态
 | 
			
		||||
        payStateList: [], //支付方式
 | 
			
		||||
        deptIdList:[],  //所属组织
 | 
			
		||||
        deptIdList: []  //所属组织
 | 
			
		||||
      },
 | 
			
		||||
      //订单详情
 | 
			
		||||
      orderInfoData: {},
 | 
			
		||||
| 
						 | 
				
			
			@ -581,8 +671,8 @@ export default {
 | 
			
		|||
        refundMoney: [
 | 
			
		||||
          {
 | 
			
		||||
            required: true,
 | 
			
		||||
                  message: "本次退款金额不能为空",
 | 
			
		||||
                  trigger: "blur",
 | 
			
		||||
            message: '本次退款金额不能为空',
 | 
			
		||||
            trigger: 'blur'
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
| 
						 | 
				
			
			@ -590,36 +680,69 @@ export default {
 | 
			
		|||
      batchIds: [],//批量id
 | 
			
		||||
      batchList: [],//批量数据数组
 | 
			
		||||
      //批量核销批量退单提醒对话框
 | 
			
		||||
      handleType:"退单",
 | 
			
		||||
      handleType: '退单',
 | 
			
		||||
      ableList: [],
 | 
			
		||||
      unableList: [],
 | 
			
		||||
      openRemind: false,
 | 
			
		||||
      openEva: false,
 | 
			
		||||
      evaluateData:{} 
 | 
			
		||||
    };
 | 
			
		||||
      evaluateData: {},
 | 
			
		||||
      PosPrinter: null,
 | 
			
		||||
      printList: [],
 | 
			
		||||
      printerName: ''
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
      this.getAreaTreeData();  
 | 
			
		||||
      this.getDeptTree(); 
 | 
			
		||||
    // this.printerName = ''
 | 
			
		||||
    // this.printList = []
 | 
			
		||||
    this.PosPrinter = new WebSDK.EscPosCommand()
 | 
			
		||||
    this.refreshPrinterList()
 | 
			
		||||
    this.getAreaTreeData()
 | 
			
		||||
    this.getDeptTree()
 | 
			
		||||
    this.getList()
 | 
			
		||||
  },
 | 
			
		||||
  mounted() {
 | 
			
		||||
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    refreshPrinterList() {
 | 
			
		||||
      setPort(18080)
 | 
			
		||||
      const category = { 'category': 1 }
 | 
			
		||||
      getPrinterList(category, this.updatePrinterList)
 | 
			
		||||
    },
 | 
			
		||||
    updatePrinterList(printers) {
 | 
			
		||||
      // this.printList = printers
 | 
			
		||||
      // console.log(this.printList)
 | 
			
		||||
      // if (!Array.isArray(printers)) {
 | 
			
		||||
      //   console.error('Expected an array of printers, but got:', typeof printers)
 | 
			
		||||
      //   return
 | 
			
		||||
      // }
 | 
			
		||||
      // console.log('Available printers:', this.printList)
 | 
			
		||||
      this.printList = printers.map(item => ({
 | 
			
		||||
        name: item.logicalName,
 | 
			
		||||
        value: item.logicalName
 | 
			
		||||
      }))
 | 
			
		||||
      console.log('Available printers:', this.printList)
 | 
			
		||||
      if (this.printList.length > 0) {
 | 
			
		||||
        this.printerName = this.printList[0].name
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
//区域树
 | 
			
		||||
    getAreaTreeData() {
 | 
			
		||||
      systemAreaTreeApi({}).then((response) => {
 | 
			
		||||
          this.treeAreaOptions = response.data; 
 | 
			
		||||
          });
 | 
			
		||||
        this.treeAreaOptions = response.data
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleAreaChange(e) {
 | 
			
		||||
      let param = {
 | 
			
		||||
            areaId:this.queryParams.areaId,"canteenType": 1
 | 
			
		||||
        areaId: this.queryParams.areaId, 'canteenType': 1
 | 
			
		||||
      }
 | 
			
		||||
      getCanteenByAreaApi(param).then((response) => {
 | 
			
		||||
        this.canteenOptions = response.rows || []
 | 
			
		||||
        this.queryParams.canteenId = null
 | 
			
		||||
        this.stallOptions = []
 | 
			
		||||
        this.queryParams.stallId = null
 | 
			
		||||
          });
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    handleCanteenChange(e) {
 | 
			
		||||
      let param = {
 | 
			
		||||
| 
						 | 
				
			
			@ -628,7 +751,7 @@ export default {
 | 
			
		|||
      getStallByCanteenApi(param).then((response) => {
 | 
			
		||||
        this.stallOptions = response.rows || []
 | 
			
		||||
        this.queryParams.stallId = null
 | 
			
		||||
          });
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    /** 查询部门下拉树结构 */
 | 
			
		||||
| 
						 | 
				
			
			@ -650,8 +773,8 @@ export default {
 | 
			
		|||
 | 
			
		||||
    /** 搜索按钮操作 */
 | 
			
		||||
    handleQuery() {
 | 
			
		||||
          this.queryParams.pageNum = 1;
 | 
			
		||||
          this.getList();
 | 
			
		||||
      this.queryParams.pageNum = 1
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    /** 重置按钮操作 */
 | 
			
		||||
    resetQuery() {
 | 
			
		||||
| 
						 | 
				
			
			@ -668,24 +791,24 @@ export default {
 | 
			
		|||
        stallId: null,//档口-单选
 | 
			
		||||
        orderStateList: [],//订单状态
 | 
			
		||||
        payStateList: [], //支付方式
 | 
			
		||||
            deptIdList:[],  //所属组织
 | 
			
		||||
        deptIdList: []  //所属组织
 | 
			
		||||
      }
 | 
			
		||||
        this.resetForm("queryForm");
 | 
			
		||||
        this.handleQuery();
 | 
			
		||||
      this.resetForm('queryForm')
 | 
			
		||||
      this.handleQuery()
 | 
			
		||||
    },
 | 
			
		||||
    /** 查询列表 */
 | 
			
		||||
    getList() {
 | 
			
		||||
          this.loading = true; 
 | 
			
		||||
      this.loading = true
 | 
			
		||||
      let param = {
 | 
			
		||||
        ...this.queryParams,
 | 
			
		||||
              "orderTypeList":[2],
 | 
			
		||||
        'orderTypeList': [2]
 | 
			
		||||
      }
 | 
			
		||||
      if (this.dateRange && this.dateRange.length > 0) {
 | 
			
		||||
        param.startDate = this.formatDate(this.dateRange[0])
 | 
			
		||||
        param.endDate = this.formatDate(this.dateRange[1])
 | 
			
		||||
      } else {
 | 
			
		||||
            param.startDate=undefined;
 | 
			
		||||
            param.endDate=undefined;
 | 
			
		||||
        param.startDate = undefined
 | 
			
		||||
        param.endDate = undefined
 | 
			
		||||
      }
 | 
			
		||||
      if (this.queryParams.canteenId) {
 | 
			
		||||
        param.canteenIdList = [this.queryParams.canteenId]
 | 
			
		||||
| 
						 | 
				
			
			@ -694,50 +817,51 @@ export default {
 | 
			
		|||
        param.stallIdList = [this.queryParams.stallId]
 | 
			
		||||
      }
 | 
			
		||||
      orderPageListApi(param).then(response => {
 | 
			
		||||
              this.tableListData = response.rows;
 | 
			
		||||
        this.tableListData = response.rows
 | 
			
		||||
        this.tableListData.forEach(item => {
 | 
			
		||||
                  if(item.phoneNumber&&item.phoneNumber!=""){
 | 
			
		||||
                    this.$set(item,"phoneNumber",decryptWithSM4(item.phoneNumber))
 | 
			
		||||
          if (item.phoneNumber && item.phoneNumber != '') {
 | 
			
		||||
            this.$set(item, 'phoneNumber', decryptWithSM4(item.phoneNumber))
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
              this.total = Number(response.total);
 | 
			
		||||
              this.loading = false;
 | 
			
		||||
          });
 | 
			
		||||
        this.total = Number(response.total)
 | 
			
		||||
        this.loading = false
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    /** 修改按钮操作 */
 | 
			
		||||
    handleView(row) {
 | 
			
		||||
      this.orderInfoData = Object.assign({}, row)
 | 
			
		||||
          this.open = true; 
 | 
			
		||||
      this.open = true
 | 
			
		||||
    },
 | 
			
		||||
    /** 部分退款按钮操作 */
 | 
			
		||||
    handleRefundPart(row) {
 | 
			
		||||
          this.orderDetailList = row.orderDetailList;
 | 
			
		||||
          this.rowData = row;
 | 
			
		||||
          this.$set(this.rowData,"refundMoney","")  
 | 
			
		||||
      this.orderDetailList = row.orderDetailList
 | 
			
		||||
      this.rowData = row
 | 
			
		||||
      this.$set(this.rowData, 'refundMoney', '')
 | 
			
		||||
      console.log(this.rowData)
 | 
			
		||||
      this.orderDetailList.forEach((item, index) => {
 | 
			
		||||
              this.$set(this.orderDetailList[index],"unRefundNum",item.quantity-item.refundNum)
 | 
			
		||||
              this.$set(this.orderDetailList[index],"goRefundNum",item.unRefundNum)
 | 
			
		||||
              this.$set(this.orderDetailList[index],"refundMoney",Number(item.goRefundNum)*(item.salePrice).toFixed(2))
 | 
			
		||||
        this.$set(this.orderDetailList[index], 'unRefundNum', item.quantity - item.refundNum)
 | 
			
		||||
        this.$set(this.orderDetailList[index], 'goRefundNum', item.unRefundNum)
 | 
			
		||||
        this.$set(this.orderDetailList[index], 'refundMoney', Number(item.goRefundNum) * (item.salePrice).toFixed(2))
 | 
			
		||||
      })
 | 
			
		||||
      this.refundList = []
 | 
			
		||||
          this.openPart = true; 
 | 
			
		||||
      this.openPart = true
 | 
			
		||||
      this.$refs.multiplePartTable.clearSelection()
 | 
			
		||||
    },
 | 
			
		||||
    inputNum(row) {
 | 
			
		||||
      if (Number(row.goRefundNum) > row.unRefundNum) {
 | 
			
		||||
              this.$modal.msgError("退款数量不能大于可退款数量!");
 | 
			
		||||
        this.$modal.msgError('退款数量不能大于可退款数量!')
 | 
			
		||||
        row.goRefundNum = row.unRefundNum
 | 
			
		||||
      }
 | 
			
		||||
      row.refundMoney = Number(row.goRefundNum) * (row.salePrice).toFixed(2)
 | 
			
		||||
      this.refundList.forEach((item) => {
 | 
			
		||||
        if (item.detailId == row.detailId) {
 | 
			
		||||
                this.$set(item,"quantity",row.goRefundNum)
 | 
			
		||||
          this.$set(item, 'quantity', row.goRefundNum)
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    //数量退款/金额退款
 | 
			
		||||
      choseRefundTypeRadio(e){},
 | 
			
		||||
    choseRefundTypeRadio(e) {
 | 
			
		||||
    },
 | 
			
		||||
    //部分退款多选
 | 
			
		||||
    handleSelectionChange(selection) {
 | 
			
		||||
      console.log(selection)
 | 
			
		||||
| 
						 | 
				
			
			@ -753,7 +877,7 @@ export default {
 | 
			
		|||
    confirmRefund() {
 | 
			
		||||
      if (this.refundType == 1) {
 | 
			
		||||
        if (this.refundList.length == 0) {
 | 
			
		||||
                this.$modal.msgError("请先勾选退款菜品!");
 | 
			
		||||
          this.$modal.msgError('请先勾选退款菜品!')
 | 
			
		||||
        } else {
 | 
			
		||||
          console.log(this.refundList)
 | 
			
		||||
          let param = {
 | 
			
		||||
| 
						 | 
				
			
			@ -762,10 +886,10 @@ export default {
 | 
			
		|||
          }
 | 
			
		||||
          refundOrderPartApi(param).then(response => {
 | 
			
		||||
            if (response.code == 200) {
 | 
			
		||||
                        this.$modal.msgSuccess("退款成功");
 | 
			
		||||
              this.$modal.msgSuccess('退款成功')
 | 
			
		||||
            }
 | 
			
		||||
            this.getList()
 | 
			
		||||
                    this.openPart = false; 
 | 
			
		||||
            this.openPart = false
 | 
			
		||||
          }).catch(err => {
 | 
			
		||||
            this.refundList = []
 | 
			
		||||
            this.$refs.multiplePartTable.clearSelection()
 | 
			
		||||
| 
						 | 
				
			
			@ -773,7 +897,7 @@ export default {
 | 
			
		|||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (this.refundType == 2) {
 | 
			
		||||
            this.$refs["rowData"].validate(valid => {
 | 
			
		||||
        this.$refs['rowData'].validate(valid => {
 | 
			
		||||
          if (valid) {
 | 
			
		||||
            let param = {
 | 
			
		||||
              refundAmount: Number(this.rowData.refundMoney * 100),
 | 
			
		||||
| 
						 | 
				
			
			@ -781,18 +905,16 @@ export default {
 | 
			
		|||
            }
 | 
			
		||||
            refundOrderPartApi(param).then(response => {
 | 
			
		||||
              if (response.code == 200) {
 | 
			
		||||
                            this.$modal.msgSuccess("退款成功");
 | 
			
		||||
                this.$modal.msgSuccess('退款成功')
 | 
			
		||||
              }
 | 
			
		||||
              this.getList()
 | 
			
		||||
                        this.openPart = false; 
 | 
			
		||||
                    }); 
 | 
			
		||||
              this.openPart = false
 | 
			
		||||
            })
 | 
			
		||||
          }
 | 
			
		||||
            });
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    },
 | 
			
		||||
    /** 退单按钮操作 */
 | 
			
		||||
    handleRefund(row) {
 | 
			
		||||
| 
						 | 
				
			
			@ -802,11 +924,12 @@ export default {
 | 
			
		|||
        orderId: row.orderId
 | 
			
		||||
      }
 | 
			
		||||
      this.$modal.confirm('是否确认退单?').then(function() {
 | 
			
		||||
              return refundOrderApi(param);
 | 
			
		||||
        return refundOrderApi(param)
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
              this.getList();
 | 
			
		||||
              this.$modal.msgSuccess("退单成功");
 | 
			
		||||
          }).catch(() => {});
 | 
			
		||||
        this.getList()
 | 
			
		||||
        this.$modal.msgSuccess('退单成功')
 | 
			
		||||
      }).catch(() => {
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    /** 核销按钮操作 */
 | 
			
		||||
    writeOffOrder(row) {
 | 
			
		||||
| 
						 | 
				
			
			@ -814,11 +937,12 @@ export default {
 | 
			
		|||
        orderIdList: [row.orderId]
 | 
			
		||||
      }
 | 
			
		||||
      this.$modal.confirm('是否确认核销?').then(function() {
 | 
			
		||||
              return writeOffOrderApi(param);
 | 
			
		||||
        return writeOffOrderApi(param)
 | 
			
		||||
      }).then(() => {
 | 
			
		||||
              this.getList();
 | 
			
		||||
              this.$modal.msgSuccess("核销成功");
 | 
			
		||||
          }).catch(() => {});
 | 
			
		||||
        this.getList()
 | 
			
		||||
        this.$modal.msgSuccess('核销成功')
 | 
			
		||||
      }).catch(() => {
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    /** 评价按钮操作 */
 | 
			
		||||
    checkEvaluate(row) {
 | 
			
		||||
| 
						 | 
				
			
			@ -834,13 +958,13 @@ export default {
 | 
			
		|||
    // ----订单批量操作------
 | 
			
		||||
    handleOrderSelectionChange(selection) {
 | 
			
		||||
      this.batchIds = selection.map((item) => item.orderId)
 | 
			
		||||
        this.batchList = selection;
 | 
			
		||||
      this.batchList = selection
 | 
			
		||||
      this.single = selection.length !== 1
 | 
			
		||||
      this.multiple = !selection.length
 | 
			
		||||
    },
 | 
			
		||||
    //批量退单
 | 
			
		||||
    handleBatchRefund() {
 | 
			
		||||
        this.handleType="退单"
 | 
			
		||||
      this.handleType = '退单'
 | 
			
		||||
      this.ableList = []
 | 
			
		||||
      this.unableList = []
 | 
			
		||||
      this.batchList.forEach(item => {
 | 
			
		||||
| 
						 | 
				
			
			@ -852,9 +976,35 @@ export default {
 | 
			
		|||
      })
 | 
			
		||||
      this.openRemind = true
 | 
			
		||||
    },
 | 
			
		||||
    changePrint(e) {
 | 
			
		||||
      this.printerName = e
 | 
			
		||||
      if (wsPrint) {
 | 
			
		||||
        wsPrint.disconnect()
 | 
			
		||||
        console.log('WebSocket connection closed.')
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    handleBatchPrint() {
 | 
			
		||||
      console.log(this.printList)
 | 
			
		||||
      this.handleType = '打印小票'
 | 
			
		||||
      this.ableList = []
 | 
			
		||||
      this.unableList = []
 | 
			
		||||
      this.batchList.forEach(item => {
 | 
			
		||||
        if (item.orderState == 1 || item.orderState == 5) {
 | 
			
		||||
          this.ableList.push(item)
 | 
			
		||||
        } else {
 | 
			
		||||
          this.unableList.push(item)
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      this.openRemind = true
 | 
			
		||||
    },
 | 
			
		||||
    handleBatchPrintRefresh() {
 | 
			
		||||
      setPort(18080)
 | 
			
		||||
      const category = { 'category': 1 }
 | 
			
		||||
      getPrinterList(category, this.updatePrinterList)
 | 
			
		||||
    },
 | 
			
		||||
    //批量核销
 | 
			
		||||
    handleBatchWriteOff() {
 | 
			
		||||
        this.handleType="核销"
 | 
			
		||||
      this.handleType = '核销'
 | 
			
		||||
      this.ableList = []
 | 
			
		||||
      this.unableList = []
 | 
			
		||||
      this.batchList.forEach(item => {
 | 
			
		||||
| 
						 | 
				
			
			@ -869,7 +1019,7 @@ export default {
 | 
			
		|||
    confirmRemind() {
 | 
			
		||||
      console.log(this.ableList.length)
 | 
			
		||||
      if (this.ableList.length > 0) {
 | 
			
		||||
          if(this.handleType=="退单"){
 | 
			
		||||
        if (this.handleType == '退单') {
 | 
			
		||||
          this.ableList.forEach(item => {
 | 
			
		||||
            let param = {
 | 
			
		||||
              orderId: item.orderId
 | 
			
		||||
| 
						 | 
				
			
			@ -878,11 +1028,11 @@ export default {
 | 
			
		|||
              //   if(response.code!=200){
 | 
			
		||||
              //     this.$modal.msgError(response.msg);
 | 
			
		||||
              //   }
 | 
			
		||||
              });
 | 
			
		||||
            })
 | 
			
		||||
            this.$modal.msgSuccess("批量退单完成");  
 | 
			
		||||
          })
 | 
			
		||||
          this.$modal.msgSuccess('批量退单完成')
 | 
			
		||||
        }
 | 
			
		||||
          if(this.handleType=="核销"){
 | 
			
		||||
        if (this.handleType == '核销') {
 | 
			
		||||
          this.ableList.forEach(item => {
 | 
			
		||||
            let param = {
 | 
			
		||||
              orderIdList: [item.orderId]
 | 
			
		||||
| 
						 | 
				
			
			@ -891,9 +1041,51 @@ export default {
 | 
			
		|||
              //   if(response.code!=200){
 | 
			
		||||
              //     this.$modal.msgError(response.msg);
 | 
			
		||||
              //   }
 | 
			
		||||
              });
 | 
			
		||||
            })
 | 
			
		||||
            this.$modal.msgSuccess("批量核销完成");  
 | 
			
		||||
          })
 | 
			
		||||
          this.$modal.msgSuccess('批量核销完成')
 | 
			
		||||
        }
 | 
			
		||||
        if (this.handleType == '打印小票') {
 | 
			
		||||
          if (this.printList.length === 0) {
 | 
			
		||||
            this.$modal.msgWarning('请先开启小票打印机服务!')
 | 
			
		||||
            return
 | 
			
		||||
          }
 | 
			
		||||
          if (this.printerName === '') {
 | 
			
		||||
            this.$modal.msgWarning('请先选择小票打印机!')
 | 
			
		||||
            return
 | 
			
		||||
          }
 | 
			
		||||
          const _titles = ['菜品名称', '数量', '单价', '总价']
 | 
			
		||||
          const _columnWidths = [20, 10, 10, 8]
 | 
			
		||||
          console.log(this.ableList)
 | 
			
		||||
          this.ableList.forEach(item => {
 | 
			
		||||
            let _rows = []
 | 
			
		||||
            item.orderDetailList.forEach((it) => {
 | 
			
		||||
              let row = []
 | 
			
		||||
              row.push(it.goodsName)
 | 
			
		||||
              row.push(it.quantity)
 | 
			
		||||
              row.push((it.salePrice / 100).toFixed(2))
 | 
			
		||||
              row.push((it.totalAmount / 100).toFixed(2))
 | 
			
		||||
              _rows.push(row)
 | 
			
		||||
            })
 | 
			
		||||
            this.PosPrinter.cleanBuffer()
 | 
			
		||||
              .setCodePage(256)
 | 
			
		||||
              .setEncoding('gbk')
 | 
			
		||||
              .printText({ data: item.nickName + '(' + item.phoneNumber + ')\n' + item.orderId, textSize: 2 })
 | 
			
		||||
              .printText({ data: item.orderTime + '\n', textSize: 1 })
 | 
			
		||||
              .printAndFeed(1)
 | 
			
		||||
              .printTable({ titles: _titles, columnWidths: _columnWidths, rows: _rows })
 | 
			
		||||
              .printAndFeed(1)
 | 
			
		||||
              .printText({
 | 
			
		||||
                data: '\n\n订单金额:' + item.payableAmount / 100 + '\n实付金额:' + (item.payableAmount - item.refundAmount) / 100 + '\n\nThank you for your order!\nWelcome again next time!',
 | 
			
		||||
                textSize: 1,
 | 
			
		||||
                alignment: 0
 | 
			
		||||
              })  // 合计: 277 -> Total: 277; 应收: 277 -> Amount Due: 277; 水流单号: 1234567891011 -> Flow Number: 1234567891011; 谢谢光临!欢迎下次光临! -> Thank you for your visit! Welcome again next time!
 | 
			
		||||
              .printAndFeed(2)
 | 
			
		||||
              .feedAndCut(50)
 | 
			
		||||
            this.prepareAndPrint(this.printerName)
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
          this.$modal.msgSuccess('打印小票完成')
 | 
			
		||||
        }
 | 
			
		||||
        this.$refs.multipleTable.clearSelection()
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
| 
						 | 
				
			
			@ -902,38 +1094,44 @@ export default {
 | 
			
		|||
        }, 500)
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    prepareAndPrint(printerName) {
 | 
			
		||||
      setPort(18080)
 | 
			
		||||
      const data = this.PosPrinter.cleanBuffer()
 | 
			
		||||
        .checkPrinterStatus()
 | 
			
		||||
        .getData()
 | 
			
		||||
      requestPrint(printerName, data, this.updatePrinterCallback)
 | 
			
		||||
    },
 | 
			
		||||
    updatePrinterCallback(res) {
 | 
			
		||||
      this.$modal.msgSuccess('打印小票完成')
 | 
			
		||||
    },
 | 
			
		||||
    //同步订单状态
 | 
			
		||||
    handleSyncPayState() {
 | 
			
		||||
      if (this.batchIds.length > 0) {
 | 
			
		||||
        this.batchIds.forEach(item => {
 | 
			
		||||
          syncOrderPayStateApi({ orderId: item }).then(response => {
 | 
			
		||||
            if (response.code != 200) {
 | 
			
		||||
                  this.$modal.msgError(response.msg);
 | 
			
		||||
              this.$modal.msgError(response.msg)
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
          })
 | 
			
		||||
          this.$modal.msgSuccess("同步已完成");
 | 
			
		||||
        })
 | 
			
		||||
        this.$modal.msgSuccess('同步已完成')
 | 
			
		||||
        this.getList()
 | 
			
		||||
        this.$refs.multipleTable.clearSelection()
 | 
			
		||||
      } else {
 | 
			
		||||
          this.$modal.msgError("请先勾选订单数据!");
 | 
			
		||||
        this.$modal.msgError('请先勾选订单数据!')
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //日期
 | 
			
		||||
    formatDate(date) {
 | 
			
		||||
      // 格式化为 YYYY-MM-DD
 | 
			
		||||
          const year = date.getFullYear();
 | 
			
		||||
          const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始
 | 
			
		||||
          const day = String(date.getDate()).padStart(2, '0');
 | 
			
		||||
          return `${year}-${month}-${day}`;
 | 
			
		||||
      const year = date.getFullYear()
 | 
			
		||||
      const month = String(date.getMonth() + 1).padStart(2, '0') // 月份从0开始
 | 
			
		||||
      const day = String(date.getDate()).padStart(2, '0')
 | 
			
		||||
      return `${year}-${month}-${day}`
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped>
 | 
			
		||||
.remind-question {
 | 
			
		||||
| 
						 | 
				
			
			@ -944,6 +1142,7 @@ export default {
 | 
			
		|||
  align-items: center;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.remind-title {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 40px;
 | 
			
		||||
| 
						 | 
				
			
			@ -954,6 +1153,7 @@ export default {
 | 
			
		|||
  align-items: center;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
::v-deep .el-rate__icon {
 | 
			
		||||
  font-size: 30px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue