Authored by jiran.zhao

合并 zjr-demo

<template>
<Modal v-model="model" class-name="vertical-center-modal">
<p slot="header">
{{title}}
</p>
<Form label-position="left" :label-width="80">
<slot name="type-select"></slot>
<Form-item label="上传文件:">
<upload-xlsx
ref="upload"
:data="importParams"
:action="action"
:on-success="uploadSuccess"
:on-error="uploadError"
:on-change="uploadChange">
<Button type="ghost" icon="ios-cloud-upload-outline">上传文件</Button>
</upload-xlsx>
<span>{{name}}</span>
</Form-item>
<slot name="remark">
</slot>
</Form>
<slot name="report"></slot>
<Modal v-model="model" class-name="vertical-center-modal">
<p slot="header">
{{ title }}
</p>
<Form label-position="left" :label-width="80">
<Form-item label="上传文件:">
<upload-xlsx
ref="upload"
:data="importParams"
:action="action"
:on-success="uploadSuccess"
:on-error="uploadError"
:on-change="uploadChange"
>
<Button type="ghost" icon="ios-cloud-upload-outline">上传文件</Button>
</upload-xlsx>
<span>{{ name }}</span>
</Form-item>
<slot name="remark"> </slot>
</Form>
<slot name="report"></slot>
<div slot="footer" style="text-align: center">
<Button type="primary" size="large" :disabled="disableSave" :loading="modelLoading" @click="upload">保存</Button>
<Button type="primary" size="large" @click="close">取消</Button>
</div>
</Modal>
<div slot="footer" style="text-align: center">
<Button type="primary" size="large" :disabled="disableSave" :loading="modelLoading" @click="upload">保存</Button>
<Button type="primary" size="large" @click="close">取消</Button>
</div>
</Modal>
</template>
<script>
import _ from 'lodash';
export default {
name: 'modal-import',
props: {
value: {
type: Boolean,
default: false
},
action: {
type: String,
default: '/import'
},
title: {
type: String,
default: '导入'
},
transParams: {
type: Object,
default: () => {
return {};
}
}
name: 'ModalImport',
props: {
value: {
type: Boolean,
default: false,
},
data() {
return {
model: this.value,
modelLoading: false,
disableSave: true,
fileName: ''
};
action: {
type: String,
default: '/import',
},
methods: {
uploadSuccess(result) {
this.$emit('import', result);
},
uploadError(err) {
this.$emit('upload-error', err);
},
uploadChange(files) {
this.fileName = files[0].name;
this.disableSave = false;
},
upload() {
this.modelLoading = true;
this.$refs.upload.upload();
},
close() {
this.model = false;
this.disableSave = true;
this.fileName = '';
this.$refs.upload.clear();
this.modelLoading = false;
},
show() {
this.model = true;
}
title: {
type: String,
default: '导入',
},
transParams: {
type: Object,
default: () => {
return {};
},
},
computed: {
name() {
return this.fileName || '未选择任何文件';
},
importParams() {
let ps = {};
},
data() {
return {
model: this.value,
modelLoading: false,
disableSave: true,
fileName: '',
};
},
computed: {
name() {
return this.fileName || '未选择任何文件';
},
importParams() {
const ps = {};
_.map(this.transParams, (v, k) => {
if (typeof v === 'object') {
ps[k] = JSON.stringify(v);
} else {
ps[k] = v;
}
});
return ps;
_.map(this.transParams, (v, k) => {
if (typeof v === 'object') {
ps[k] = JSON.stringify(v);
} else {
ps[k] = v;
}
}
});
return ps;
},
},
methods: {
uploadSuccess(result) {
this.$emit('import', result);
},
uploadError(err) {
this.$emit('upload-error', err);
},
uploadChange(files) {
if (files.length > 0) {
//导入取消无name
this.fileName = files[0].name;
this.disableSave = false;
}
},
upload() {
this.modelLoading = true;
this.$refs.upload.upload();
},
close() {
this.model = false;
this.disableSave = true;
this.fileName = '';
this.$refs.upload.clear();
this.modelLoading = false;
},
show() {
this.model = true;
},
},
};
</script>
... ...
... ... @@ -5,6 +5,7 @@ import franchisePayment from './franchise-payment';
import print from './print';
import stock from './stock';
import invoice from './invoice';
import withdraw from './withdraw';
export default {
clearing,
payment,
... ... @@ -13,4 +14,5 @@ export default {
print,
stock,
invoice,
withdraw,
};
... ...
<template>
<layout-body>
<div class="detail">
<div class="detail-header">
<p class="bold-title">状态:{{ data.status }}</p>
<p class="no-title">提现发起后,正常xx-xx工作日到款</p>
</div>
<div class="detail-list">
<p>
<span class="no-title">创建时间:{{ data.createTime | timeFormat }}</span>
<span class="no-title">店铺:{{ data.shopName }}</span>
<span class="no-title">供应商: {{ data.supplierName }}</span>
</p>
<table border class="table-body">
<tr>
<td>业务单据号</td>
<td>{{ data.statementSn }}</td>
<td>类型</td>
<td>{{ data.type }}</td>
</tr>
<tr>
<td>收款账户</td>
<td>{{ data.targetAccount }}</td>
<td>付款账户</td>
<td>有货商贸有限公司(yh@yoho.cn){{ data.targetAccount }}</td>
</tr>
<tr>
<td>申请金额(元)</td>
<td>{{ data.applyAmount }}</td>
<td>服务费</td>
<td>{{ data.serviceAmount }}</td>
</tr>
<tr>
<td>成功金额(元)</td>
<td>{{ data.tradeSuccessAmount }}</td>
<td>操作人</td>
<td>{{ data.applyPid }}</td>
</tr>
<tr>
<td>说明</td>
<td>{{ data.remarks }}</td>
<td>失败原因</td>
<td>{{ data.errorReason }}</td>
</tr>
<tr>
<td>备注</td>
<td>{{ data.remarks }}</td>
<td></td>
<td></td>
</tr>
</table>
</div>
<div class="detail-footer">
<i-button type="primary" @click="backList">返回列表</i-button>
</div>
</div>
</layout-body>
</template>
<script>
import FinanceService from 'services/finance/finance-service';
export default {
name: 'Detail',
props: ['id'],
data() {
return {
data: [],
};
},
created() {
this.financeService = new FinanceService();
},
mounted() {
this.getDetail();
},
methods: {
backList() {
this.$router.push({ name: 'finance.withdraw.withdrawlist' });
},
getDetail() {
return this.financeService.shopWithdrawApplyById(this.$route.params).then(result => {
if (result.code === 200) {
this.data = result.data;
this.$emit('on-change', this.data);
}
});
},
refresh() {
this.getDetail();
},
},
};
</script>
<style lang="scss">
.detail {
margin-bottom: 20px;
.detail-header {
.bold-title {
font-size: 25px;
}
.no-title {
font-size: 12px;
}
}
.detail-list {
margin-top: 20px;
table,
tr,
td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
table {
font-size: 12px;
border-collapse: collapse;
border-spacing: 0;
empty-cells: show;
}
}
.detail-footer {
margin-top: 20px;
}
}
</style>
... ...
<template>
<div>
<layout-body>
<p slot="title">交易服务明细</p>
<layout-filter ref="filter" :model="filters" class="box-filter" :inline="true" :col="1">
<filter-item label="起止时间">
<Date-picker
v-model="filters.createTime.model"
type="datetimerange"
format="yyyy-MM-dd"
placeholder="选择日期和时间"
@on-change="createTimeChange"
></Date-picker>
<div class="quick">
<a
href="javascript:;"
@click="
() => {
timeFlag(1);
}
"
>今天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(2);
}
"
>昨天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(3);
}
"
>最近7天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(4);
}
"
>最近30天</a
>
</div>
<div class="select-container">
<Input v-model.trim="filters.targetAccount.model" :placeholder="filters.targetAccount.label" />
</div>
</filter-item>
<filter-item>
<div class="select-container">
<Input v-model.trim="filters.orderCode.model" :placeholder="filters.orderCode.label" />
</div>
<div class="select-container">
<Select v-model.trim="filters.clearingType.model" :placeholder="filters.clearingType.label">
<Option v-for="option in filters.clearingType.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Select v-model.trim="filters.subClearingType.model" :placeholder="filters.subClearingType.label">
<Option v-for="option in filters.subClearingType.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Select v-model.trim="filters.withdrawStatus.model" :placeholder="filters.withdrawStatus.label">
<Option v-for="option in filters.withdrawStatus.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Button type="primary" @click="search">查询</Button>
<Button type="primary" @click="reset">全部</Button>
<Button>导出</Button>
</div>
</filter-item>
</layout-filter>
<layout-list>
<Table border :columns="tableCols" :data="tableData"></Table>
<Page
:total="pageData.total"
:current="pageData.current"
:page-size="pageData.pageSize"
show-total
@on-change="pageChange"
></Page>
</layout-list>
</layout-body>
</div>
</template>
<script>
import _ from 'lodash';
import moment from 'moment';
import { FreightApply } from './store';
import FinanceService from 'services/finance/finance-service';
export default {
data() {
return FreightApply.call(this);
},
created() {
this.financeService = new FinanceService();
this.search();
},
methods: {
filterValues() {
const values = {
pageNo: 1,
pageSize: 10,
};
const fields = this.filters;
const keysMap = {
beginTime: 'beginTime',
endTime: 'endTime',
timeFlag: 'timeFlag',
targetAccount: 'targetAccount',
orderCode: 'orderCode',
clearingType: 'clearingType',
subClearingType: 'subClearingType',
withdrawStatus: 'withdrawStatus',
};
if (this.enableFilter) {
_.each(keysMap, (val, key) => {
values[key] = fields[val].model;
});
}
return values;
},
search() {
let params = {};
this.enableFilter = true;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
reset() {
let params = {};
this.enableFilter = false;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
timeFlag(flag) {
let params = {};
this.enableFilter = false;
params = this.filterValues();
params.timeFlag = flag;
this.list(params);
this.pageData.current = 1;
},
createTimeChange(time) {
if (!_.isArray(time)) {
time = time.split(' - ');
}
if ((time[0] + '').length) {
this.filters.beginTime.model = moment(time[0]).format('YYYY-MM-DD');
this.filters.endTime.model = moment(time[1]).format('YYYY-MM-DD');
}
},
pageChange(page) {
const params = this.filterValues();
params.pageNo = page;
this.pageData.current = page;
this.list(params);
},
list(params) {
this.financeService.shopWithdrawFreightList(params).then(ret => {
this.tableData = _.get(ret, 'data.records', []);
this.pageData.total = _.get(ret, 'data.totalCount', 0);
this.pageData.current = _.get(ret, 'data.pageNo', 1);
});
},
getDetailById(id) {
this.$router.push({
name: 'finance.withdraw.freight-detail',
params: {
id,
},
});
},
},
};
</script>
<style lang="scss">
.layout-container {
min-height: 200px;
margin: 15px;
overflow: hidden;
background: #fff;
border-radius: 4px;
.layout-filter .line {
border-top: none;
margin-bottom: 0;
}
}
.shop-card {
margin-top: 10px;
margin-bottom: 10px;
}
.box-title {
font-weight: 700;
color: #495060;
font-size: 16px;
line-height: 22px;
margin: 5px;
&:before {
content: ' ';
display: inline-block;
width: 5px;
margin-right: 2px;
height: 22px;
vertical-align: top;
background-color: #999;
}
}
.box-item {
width: 90%;
height: 50px;
padding: 0 0 0 15px;
line-height: 50px;
font-size: 14px;
overflow: hidden;
border-radius: 5px;
color: #fff;
margin-bottom: 10px;
.box-item-label {
display: inline-block;
min-width: 75px;
vertical-align: top;
font-weight: normal;
}
.box-item-value {
font-size: 20px;
font-weight: 600;
}
i {
display: inline-block;
width: 20px;
height: 20px;
font-size: 22px;
text-align: center;
margin-top: -7px;
vertical-align: middle;
margin-right: 3px;
}
}
.box-filter {
.ivu-date-picker {
margin-left: 0;
width: 220px !important;
}
.quick {
display: inline-block;
margin-left: 20px;
margin-right: 50px;
a {
margin-right: 5px;
}
}
.select-container {
display: inline-block;
width: 200px;
margin-right: 15px;
margin-top: 5px;
}
}
.ivu-table-cell {
padding-left: 6px;
padding-right: 6px;
}
.action-column {
.cell-action-row {
margin-top: 10px;
&:last-child {
margin-bottom: 10px;
}
}
}
</style>
... ...
export default [
{
path: '/withdrawlist.html',
name: 'withdrawlist',
component: () => import(/* webpackChunkName: "finance.withdraw" */ './withdraw-list'),
meta: {
pageName: '资金总览',
},
},
{
path: '/detail/:id.html',
name: 'detail',
component: () => import(/* webpackChunkName: "finance.withdraw" */ './detail'),
meta: {
pageName: '提现明细',
},
},
{
path: '/servicelist.html',
name: 'servicelist',
component: () => import(/* webpackChunkName: "finance.withdraw" */ './service-list'),
meta: {
pageName: '服务费账单',
},
},
{
path: '/transactionlist.html',
name: 'transactionlist',
component: () => import(/* webpackChunkName: "finance.withdraw" */ './transaction-list'),
meta: {
pageName: '交易账务明细',
},
},
{
path: '/freightlist.html',
name: 'freightlist',
component: () => import(/* webpackChunkName: "finance.withdraw" */ './freight-list'),
meta: {
pageName: '运费账务明细',
},
},
{
path: '/withdrawapply.html',
name: 'withdrawapply',
component: () => import(/* webpackChunkName: "finance.withdraw" */ './withdraw-apply'),
meta: {
pageName: '申请提现',
},
},
];
... ...
<template>
<div class="stat-shop">
<layout-body>
<p slot="title">服务费账单</p>
<layout-filter ref="filter" :model="filters" class="box-filter" :inline="true" :col="1">
<filter-item label="起止时间">
<Date-picker
v-model="filters.createTime.model"
type="datetimerange"
format="yyyy-MM-dd"
placeholder="选择日期和时间"
@on-change="createTimeChange"
></Date-picker>
<div class="quick">
<a
href="javascript:;"
@click="
() => {
timeFlag(1);
}
"
>今天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(2);
}
"
>昨天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(3);
}
"
>最近7天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(4);
}
"
>最近30天</a
>
</div>
<div class="select-container">
<Input v-model.trim="filters.sku.model" :placeholder="filters.sku.label" />
</div>
<div class="select-container">
<Select v-model.trim="filters.withdrawStatus.model" :placeholder="filters.withdrawStatus.label">
<Option v-for="option in filters.withdrawStatus.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
</filter-item>
<filter-item>
<div class="select-container">
<Input v-model.trim="filters.targetAccount.model" :placeholder="filters.targetAccount.label" />
</div>
<div class="select-container">
<Select v-model.trim="filters.clearingType.model" :placeholder="filters.clearingType.label">
<Option v-for="option in filters.clearingType.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Select v-model.trim="filters.subClearingType.model" :placeholder="filters.subClearingType.label">
<Option v-for="option in filters.subClearingType.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Input v-model.trim="filters.orderCode.model" :placeholder="filters.orderCode.label" />
</div>
<div class="select-container">
<Button type="primary" @click="search">查询</Button>
<Button type="primary" @click="reset">全部</Button>
<Button>导出</Button>
</div>
</filter-item>
</layout-filter>
<layout-list>
<Table border :columns="tableCols" :data="tableData"></Table>
<Page
:total="pageData.total"
:current="pageData.current"
:page-size="pageData.pageSize"
show-total
@on-change="pageChange"
></Page>
</layout-list>
</layout-body>
</div>
</template>
<script>
import _ from 'lodash';
import moment from 'moment';
import { ServiceList } from './store';
import FinanceService from 'services/finance/finance-service';
export default {
data() {
return ServiceList.call(this);
},
created() {
this.financeService = new FinanceService();
this.search();
},
methods: {
filterValues() {
const values = {
pageNo: 1,
pageSize: 10,
};
const fields = this.filters;
const keysMap = {
beginTime: 'beginTime',
endTime: 'endTime',
timeFlag: 'timeFlag',
withdrawStatus: 'withdrawStatus',
orderCode: 'orderCode',
sku: 'sku',
targetAccount: 'targetAccount',
clearingType: 'clearingType',
subClearingType: 'subClearingType',
statementSn: 'statementSn',
};
if (this.enableFilter) {
_.each(keysMap, (val, key) => {
values[key] = fields[val].model;
});
}
return values;
},
search() {
let params = {};
this.enableFilter = true;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
reset() {
let params = {};
this.enableFilter = false;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
timeFlag(flag) {
let params = {};
this.enableFilter = false;
params = this.filterValues();
params.timeFlag = flag;
this.list(params);
this.pageData.current = 1;
},
createTimeChange(time) {
if (!_.isArray(time)) {
time = time.split(' - ');
}
if ((time[0] + '').length) {
this.filters.beginTime.model = moment(time[0]).format('YYYY-MM-DD');
this.filters.endTime.model = moment(time[1]).format('YYYY-MM-DD');
}
},
pageChange(page) {
const params = this.filterValues();
params.pageNo = page;
this.pageData.current = page;
this.list(params);
},
list(params) {
this.financeService.shopWithdrawServiceList(params).then(ret => {
this.tableData = _.get(ret, 'data.records', []);
this.pageData.total = _.get(ret, 'data.totalCount', 0);
this.pageData.current = _.get(ret, 'data.pageNo', 1);
});
},
},
};
</script>
<style lang="scss">
.layout-container {
min-height: 200px;
margin: 15px;
overflow: hidden;
background: #fff;
border-radius: 4px;
.layout-filter .line {
border-top: none;
margin-bottom: 0;
}
}
.shop-card {
margin-top: 10px;
margin-bottom: 10px;
}
.box-title {
font-weight: 700;
color: #495060;
font-size: 16px;
line-height: 22px;
margin: 5px;
&:before {
content: ' ';
display: inline-block;
width: 5px;
margin-right: 2px;
height: 22px;
vertical-align: top;
background-color: #999;
}
}
.box-item {
width: 90%;
height: 50px;
padding: 0 0 0 15px;
line-height: 50px;
font-size: 14px;
overflow: hidden;
border-radius: 5px;
color: #fff;
margin-bottom: 10px;
.box-item-label {
display: inline-block;
min-width: 75px;
vertical-align: top;
font-weight: normal;
}
.box-item-value {
font-size: 20px;
font-weight: 600;
}
i {
display: inline-block;
width: 20px;
height: 20px;
font-size: 22px;
text-align: center;
margin-top: -7px;
vertical-align: middle;
margin-right: 3px;
}
}
.box-filter {
.ivu-date-picker {
margin-left: 0;
width: 220px !important;
}
.quick {
display: inline-block;
margin-left: 20px;
margin-right: 50px;
a {
margin-right: 5px;
}
}
.select-container {
display: inline-block;
width: 280px;
}
}
.ivu-table-cell {
padding-left: 6px;
padding-right: 6px;
}
.status-column {
.cell-action-row {
margin-top: 10px;
&:last-child {
margin-bottom: 10px;
}
}
}
</style>
... ...
import moment from 'moment';
const withdrawStatus = {
0: '提现中',
1: '提现成功',
2: '提现失败',
3: '冻结中',
4: '可提现',
};
export default function() {
return {
filters: {
createTime: {
label: '创建时间',
model: '',
},
beginTime: {
model: '',
},
endTime: {
model: '',
},
timeFlag: {
label: '时间标志',
model: '',
},
targetAccount: {
label: '提现账户',
model: '',
},
orderCode: {
label: '订单号',
model: '',
},
clearingType: {
label: '账务类型',
model: '',
options: [
{
value: 1,
label: '收入',
},
{
value: 2,
label: '支出',
},
],
},
subClearingType: {
label: '子账务类型',
model: '',
options: [
{
value: 1,
label: '交易服务费',
},
{
value: 2,
label: '提现服务费',
},
],
},
withdrawStatus: {
label: '提现状态',
model: '',
options: [
{
value: 0,
label: '提现中',
},
{
value: 1,
label: '提现成功',
},
{
value: 2,
label: '提现失败',
},
{
value: 3,
label: '冻结中',
},
{
value: 4,
label: '可提现',
},
],
},
pageNo: 1,
pageSize: 10,
},
tableCols: [
{
title: '账务ID',
key: 'id',
width: 60,
align: 'center',
},
{
title: '结算时间',
key: 'createTime',
align: 'center',
render(h, params) {
const time = moment.unix(params.row.createTime);
return (
<div>
<div>{time.format('YYYY/MM/DD')}</div>
<div>{time.format('HH:mm:ss')}</div>
</div>
);
},
},
{
title: '订单号',
key: 'orderCode',
},
{
title: '商品名称',
key: 'productName',
},
{
title: '账务类型',
key: 'clearingType',
},
{
title: '商家实收(元)',
key: 'amount',
},
{
title: '提现状态',
key: 'status',
align: 'center',
render: (h, params) => {
const row = params.row;
const as = row.status;
const asText = as === 2 ? `${withdrawStatus[row.status]}(${row.rejectReason})` : withdrawStatus[as];
row.lineIndex = params.index;
return <p class={{ 'high-light': as === 2 }}>{asText}</p>;
},
className: 'status-column',
},
{
title: '提现申请日期',
key: 'applyTime',
align: 'center',
render(h, params) {
const applyTime = moment.unix(params.row.applyTime);
return (
<div>
<div>{applyTime.format('YYYY/MM/DD')}</div>
<div>{applyTime.format('HH:mm:ss')}</div>
</div>
);
},
},
{
title: '提现成功日期',
key: 'applySuccessTime',
align: 'center',
render(h, params) {
const appSuTime = moment.unix(params.row.applySuccessTime);
return (
<div>
<div>{appSuTime.format('YYYY/MM/DD')}</div>
<div>{appSuTime.format('HH:mm:ss')}</div>
</div>
);
},
},
{
title: '操作',
key: 'action',
width: 180,
align: 'center',
render: (h, params) => {
const row = params.row;
return (
<div>
<div class="cell-action-row">
<i-button type="primary" size="small" onClick={() => this.getDetailById(row.id)}>
查看明细
</i-button>
</div>
</div>
);
},
className: 'action-column',
},
],
tableData: [],
pageData: {
total: 0,
current: 1,
pageSize: 10,
},
};
}
... ...
import WithdrawList from './withdraw-list';
import ServiceList from './service-list';
import TransactionList from './transaction-list';
import WithdrawApply from './withdraw-apply';
import FreightApply from './freight-list';
export { WithdrawList, ServiceList, TransactionList, WithdrawApply, FreightApply };
... ...
import moment from 'moment';
const withdrawStatus = {
0: '提现中',
1: '提现成功',
2: '提现失败',
};
export default function() {
return {
filters: {
createTime: {
label: '创建时间',
model: '',
},
beginTime: {
model: '',
},
endTime: {
model: '',
},
timeFlag: {
label: '时间标志',
model: '',
},
sku: {
label: 'SKU',
model: '',
},
withdrawStatus: {
label: '提现状态',
model: '',
options: [
{
value: 0,
label: '提现中',
},
{
value: 1,
label: '提现成功',
},
{
value: 2,
label: '提现失败',
},
],
},
orderCode: {
label: '订单号',
model: '',
},
statementSn: {
label: '业务单据号',
model: '',
},
clearingType: {
label: '账务类型',
model: '',
options: [
{
value: 1,
label: '销售',
},
{
value: 2,
label: '退款',
},
],
},
subClearingType: {
label: '子账务类型',
model: '',
options: [
{
value: 1,
label: '交易服务费',
},
{
value: 2,
label: '提现服务费',
},
],
},
targetAccount: {
label: '提现账户',
model: '',
},
pageNo: 1,
pageSize: 10,
},
tableCols: [
{
title: '账务ID',
key: 'id',
align: 'center',
},
{
title: '提现时间',
key: 'withdrawTime',
align: 'center',
},
{
title: '商家名称',
key: 'supplierName',
align: 'center',
},
{
title: '商家收款账户',
key: 'targetAccount',
align: 'center',
},
{
title: '订单号',
key: 'orderCode',
align: 'center',
},
{
title: 'SKU',
key: 'productSku',
align: 'center',
},
{
title: '商品名称',
key: 'productName',
align: 'center',
},
{
title: '业务单据号',
key: 'statementSn',
align: 'center',
},
{
title: '账务类型',
key: 'clearingType',
align: 'center',
},
{
title: '子服务类型',
key: 'subClearingType',
align: 'center',
},
{
title: '服务费金额(元)',
key: 'serviceAmount',
align: 'center',
},
{
title: '提现状态',
key: 'status',
align: 'center',
render: (h, params) => {
const row = params.row;
const as = row.status;
const asText = as === 2 ? `${withdrawStatus[row.status]}(${row.rejectReason})` : withdrawStatus[as];
row.lineIndex = params.index;
return <p class={{ 'high-light': as === 2 }}>{asText}</p>;
},
className: 'status-column',
},
{
title: '提现成功日期',
key: 'createTime',
align: 'center',
render(h, params) {
const time = moment.unix(params.row.createTime);
return (
<div>
<div>{time.format('YYYY/MM/DD')}</div>
<div>{time.format('HH:mm:ss')}</div>
</div>
);
},
},
],
tableData: [],
pageData: {
total: 0,
current: 1,
pageSize: 10,
},
};
}
... ...
import moment from 'moment';
const withdrawStatus = {
0: '提现中',
1: '提现成功',
2: '提现失败',
};
export default function() {
return {
activate: 'all',
filters: {
createTime: {
label: '创建时间',
model: '',
},
beginTime: {
model: '',
},
endTime: {
model: '',
},
timeFlag: {
label: '时间标志',
model: '',
},
withdrawStatus: {
label: '提现状态',
model: '',
options: [
{
value: 0,
label: '提现中',
},
{
value: 1,
label: '提现成功',
},
{
value: 2,
label: '提现失败',
},
],
},
targetAccount: {
label: '提现账户',
model: '',
},
orderCode: {
label: '订单号',
model: '',
},
sku: {
label: 'SKU',
model: '',
},
productName: {
label: '商品名称',
model: '',
},
clearingType: {
label: '账务类型',
model: '',
options: [
{
value: 1,
label: '收入',
},
{
value: 2,
label: '支出',
},
],
},
subClearingType: {
label: '子账务类型',
model: '',
options: [
{
value: 1,
label: '交易服务费',
},
{
value: 2,
label: '提现服务费',
},
],
},
pageNo: 1,
pageSize: 10,
},
tableCols: [
{
title: '账务ID',
key: 'id',
width: 60,
align: 'center',
},
{
title: '结算时间',
key: 'createTime',
align: 'center',
render(h, params) {
const time = moment.unix(params.row.createTime);
return (
<div>
<div>{time.format('YYYY/MM/DD')}</div>
<div>{time.format('HH:mm:ss')}</div>
</div>
);
},
},
{
title: '订单号',
key: 'orderCode',
},
{
title: 'SKU',
key: 'productSku',
},
{
title: '商品名称',
key: 'productName',
},
{
title: '账务类型',
key: 'clearingType',
},
{
title: '子账务类型',
key: 'subClearingTypes',
},
{
title: '商家实收(元)',
key: 'amount',
},
{
title: '提现状态',
key: 'status',
align: 'center',
render: (h, params) => {
const row = params.row;
const as = row.status;
const asText = as === 2 ? `${withdrawStatus[row.status]}(${row.rejectReason})` : withdrawStatus[as];
row.lineIndex = params.index;
return <p class={{ 'high-light': as === 2 }}>{asText}</p>;
},
className: 'status-column',
},
{
title: '提现申请日期',
key: 'applyTime',
align: 'center',
render(h, params) {
const applyTime = moment.unix(params.row.applyTime);
return (
<div>
<div>{applyTime.format('YYYY/MM/DD')}</div>
<div>{applyTime.format('HH:mm:ss')}</div>
</div>
);
},
},
{
title: '提现成功日期',
key: 'applySuccessTime',
align: 'center',
render(h, params) {
const appSuTime = moment.unix(params.row.applySuccessTime);
return (
<div>
<div>{appSuTime.format('YYYY/MM/DD')}</div>
<div>{appSuTime.format('HH:mm:ss')}</div>
</div>
);
},
},
{
title: '操作',
key: 'action',
width: 180,
align: 'center',
render: (h, params) => {
const row = params.row;
return (
<div>
<div class="cell-action-row">
<i-button type="primary" size="small" onClick={() => this.getDetailById(row.id)}>
查看明细
</i-button>
</div>
</div>
);
},
className: 'action-column',
},
],
tableData: [],
pageData: {
total: 0,
current: 1,
pageSize: 10,
},
};
}
... ...
export default function() {
return {
form: '',
showLoading: true,
data: {
seasons: '',
productIntro: '',
},
ruleValidate: {
productName: [{ required: true, message: '商品名不能为空', trigger: 'blur' }],
},
};
}
... ...
import moment from 'moment';
const withdrawStatus = {
0: '提现中',
1: '提现成功',
2: '提现失败',
};
export default function() {
return {
filters: {
createTime: {
label: '创建时间',
model: '',
},
beginTime: {
model: '',
},
endTime: {
model: '',
},
timeFlag: {
label: '时间标志',
model: '',
},
withdrawStatus: {
label: '提现状态',
model: '',
options: [
{
value: 0,
label: '提现中',
},
{
value: 1,
label: '提现成功',
},
{
value: 2,
label: '提现失败',
},
],
},
statementSn: {
label: '业务单据号',
model: '',
},
targetAccount: {
label: '提现账户',
model: '',
},
pageNo: 1,
pageSize: 10,
},
tableCols: [
{
title: 'ID',
key: 'id',
align: 'center',
},
{
title: '申请时间',
key: 'createTime',
align: 'center',
render(h, params) {
const time = moment.unix(params.row.createTime);
return (
<div>
<div>{time.format('YYYY/MM/DD')}</div>
<div>{time.format('HH:mm:ss')}</div>
</div>
);
},
},
{
title: '商家收款账户',
key: 'targetAccount',
align: 'center',
},
{
title: '申请金额(元)',
key: 'applyAmount',
align: 'center',
},
{
title: '服务费(元)',
key: 'serviceAmount',
align: 'center',
},
{
title: '成功金额(元)',
},
{
title: '提现状态',
key: 'status',
align: 'center',
render: (h, params) => {
const row = params.row;
const as = row.status;
const asText = as === 2 ? `${withdrawStatus[row.status]}(${row.rejectReason})` : withdrawStatus[as];
row.lineIndex = params.index;
return <p class={{ 'high-light': as === 2 }}>{asText}</p>;
},
className: 'status-column',
},
{
title: '说明',
key: 'remarks',
},
{
title: '操作人',
key: 'applyPid',
align: 'center',
},
{
title: '操作',
key: 'action',
width: 180,
align: 'center',
render: (h, params) => {
const row = params.row;
return (
<div>
<div class="cell-action-row">
<i-button type="primary" size="small" onClick={() => this.getDetailById(row.id)}>
提现明细
</i-button>
</div>
</div>
);
},
className: 'action-column',
},
],
tableData: [],
pageData: {
total: 0,
current: 1,
pageSize: 10,
},
};
}
... ...
<template>
<div>
<layout-body>
<p slot="title">交易服务明细</p>
<layout-filter ref="filter" :model="filters" class="box-filter" :inline="true" :col="1">
<filter-item label="起止时间">
<Date-picker
v-model="filters.createTime.model"
type="datetimerange"
format="yyyy-MM-dd"
placeholder="选择日期和时间"
@on-change="createTimeChange"
></Date-picker>
<div class="quick">
<a
href="javascript:;"
@click="
() => {
timeFlag(1);
}
"
>今天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(2);
}
"
>昨天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(3);
}
"
>最近7天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(4);
}
"
>最近30天</a
>
</div>
<div class="select-container">
<Select v-model.trim="filters.withdrawStatus.model" :placeholder="filters.withdrawStatus.label">
<Option v-for="option in filters.withdrawStatus.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Input v-model.trim="filters.targetAccount.model" :placeholder="filters.targetAccount.label" />
</div>
</filter-item>
<filter-item>
<div class="select-container">
<Input v-model.trim="filters.orderCode.model" :placeholder="filters.orderCode.label" />
</div>
<div class="select-container">
<Input v-model.trim="filters.sku.model" :placeholder="filters.sku.label" />
</div>
<div class="select-container">
<Input v-model.trim="filters.productName.model" :placeholder="filters.productName.label" />
</div>
<div class="select-container">
<Select v-model.trim="filters.clearingType.model" :placeholder="filters.clearingType.label">
<Option v-for="option in filters.clearingType.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Select v-model.trim="filters.subClearingType.model" :placeholder="filters.subClearingType.label">
<Option v-for="option in filters.subClearingType.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Button type="primary" @click="search">查询</Button>
<Button type="primary" @click="reset">全部</Button>
<Button>导出</Button>
</div>
</filter-item>
</layout-filter>
<layout-tab>
<Tabs :value="activate" :animated="false" @on-click="switchTab">
<Tab-pane label="全部" name="all"></Tab-pane>
<Tab-pane :label="revenueTabLabel" name="REVENUE"></Tab-pane>
<Tab-pane :label="expendTabLabel" name="EXPEND"></Tab-pane>
</Tabs>
</layout-tab>
<layout-list>
<Table border :columns="tableCols" :data="tableData"></Table>
<Page
:total="pageData.total"
:current="pageData.current"
:page-size="pageData.pageSize"
show-total
@on-change="pageChange"
></Page>
</layout-list>
</layout-body>
</div>
</template>
<script>
import _ from 'lodash';
import moment from 'moment';
import { TransactionList } from './store';
import FinanceService from 'services/finance/finance-service';
const ClearingTypeName2Id = {
REVENUE: 1,
EXPEND: 2,
};
export default {
data() {
return TransactionList.call(this);
},
computed: {
revenueTabLabel() {
return `收入`;
},
expendTabLabel() {
return `支出`;
},
},
created() {
this.financeService = new FinanceService();
this.setActiveTab();
},
methods: {
filterValues() {
const values = {
pageNo: 1,
pageSize: 10,
};
const fields = this.filters;
const keysMap = {
beginTime: 'beginTime',
endTime: 'endTime',
timeFlag: 'timeFlag',
withdrawStatus: 'withdrawStatus',
targetAccount: 'targetAccount',
orderCode: 'orderCode',
sku: 'sku',
productName: 'productName',
clearingType: 'clearingType',
subClearingType: 'subClearingType',
};
if (this.activate !== 'all') {
values.clearingType = ClearingTypeName2Id[this.activate];
}
if (this.enableFilter) {
_.each(keysMap, (val, key) => {
values[key] = fields[val].model;
});
}
return values;
},
switchTab(name) {
this.$router.replace({
name: `finance.withdraw.transactionlist`,
query: {
tab: name,
},
});
},
setActiveTab() {
const { tab } = this.$route.query;
this.activate = tab || 'all';
this.search();
},
search() {
let params = {};
this.enableFilter = true;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
reset() {
let params = {};
this.enableFilter = false;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
timeFlag(flag) {
let params = {};
this.enableFilter = false;
params = this.filterValues();
params.timeFlag = flag;
this.list(params);
this.pageData.current = 1;
},
createTimeChange(time) {
if (!_.isArray(time)) {
time = time.split(' - ');
}
if ((time[0] + '').length) {
this.filters.beginTime.model = moment(time[0]).format('YYYY-MM-DD');
this.filters.endTime.model = moment(time[1]).format('YYYY-MM-DD');
}
},
pageChange(page) {
const params = this.filterValues();
params.pageNo = page;
this.pageData.current = page;
this.list(params);
},
list(params) {
this.financeService.shopWithdrawAccountList(params).then(ret => {
this.tableData = _.get(ret, 'data.records', []);
this.pageData.total = _.get(ret, 'data.totalCount', 0);
this.pageData.current = _.get(ret, 'data.pageNo', 0) + 1;
});
},
getDetailById(id) {
this.$router.push({
name: 'finance.withdraw.transaction-detail',
params: {
id,
},
});
},
},
};
</script>
<style lang="scss">
.layout-container {
min-height: 200px;
margin: 15px;
overflow: hidden;
background: #fff;
border-radius: 4px;
.layout-filter .line {
border-top: none;
margin-bottom: 0;
}
}
.shop-card {
margin-top: 10px;
margin-bottom: 10px;
}
.box-title {
font-weight: 700;
color: #495060;
font-size: 16px;
line-height: 22px;
margin: 5px;
&:before {
content: ' ';
display: inline-block;
width: 5px;
margin-right: 2px;
height: 22px;
vertical-align: top;
background-color: #999;
}
}
.box-item {
width: 90%;
height: 50px;
padding: 0 0 0 15px;
line-height: 50px;
font-size: 14px;
overflow: hidden;
border-radius: 5px;
color: #fff;
margin-bottom: 10px;
.box-item-label {
display: inline-block;
min-width: 75px;
vertical-align: top;
font-weight: normal;
}
.box-item-value {
font-size: 20px;
font-weight: 600;
}
i {
display: inline-block;
width: 20px;
height: 20px;
font-size: 22px;
text-align: center;
margin-top: -7px;
vertical-align: middle;
margin-right: 3px;
}
}
.box-filter {
.ivu-date-picker {
margin-left: 0;
width: 220px !important;
}
.quick {
display: inline-block;
margin-left: 20px;
margin-right: 50px;
a {
margin-right: 5px;
}
}
.select-container {
display: inline-block;
width: 200px;
margin-right: 15px;
margin-top: 5px;
}
}
.ivu-table-cell {
padding-left: 6px;
padding-right: 6px;
}
.action-column {
.cell-action-row {
margin-top: 10px;
&:last-child {
margin-bottom: 10px;
}
}
}
</style>
... ...
<template>
<layout-body>
<Form ref="withdraw" :model="data" class="detail" :label-width="100" :rules="ruleValidate">
<Form-item label="店铺名称">
<span>{{ data.shopName }}</span>
</Form-item>
<Form-item label="可提现金额(元)">
<span>{{ data.availableAmount }}</span>
<br />
<span class="red">*支付宝每日转账最高限额10万元人民币,单日超过10万人民币限额的,请联系平台客服</span>
</Form-item>
<Form-item label="提现方式">
<span>最大可提现</span><span>{{ formatDate(data.billBeginTime) }}</span>
~
<span>{{ formatDate(data.billEndTime) }}</span>
<br />
<span>请选择账单日期</span>
<Date-picker
:value="data.range"
type="datetimerange"
format="yyyy-MM-dd"
placeholder="选择日期时间"
@on-change="clickAvailableDate"
/>
</Form-item>
<Form-item label="提现金额">
<input :value="data.availableAmount" placeholder="请输入..." />
</Form-item>
<Form-item label="提现到帐号">
<span>{{ data.withdrawAccount }}</span>
</Form-item>
<Form-item label="账号名称">
<span>{{ data.withdrawAccountName }}</span>
</Form-item>
<Form-item label="备注">
<span>{{ data.remark }}</span>
</Form-item>
<Form-item>
<Button id="btnSubmit" type="primary" size="large" @click="save">确认提现</Button>
<Button type="primary" size="large">联系客服</Button>
<Button id="cancel" type="primary" size="large">联系客服</Button>
</Form-item>
</Form>
</layout-body>
</template>
<script>
import _ from 'lodash';
import moment from 'moment';
import FinanceService from 'services/finance/finance-service';
import { WithdrawApply } from './store';
export default {
data() {
return WithdrawApply.call(this);
},
created() {
const params = {
token: this.$user.token,
timestamps: Math.round(new Date().getTime() / 1000),
};
this.financeService = new FinanceService();
this.financeService.shopWithdrawApplyInit(params).then(result => {
if (result.code === 200) {
Object.assign(this.data, result.data);
}
});
},
mounted() {
this.getInfo();
},
methods: {
backList() {
this.$router.push({ name: 'finance.withdraw.withdrawlist' });
},
getInfo() {
return this.financeService.shopWithdrawApplyInit().then(result => {
if (result.code === 200) {
this.data = result.data;
this.$emit('on-change', this.data);
}
});
},
validateWithdrawApply() {
return new Promise(resolve => {
this.$refs.data.validate(valid => {
if (valid) {
resolve(true);
} else {
resolve(false);
}
});
});
},
beforeSave() {
const newApply = {};
newApply.availableAmount = this.data.availableAmount;
newApply.applyType = this.data.applyType;
newApply.beginTime = this.data.beginTime;
newApply.endTime = this.data.endTime;
newApply.applyAmount = this.data.applyAmount;
newApply.targetAccount = this.data.targetAccount;
newApply.remarks = this.data.remarks;
newApply.timestamp = this.data.timestamp;
newApply.token = this.data.token;
newApply.sign = this.data.sign;
return newApply;
},
save() {
const newApply = this.beforeSave();
this.$Loading.start();
return this.financeService.shopWithdrawApply(newApply).then(result => {
if (result.code === 200) {
this.$Loading.finish();
this.$Notice.success({
title: '提交成功',
desc: '确认提现成功!',
});
this.go(this.from);
} else {
this.$Loading.error();
this.$Notice.error({
title: '提交错误',
desc: result.message,
});
}
});
},
submit() {
this.validateWithdrawApply()
.then(([r1, r2]) => {
if (r1 & r2) {
return Promise.resolve();
} else {
this.$Message.error('请填写必填项');
return Promise.reject();
}
})
.then(this.save)
.catch(() => this.$Loading.error());
},
refresh() {
this.getInfo();
},
formatDate(date) {
if (date) {
return moment.unix(date).format('YYYY-MM-DD');
}
},
clickAvailableDate(time) {
if (!_.isArray(time)) {
time = time.split(' - ');
}
if ((time[0] + '').length) {
const billBeginStr = moment.unix(this.data.billBeginTime).format('YYYY-MM-DD');
const billEndStr = moment.unix(this.data.billEndTime).format('YYYY-MM-DD');
if (time[0] < billBeginStr || time[1] > billEndStr) {
this.data.beginTime = '';
this.data.endTime = '';
this.$Notice.error({
title: '时间选择错误',
desc: '请选择范围内时间',
});
}
this.data.beginTime = time[0];
this.data.endTime = time[1];
this.getAvailableAmount();
} else {
this.data.beginTime = '';
this.data.endTime = '';
}
},
getAvailableAmount() {
const params = {};
params.beginTime = this.data.beginTime;
params.endTime = this.data.endTime;
this.financeService.shopGetAvailableAmount(params).then(result => {
if (result.code === 200) {
this.data.availableAmount = result.availableAmount;
} else {
this.$Loading.error();
this.$Notice.error({
title: '查询错误',
desc: result.message,
});
}
});
},
},
};
</script>
<style lang="scss">
.detail {
.ivu-input-wrapper {
width: 300px;
}
.ivu-date-picker-editor {
width: 150px;
}
.ivu-select {
width: 200px;
}
.ivu-table-cell {
.ivu-input-wrapper {
width: auto;
}
}
.btn-fixed {
&.fix {
width: calc(100% - 200px);
position: fixed;
bottom: 0;
left: 200px;
text-align: right;
padding-right: 50px;
height: 60px;
line-height: 60px;
background: rgba(255, 255, 255, 0.7);
box-shadow: 1px 0 5px 1px #ccc;
z-index: 1002;
}
}
.red {
color: red;
}
}
</style>
... ...
<template>
<div>
<layout-body>
<p slot="title">资金总览</p>
<layout-filter ref="filter" :model="filters" class="box-filter" :inline="true" :col="1">
<filter-item label="起止时间">
<Date-picker
v-model="filters.createTime.model"
type="datetimerange"
format="yyyy-MM-dd"
placeholder="选择日期和时间"
@on-change="createTimeChange"
></Date-picker>
<div class="quick">
<a
href="javascript:;"
@click="
() => {
timeFlag(1);
}
"
>今天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(2);
}
"
>昨天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(3);
}
"
>最近7天</a
>
<a
href="javascript:;"
@click="
() => {
timeFlag(4);
}
"
>最近30天</a
>
</div>
</filter-item>
<filter-item>
<div class="select-container">
<Select v-model.trim="filters.withdrawStatus.model" :placeholder="filters.withdrawStatus.label">
<Option v-for="option in filters.withdrawStatus.options" :key="option.value" :value="option.value">{{
option.label
}}</Option>
</Select>
</div>
<div class="select-container">
<Input v-model.trim="filters.statementSn.model" :placeholder="filters.statementSn.label" />
</div>
<div class="select-container">
<Input v-model.trim="filters.targetAccount.model" :placeholder="filters.targetAccount.label" />
</div>
<div class="select-container">
<Button type="primary" @click="search">查询</Button>
<Button type="primary" @click="reset">全部</Button>
<Button>导出</Button>
</div>
</filter-item>
</layout-filter>
<layout-list>
<Table border :columns="tableCols" :data="tableData"></Table>
<Page
:total="pageData.total"
:current="pageData.current"
:page-size="pageData.pageSize"
show-total
@on-change="pageChange"
></Page>
</layout-list>
</layout-body>
</div>
</template>
<script>
import _ from 'lodash';
import moment from 'moment';
import { WithdrawList } from './store';
import FinanceService from 'services/finance/finance-service';
export default {
data() {
return WithdrawList.call(this);
},
created() {
this.financeService = new FinanceService();
this.search();
},
methods: {
filterValues() {
const values = {
pageNo: 1,
pageSize: 10,
};
const fields = this.filters;
const keysMap = {
beginTime: 'beginTime',
endTime: 'endTime',
timeFlag: 'timeFlag',
withdrawStatus: 'withdrawStatus',
statementSn: 'statementSn',
};
if (this.enableFilter) {
_.each(keysMap, (val, key) => {
values[key] = fields[val].model;
});
}
return values;
},
search() {
let params = {};
this.enableFilter = true;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
reset() {
let params = {};
this.enableFilter = false;
params = this.filterValues();
this.list(params);
this.pageData.current = 1;
},
timeFlag(flag) {
let params = {};
this.enableFilter = false;
params = this.filterValues();
params.timeFlag = flag;
this.list(params);
this.pageData.current = 1;
},
createTimeChange(time) {
if (!_.isArray(time)) {
time = time.split(' - ');
}
if ((time[0] + '').length) {
this.filters.beginTime.model = moment(time[0]).format('YYYY-MM-DD');
this.filters.endTime.model = moment(time[1]).format('YYYY-MM-DD');
}
},
pageChange(page) {
const params = this.filterValues();
params.pageNo = page;
this.pageData.current = page;
this.list(params);
},
list(params) {
this.financeService.shopWithdrawList(params).then(ret => {
this.tableData = _.get(ret, 'data.records', []);
this.pageData.total = _.get(ret, 'data.totalCount', 0);
this.pageData.current = _.get(ret, 'data.pageNo', 1);
});
},
getDetailById(id) {
this.$router.push({
name: 'finance.withdraw.detail',
params: {
id,
},
});
},
},
};
</script>
<style lang="scss">
.layout-container {
min-height: 200px;
margin: 15px;
overflow: hidden;
background: #fff;
border-radius: 4px;
.layout-filter .line {
border-top: none;
margin-bottom: 0;
}
}
.shop-card {
margin-top: 10px;
margin-bottom: 10px;
}
.box-title {
font-weight: 700;
color: #495060;
font-size: 16px;
line-height: 22px;
margin: 5px;
&:before {
content: ' ';
display: inline-block;
width: 5px;
margin-right: 2px;
height: 22px;
vertical-align: top;
background-color: #999;
}
}
.box-item {
width: 90%;
height: 50px;
padding: 0 0 0 15px;
line-height: 50px;
font-size: 14px;
overflow: hidden;
border-radius: 5px;
color: #fff;
margin-bottom: 10px;
.box-item-label {
display: inline-block;
min-width: 75px;
vertical-align: top;
font-weight: normal;
}
.box-item-value {
font-size: 20px;
font-weight: 600;
}
i {
display: inline-block;
width: 20px;
height: 20px;
font-size: 22px;
text-align: center;
margin-top: -7px;
vertical-align: middle;
margin-right: 3px;
}
}
.box-filter {
.ivu-date-picker {
margin-left: 0;
width: 220px !important;
}
.quick {
display: inline-block;
margin-left: 20px;
margin-right: 50px;
a {
margin-right: 5px;
}
}
.select-container {
display: inline-block;
width: 280px;
}
}
.ivu-table-cell {
padding-left: 6px;
padding-right: 6px;
}
.action-column {
.cell-action-row {
margin-top: 10px;
&:last-child {
margin-bottom: 10px;
}
}
}
</style>
... ...
<template>
<Modal v-model="model"
width="790"
class-name="vertical-center-modal">
<p slot="header">
SKN: {{productSkn}}&nbsp;&nbsp;&nbsp;&nbsp;{{productName}}
</p>
<div style="text-align: center">
<Table ref="storeTable" :columns="table.cols" :data="table.data"> </Table>
</div>
<div slot="footer" style="text-align: center">
<Button type="primary" size="large" :loading="modal_loading" @click="submit">保存</Button>
<Button type="primary" size="large" @click="cancel">取消</Button>
</div>
</Modal>
<Modal v-model="model" width="790" class-name="vertical-center-modal">
<p slot="header">SKN: {{ productSkn }}&nbsp;&nbsp;&nbsp;&nbsp;{{ productName }}</p>
<div style="text-align: center">
<Table ref="storeTable" :columns="table.cols" :data="table.data"></Table>
</div>
<div slot="footer" style="text-align: center">
<Button type="primary" size="large" :loading="modal_loading" @click="submit">保存</Button>
<Button type="primary" size="large" @click="cancel">取消</Button>
</div>
</Modal>
</template>
<script>
import JitService from 'services/repository/jit-service';
import _ from 'lodash';
export default {
name: 'edit-store',
created() {
this.jitService = new JitService();
},
data() {
return {
model: false,
modal_loading: false,
self: this,
table: {
cols: [
{
title: 'SKU',
key: 'productSku',
align: 'center',
width: 250,
render(h, {row}) {
return (
<span>{row.yohoInventroyDetailRespBo.productSku}</span>
);
}
},
{
title: '规格',
key: 'sizeName',
align: 'center',
width: 250,
render: (h, params) => {
return (
<span>{params.row.factoryGoodsName}/{params.row.sizeName}</span>
);
}
},
{
title: '库存详情',
key: 'virtualStockNum',
align: 'center',
width: 250,
render: (h, params) => {
return (
<i-input
value={params.row.yohoInventroyDetailRespBo.virtualStockNum}
maxlength={5}
onInput={val => (params.row.yohoInventroyDetailRespBo.virtualStockNum = val)}></i-input>
);
}
}
],
data: [],
name: 'EditStore',
data() {
return {
model: false,
modal_loading: false,
self: this,
table: {
cols: [
{
title: 'SKU',
key: 'productSku',
align: 'center',
width: 250,
render(h, { row }) {
return <span>{row.yohoInventroyDetailRespBo.productSku}</span>;
},
},
{
title: '规格',
key: 'sizeName',
align: 'center',
width: 250,
render: (h, params) => {
return (
<span>
{params.row.factoryGoodsName}/{params.row.sizeName}
</span>
);
},
},
{
title: '库存详情',
key: 'virtualStockNum',
align: 'center',
width: 250,
render: (h, params) => {
return (
<i-input
value={params.row.yohoInventroyDetailRespBo.virtualStockNum}
maxlength={5}
onInput={val => (params.row.yohoInventroyDetailRespBo.virtualStockNum = val)}
/>
);
},
productSkn: '',
productName: '',
brandName: '',
brandId: ''
};
},
],
data: [],
},
productSkn: '',
productName: '',
brandName: '',
brandId: '',
storageType: '',
};
},
created() {
this.jitService = new JitService();
},
methods: {
show(row, storageType) {
this.reset();
this.productSkn = row.productSkn;
this.brandId = row.brandId;
this.brandName = row.brandName;
this.productName = row.productName;
this.storageType = storageType;
this.model = true;
this.getData();
},
methods: {
show(row) {
this.reset();
this.productSkn = row.productSkn;
this.brandId = row.brandId;
this.brandName = row.brandName;
this.productName = row.productName;
this.model = true;
this.getData();
},
close() {
this.reset();
this.model = false;
},
submit() {
this.modal_loading = true;
this.save().then((result) => {
this.$emit('on-success');
this.modal_loading = false;
this.close();
if (result.code === 200) {
this.$Notice.success({
title: '更新库存成功',
});
} else {
this.$Notice.error({
title: '保存失败,请重试',
});
}
}).catch((err) => {
this.modal_loading = false;
if (err.code === 501) {
this.$Message.error(err.message);
}
close() {
this.reset();
this.model = false;
},
submit() {
this.modal_loading = true;
this.save()
.then(result => {
this.$emit('on-success');
this.modal_loading = false;
this.close();
if (result.code === 200) {
this.$Notice.success({
title: '更新库存成功',
});
},
cancel() {
this.close();
},
reset() {
this.productSkn = null;
this.brandId = null;
this.brandName = null;
this.productName = null;
this.modal_loading = false;
this.table.data = [];
},
getData() {
this.jitService.getStorageBySkn(this.productSkn, this.brandId)
.then((result) => {
if (result.code === 200) {
this.table.data = result.data;
}
});
},
save() {
this.refreshTable();
return this.beforeSave().then((data) => {
if (!data.length) {
this.$Message.warning('没有任何修改');
return Promise.reject();
}
return this.jitService.updateStorage(data);
} else {
this.$Notice.error({
title: '保存失败,请重试',
});
},
refreshTable() {
this.originRows = this.table.data;
this.table.data = this.$refs.storeTable.rebuildData;
},
beforeSave() {
let hasString = _.some(this.table.data, d => !/^[0-9]*$/.test(d.yohoInventroyDetailRespBo.virtualStockNum));
if (hasString) {
return Promise.reject({code: 501, message: '库存只能是数字'});
}
let gtMax = _.some(this.table.data, d => +d.yohoInventroyDetailRespBo.virtualStockNum > 30000);
if (gtMax) {
return Promise.reject({code: 501, message: '库存应小于 60000'});
}
return Promise.resolve(this.table.data.filter(item => {
return this.originRows.find(row => row.yohoInventroyDetailRespBo.productSku === item.yohoInventroyDetailRespBo.productSku && row.yohoInventroyDetailRespBo.virtualStockNum !== item.yohoInventroyDetailRespBo.virtualStockNum);
}).map(item => {
return {
productSku: item.yohoInventroyDetailRespBo.productSku,
productSkn: item.productSkn,
number: parseInt(item.yohoInventroyDetailRespBo.virtualStockNum, 10)
};
}));
}
})
.catch(err => {
this.modal_loading = false;
if (err.code === 501) {
this.$Message.error(err.message);
}
});
},
cancel() {
this.close();
},
reset() {
this.productSkn = null;
this.brandId = null;
this.brandName = null;
this.productName = null;
this.storageType = null;
this.modal_loading = false;
this.table.data = [];
},
getData() {
this.jitService.getStorageBySkn(this.productSkn, this.brandId).then(result => {
if (result.code === 200) {
this.table.data = result.data;
}
});
},
save() {
this.refreshTable();
return this.beforeSave().then(data => {
if (!data.length) {
this.$Message.warning('没有任何修改');
return Promise.reject();
}
if (!this.storageType) {
this.$Message.warning('商品类型未知');
return Promise.reject();
}
}
return this.jitService.updateStorage(data, this.storageType);
});
},
refreshTable() {
this.originRows = this.table.data;
this.table.data = this.$refs.storeTable.rebuildData;
},
beforeSave() {
const hasString = _.some(this.table.data, d => !/^[0-9]*$/.test(d.yohoInventroyDetailRespBo.virtualStockNum));
if (hasString) {
return Promise.reject({ code: 501, message: '库存只能是数字' });
}
const gtMax = _.some(this.table.data, d => +d.yohoInventroyDetailRespBo.virtualStockNum > 30000);
if (gtMax) {
return Promise.reject({ code: 501, message: '库存应小于 60000' });
}
return Promise.resolve(
this.table.data
.filter(item => {
return this.originRows.find(
row =>
row.yohoInventroyDetailRespBo.productSku === item.yohoInventroyDetailRespBo.productSku &&
row.yohoInventroyDetailRespBo.virtualStockNum !== item.yohoInventroyDetailRespBo.virtualStockNum
);
})
.map(item => {
return {
productSku: item.yohoInventroyDetailRespBo.productSku,
productSkn: item.productSkn,
number: parseInt(item.yohoInventroyDetailRespBo.virtualStockNum, 10),
};
})
);
},
},
};
</script>
<style lang="scss">
.vertical-center-modal {
display: flex;
align-items: center;
justify-content: center;
display: flex;
align-items: center;
justify-content: center;
.ivu-modal {
top: 0;
}
.ivu-modal {
top: 0;
}
}
.spin-container {
width: 1033px;
height: 200px;
position: relative;
width: 1033px;
height: 200px;
position: relative;
}
.table-container {
width: 1033px;
min-height: 200px;
width: 1033px;
min-height: 200px;
}
</style>
... ...
<template>
<modal-import
ref="importSeller"
title="导入库存"
:trans-params="transParams"
@import="importSeller">
<Form-item v-if="shopNature === 6" slot="type-select" label="选择类型:">
<Radio-group v-model="uploadType">
<Radio label="3" ><span>JIT</span></Radio>
<Radio label="6"><span>一件代发</span></Radio>
</Radio-group>
</Form-item>
<div slot="remark">
<Form-item label="说明:">
<div style="display: inline-block">
<ul>
<li>1、上传文件必须是 <span style="color: red;">.xlsx</span> 文件</li>
<li>2、第一行为标题栏:<strong>skn | sku | 库存数量</strong></li>
<li>3、每次最多导入1000条数据</li>
<li>4、<a href="/example.xlsx">下载样例</a></li>
</ul>
</div>
</Form-item>
<modal-import ref="importSeller" title="导入库存" :trans-params="transParams" @import="importSeller">
<div slot="remark">
<Form-item label="商品类型:">
<Radio-group v-model="storageType.model">
<Radio v-for="option in storageType.options" :key="option.value" :label="option.value">{{
option.label
}}</Radio>
</Radio-group>
</Form-item>
<Form-item label="说明:">
<div style="display: inline-block">
<ul>
<li>1、上传文件必须是 <span style="color: red;">.xlsx</span> 文件</li>
<li>2、第一行为标题栏:<strong>skn | sku | 库存数量</strong></li>
<li>3、每次最多导入1000条数据</li>
<li>4、<a href="/example.xlsx">下载样例</a></li>
</ul>
</div>
<div slot="report">
<Form label-position="left" :label-width="130" v-if="failList">
<div class="report">
<div class="title">库存导入结果报告</div>
<Form-item label="导入成功 SKU :" v-if="successList">
<ul class="success">
<li v-for="sku in successList" :key="sku">
{{sku}}
</li>
</ul>
</Form-item>
<Form-item label="SKN 不属于该店铺:" v-if="sknNotInShop">
<ul class="err">
<li v-for="sku in sknNotInShop" :key="sku" v-if="sku">
{{sku}}
</li>
</ul>
</Form-item>
<Form-item label="SKU与SKN不匹配:" v-if="skuNotInSkn">
<ul class="err">
<li v-for="sku in skuNotInSkn" :key="sku">
{{sku}}
</li>
</ul>
</Form-item>
<Form-item label="SKN不存在:" v-if="sknNotExist">
<ul class="err">
<li v-for="sku in sknNotExist" :key="sku">
{{sku}}
</li>
</ul>
</Form-item>
<Form-item label="SKU不存在:" v-if="skuNotExist">
<ul class="err">
<li v-for="sku in skuNotExist" :key="sku">
{{sku}}
</li>
</ul>
</Form-item>
<Form-item label="库存数据非法:" v-if="storageNumError">
<ul class="err">
<li v-for="sku in storageNumError" :key="sku">
{{sku}}
</li>
</ul>
</Form-item>
</div>
</Form>
</Form-item>
</div>
<div slot="report">
<Form v-if="failList" label-position="left" :label-width="130">
<div class="report">
<div class="title">库存导入结果报告</div>
<Form-item v-if="successList" label="导入成功 SKU :">
<ul class="success">
<li v-for="sku in successList" :key="sku">
{{ sku }}
</li>
</ul>
</Form-item>
<Form-item v-if="sknNotInShop" label="SKN 不属于该店铺:">
<ul class="err">
<li v-for="sku in sknNotInShop" :key="sku">
{{ sku }}
</li>
</ul>
</Form-item>
<Form-item v-if="skuNotInSkn" label="SKU与SKN不匹配:">
<ul class="err">
<li v-for="sku in skuNotInSkn" :key="sku">
{{ sku }}
</li>
</ul>
</Form-item>
<Form-item v-if="sknNotExist" label="SKN不存在:">
<ul class="err">
<li v-for="sku in sknNotExist" :key="sku">
{{ sku }}
</li>
</ul>
</Form-item>
<Form-item v-if="skuNotExist" label="SKU不存在:">
<ul class="err">
<li v-for="sku in skuNotExist" :key="sku">
{{ sku }}
</li>
</ul>
</Form-item>
<Form-item v-if="storageNumError" label="库存数据非法:">
<ul class="err">
<li v-for="sku in storageNumError" :key="sku">
{{ sku }}
</li>
</ul>
</Form-item>
</div>
</modal-import>
</Form>
</div>
</modal-import>
</template>
<script>
import _ from 'lodash';
import JitService from 'services/repository/jit-service';
export default {
name: 'import-store',
created() {
this.jitService = new JitService();
},
props: {
shopNature: {
type: Number,
default: 3
}
},
data() {
return {
transParams: {
cols: {
productSku: 'sku',
productSkn: 'skn',
number: 'number'
}
},
fileName: '',
successList: null,
sknNotInShop: null,
skuNotInSkn: null,
sknNotExist: null,
skuNotExist: null,
storageNumError: null,
failList: null,
uploadType: '3'
};
},
methods: {
show() {
this.reset();
this.$refs.importSeller.show();
name: 'ImportStore',
data() {
return {
transParams: {
cols: {
productSku: 'sku',
productSkn: 'skn',
number: 'number',
},
importSeller(storages) {
storages = _.filter(storages, row =>
_.trim(row.productSku) &&
_.trim(row.productSkn) &&
_.trim(row.number));
storages = _.each(storages, row => {
row.productSkn = _.parseInt(row.productSkn);
row.productSku = _.parseInt(row.productSku);
row.number = _.parseInt(row.number);
});
if (!storages.length) {
return this.$Message.error('导入存储为空');
}
if (storages.length > 1000) {
return this.$Message.error('导入数据不能大于1000条');
}
let stroageType = parseInt(this.uploadType, 10) || 3;
this.jitService.updateStorage(storages, storageType).then(result => {
if (result.code === 200) {
this.$Notice.success({
title: '导入成功',
});
},
fileName: '',
successList: null,
sknNotInShop: null,
skuNotInSkn: null,
sknNotExist: null,
skuNotExist: null,
storageNumError: null,
failList: null,
storageType: {
label: '商品类型',
model: 3,
options: [
{
value: 3,
label: 'JIT',
},
{
value: 6,
label: '一件代发',
},
],
},
};
},
created() {
this.jitService = new JitService();
},
methods: {
show() {
this.reset();
this.$refs.importSeller.show();
},
importSeller(storages) {
storages = _.filter(storages, row => _.trim(row.productSku) && _.trim(row.productSkn) && _.trim(row.number));
storages = _.each(storages, row => {
row.productSkn = _.parseInt(row.productSkn);
row.productSku = _.parseInt(row.productSku);
row.number = _.parseInt(row.number);
});
this.$emit('on-success');
this.$refs.importSeller.close();
} else if (result.code === 500) {
this.$Notice.error({
title: '导入失败',
desc: result.message
});
} else {
this.$Notice.error({
title: '导入失败',
desc: result.message
});
if (!storages.length) {
return this.$Message.error('导入存储为空');
}
if (storages.length > 1000) {
return this.$Message.error('导入数据不能大于1000条');
}
if (!this.storageType.model) {
return this.$Message.error('请选择商品类型');
}
this.jitService.updateStorage(storages, this.storageType.model).then(result => {
if (result.code === 200) {
this.$Notice.success({
title: '导入成功',
});
this.successList = this.handleArray(result.data.successList);
this.sknNotInShop = this.handleArray(result.data.sknNotInShop);
this.skuNotInSkn = this.handleArray(result.data.skuNotInSkn);
this.sknNotExist = this.handleArray(result.data.sknNotExist);
this.skuNotExist = this.handleArray(result.data.skuNotExist);
this.storageNumError = this.handleArray(result.data.storageNumError);
this.failList = this.handleArray(result.data.failList);
}
});
},
handleArray(array) {
if (!array) {
return null;
}
if (_.isEmpty(array)) {
return null;
}
let newArray = array.filter(i => i);
this.$emit('on-success');
this.$refs.importSeller.close();
} else if (result.code === 500) {
this.$Notice.error({
title: '导入失败',
desc: result.message,
});
} else {
this.$Notice.error({
title: '导入失败',
desc: result.message,
});
if (_.isEmpty(newArray)) {
return null;
}
return newArray;
},
reset() {
this.successList = null;
this.sknNotInShop = null;
this.skuNotInSkn = null;
this.sknNotExist = null;
this.skuNotExist = null;
this.storageNumError = null;
this.failList = null;
this.successList = this.handleArray(result.data.successList);
this.sknNotInShop = this.handleArray(result.data.sknNotInShop);
this.skuNotInSkn = this.handleArray(result.data.skuNotInSkn);
this.sknNotExist = this.handleArray(result.data.sknNotExist);
this.skuNotExist = this.handleArray(result.data.skuNotExist);
this.storageNumError = this.handleArray(result.data.storageNumError);
this.failList = this.handleArray(result.data.failList);
}
}
});
},
handleArray(array) {
if (!array) {
return null;
}
if (_.isEmpty(array)) {
return null;
}
const newArray = array.filter(i => i);
if (_.isEmpty(newArray)) {
return null;
}
return newArray;
},
reset() {
this.successList = null;
this.sknNotInShop = null;
this.skuNotInSkn = null;
this.sknNotExist = null;
this.skuNotExist = null;
this.storageNumError = null;
this.failList = null;
this.storageType = {
label: '商品类型',
model: 3,
options: [
{
value: 3,
label: 'JIT',
},
{
value: 6,
label: '一件代发',
},
],
};
},
},
};
</script>
<style lang="scss" scoped>
.report {
max-height: 500px;
overflow: auto;
max-height: 500px;
overflow: auto;
.title {
font-size: 20px;
text-align: center;
font-weight: bold;
margin-bottom: 20px;
margin-top: 10px;
}
.title {
font-size: 20px;
text-align: center;
font-weight: bold;
margin-bottom: 20px;
margin-top: 10px;
}
.success {
li {
display: inline-block;
color: green;
width: 70px;
}
.success {
li {
display: inline-block;
color: green;
width: 70px;
}
}
.err {
display: inline-block;
.err {
display: inline-block;
li {
display: inline-block;
color: red;
width: 70px;
}
li {
display: inline-block;
color: red;
width: 70px;
}
}
}
</style>
... ...
... ... @@ -3,10 +3,10 @@
* Created by TaoHuang on 2017/5/4.
*/
export default {
path: '/jit.html',
name: 'jit',
component: () => import(/* webpackChunkName: "repository.jit" */'./jit'),
meta: {
pageName: '可调拨库存'
}
path: '/jit.html',
name: 'jit',
component: () => import(/* webpackChunkName: "repository.jit" */ './jit'),
meta: {
pageName: '库存管理',
},
};
... ...
<template>
<layout-body>
<layout-filter>
<filter-item :label="filters.sknCode.label">
<Input v-model.trim="filters.sknCode.model" :number="true"
:placeholder="filters.sknCode.holder" :maxlength="9"></Input>
</filter-item>
<filter-item label="选择类目">
<select-category :value="categoryValue" @select-change="sortChange"></select-category>
</filter-item>
<layout-body>
<layout-filter>
<filter-item :label="filters.sknCode.label">
<Input
v-model.trim="filters.sknCode.model"
:number="true"
:placeholder="filters.sknCode.holder"
:maxlength="9"
/>
</filter-item>
<filter-item label="选择类目">
<select-category :value="categoryValue" @select-change="sortChange"></select-category>
</filter-item>
<filter-item label="选择品牌">
<select-brand v-model="filters.brand.model"></select-brand>
</filter-item>
<filter-item label="选择类型" v-if="shopData.shopNature === 6">
<Select v-model="filters.storageType">
<Option :value="3" label="JIT"></Option>
<Option :value="6" label="一件代发"></Option>
</Select>
</filter-item>
<filter-item label="选择品牌">
<select-brand v-model="filters.brand.model"></select-brand>
</filter-item>
<filter-item>
<Button type="primary" @click="filterSearch">筛选</Button>
<Button type="warning" @click="showImportStore">导入库存</Button>
<Button @click="clearFilter">清空条件</Button>
<!-- <filter-tips type="warning" show-icon closable>如果该商品在有货仓库中有库存,会包含在可售库存中进行展示。可以点击【库存分布】查询商品库存详情</filter-tips> -->
</filter-item>
</layout-filter>
<filter-item :label="filters.storageType.label">
<Select v-model="filters.storageType.model" @on-change="storageTypeSelect">
<Option v-for="option in filters.storageType.options" :key="option.value" :value="option.value"
>{{ option.label }}
</Option>
</Select>
</filter-item>
<layout-list>
<Table border :columns="tableCols" :data="tableData"></Table>
<Page :total="pageData.total" :current="pageData.current"
@on-change="pageChange" :page-size="20" show-total></Page>
</layout-list>
<filter-item>
<Button type="primary" @click="filterSearch">筛选</Button>
<Button type="warning" @click="showImportStore">导入库存</Button>
<Button @click="clearFilter">清空条件</Button>
<!-- <filter-tips type="warning" show-icon closable>如果该商品在有货仓库中有库存,会包含在可售库存中进行展示。可以点击【库存分布】查询商品库存详情</filter-tips> -->
</filter-item>
</layout-filter>
<edit-store ref="showStoreEdit" @on-success="editSuccess"></edit-store>
<import-store ref="showStoreImport" @on-success="editSuccess" :shop-nature="shopData.shopNature"></import-store>
</layout-body>
<layout-list>
<Table border :columns="tableCols" :data="tableData"></Table>
<Page
:total="pageData.total"
:current="pageData.current"
:page-size="20"
show-total
@on-change="pageChange"
></Page>
</layout-list>
<edit-store ref="showStoreEdit" @on-success="editSuccess"></edit-store>
<import-store ref="showStoreImport" @on-success="editSuccess"></import-store>
</layout-body>
</template>
<script>
import _ from 'lodash';
import JitService from 'services/repository/jit-service';
import EditStore from './components/edit-store';
import ImportStore from './components/import-store';
import {jit} from './store';
import _ from 'lodash';
import JitService from 'services/repository/jit-service';
import EditStore from './components/edit-store';
import ImportStore from './components/import-store';
import { jit } from './store';
import FilterItem from '../../../components/global/layout-filter-item';
export default {
created() {
this.jitService = new JitService();
this.jitService.getShop().then(result => {
this.shopData = result.data;
});
},
data() {
return jit.call(this);
},
mounted() {
this.getProduct();
},
methods: {
editStore(row) {
this.$refs.showStoreEdit.show(row);
},
editSuccess() {
this.getProduct();
},
showImportStore() {
this.$refs.showStoreImport.show();
},
filterParams() {
let productSkn = this.filters.sknCode.model;
let brandId = this.filters.brand.model === -1 ? null : this.filters.brand.model;
let maxSortId = this.filters.maxSortId;
let middleSortId = this.filters.middleSortId;
let smallSortId = this.filters.smallSortId;
let storageType = this.filters.storageType;
export default {
components: {
FilterItem,
EditStore,
ImportStore,
},
data() {
return jit.call(this);
},
created() {
this.jitService = new JitService();
},
mounted() {
this.getProduct();
},
methods: {
editStore(row) {
this.$refs.showStoreEdit.show(row, this.filters.storageType.model);
},
editSuccess() {
this.getProduct();
},
showImportStore() {
this.$refs.showStoreImport.show();
},
filterParams() {
const productSkn = this.filters.sknCode.model;
const brandId = this.filters.brand.model === -1 ? null : this.filters.brand.model;
const maxSortId = this.filters.maxSortId;
const middleSortId = this.filters.middleSortId;
const smallSortId = this.filters.smallSortId;
const storageType = this.filters.storageType.model;
let pageNo = this.pageData.current;
let pageSize = this.pageData.pageSize;
const pageNo = this.pageData.current;
const pageSize = this.pageData.pageSize;
if (productSkn && !_.isNumber(productSkn)) {
this.$Message.error('SKN编码只能为数字');
return Promise.reject();
}
if (productSkn && !_.isNumber(productSkn)) {
this.$Message.error('SKN编码只能为数字');
return Promise.reject();
}
return Promise.resolve({
productSkn,
brandId,
maxSortId,
middleSortId,
smallSortId,
storageType,
pageNo,
pageSize
});
},
filterSearch() {
this.getProduct();
},
clearFilter() {
this.filters.sknCode.model = null;
this.filters.brand.model = -1;
this.filters.maxSortId = null;
this.filters.middleSortId = null;
this.filters.smallSortId = null;
this.filters.storageType = null;
this.categoryValue = [];
this.pageData.current = 1;
return Promise.resolve({
productSkn,
brandId,
maxSortId,
middleSortId,
smallSortId,
pageNo,
pageSize,
storageType,
});
},
filterSearch() {
this.getProduct();
},
storageTypeSelect() {
this.getProduct();
},
clearFilter() {
this.filters.sknCode.model = null;
this.filters.brand.model = -1;
this.filters.maxSortId = null;
this.filters.middleSortId = null;
this.filters.smallSortId = null;
this.filters.storageType.model = 3;
this.categoryValue = [];
this.pageData.current = 1;
this.getProduct();
},
pageChange(page) {
this.pageData.current = page;
this.getProduct();
},
getProduct() {
return this.filterParams().then((params) => {
return this.jitService.listProduct(params).then((result) => {
if (result.code === 200) {
this.tableData = result.data.records;
this.pageData.total = result.data.totalCount;
this.pageData.current = result.data.pageNo;
}
});
});
},
sortChange(sort) {
this.filters.maxSortId = sort.max;
this.filters.middleSortId = sort.mid;
this.filters.smallSortId = sort.min;
}
},
components: {
EditStore,
ImportStore
}
};
this.getProduct();
},
pageChange(page) {
this.pageData.current = page;
this.getProduct();
},
getProduct() {
return this.filterParams().then(params => {
return this.jitService.listProduct(params).then(result => {
if (result.code === 200) {
this.tableData = result.data.records;
this.pageData.total = result.data.totalCount;
this.pageData.current = result.data.pageNo;
}
});
});
},
sortChange(sort) {
this.filters.maxSortId = sort.max;
this.filters.middleSortId = sort.mid;
this.filters.smallSortId = sort.min;
},
},
};
</script>
<style lang="scss">
.btn-row-space {
margin-top: 10px;
}
.btn-row-space {
margin-top: 10px;
}
</style>
... ...
... ... @@ -6,6 +6,4 @@
import jit from './jit';
export {
jit
};
export { jit };
... ...
... ... @@ -3,114 +3,128 @@
*/
export default function() {
return {
tableCols: [{
title: 'SKN',
key: 'productSkn',
align: 'center'
return {
tableCols: [
{
title: 'SKN',
key: 'productSkn',
align: 'center',
},
{
title: '图片',
key: 'image',
align: 'center',
render: (h, params) => {
return <img v-prod-img={params.row.productSkn} />;
},
{
title: '图片',
key: 'image',
align: 'center',
render: (h, params) => {
return (
<img v-prod-img={params.row.productSkn}/>
);
}
},
{
title: '商品名称',
key: 'productName',
align: 'center',
},
{
title: '品牌',
key: 'brandName',
align: 'center',
},
{
title: '设置总库存',
key: 'virtualNum',
align: 'center',
render: (h, params) => {
return <span>{params.row.virtualNum || 0}</span>;
},
{
title: '商品名称',
key: 'productName',
align: 'center',
},
{
title: '可售库存',
key: 'storage',
align: 'center',
render: (h, params) => {
return <span>{params.row.storage || 0}</span>;
},
{
title: '品牌',
key: 'brandName',
align: 'center',
},
{
title: '销售价',
key: 'salePrice',
align: 'center',
render: (h, params) => {
return <span>{params.row.salePrice || 0}</span>;
},
{
title: '设置总库存',
key: 'virtualNum',
align: 'center',
render: (h, params) => {
return (
<span>{params.row.virtualNum || 0}</span>
);
}
},
{
title: '更新时间',
key: 'editTime',
align: 'center',
render: (h, params) => {
return <span>{params.row.editTime || '-'}</span>;
},
{
title: '可售库存',
key: 'storage',
align: 'center',
render: (h, params) => {
return (
<span>{params.row.storage || 0}</span>
);
}
},
{
title: '操作',
key: 'action',
align: 'center',
render: (h, params) => {
return (
<action-group>
<i-button type="primary" size="small" onClick={() => this.editStore(params.row)}>
库存编辑
</i-button>
<i-button
type="success"
size="small"
onClick={() =>
this.$router.push({
name: 'repository.inventory',
query: {
productSkn: params.row.productSkn,
},
})
}
>
库存分布
</i-button>
</action-group>
);
},
{
title: '销售价',
key: 'salePrice',
align: 'center',
render: (h, params) => {
return (
<span>{params.row.salePrice || 0}</span>
);
}
},
{
title: '更新时间',
key: 'editTime',
align: 'center',
render: (h, params) => {
return (
<span>{params.row.editTime || '-'}</span>
);
}
},
{
title: '操作',
key: 'action',
align: 'center',
render: (h, params) => {
return (
<action-group>
<i-button type="primary" size="small" onClick={() => this.editStore(params.row)}>库存编辑</i-button>
<i-button type="success" size="small" onClick={() => this.$router.push({
name: 'repository.inventory',
query: {
productSkn: params.row.productSkn
}
})}>库存分布</i-button>
</action-group>
);
}
}],
tableData: [],
pageData: {
total: 0,
current: 1,
pageSize: 20
},
shopData: {},
categoryValue: [],
filters: {
sknCode: {
label: 'SKN编码',
labelSpan: 6,
model: '',
holder: '',
fieldSpan: 18
},
brand: {
label: '选择品牌',
model: -1
},
maxSortId: null,
middleSortId: null,
smallSortId: null,
storageType: null,
}
};
},
],
tableData: [],
pageData: {
total: 0,
current: 1,
pageSize: 20,
},
categoryValue: [],
filters: {
sknCode: {
label: 'SKN编码',
labelSpan: 6,
model: '',
holder: '',
fieldSpan: 18,
},
brand: {
label: '选择品牌',
model: -1,
},
maxSortId: null,
middleSortId: null,
smallSortId: null,
storageType: {
label: '商品类型',
model: 3,
options: [
{
value: 3,
label: 'JIT',
},
{
value: 6,
label: '一件代发',
},
],
},
},
};
}
... ...
... ... @@ -8,6 +8,14 @@ const apiUrl = {
exportBalanceList: '/erp/exportBalanceList',
balanceDetailSum: '/erp/balanceDetailSum',
settlementListSum: '/erp/settlementListSum',
shopWithdrawList: '/erp/shopWithdrawList',
shopWithdrawApplyById: '/erp/shopWithdrawApplyById',
shopWithdrawAccountList: '/erp/shopWithdrawAccountList',
shopWithdrawServiceList: '/erp/shopWithdrawServiceList',
shopWithdrawFreightList: '/erp/shopWithdrawFreightList',
shopWithdrawApplyInit: '/erp/shopWithdrawApplyInit',
shopGetAvailableAmount: '/erp/shopGetAvailableAmount',
shopWithdrawApply: '/erp/shopWithdrawApply',
};
class FinanceService extends Service {
... ... @@ -65,10 +73,84 @@ class FinanceService extends Service {
settlementListSum(params) {
return this.post(apiUrl.settlementListSum, params);
}
/**
* 资金操作明细列表
* @param params
* @returns {Promise<unknown>}
*/
shopWithdrawList(params) {
return this.post(apiUrl.shopWithdrawList, params);
}
/**
* 资金操作明细-提现明细
* @param params
* @returns {Promise<unknown>}
*/
shopWithdrawApplyById(params) {
return this.post(apiUrl.shopWithdrawApplyById, params);
}
/**
* 交易账务明细
* @param params
* @returns {Promise<unknown>}
*/
shopWithdrawAccountList(params) {
return this.post(apiUrl.shopWithdrawAccountList, params);
}
/**
* 服务费账单
* @param params
* @returns {Promise<unknown>}
*/
shopWithdrawServiceList(params) {
return this.post(apiUrl.shopWithdrawServiceList, params);
}
/**
* 运费账务明细
* @param params
* @returns {Promise<unknown>}
*/
shopWithdrawFreightList(params) {
return this.post(apiUrl.shopWithdrawFreightList, params);
}
/**
* 提现页面初始数据
* @param params
* @returns {Promise<unknown>}
*/
shopWithdrawApplyInit(params) {
return this.post(apiUrl.shopWithdrawApplyInit, params);
}
/**
* 根据店铺ID,时间获取可用的提现金额
* @param params
* @returns {Promise<unknown>}
*/
shopGetAvailableAmount(params) {
return this.post(apiUrl.shopWithdrawApply, params);
}
/**
* 提现申请管理-申请提现
* @param params
* @returns {Promise<unknown>}
*/
shopWithdrawApply(params) {
return this.post(apiUrl.shopWithdrawApply, params);
}
}
FinanceService.exportBalanceList = '/Api/erp/exportBalanceList'; // 导出对账单列表, 结算单列表
FinanceService.exportBalanceDetail = '/Api/erp/exportBalanceDetail'; // 导出对账单详情
FinanceService.exportSettlementDetail = '/Api/erp/exportSettlementDetail'; // 导出结算单详情
FinanceService.exportInventory = '/Api/erp/exportInventoryLedgerList'; // 导出结算单库存
FinanceService.exportShopWithdrawList = '/Api/erp/exportShopWithdrawList'; // 导出结算单库存
export default FinanceService;
... ...
... ... @@ -4,35 +4,28 @@
import Service from '../service';
const apiUrl = {
listProduct: '/erp/jitProductList',
getStorageBySkn: '/erp/getJitStorageListBySkn',
importJitStorage: '/erp/importJitStorage'
listProduct: '/erp/jitProductList',
getStorageBySkn: '/erp/getJitStorageListBySkn',
importJitStorage: '/erp/importJitStorage',
};
class JitService extends Service {
listProduct(params) {
return this.post(apiUrl.listProduct, params);
}
listProduct(params) {
return this.post(apiUrl.listProduct, params);
}
getStorageBySkn(productSkn, brandId) {
return this.post(apiUrl.getStorageBySkn, { productSkn, brandId });
}
getStorageBySkn(productSkn, brandId) {
return this.post(apiUrl.getStorageBySkn, { productSkn, brandId });
}
getShop(params) {
return this.get('/platform/getShopDetailById', {
params,
});
}
updateStorage(params, storageType) {
let data = {
// brandAuthData: null,
authLevel: true,
storageType: storageType,
virtualInventoryBos: params
};
return this.post(apiUrl.importJitStorage, data);
}
updateStorage(params, storageType) {
const data = {
// brandAuthData: null,
authLevel: true,
storageType,
virtualInventoryBos: params,
};
return this.post(apiUrl.importJitStorage, data);
}
}
export default JitService;
... ...
... ... @@ -116,6 +116,16 @@ const domainApis = {
returnedReject: '/erp-gateway-web/shop/returnedGoods/returnedGoodsReject',
getReturnedInfo: '/erp-gateway-web/shop/returnedGoods/queryById',
exportReturnedGoods: '/erp-gateway-web/shop/export/exportReturnedGoods',
// 提现申请管理
shopWithdrawList: '/erp-gateway-web/shop/withdraw/list', //资金操作明细列表
shopWithdrawApplyById: '/erp-gateway-web/shop/withdraw/applyById', //资金操作明细-提现明细
shopWithdrawAccountList: '/erp-gateway-web/shop/account/list', //交易账务明细
shopWithdrawServiceList: '/erp-gateway-web/shop/withdraw/service/list', //服务费账单
shopWithdrawFreightList: '/erp-gateway-web/shop/withdraw/freight/list', //运费账务明细
shopWithdrawApplyInit: '/erp-gateway-web/shop/withdraw/init', //提现页面初始数据
shopGetAvailableAmount: '/erp-gateway-web/shop/withdraw/getAvailableAmount', //根据店铺ID,时间获取可用的提现金额
shopWithdrawApply: '/erp-gateway-web/shop/withdraw/apply', //资金操作明细-申请提现
},
platform: {
queryShopsByAdminPid: '/SellerShopController/queryShopsByAdminPid',
... ... @@ -193,7 +203,7 @@ const domains = {
/* erp: 'http://192.168.103.82:9098',
platform: 'http://192.168.102.202:8088/platform',
shop: 'http://192.168.102.211:30016'*/
erp: 'http://192.168.103.48:9098',
erp: 'http://192.168.102.47:9098',
platform: 'http://java-yoho-platform.test3.ingress.dev.yohocorp.com/platform',
shop: 'http://192.168.102.211:30016',
};
... ...
... ... @@ -64,6 +64,7 @@ class UserController extends Context {
overdueInfo,
pwdComplexRateDesc: user.pwdComplexRateDesc,
needUpdate,
token: user.token,
},
});
});
... ...