tianyi 1 week ago
parent
commit
021fb763c0
  1. 6
      src/api/index.js
  2. 114
      src/views/app/business/courier/addEdit.vue
  3. 596
      src/views/app/business/courier/courier.vue
  4. 258
      src/views/app/business/logistics/logistics.vue
  5. 513
      src/views/sys/order-manage/orderManage.vue

6
src/api/index.js

@ -681,7 +681,7 @@ export const deleteOrder = (params) => {
// 获取配送员 // 获取配送员
export const getWorkerListData = (params) => { export const getWorkerListData = (params) => {
return postBodyRequest('/worker/getMatchingWorkerList', params) return postBodyRequest('/worker/getByCondition', params)
} }
// 创建订单 // 创建订单
@ -735,6 +735,10 @@ export const getOwListData = (params) => {
export const getOrderList = (params) => { export const getOrderList = (params) => {
return postBodyRequest('/mall/order/page', params) return postBodyRequest('/mall/order/page', params)
} }
// 订单调度
export const orderScheduling = (params) => {
return postBodyRequest('/mall/delivery/pagebyworker', params)
}
//取消订单 //取消订单
export const returnOrder = (params) => { export const returnOrder = (params) => {
return postRequest('/mall/order/cancel', params) return postRequest('/mall/order/cancel', params)

114
src/views/app/business/courier/addEdit.vue

@ -1,13 +1,7 @@
<template> <template>
<div class="worker-edit"> <div class="worker-edit">
<!-- Drawer抽屉 --> <!-- Drawer抽屉 -->
<Drawer <Drawer :title="title" v-model="visible" width="720" draggable :mask-closable="type == '0'">
:title="title"
v-model="visible"
width="720"
draggable
:mask-closable="type == '0'"
>
<div :style="{ maxHeight: maxHeight }" class="drawer-content"> <div :style="{ maxHeight: maxHeight }" class="drawer-content">
<div class="drawer-header"> <div class="drawer-header">
<div style="margin-right: 16px">基本信息</div> <div style="margin-right: 16px">基本信息</div>
@ -15,38 +9,24 @@
<Form label-colon v-show="type != '2'"> <Form label-colon v-show="type != '2'">
<Row :gutter="32"> <Row :gutter="32">
<Col span="12"> <Col span="12">
<FormItem label="快递员ID"> <FormItem label="配送员ID">
{{ form.workerId }} {{ form.workerId }}
<Tooltip trigger="hover" placement="right" content="账户已禁用"> <Tooltip trigger="hover" placement="right" content="账户已禁用">
<Icon <Icon v-show="form.workerStatus == 3" type="md-lock" size="18"
v-show="form.workerStatus == 3" style="margin-left: 10px; cursor: pointer" />
type="md-lock"
size="18"
style="margin-left: 10px; cursor: pointer"
/>
</Tooltip> </Tooltip>
</FormItem> </FormItem>
</Col> </Col>
<Col span="12"> <Col span="12">
<FormItem label="快递员状态"> <FormItem label="配送员状态">
{{ this.statusName }} {{ this.statusName }}
<Icon <Icon v-show="form.workerStatus" type="md-key" :color="passColor" size="18"
v-show="form.workerStatus" style="margin-left: 10px; cursor: pointer" />
type="md-key"
:color="passColor"
size="18"
style="margin-left: 10px; cursor: pointer"
/>
</FormItem> </FormItem>
</Col> </Col>
</Row> </Row>
</Form> </Form>
<Form <Form ref="form" :model="form" :rules="formValidate" label-position="top">
ref="form"
:model="form"
:rules="formValidate"
label-position="top"
>
<Row :gutter="32"> <Row :gutter="32">
<Col span="12"> <Col span="12">
<FormItem label="登录账号" prop="username"> <FormItem label="登录账号" prop="username">
@ -61,28 +41,25 @@
</Row> </Row>
<Row :gutter="32"> <Row :gutter="32">
<Col span="12"> <Col span="12">
<FormItem label="快递员名称" prop="workerName"> <FormItem label="配送员名称" prop="workerName">
<Input v-model="form.workerName" /> <Input v-model="form.workerName" />
</FormItem> </FormItem>
</Col> </Col>
<Col span="12"> <Col span="12">
<FormItem label="归属商圈" prop="region"> <FormItem label="所属学校" prop="region">
<region-tree-choose <Input v-model="form.regionTitle" disabled />
@on-change="handleSelectRegion"
ref="regionTree"
></region-tree-choose>
</FormItem> </FormItem>
</Col> </Col>
</Row> </Row>
<Row :gutter="32"> <Row :gutter="32">
<Col span="12"> <Col span="12">
<FormItem label="当次应缴" prop="depoNum"> <FormItem label="佣金余额" prop="depoBal">
<Input v-model="form.depoNum" /> <Input v-model="form.depoBal" />
</FormItem> </FormItem>
</Col> </Col>
<Col span="12"> <Col span="12">
<FormItem label="押金余额" prop="depoBal"> <FormItem label="交易保障金" prop="rebateAmount">
<Input v-model="form.depoBal" :disabled="true"/> <Input v-model="form.rebateAmount" :disabled="true" />
</FormItem> </FormItem>
</Col> </Col>
</Row> </Row>
@ -93,30 +70,14 @@
</FormItem> </FormItem>
</Col> </Col>
<Col span="24"> <Col span="24">
<FormItem label="快递员简介"> <FormItem label="配送员简介">
<Input type="textarea" v-model="form.workerDescribe" :rows="4" /> <Input type="textarea" v-model="form.workerDescribe" :rows="4" />
</FormItem> </FormItem>
</Col> </Col>
</Row> </Row>
<Row :gutter="32">
<Col span="12">
<FormItem label="所属公司" prop="ownerCompany">
<Select v-model="form.ownerCompany" multiple transfer>
<Option
v-for="item in companyList"
:value="item.id"
:key="item.id"
:label="item.companyName"
>
<span style="margin-right: 10px">{{ item.companyName }}</span>
</Option>
</Select>
</FormItem>
</Col>
</Row>
<Row :gutter="32"> <Row :gutter="32">
<Col span="24"> <Col span="24">
<FormItem label="快递员收费标准说明"> <FormItem label="配送员收费标准说明">
<Input type="textarea" v-model="form.remark" :rows="4" /> <Input type="textarea" v-model="form.remark" :rows="4" />
</FormItem> </FormItem>
</Col> </Col>
@ -124,9 +85,7 @@
</Form> </Form>
</div> </div>
<div class="drawer-footer br" v-show="type != '0'"> <div class="drawer-footer br" v-show="type != '0'">
<Button type="primary" :loading="submitLoading" @click="submit" <Button type="primary" :loading="submitLoading" @click="submit">提交</Button>
>提交</Button
>
<Button @click="visible = false">取消</Button> <Button @click="visible = false">取消</Button>
</div> </div>
</Drawer> </Drawer>
@ -134,19 +93,25 @@
</template> </template>
<script> <script>
import { getAllRoleList, addWorker, editWorker } from "@/api/index"; import {
import { getLogiticsCompanyList } from "@/api/app"; getAllRoleList,
import { addWorker,
editWorker
} from "@/api/index";
import {
getLogiticsCompanyList
} from "@/api/app";
import {
validateUsername, validateUsername,
validateMobile, validateMobile,
validatePassword, validatePassword,
} from "@/libs/validate"; } from "@/libs/validate";
import departmentTreeChoose from "@/views/my-components/hiver/department-tree-choose"; import departmentTreeChoose from "@/views/my-components/hiver/department-tree-choose";
import uploadPicInput from "@/views/my-components/hiver/upload-pic-input"; import uploadPicInput from "@/views/my-components/hiver/upload-pic-input";
import SetPassword from "@/views/my-components/hiver/set-password"; import SetPassword from "@/views/my-components/hiver/set-password";
import dict from "@/views/my-components/hiver/dict"; import dict from "@/views/my-components/hiver/dict";
import regionTreeChoose from "@/views/my-components/hiver/region-tree-choose"; import regionTreeChoose from "@/views/my-components/hiver/region-tree-choose";
export default { export default {
name: "addEdit", name: "addEdit",
components: { components: {
regionTreeChoose, regionTreeChoose,
@ -273,12 +238,6 @@ export default {
this.passColor = "#ed3f14"; this.passColor = "#ed3f14";
this.statusName = "已禁用"; this.statusName = "已禁用";
} }
//
let selectCompanyIds = [];
selectCompanyIds = data.ownerCompany.split(",");
data.ownerCompany = selectCompanyIds;
//
this.$refs.regionTree.setData(data.region, data.regionTitle);
// //
this.form = data; this.form = data;
} else { } else {
@ -301,10 +260,9 @@ export default {
mounted() { mounted() {
this.init(); this.init();
}, },
}; };
</script> </script>
<style lang="less"> <style lang="less">
@import "@/styles/drawer-common.less"; @import "@/styles/drawer-common.less";
</style> </style>

596
src/views/app/business/courier/courier.vue

@ -1,131 +1,54 @@
<style lang="less"> <style lang="less">
@import "@/styles/table-common.less"; @import "@/styles/table-common.less";
@import "./courier.less"; @import "./courier.less";
</style> </style>
<template> <template>
<div class="search"> <div class="search">
<Card> <Card>
<Row v-show="openSearch" @keydown.enter.native="handleSearch"> <Row v-show="openSearch" @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70"> <Form ref="searchForm" :model="searchForm" inline :label-width="90">
<FormItem label="快递员编号" prop="WorkerId"> <FormItem label="配送员名称" prop="WorkerName">
<Input <Input type="text" v-model="searchForm.workerName" clearable placeholder="请输入配送员名称"
type="text" style="width: 200px" />
v-model="searchForm.WorkerId"
clearable
placeholder="请输入快递员编号"
style="width: 200px"
/>
</FormItem> </FormItem>
<FormItem label="快递员名称" prop="WorkerName"> <FormItem label="上线状态" prop="isOnLine">
<Input <Select ref="dep" @on-change="checkStatusLine" style="width:200px">
type="text" <Option v-for="(item, i) in dictDataLine" :key="i" :value="item.value">{{
v-model="searchForm.WorkerName" item.title
clearable }}</Option>
placeholder="请输入快递员名称" </Select>
style="width: 200px"
/>
</FormItem> </FormItem>
<span v-if="drop"> <FormItem label="是否接指派单" prop="getPushOrder">
<FormItem label="接单状态" prop="WorkerStatus"> <Select ref="dep" @on-change="checkStatus" style="width:200px">
<dict dict="WorkerStatus" v-model="searchForm.WorkerStatus" style="width: 200px" /> <Option v-for="(item, i) in dictData" :key="i" :value="item.value">{{
item.title
}}</Option>
</Select>
</FormItem> </FormItem>
<FormItem label="电话" prop="mobile">
<Input
type="text"
v-model="searchForm.mobile"
clearable
placeholder="请输入电话"
style="width: 200px"
/>
</FormItem>
<FormItem label="创建时间">
<DatePicker
:options="options"
v-model="selectDate"
type="daterange"
format="yyyy-MM-dd"
clearable
@on-change="selectDateRange"
placeholder="选择起始时间"
style="width: 200px"
></DatePicker>
</FormItem>
</span>
<FormItem style="margin-left: -35px" class="br"> <FormItem style="margin-left: -35px" class="br">
<Button @click="handleSearch" type="primary" icon="ios-search" <Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button>
>搜索</Button
>
<Button @click="handleReset">重置</Button> <Button @click="handleReset">重置</Button>
<a class="drop-down" @click="dropDown">
{{ dropDownContent }}
<Icon :type="dropDownIcon"></Icon>
</a>
</FormItem> </FormItem>
</Form> </Form>
</Row> </Row>
<Row align="middle" justify="space-between" class="operation"> <Row align="middle" justify="space-between" class="operation">
<div>
<Button @click="add" type="primary" icon="md-add">创建快递员</Button>
<Button @click="delAll" icon="md-trash">批量删除</Button>
<Dropdown @on-click="handleDropdown">
<Button>
更多操作
<Icon type="md-arrow-dropdown" />
</Button>
<DropdownMenu slot="list">
<!-- <DropdownItem name="reset">重置用户密码</DropdownItem> -->
<DropdownItem name="exportData">导出所选数据</DropdownItem>
<DropdownItem name="exportAll">导出全部数据</DropdownItem>
<DropdownItem name="importData">导入数据</DropdownItem>
</DropdownMenu>
</Dropdown>
</div>
<div class="icons"> <div class="icons">
<Tooltip content="刷新" placement="top" transfer> <Tooltip content="刷新" placement="top" transfer>
<Icon <Icon type="md-refresh" size="18" class="item" @click="getDataList" />
type="md-refresh"
size="18"
class="item"
@click="getDataList"
/>
</Tooltip> </Tooltip>
<Tooltip <Tooltip :content="openSearch ? '关闭搜索' : '开启搜索'" placement="top" transfer>
:content="openSearch ? '关闭搜索' : '开启搜索'" <Icon type="ios-search" size="18" class="item tip" @click="openSearch = !openSearch" />
placement="top"
transfer
>
<Icon
type="ios-search"
size="18"
class="item tip"
@click="openSearch = !openSearch"
/>
</Tooltip> </Tooltip>
<Tooltip <Tooltip :content="openTip ? '关闭提示' : '开启提示'" placement="top" transfer>
:content="openTip ? '关闭提示' : '开启提示'" <Icon type="md-bulb" size="18" class="item tip" @click="openTip = !openTip" />
placement="top"
transfer
>
<Icon
type="md-bulb"
size="18"
class="item tip"
@click="openTip = !openTip"
/>
</Tooltip> </Tooltip>
<Tooltip content="表格密度" placement="top" transfer> <Tooltip content="表格密度" placement="top" transfer>
<Dropdown @on-click="changeTableSize" trigger="click"> <Dropdown @on-click="changeTableSize" trigger="click">
<Icon type="md-list" size="18" class="item" /> <Icon type="md-list" size="18" class="item" />
<DropdownMenu slot="list"> <DropdownMenu slot="list">
<DropdownItem :selected="tableSize == 'default'" name="default" <DropdownItem :selected="tableSize == 'default'" name="default">默认</DropdownItem>
>默认</DropdownItem <DropdownItem :selected="tableSize == 'large'" name="large">宽松</DropdownItem>
> <DropdownItem :selected="tableSize == 'small'" name="small">紧密</DropdownItem>
<DropdownItem :selected="tableSize == 'large'" name="large"
>宽松</DropdownItem
>
<DropdownItem :selected="tableSize == 'small'" name="small"
>紧密</DropdownItem
>
</DropdownMenu> </DropdownMenu>
</Dropdown> </Dropdown>
</Tooltip> </Tooltip>
@ -136,146 +59,43 @@
<span class="select-count">{{ selectList.length }}</span> <span class="select-count">{{ selectList.length }}</span>
<a class="select-clear" @click="clearSelectAll">清空</a> <a class="select-clear" @click="clearSelectAll">清空</a>
</Alert> </Alert>
<Table <Table :loading="loading" border :columns="colHidden" :data="data" :size="tableSize" sortable="custom"
:loading="loading" @on-sort-change="changeSort" @on-selection-change="showSelect" ref="table"></Table>
border
:columns="colHidden"
:data="data"
:size="tableSize"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="showSelect"
ref="table"
></Table>
<Row type="flex" justify="end" class="page"> <Row type="flex" justify="end" class="page">
<Page <Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize"
:current="searchForm.pageNumber" @on-change="changePage" @on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]"
:total="total" size="small" show-total show-elevator show-sizer></Page>
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
</Row> </Row>
</Card> </Card>
<addEdit :data="form" :type="showType" v-model="showWorker" @on-submit="getDataList" />
<!-- 自定义导出数据 -->
<Modal
v-model="exportModalVisible"
:title="exportTitle"
:loading="loadingExport"
@on-ok="exportCustomData"
>
<Form ref="exportForm" :label-width="100">
<FormItem label="导出文件名">
<Input v-model="filename" />
</FormItem>
<FormItem label="自定义导出列">
<CheckboxGroup v-model="chooseColumns">
<Checkbox
v-for="(item, i) in exportColumns"
:label="item.title"
:key="i"
:value="item.checked"
:disabled="item.disabled"
></Checkbox>
</CheckboxGroup>
</FormItem>
</Form>
</Modal>
<!-- 导入数据 -->
<Drawer
title="导入数据"
closable
v-model="importModalVisible"
width="800"
draggable
>
<div
style="
display: flex;
justify-content: space-between;
align-items: center;
"
>
<Upload action :before-upload="beforeUploadImport" accept=".xls, .xlsx">
<Button
:loading="reading"
icon="ios-cloud-upload-outline"
style="margin-right: 10px"
>上传Excel文件</Button
>
<span v-if="uploadfile.name"
>当前选择文件{{ uploadfile.name }}</span
>
</Upload>
<Button @click="clearImportData" icon="md-trash">清空数据</Button>
</div>
<Alert type="warning" show-icon
>导入前请下载查看导入模版数据文件查看所需字段及说明确保数据格式正确不得修改列英文名称</Alert
>
<Table
:columns="importColumns"
border
:height="height"
:data="importTableData"
ref="importTable"
></Table>
<div class="drawer-footer">
<Button @click="downloadTemple" type="info">下载导入模板</Button>
<div style="position: absolute; right: 15px; display: inline-block">
<Button @click="importModalVisible = false">关闭</Button>
<Button
:loading="importLoading"
:disabled="importTableData.length <= 0"
@click="importData"
style="margin-left: 8px"
type="primary"
>
确认导入
<span v-if="importTableData.length > 0"
>{{ importTableData.length }} 条数据</span
>
</Button>
</div>
</div>
</Drawer>
<addEdit
:data="form"
:type="showType"
v-model="showWorker"
@on-submit="getDataList"
/>
</div> </div>
</template> </template>
<script> <script>
import { import {
getWorkerListData, getWorkerListData,
enableWorker, enableWorker,
disableWorker, disableWorker,
deleteWorker, deleteWorker,
getAllUserData,
importUserData,
resetUserPass,
getDictDataByType,
offLineWorker, offLineWorker,
onLineWorker, onLineWorker,
} from "@/api/index"; } from "@/api/index";
import { shortcuts } from "@/libs/shortcuts"; import {
// shortcuts
import { userColumns, userData } from "./importTemplate"; } from "@/libs/shortcuts";
// //
import { exportColumn } from "./exportColumn"; import {
import excel from "@/libs/excel"; userColumns,
import addEdit from "./addEdit.vue"; userData
import dict from "@/views/my-components/hiver/dict"; } from "./importTemplate";
export default { //
import {
exportColumn
} from "./exportColumn";
import excel from "@/libs/excel";
import addEdit from "./addEdit.vue";
import dict from "@/views/my-components/hiver/dict";
export default {
name: "Courier", name: "Courier",
components: { components: {
addEdit, addEdit,
@ -296,30 +116,36 @@ export default {
exportModalVisible: false, exportModalVisible: false,
importModalVisible: false, importModalVisible: false,
drop: false, drop: false,
dropDownContent: "展开",
dropDownIcon: "ios-arrow-down", dropDownIcon: "ios-arrow-down",
selectList: [], selectList: [],
dictDataLine: [{
title: "下线",
value: 0
}, {
title: "上线",
value: 1
}],
dictData: [{
title: "不接指派",
value: 0
}, {
title: "接指派",
value: 1
}],
searchForm: { searchForm: {
workerId: "", region:JSON.parse(this.getStore("user")).departmentId,
workerName: "", workerName:'',
workerStatus: "", isOnLine:'', //0线1线
mobile: "", getPushOrder:'', //0 1
pageNumber: 1, pageNum: 1,
pageSize: 10, pageSize: 10
sort: "createTime",
order: "desc",
startDate: "",
endDate: "",
signPerson: "2",
adminFlag: "1",
}, },
selectDate: null, selectDate: null,
options: { options: {
shortcuts: shortcuts, shortcuts: shortcuts,
}, },
form: {}, form: {},
columns: [ columns: [{
{
type: "selection", type: "selection",
width: 60, width: 60,
align: "center", align: "center",
@ -332,38 +158,44 @@ export default {
fixed: "left", fixed: "left",
}, },
{ {
title: "快递员编号", title: "配送员编号",
key: "workerId", key: "workerId",
minWidth: 125, minWidth: 125,
sortable: true, },
fixed: "left",
render: (h, params) => {
return h(
"a",
{ {
on: { title: "配送员名称",
click: () => { key: "workerName",
this.showDetail(params.row); minWidth: 125,
}, },
{
title: "佣金余额",
key: "depoBal",
minWidth: 125,
}, },
{
title: "配送员创建时间",
key: "createTime",
minWidth: 125,
}, },
params.row.workerId {
); title: "联系方式",
key: "mobile",
minWidth: 125,
}, },
{
title: "接单区域",
key: "regionTitle",
minWidth: 125,
}, },
{ {
title: "快递员名称", title: "描述",
key: "workerName", key: "remark",
minWidth: 125, minWidth: 125,
sortable: true,
fixed: "left",
}, },
{ {
title: "接单状态", title: "接单状态",
key: "workerStatus", key: "workerStatus",
minWidth: 160, minWidth: 160,
sortable: true,
//fixed: "left",
render: (h, params) => { render: (h, params) => {
let re = "", let re = "",
color = ""; color = "";
@ -379,8 +211,7 @@ export default {
} }
return h("div", [ return h("div", [
h( h(
"Tag", "Tag", {
{
props: { props: {
color: color, color: color,
}, },
@ -388,38 +219,12 @@ export default {
re re
), ),
]); ]);
},
filters: [
{
label: "可抢单",
value: 1,
},
{
label: "不可接单",
value: 2,
},
{
label: "已禁用",
value: 3,
},
],
filterMultiple: false,
filterRemote: (e) => {
let v = "";
if (e.length > 0) {
v = e[0];
} }
this.searchForm.workerStatus = v;
this.searchForm.pageNumber = 1;
this.getDataList();
},
}, },
{ {
title: "上线状态", title: "上线状态",
key: "isOnLine", key: "isOnLine",
minWidth: 160, minWidth: 160,
sortable: true,
//fixed: "left",
render: (h, params) => { render: (h, params) => {
let re = "", let re = "",
color = ""; color = "";
@ -432,8 +237,7 @@ export default {
} }
return h("div", [ return h("div", [
h( h(
"Tag", "Tag", {
{
props: { props: {
color: color, color: color,
}, },
@ -441,52 +245,54 @@ export default {
re re
), ),
]); ]);
},
filters: [
{
label: "上线",
value: 1,
},
{
label: "下线",
value: 0,
}
],
filterMultiple: false,
filterRemote: (e) => {
let v = "";
if (e.length > 0) {
v = e[0];
} }
this.searchForm.isOnLine = v;
this.searchForm.pageNumber = 1;
this.getDataList();
},
}, },
{ {
title: "当次缴纳", title: "交易保障金",
key: "depoNum", key: "rebateAmount",
width: 200, width: 200,
align: "center", align: "center"
hidden: true
}, },
{ {
title: "押金余额", title: "手上的待接单订单数",
key: "depoBal", key: "orderWaitCount",
width: 200, width: 200,
align: "center", align: "center",
}, },
{ {
title: "联系方式", title: "手上的待取货订单数",
key: "mobile", key: "orderGetCount",
width: 200, width: 200,
align: "center", align: "center",
}, },
{ {
title: "创建时间", title: "手上的待送达订单数",
key: "createTime", key: "orderPutCount",
sortable: true, width: 180,
sortType: "desc", },
{
title: "学生/身份证",
key: "cardPicture",
width: 180,
},
{
title: "是否接指派",
key: "getPushOrder",
width: 180,
},
{
title: "评分",
key: "score",
width: 180,
},
{
title: "平均时长",
key: "avgTime",
width: 180,
},
{
title: "超出3楼额外费用",
key: "highFloorFee",
width: 180, width: 180,
}, },
{ {
@ -499,8 +305,7 @@ export default {
let enableOrDisable = ""; let enableOrDisable = "";
if (params.row.workerStatus == 1) { if (params.row.workerStatus == 1) {
enableOrDisable = h( enableOrDisable = h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.disable(params.row); this.disable(params.row);
@ -511,8 +316,7 @@ export default {
); );
} else { } else {
enableOrDisable = h( enableOrDisable = h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.enable(params.row); this.enable(params.row);
@ -525,8 +329,7 @@ export default {
let onOrOffLine = ""; let onOrOffLine = "";
if (params.row.isOnLine == 1) { if (params.row.isOnLine == 1) {
onOrOffLine = h( onOrOffLine = h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.offLine(params.row); this.offLine(params.row);
@ -537,8 +340,7 @@ export default {
); );
} else { } else {
onOrOffLine = h( onOrOffLine = h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.onLine(params.row); this.onLine(params.row);
@ -550,8 +352,7 @@ export default {
} }
return h("div", [ return h("div", [
h( h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.edit(params.row); this.edit(params.row);
@ -578,15 +379,14 @@ export default {
}, },
}), }),
h( h(
"a", "a", {
{
on: { on: {
click: () => { click: () => {
this.remove(params.row); this.remove(params.row);
}, },
}, },
}, },
"删除" "查看接单规则"
), ),
]); ]);
}, },
@ -594,7 +394,7 @@ export default {
], ],
exportColumns: exportColumn, exportColumns: exportColumn,
chooseColumns: [], chooseColumns: [],
filename: "快递员数据", filename: "配送员数据",
exportTitle: "确认导出", exportTitle: "确认导出",
exportType: "", exportType: "",
importTableData: [], importTableData: [],
@ -607,7 +407,6 @@ export default {
data: [], data: [],
exportData: [], exportData: [],
total: 0, total: 0,
dictData: [],
}; };
}, },
methods: { methods: {
@ -635,6 +434,14 @@ export default {
this.searchForm.pageSize = v; this.searchForm.pageSize = v;
this.getDataList(); this.getDataList();
}, },
checkStatusLine(v){
this.searchForm.isOnLine = v
console.log(v)
},
checkStatus(v){
this.searchForm.getPushOrder = v
console.log(v)
},
selectDateRange(v) { selectDateRange(v) {
if (v) { if (v) {
this.searchForm.startDate = v[0]; this.searchForm.startDate = v[0];
@ -713,79 +520,7 @@ export default {
}; };
excel.export_array_to_excel(params); excel.export_array_to_excel(params);
}, },
beforeUploadImport(file) {
this.uploadfile = file;
const fileExt = file.name.split(".").pop().toLocaleLowerCase();
if (fileExt == "xlsx" || fileExt == "xls") {
this.readFile(file);
this.file = file;
} else {
this.$Notice.warning({
title: "文件类型错误",
desc:
"所选文件‘ " +
file.name +
" ’不是EXCEL文件,请选择后缀为.xlsx或者.xls的EXCEL文件。",
});
}
return false;
},
//
readFile(file) {
this.reading = true;
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onerror = (e) => {
this.reading = false;
this.$Message.error("文件读取出错");
};
reader.onload = (e) => {
const data = e.target.result;
const { header, results } = excel.read(data, "array");
const tableTitle = header.map((item) => {
return { title: item, key: item, minWidth: 130, align: "center" };
});
this.importTableData = results;
this.importColumns = tableTitle;
this.reading = false;
this.$Message.success("读取数据成功");
};
},
clearImportData() {
this.importTableData = [];
this.importColumns = [];
this.uploadfile = {};
},
downloadTemple() {
let title = [];
let key = [];
userColumns.forEach((e) => {
title.push(e.title);
key.push(e.key);
});
const params = {
title: title,
key: key,
data: userData,
autoWidth: true,
filename: "导入用户数据模版",
};
excel.export_array_to_excel(params);
},
importData() {
this.importLoading = true;
importUserData(this.importTableData).then((res) => {
this.importLoading = false;
if (res.success) {
this.importModalVisible = false;
this.getDataList();
this.$Modal.info({
title: "导入结果",
content: res.message,
});
}
});
},
showDetail(v) { showDetail(v) {
// null"" // null""
for (let attr in v) { for (let attr in v) {
@ -819,7 +554,7 @@ export default {
enable(v) { enable(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认恢复", title: "确认恢复",
content: "您确认要恢复快递员 " + v.workerName + " ?", content: "您确认要恢复配送员 " + v.workerName + " ?",
loading: true, loading: true,
onOk: () => { onOk: () => {
enableWorker(v.workerId).then((res) => { enableWorker(v.workerId).then((res) => {
@ -835,7 +570,7 @@ export default {
disable(v) { disable(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认禁用", title: "确认禁用",
content: "您确认要禁用快递员 " + v.workerName + " ?", content: "您确认要禁用配送员 " + v.workerName + " ?",
loading: true, loading: true,
onOk: () => { onOk: () => {
disableWorker(v.workerId).then((res) => { disableWorker(v.workerId).then((res) => {
@ -851,7 +586,7 @@ export default {
offLine(v) { offLine(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认下线", title: "确认下线",
content: "您确认要使抢单工 " + v.workerName + " 下线吗?", content: "您确认要使配送员 " + v.workerName + " 下线吗?",
loading: true, loading: true,
onOk: () => { onOk: () => {
offLineWorker({ offLineWorker({
@ -869,7 +604,7 @@ export default {
onLine(v) { onLine(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认上线", title: "确认上线",
content: "您确认要使抢单工 " + v.workerName + " 上线吗?", content: "您确认要使配送员 " + v.workerName + " 上线吗?",
loading: true, loading: true,
onOk: () => { onOk: () => {
onLineWorker({ onLineWorker({
@ -887,7 +622,7 @@ export default {
remove(v) { remove(v) {
this.$Modal.confirm({ this.$Modal.confirm({
title: "确认删除", title: "确认删除",
content: "您确认要删除快递员 " + v.workerId + " ?", content: "您确认要删除配送员 " + v.workerId + " ?",
loading: true, loading: true,
onOk: () => { onOk: () => {
deleteWorker(v.workerId).then((res) => { deleteWorker(v.workerId).then((res) => {
@ -901,16 +636,6 @@ export default {
}, },
}); });
}, },
dropDown() {
if (this.drop) {
this.dropDownContent = "展开";
this.dropDownIcon = "ios-arrow-down";
} else {
this.dropDownContent = "收起";
this.dropDownIcon = "ios-arrow-up";
}
this.drop = !this.drop;
},
showSelect(e) { showSelect(e) {
this.exportData = e; this.exportData = e;
this.selectList = e; this.selectList = e;
@ -929,11 +654,13 @@ export default {
loading: true, loading: true,
onOk: () => { onOk: () => {
let ids = ""; let ids = "";
this.selectList.forEach(function (e) { this.selectList.forEach(function(e) {
ids += e.id + ","; ids += e.id + ",";
}); });
ids = ids.substring(0, ids.length - 1); ids = ids.substring(0, ids.length - 1);
deleteWorker({ ids: ids }).then((res) => { deleteWorker({
ids: ids
}).then((res) => {
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("删除成功"); this.$Message.success("删除成功");
@ -944,9 +671,10 @@ export default {
}, },
}); });
}, },
},computed:{ },
colHidden:function (){ computed: {
return this.columns.filter(function(e){ colHidden: function() {
return this.columns.filter(function(e) {
return !e.hidden; return !e.hidden;
}) })
} }
@ -956,5 +684,5 @@ export default {
this.height = Number(document.documentElement.clientHeight - 230); this.height = Number(document.documentElement.clientHeight - 230);
this.init(); this.init();
}, },
}; };
</script> </script>

258
src/views/app/business/logistics/logistics.vue

@ -10,15 +10,20 @@
<TabPane label="快递订单" name="2"></TabPane> <TabPane label="快递订单" name="2"></TabPane>
<TabPane label="跑腿订单" name="3"></TabPane> <TabPane label="跑腿订单" name="3"></TabPane>
</Tabs> </Tabs>
<Tabs v-model="tabName" :animated="false" @on-click="changeTab"> <Tabs v-model="tabName1" :animated="false" @on-click="changeTab">
<TabPane label="指派单" name="7"></TabPane> <TabPane label="全部" name="10"></TabPane>
<TabPane label="待支付" name=""></TabPane>
<TabPane label="待成团" name=""></TabPane>
<TabPane label="待消费" name=""></TabPane>
<TabPane label="待接单" name="0"></TabPane> <TabPane label="待接单" name="0"></TabPane>
<TabPane label="待取货" name="1"></TabPane> <TabPane label="待取货" name="1"></TabPane>
<TabPane label="待送达" name="2"></TabPane> <TabPane label="待送达" name="2"></TabPane>
<TabPane label="已完成" name="3"></TabPane> <TabPane label="已完成" name=""></TabPane>
<TabPane label="已取消" name="4"></TabPane> <TabPane label="待退款" name=""></TabPane>
<TabPane label="已退款" name="5"></TabPane> <TabPane label="已退款" name=""></TabPane>
<TabPane label="预订单" name="6"></TabPane> <TabPane label="已取消" name=""></TabPane>
<TabPane label="售后中" name=""></TabPane>
<TabPane label="已售后" name=""></TabPane>
</Tabs> </Tabs>
<Row v-show="openSearch" @keydown.enter.native="handleSearch"> <Row v-show="openSearch" @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70"> <Form ref="searchForm" :model="searchForm" inline :label-width="70">
@ -39,7 +44,7 @@
<Row align="middle" justify="space-between" class="operation"> <Row align="middle" justify="space-between" class="operation">
<div class="icons"> <div class="icons">
<Tooltip content="刷新" placement="top" transfer> <Tooltip content="刷新" placement="top" transfer>
<Icon type="md-refresh" size="18" class="item" @click="getDataList" /> <Icon type="md-refresh" size="18" class="item" @click="getLogisticsInfo" />
</Tooltip> </Tooltip>
<Tooltip :content="openSearch ? '关闭搜索' : '开启搜索'" placement="top" transfer> <Tooltip :content="openSearch ? '关闭搜索' : '开启搜索'" placement="top" transfer>
<Icon type="ios-search" size="18" class="item tip" @click="openSearch = !openSearch" /> <Icon type="ios-search" size="18" class="item tip" @click="openSearch = !openSearch" />
@ -72,21 +77,6 @@
size="small" show-total show-elevator show-sizer></Page> size="small" show-total show-elevator show-sizer></Page>
</Row> </Row>
</Card> </Card>
<!-- 自定义导出数据 -->
<Modal v-model="exportModalVisible" :title="exportTitle" :loading="loadingExport" @on-ok="exportCustomData">
<Form ref="exportForm" :label-width="100">
<FormItem label="导出文件名">
<Input v-model="filename" />
</FormItem>
<FormItem label="自定义导出列">
<CheckboxGroup v-model="chooseColumns">
<Checkbox v-for="(item, i) in exportColumns" :label="item.title" :key="i" :value="item.checked"
:disabled="item.disabled"></Checkbox>
</CheckboxGroup>
</FormItem>
</Form>
</Modal>
<!-- 转单弹窗 --> <!-- 转单弹窗 -->
<Modal v-model="transferOrder" @on-ok="transferClose" :width="1065"> <Modal v-model="transferOrder" @on-ok="transferClose" :width="1065">
<Table :loading="loading" border :columns="workerList" :data="transferList" :size="tableSize" <Table :loading="loading" border :columns="workerList" :data="transferList" :size="tableSize"
@ -104,68 +94,20 @@
<Button type="text" @click="Visiable = false">关闭</Button> <Button type="text" @click="Visiable = false">关闭</Button>
</div> </div>
</Modal> </Modal>
<!-- 导入数据 --> <addEdit :data="form" :type="showType" v-model="showOrder" @on-submit="getLogisticsInfo" />
<Drawer title="导入数据" closable v-model="importModalVisible" width="800" draggable>
<div style="
display: flex;
justify-content: space-between;
align-items: center;
">
<Upload action :before-upload="beforeUploadImport" accept=".xls, .xlsx">
<Button :loading="reading" icon="ios-cloud-upload-outline"
style="margin-right: 10px">上传Excel文件</Button>
<span v-if="uploadfile.name">当前选择文件{{ uploadfile.name }}</span>
</Upload>
<Button @click="clearImportData" icon="md-trash">清空数据</Button>
</div>
<Alert type="warning" show-icon>导入前请下载查看导入模版数据文件查看所需字段及说明确保数据格式正确不得修改列英文名称</Alert>
<Table :columns="importColumns" border :height="height" :data="importTableData" ref="importTable"></Table>
<div class="drawer-footer">
<Button @click="downloadTemple" type="info">下载导入模板</Button>
<div style="position: absolute; right: 15px; display: inline-block">
<Button @click="importModalVisible = false">关闭</Button>
<Button :loading="importLoading" :disabled="importTableData.length <= 0" @click="importData"
style="margin-left: 8px" type="primary">
确认导入
<span v-if="importTableData.length > 0">{{ importTableData.length }} 条数据</span>
</Button>
</div>
</div>
</Drawer>
<addEdit :data="form" :type="showType" v-model="showOrder" @on-submit="getDataList" />
</div> </div>
</template> </template>
<script> <script>
import { import {
getOwListData, orderScheduling,
getConditionList,
getWorkerListData, getWorkerListData,
transferOrder, transferOrder,
runshOrder, runshOrder,
enableUser, enableUser,
getSaleByCompanyId,
disableUser, disableUser,
deleteOrder, deleteOrder,
getAllUserData,
importUserData,
resetUserPass,
getDictDataByType,
unbindOrder,
} from "@/api/index"; } from "@/api/index";
import {
shortcuts
} from "@/libs/shortcuts";
//
import {
userColumns,
userData
} from "./importTemplate";
//
import {
exportColumn
} from "./exportColumn";
import excel from "@/libs/excel"; import excel from "@/libs/excel";
import addEdit from "./addEdit.vue"; import addEdit from "./addEdit.vue";
import dict from "@/views/my-components/hiver/dict"; import dict from "@/views/my-components/hiver/dict";
@ -208,25 +150,14 @@
}, },
searchForm: { searchForm: {
deliveryType: 1, deliveryType: 1,
getAreaId: "",
hallOnly: true,
kuaidiData: [],
order: "", order: "",
pageNum: 1, pageNum: 1,
pageSize: '10', pageSize: 10,
putAreaId: "", regionId: JSON.parse(this.getStore("user")).departmentId,
regionId: "", status: 0
status: 0,
waimaiData: [],
workerId: ""
}, },
selectDate: null, selectDate: null,
options: {
shortcuts: shortcuts,
},
form: {}, form: {},
// {{item.isOnLine==0?'线':'线'}}
// {{item.signPerson==1?'':''}}
workerList: [{ workerList: [{
type: "index", type: "index",
width: 60, width: 60,
@ -422,7 +353,6 @@
}, },
}, },
], ],
exportColumns: exportColumn,
chooseColumns: [], chooseColumns: [],
filename: "订单数据", filename: "订单数据",
exportTitle: "确认导出", exportTitle: "确认导出",
@ -432,8 +362,6 @@
uploadfile: { uploadfile: {
name: "", name: "",
}, },
tempColumns: userColumns,
tempData: userData,
data: [], data: [],
exportData: [], exportData: [],
total: 0, total: 0,
@ -444,16 +372,7 @@
}, },
methods: { methods: {
init() { init() {
this.getDataList(); this.getLogisticsInfo();
//
let array = [];
this.exportColumns.forEach((e) => {
//
//e.disabled = false;
array.push(e.title);
});
this.chooseColumns = array;
}, },
//--> //-->
goTransferOrder(item) { goTransferOrder(item) {
@ -474,7 +393,7 @@
if (res.success) { if (res.success) {
this.$Message.success("转单成功"); this.$Message.success("转单成功");
this.transferOrder = false this.transferOrder = false
this.getDataList() this.getLogisticsInfo()
} }
}); });
} }
@ -487,16 +406,16 @@
changeOrderTab() { changeOrderTab() {
this.searchForm.pageNum = 1; this.searchForm.pageNum = 1;
this.searchForm.deliveryType = v; this.searchForm.deliveryType = v;
this.getDataList(); this.getLogisticsInfo();
}, },
changeTab(v) { changeTab(v) {
this.searchForm.pageNum = 1; this.searchForm.pageNum = 1;
this.searchForm.status = v; this.searchForm.status = v;
this.getDataList(); this.getLogisticsInfo();
}, },
changePage(v) { changePage(v) {
this.searchForm.pageNum = v; this.searchForm.pageNum = v;
this.getDataList(); this.getLogisticsInfo();
this.clearSelectAll(); this.clearSelectAll();
}, },
changeWorkerPage(v) { changeWorkerPage(v) {
@ -505,7 +424,7 @@
}, },
changePageSize(v) { changePageSize(v) {
this.searchForm.pageSize = v; this.searchForm.pageSize = v;
this.getDataList(); this.getLogisticsInfo();
}, },
changeWorkerPageSize(v) { changeWorkerPageSize(v) {
this.searchWorker.pageSize = v; this.searchWorker.pageSize = v;
@ -526,17 +445,15 @@
return diffInMinutes; return diffInMinutes;
}, },
getDataList() { //
this.loading = true; getLogisticsInfo() {
// orderScheduling(this.searchForm).then((res) => {
getOwListData(this.searchForm).then((res) => {
this.loading = false; this.loading = false;
if (res.success) { if (res.success) {
this.data = res.result.records; this.data = res.result.records
this.total = res.result.total; this.total = res.result.total;
} }
}); });
}, },
transferClose() { transferClose() {
this.transferOrder = false this.transferOrder = false
@ -544,7 +461,7 @@
handleSearch() { handleSearch() {
this.searchForm.pageNum = 1; this.searchForm.pageNum = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 10;
this.getDataList(); this.getLogisticsInfo();
}, },
handleReset() { handleReset() {
this.$refs.searchForm.resetFields(); this.$refs.searchForm.resetFields();
@ -556,7 +473,7 @@
this.$refs.dep.clearSelect(); this.$refs.dep.clearSelect();
this.searchForm.departmentId = ""; this.searchForm.departmentId = "";
// //
this.getDataList(); this.getLogisticsInfo();
}, },
changeSort(e) { changeSort(e) {
this.searchForm.sort = e.key; this.searchForm.sort = e.key;
@ -564,117 +481,14 @@
if (e.order == "normal") { if (e.order == "normal") {
this.searchForm.order = ""; this.searchForm.order = "";
} }
this.getDataList(); this.getLogisticsInfo();
},
exportCustomData() {
if (this.filename == "") {
this.filename = "用户数据";
}
//
let exportColumns = [];
this.exportColumns.forEach((e) => {
this.chooseColumns.forEach((c) => {
if (e.title == c && !e.disabled) {
exportColumns.push(e);
}
});
});
this.exportModalVisible = false;
let title = [];
let key = [];
exportColumns.forEach((e) => {
title.push(e.title);
key.push(e.key);
});
const params = {
title: title,
key: key,
data: this.exportData,
autoWidth: true,
filename: this.filename,
};
excel.export_array_to_excel(params);
},
beforeUploadImport(file) {
this.uploadfile = file;
const fileExt = file.name.split(".").pop().toLocaleLowerCase();
if (fileExt == "xlsx" || fileExt == "xls") {
this.readFile(file);
this.file = file;
} else {
this.$Notice.warning({
title: "文件类型错误",
desc: "所选文件‘ " +
file.name +
" ’不是EXCEL文件,请选择后缀为.xlsx或者.xls的EXCEL文件。",
});
}
return false;
},
//
readFile(file) {
this.reading = true;
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onerror = (e) => {
this.reading = false;
this.$Message.error("文件读取出错");
};
reader.onload = (e) => {
const data = e.target.result;
const {
header,
results
} = excel.read(data, "array");
const tableTitle = header.map((item) => {
return {
title: item,
key: item,
minWidth: 130,
align: "center"
};
});
this.importTableData = results;
this.importColumns = tableTitle;
this.reading = false;
this.$Message.success("读取数据成功");
};
}, },
clearImportData() { clearImportData() {
this.importTableData = []; this.importTableData = [];
this.importColumns = []; this.importColumns = [];
this.uploadfile = {}; this.uploadfile = {};
}, },
downloadTemple() {
let title = [];
let key = [];
userColumns.forEach((e) => {
title.push(e.title);
key.push(e.key);
});
const params = {
title: title,
key: key,
data: userData,
autoWidth: true,
filename: "导入用户数据模版",
};
excel.export_array_to_excel(params);
},
importData() {
this.importLoading = true;
importUserData(this.importTableData).then((res) => {
this.importLoading = false;
if (res.success) {
this.importModalVisible = false;
this.getDataList();
this.$Modal.info({
title: "导入结果",
content: res.message,
});
}
});
},
showDetail(v) { showDetail(v) {
// null"" // null""
for (let attr in v) { for (let attr in v) {
@ -715,7 +529,7 @@
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("操作成功"); this.$Message.success("操作成功");
this.getDataList(); this.getLogisticsInfo();
} }
}); });
}, },
@ -731,7 +545,7 @@
this.$Modal.remove(); this.$Modal.remove();
if (res.success) { if (res.success) {
this.$Message.success("操作成功"); this.$Message.success("操作成功");
this.getDataList(); this.getLogisticsInfo();
} }
}); });
}, },
@ -750,7 +564,7 @@
if (res.success) { if (res.success) {
this.clearSelectAll(); this.clearSelectAll();
this.$Message.success("删除成功"); this.$Message.success("删除成功");
this.getDataList(); this.getLogisticsInfo();
} }
}); });
}, },
@ -825,7 +639,7 @@
if (res.success) { if (res.success) {
this.$Message.success("删除成功"); this.$Message.success("删除成功");
this.clearSelectAll(); this.clearSelectAll();
this.getDataList(); this.getLogisticsInfo();
} }
}); });
}, },
@ -833,8 +647,6 @@
}, },
}, },
mounted() { mounted() {
//
this.height = Number(document.documentElement.clientHeight - 230);
this.init(); this.init();
}, },
}; };

513
src/views/sys/order-manage/orderManage.vue

@ -6,49 +6,35 @@
<div class="search"> <div class="search">
<Card> <Card>
<Tabs v-model="tabName" :animated="false" @on-click="changeOrderTab"> <Tabs v-model="tabName" :animated="false" @on-click="changeOrderTab">
<TabPane label="指派单" name="7"></TabPane> <TabPane label="饭团订单" name="1"></TabPane>
<TabPane label="待接单" name="0"></TabPane> <TabPane label="快递订单" name="2"></TabPane>
<TabPane label="待取货" name="1"></TabPane> <TabPane label="跑腿订单" name="3"></TabPane>
<TabPane label="待送达" name="2"></TabPane> </Tabs>
<TabPane label="已完成" name="3"></TabPane> <Tabs v-model="tabName1" :animated="false" @on-click="changeTab">
<TabPane label="已取消" name="4"></TabPane> <TabPane label="全部" name="10"></TabPane>
<TabPane label="已退款" name="5"></TabPane> <TabPane label="待支付" name="0"></TabPane>
<TabPane label="预订单" name="6"></TabPane> <TabPane label="待成团" name="1"></TabPane>
<TabPane label="待消费" name="2"></TabPane>
<TabPane label="待接单" name="3"></TabPane>
<TabPane label="待取货" name="4"></TabPane>
<TabPane label="待送达" name="5"></TabPane>
<TabPane label="已完成" name="6"></TabPane>
<TabPane label="待退款" name="7"></TabPane>
<TabPane label="已退款" name="8"></TabPane>
<TabPane label="已取消" name="9"></TabPane>
<TabPane label="售后中" name="11"></TabPane>
<TabPane label="已售后" name="12"></TabPane>
</Tabs> </Tabs>
<Row v-show="openSearch" @keydown.enter.native="handleSearch"> <Row v-show="openSearch" @keydown.enter.native="handleSearch">
<Form ref="searchForm" :model="searchForm" inline :label-width="70"> <Form ref="searchForm" :model="searchForm" inline :label-width="100">
<FormItem label="状态" prop="orderId">
<Select ref="dep" @on-change="checkStatus" clearable="true">
<Option v-for="(item, i) in dictData" :key="i" :value="item.value">{{
item.title
}}</Option>
</Select>
</FormItem> <FormItem label="店铺名称" prop="orderLogistics">
<FormItem label="名称" prop="orderLogistics"> <Input type="text" v-model="searchForm.shopName" clearable placeholder="请输入店铺名称"
<Input type="text" v-model="searchForm.searchStr" clearable placeholder="请输入收发货人名称"
style="width: 200px" /> style="width: 200px" />
</FormItem> </FormItem>
<FormItem label="收货人id" prop="kdOrderId1"> <FormItem label="收货人手机号" prop="kdOrderId1">
<Input type="text" v-model="searchForm.receiverPhone" clearable placeholder="请输入店铺名称"
<Select v-model="shou" clearable='false' @on-clear="clearShou=true" filterable style="width: 200px" />
:remote-method="getShouValue" :loading="loading1" placeholder="请选择或输入添加">
<Option v-for="item in shouList" :value="item.id" :key="item.username"
:label="item.shipperOrReceiverName" @on-change="checkShouValue(item)">
<span style="margin-right: 10px">{{ item.shipperOrReceiverName }}</span>
<span style="color: #ccc">{{ item.mobile }}</span>
</Option>
</Select>
</FormItem>
<FormItem label="发货人id" prop="kdOrderId">
<Select v-model="fa" clearable='false' filterable @on-clear="searchForm.shipperId =''"
:remote-method="getFaValue" :loading="loading2" placeholder="请选择或输入添加">
<Option v-for="item in faList" @on-change="checkFaValue(item)" :value="item.id"
:key="item.mobile" :label="item.shipperOrReceiverName">
<span style="margin-right: 10px">{{ item.shipperOrReceiverName }}</span>
<span style="color: #ccc">{{ item.mobile }}</span>
</Option>
</Select>
</FormItem> </FormItem>
<FormItem style="margin-left: -35px" class="br"> <FormItem style="margin-left: -35px" class="br">
<Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button> <Button @click="handleSearch" type="primary" icon="ios-search">搜索</Button>
@ -59,7 +45,7 @@
<Row align="middle" justify="space-between" class="operation"> <Row align="middle" justify="space-between" class="operation">
<div class="icons"> <div class="icons">
<Tooltip content="刷新" placement="top" transfer> <Tooltip content="刷新" placement="top" transfer>
<Icon type="md-refresh" size="18" class="item" @click="getDataList" /> <Icon type="md-refresh" size="18" class="item" @click="getLogisticsInfo" />
</Tooltip> </Tooltip>
<Tooltip :content="openSearch ? '关闭搜索' : '开启搜索'" placement="top" transfer> <Tooltip :content="openSearch ? '关闭搜索' : '开启搜索'" placement="top" transfer>
<Icon type="ios-search" size="18" class="item tip" @click="openSearch = !openSearch" /> <Icon type="ios-search" size="18" class="item tip" @click="openSearch = !openSearch" />
@ -99,119 +85,32 @@
<Button type="text" @click="Visiable = false">关闭</Button> <Button type="text" @click="Visiable = false">关闭</Button>
</div> </div>
</Modal> </Modal>
<!-- 自定义导出数据 -->
<Modal v-model="exportModalVisible" :title="exportTitle" :loading="loadingExport" @on-ok="exportCustomData">
<Form ref="exportForm" :label-width="100">
<FormItem label="导出文件名">
<Input v-model="filename" />
</FormItem>
<FormItem label="自定义导出列">
<CheckboxGroup v-model="chooseColumns">
<Checkbox v-for="(item, i) in exportColumns" :label="item.title" :key="i" :value="item.checked"
:disabled="item.disabled"></Checkbox>
</CheckboxGroup>
</FormItem>
</Form>
</Modal>
<!-- 导入数据 -->
<Drawer title="导入数据" closable v-model="importModalVisible" width="800" draggable>
<div style="
display: flex;
justify-content: space-between;
align-items: center;
">
<Upload action :before-upload="beforeUploadImport" accept=".xls, .xlsx">
<Button :loading="reading" icon="ios-cloud-upload-outline"
style="margin-right: 10px">上传Excel文件</Button>
<span v-if="uploadfile.name">当前选择文件{{ uploadfile.name }}</span>
</Upload>
<Button @click="clearImportData" icon="md-trash">清空数据</Button>
</div>
<Alert type="warning" show-icon>导入前请下载查看导入模版数据文件查看所需字段及说明确保数据格式正确不得修改列英文名称</Alert>
<Table :columns="importColumns" border :height="height" :data="importTableData" ref="importTable"></Table>
<div class="drawer-footer">
<Button @click="downloadTemple" type="info">下载导入模板</Button>
<div style="position: absolute; right: 15px; display: inline-block">
<Button @click="importModalVisible = false">关闭</Button>
<Button :loading="importLoading" :disabled="importTableData.length <= 0" @click="importData"
style="margin-left: 8px" type="primary">
确认导入
<span v-if="importTableData.length > 0">{{ importTableData.length }} 条数据</span>
</Button>
</div>
</div>
</Drawer>
<addEdit :data="form" :type="showType" v-model="showOrder" @on-submit="getDataList" /> <addEdit :data="form" :type="showType" v-model="showOrder" @on-submit="getLogisticsInfo" />
</div> </div>
</template> </template>
<script> <script>
import { import {
getLogisticsOrderPageList, getOrderList
getLogisticsOrderStatistics,
batchUpdateOrderStatus,
getOrderList,
enableUser,
getLogisticsAddressBookPageList,
disableUser,
deleteOrder,
getAllUserData,
importUserData,
resetUserPass,
getDictDataByType,
} from "@/api/index"; } from "@/api/index";
import {
getAllLogiticsCompanyData,
getLogiticsCompanyData,
} from "@/api/app";
import {
shortcuts
} from "@/libs/shortcuts";
//
import {
userColumns,
userData
} from "./importTemplate";
//
import {
exportColumn
} from "./exportColumn";
import excel from "@/libs/excel";
import addEdit from "./addEdit.vue"; import addEdit from "./addEdit.vue";
import dict from "@/views/my-components/hiver/dict";
import logisticsAddress from "@/views/sys/order-manage/logisticsAddress"; import logisticsAddress from "@/views/sys/order-manage/logisticsAddress";
export default { export default {
name: "order-manage", name: "order-manage",
components: { components: {
addEdit, addEdit,
dict,
logisticsAddress, logisticsAddress,
}, },
data() { data() {
return { return {
tableSize: "default", tableSize: "default",
Visiable: false, Visiable: false,
height: 510,
loading1: false,
loading2: false,
showOrder: false, showOrder: false,
clearShou: false,
clearFa: false,
shouList: [],
shou: '',
fa: '',
faList: [],
orderStatistics: {},
showType: "0", showType: "0",
openSearch: true, openSearch: true,
openTip: true, openTip: true,
loading: true, loading: true,
reading: false,
importLoading: false,
loadingExport: true,
exportModalVisible: false,
importModalVisible: false,
drop: false, drop: false,
dropDownContent: "展开", dropDownContent: "展开",
dropDownIcon: "ios-arrow-down", dropDownIcon: "ios-arrow-down",
@ -219,15 +118,13 @@
searchForm: { searchForm: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
regionId: "", regionId: JSON.parse(this.getStore("user")).departmentId,
searchType: 0, searchType: 0,
searchStatus:0,
shopName: "", shopName: "",
mobile:'',
userId: "" userId: ""
}, },
selectDate: null,
options: {
shortcuts: shortcuts,
},
form: {}, form: {},
columns: [{ columns: [{
type: "index", type: "index",
@ -238,13 +135,13 @@
{ {
title: "订单编号", title: "订单编号",
key: "id", key: "id",
width: 150, width: 200,
align: "center", align: "center",
}, },
{ {
title: "用户账号", title: "用户账号",
key: "receiverPhone", key: "receiverPhone",
width: 150, width: 130,
align: "center", align: "center",
}, },
{ {
@ -262,7 +159,7 @@
{ {
title: "订单总金额", title: "订单总金额",
key: "totalAmount", key: "totalAmount",
width: 160, width: 130,
align: "center", align: "center",
}, },
{ {
@ -280,14 +177,52 @@
{ {
title: "完成支付时间", title: "完成支付时间",
key: "createTime", key: "createTime",
width: 150, width: 170,
align: "center", align: "center",
render: (h, params) => {
return h(
"div",
this.formatDateTime(params.row.createTime)
);
}
}, },
{ {
title: "订单状态", title: "订单状态",
key: "status", key: "status",
width: 200, width: 130,
align: "center", align: "center",
render: (h, params) => {
let re = ""
if (params.row.status == 0) {
re = "待支付";
} else if (params.row.status == 1) {
re = "待成团";
} else if (params.row.status == 2) {
re = "待消费";
} else if (params.row.status == 3) {
re = "待接单";
} else if (params.row.status == 4) {
re = "待取货";
} else if (params.row.status == 5) {
re = "待送达";
} else if (params.row.status == 6) {
re = "已完成";
} else if (params.row.status == 7) {
re = "待退款";
} else if (params.row.status == 8) {
re = "已退款";
} else if (params.row.status == 9) {
re = "已取消";
} else if (params.row.status == 11) {
re = "售后中";
} else if (params.row.status == 12) {
re = "已售后";
}
return h(
"div",
re
);
}
}, },
{ {
title: "操作", title: "操作",
@ -311,34 +246,8 @@
}, },
}, },
], ],
exportColumns: exportColumn,
chooseColumns: [],
filename: "订单数据",
exportTitle: "确认导出",
exportType: "",
importTableData: [],
importColumns: [],
uploadfile: {
name: "",
},
tempColumns: userColumns,
tempData: userData,
data: [], data: [],
exportData: [],
total: 0, total: 0,
dictData: [{
title: "全部",
value: ""
}, {
title: "已付",
value: 0
}, {
title: "未付",
value: 1
}, {
title: "挂单",
value: 2
}],
}; };
}, },
computed: { computed: {
@ -349,55 +258,22 @@
} }
}, },
mounted() { mounted() {
//
this.height = Number(document.documentElement.clientHeight - 230);
this.init(); this.init();
}, },
methods: { methods: {
init() { init() {
this.getLogisticsInfo() this.getLogisticsInfo()
//
let array = [];
this.exportColumns.forEach((e) => {
//
//e.disabled = false;
array.push(e.title);
});
this.chooseColumns = array;
},
checkOrderStatus(v, status) {
let listStr = ''
if (v == '') {
console.log('selectList', this.selectList)
for (let i = 0; i < this.selectList.length; i++) {
if (this.selectList.length != (i + 1)) {
listStr += this.selectList[i].id + ','
} else {
listStr += this.selectList[i].id
}
}
}
this.$Modal.confirm({
title: "确认更改",
content: "您确认要更改此条数据吗?",
loading: true,
onOk: () => {
batchUpdateOrderStatus({
orderIds: v == '' ? listStr : v.id,
status: status
}).then((res) => {
this.$Modal.remove();
if (res.success) {
this.$Message.success("修改成功");
this.getDataList();
}
});
}, },
}); formatDateTime(isoString) {
if (!isoString) return ''
const date = new Date(isoString)
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const hours = String(date.getHours()).padStart(2, '0')
const minutes = String(date.getMinutes()).padStart(2, '0')
const seconds = String(date.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}, },
getMonth() { getMonth() {
let date = new Date() let date = new Date()
@ -408,96 +284,31 @@
let single = year + '-' + month + '-' + da // let single = year + '-' + month + '-' + da //
return single return single
}, },
//2
changeTab(v) {
this.searchForm.pageNum = 1;
this.searchForm.searchStatus = v;
this.getLogisticsInfo();
},
//1
changeOrderTab(v){
console.log(v)
this.searchForm.pageNum = 1;
this.searchForm.searchType = v
this.getLogisticsInfo()
},
checkStatus(v) { checkStatus(v) {
console.log('下拉框选择', v) console.log('下拉框选择', v)
this.searchForm.orderStatus = v this.searchForm.orderStatus = v
}, },
handleDropdown(name) {
if (name == "exportData") {
if (this.selectList.length <= 0) {
this.$Message.warning("您还未选择要导出的数据");
return;
}
this.exportType = "part";
this.exportModalVisible = true;
for (let i = 0; i < this.selectList.length; i++) {
// this.selectList[i].orderStatus = this.selectList[i].orderStatus == 0 ? '' : this.selectList[i]
// .orderStatus == 1 ? '' : this.selectList[i].orderStatus == 2 ? '' : ""
if (this.selectList[i].methodOfSettlement == 0) { //
this.selectList[i].xianjin = this.selectList[i].allCost
this.selectList[i].yuefu = ""
} else if (this.selectList[i].methodOfSettlement == 1) {
this.selectList[i].xianjin = ""
this.selectList[i].yuefu = this.selectList[i].allCost
}
// this.selectList[i].methodOfSettlement = this.selectList[i].methodOfSettlement == 0 ? '' : this
// .selectList[i].methodOfSettlement == 1 ? '' : this.selectList[i].methodOfSettlement == 2 ?
// '' : ""
}
this.exportTitle = "确认导出 " + this.selectList.length + " 条数据";
} else if (name == "exportAll") {
this.exportType = "all";
this.exportModalVisible = true;
this.exportTitle = "确认导出全部 " + this.total + " 条数据";
this.searchForm.pageSize = 10000
getLogisticsOrderPageList(this.searchForm).then((res) => {
this.loading = false;
if (res.success) {
for (let i = 0; i < res.result.records.length; i++) {
// res.result.records[i].orderStatus = res.result.records[i].orderStatus == 0 ? '' :
// res.result.records[i].orderStatus == 1 ? '' : res.result.records[i]
// .orderStatus == 2 ? '' : ""
if (res.result.records[i].methodOfSettlement == 0) { //
res.result.records[i].xianjin = res.result.records[i].allCost
res.result.records[i].yuefu = ""
} else if (res.result.records[i].methodOfSettlement == 1) {
res.result.records[i].xianjin = ""
res.result.records[i].yuefu = res.result.records[i].allCost
}
// res.result.records[i].methodOfSettlement = res.result.records[i]
// .methodOfSettlement == 0 ? '' : res.result.records[i].methodOfSettlement ==
// 1 ? '' : res.result.records[i].methodOfSettlement == 2 ? '' : ""
}
console.log(res.result.records)
this.exportData = res.result.records;
}
});
}
},
changePage(v) { changePage(v) {
this.searchForm.pageNum = v; this.searchForm.pageNum = v;
this.getDataList(); this.getLogisticsInfo();
this.clearSelectAll(); this.clearSelectAll();
}, },
changePageSize(v) { changePageSize(v) {
this.searchForm.pageSize = v; this.searchForm.pageSize = v;
this.getDataList(); this.getLogisticsInfo();
},
checkShouValue(v) {
if (this.clearShou == true) {
this.searchForm.receiverId = ""
this.searchForm.receiverName = ""
this.searchForm.receiverMobile = ""
} else {
console.log('shou', v)
this.searchForm.receiverId = v.id
}
},
checkFaValue(v) {
if (this.clearFa == true) {
this.searchForm.shipperId = ""
this.searchForm.shipperName = ""
this.searchForm.shipperMobile = ""
} else {
console.log('发', v)
this.searchForm.shipperId = v.id
}
}, },
changeTableSize(v) { changeTableSize(v) {
this.tableSize = v; this.tableSize = v;
@ -516,25 +327,14 @@
handleSearch() { handleSearch() {
this.searchForm.pageNum = 1; this.searchForm.pageNum = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 10;
this.getDataList(); this.getLogisticsInfo();
}, },
handleReset() { handleReset() {
this.$refs.searchForm.resetFields(); this.$refs.searchForm.resetFields();
this.searchForm.pageNum = 1; this.searchForm.pageNum = 1;
this.searchForm.pageSize = 10; this.searchForm.pageSize = 10;
this.selectDate = null;
let dayTime = this.getMonth()
this.selectDate = [dayTime, dayTime]
this.searchForm.startDate = dayTime
this.searchForm.endDate = dayTime
this.searchForm.searchStr = "";
this.searchForm.companyId = "";
this.searchForm.companyName = "";
this.$refs.dep.clearSelect();
this.searchForm.departmentId = "";
// //
this.getDataList(); this.getLogisticsInfo();
}, },
changeSort(e) { changeSort(e) {
this.searchForm.sort = e.key; this.searchForm.sort = e.key;
@ -542,117 +342,9 @@
if (e.order == "normal") { if (e.order == "normal") {
this.searchForm.order = ""; this.searchForm.order = "";
} }
this.getDataList(); this.getLogisticsInfo();
},
exportCustomData() {
if (this.filename == "") {
this.filename = "用户数据";
}
//
let exportColumns = [];
this.exportColumns.forEach((e) => {
this.chooseColumns.forEach((c) => {
if (e.title == c && !e.disabled) {
exportColumns.push(e);
}
});
});
this.exportModalVisible = false;
let title = [];
let key = [];
exportColumns.forEach((e) => {
title.push(e.title);
key.push(e.key);
});
const params = {
title: title,
key: key,
data: this.exportData,
autoWidth: true,
filename: this.filename,
};
excel.export_array_to_excel(params);
},
beforeUploadImport(file) {
this.uploadfile = file;
const fileExt = file.name.split(".").pop().toLocaleLowerCase();
if (fileExt == "xlsx" || fileExt == "xls") {
this.readFile(file);
this.file = file;
} else {
this.$Notice.warning({
title: "文件类型错误",
desc: "所选文件‘ " +
file.name +
" ’不是EXCEL文件,请选择后缀为.xlsx或者.xls的EXCEL文件。",
});
}
return false;
},
//
readFile(file) {
this.reading = true;
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onerror = (e) => {
this.reading = false;
this.$Message.error("文件读取出错");
};
reader.onload = (e) => {
const data = e.target.result;
const {
header,
results
} = excel.read(data, "array");
const tableTitle = header.map((item) => {
return {
title: item,
key: item,
minWidth: 130,
align: "center"
};
});
this.importTableData = results;
this.importColumns = tableTitle;
this.reading = false;
this.$Message.success("读取数据成功");
};
},
clearImportData() {
this.importTableData = [];
this.importColumns = [];
this.uploadfile = {};
},
downloadTemple() {
let title = [];
let key = [];
userColumns.forEach((e) => {
title.push(e.title);
key.push(e.key);
});
const params = {
title: title,
key: key,
data: userData,
autoWidth: true,
filename: "导入用户数据模版",
};
excel.export_array_to_excel(params);
},
importData() {
this.importLoading = true;
importUserData(this.importTableData).then((res) => {
this.importLoading = false;
if (res.success) {
this.importModalVisible = false;
this.getDataList();
this.$Modal.info({
title: "导入结果",
content: res.message,
});
}
});
}, },
showDetail(v) { showDetail(v) {
// null"" // null""
for (let attr in v) { for (let attr in v) {
@ -678,7 +370,6 @@
this.drop = !this.drop; this.drop = !this.drop;
}, },
showSelect(e) { showSelect(e) {
this.exportData = e;
this.selectList = e; this.selectList = e;
}, },
clearSelectAll() { clearSelectAll() {

Loading…
Cancel
Save