Authored by 陈峰

Merge branch 'release/1.0' of http://git.yoho.cn/fe/yoho-shop-manage into release/1.0

... ... @@ -209,7 +209,7 @@ export default {
if (!Number.isInteger(value)) {
callback(new Error('请输入整数,不能有小数点'));
} else if (value > 10000) {
} else if (value > 99999) {
callback(new Error('价格不能大于5位'));
} else {
callback();
... ... @@ -268,7 +268,8 @@ export default {
render(row, col, index) {
return `<div
:class="{'upload-item': true ,
'upload-item-error': row.goodsColorImage.showValidate && row.goodsColorImage.validate}"
'upload-item-error':
row.goodsColorImage.showValidate && row.goodsColorImage.validate}"
>
<div class="upload-item-img">
<img v-if="row.goodsColorImage.value"
... ...
... ... @@ -13,8 +13,9 @@
<Row>
<Col>
<div class="create-item-title">商品颜色主图
<span class="create-group-sub-title">(商品正面图默认为用户选择商品颜色和展示使用。用户从不同频道查看商品,优先展示频道封面图)<a
href="javascript: void 0;" @click="onClickShowExample">查看色卡图片示例</a></span>
<span class="create-group-sub-title">(商品正面图默认为用户选择商品颜色和展示使用。用户从不同频道查看商品,优先展示频道封面图)
<a href="javascript: void 0;" @click="onClickShowExample">查看色卡图片示例</a>
</span>
</div>
</Col>
</Row>
... ...
... ... @@ -68,7 +68,9 @@
<span class="create-group-sub-title">(商品上架销售需要完成必填项信息)</span>
</div>
<div class="create-item-title">商品颜色主图
<span class="create-group-sub-title">(商品正面图默认为用户选择商品颜色和展示使用。用户从不同频道查看商品,优先展示频道封面图)</span>
<span class="create-group-sub-title">(商品正面图默认为用户选择商品颜色和展示使用。用户从不同频道查看商品,优先展示频道封面图)
<a href="javascript: void 0;" @click="onClickShowExample">查看色卡图片示例</a>
</span>
</div>
<ImageGoodsMain v-model="product.goods"></ImageGoodsMain>
<div class="create-item-title">商品描述(详情页内容)</div>
... ... @@ -105,7 +107,7 @@
</Form-item>
</Form>
<Spin size="large" fix v-else-if="showLoading"></Spin>
</LayoutBody>
<ModalExample ref="example"></ModalExample></LayoutBody>
</template>
<script>
import _ from 'lodash';
... ... @@ -114,6 +116,7 @@ import { SelectSeason } from 'components/select';
import { RadioSeason, RadioGender } from 'components/radio';
import { TableGoodSize } from 'components/table';
import { ImageGoodsMain } from 'components/image';
import {ModalExample} from 'components/modal';
import service from 'product-create/service';
import api from 'product-create/api';
... ... @@ -527,6 +530,9 @@ export default {
return total;
}, []);
},
onClickShowExample() {
this.$refs.example.show();
}
},
components: {
... ... @@ -538,7 +544,8 @@ export default {
SelectSeason,
CheckboxColor,
CheckboxSize,
ImageGoodsMain
ImageGoodsMain,
ModalExample
}
};
</script>
... ...
... ... @@ -142,12 +142,14 @@
return;
}
this.$Loading.start();
service.productList(
_.merge(params || {}, {
shelfStatus: 0,
size: 20
}))
.then(res => {
this.$Loading.finish();
if (res.code === 200) {
this.updateStore(res.data);
}
... ... @@ -205,15 +207,37 @@
this.productList(params);
},
setOnSale(skns) {
setOnSale(rows) {
const params = {
targetStatus: 1
};
if (_.isArray(skns)) {
params.productSkns = `[${skns.join(',')}]`;
let inValid = [];
let sknArray = [];
if (_.isArray(rows)) {
_.each(rows, item => {
if (item.stock < 1) {
inValid.push(item.productSkn);
}
sknArray.push(item.productSkn);
});
if (inValid.length) {
const error = inValid.join(':库存为0不能上架;');
this.$Message.error(`${error}:库存为0不能上架;`, 5);
return;
}
params.productSkns = `[${sknArray.join(',')}]`;
} else {
params.productSkns = `[${skns}]`;
if (rows.stock < 1) {
this.$Message.error('库存为0的商品不能上架');
return;
}
params.productSkns = `[${rows.productSkn}]`;
}
service.setOnSale(params)
... ... @@ -225,16 +249,11 @@
batchSetOnSale() {
if (!this.batchOnSale.length) {
return this.$Message.error('请选择要上架的商品');
this.$Message.error('请选择要上架的商品');
return;
}
let skns = [];
_.each(this.batchOnSale, (item) => {
skns.push(item.productSkn);
});
this.setOnSale(skns);
this.setOnSale(this.batchOnSale);
},
editPrice(row) {
row.changePrice = true;
... ...
... ... @@ -241,7 +241,7 @@ export default () => {
</div>
<div class="cell-action-row">
<i-button type="success" size="small"
@click="setOnSale(${row.productSkn})">商品上架</i-button>
@click="setOnSale(row)">商品上架</i-button>
</div>
</div>`;
},
... ...
... ... @@ -136,12 +136,14 @@
return;
}
this.$Loading.start();
service.productList(
_.merge(params || {}, {
shelfStatus: 1,
size: 20
}))
.then(res => {
this.$Loading.finish();
if (res.code === 200) {
this.updateStore(res.data);
}
... ...
... ... @@ -75,6 +75,7 @@ export default {
this.getData();
},
close() {
this.reset();
this.model = false;
},
submit() {
... ...
... ... @@ -27,11 +27,69 @@
</ul>
</div>
</Form-item>
</Form>
<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>
</div>
<div slot="footer" style="text-align: center">
<Button type="primary" size="large" :loading="modal_loading" @click="save">保存</Button>
<Button type="primary" size="large" :loading="modal_loading" v-if="!failList" @click="save">保存</Button>
<Button type="primary" size="large" v-else @click="close">关闭</Button>
<Button type="primary" size="large" @click="close">取消</Button>
</div>
</Modal>
... ... @@ -39,20 +97,21 @@
<script>
const ERROR = {
sknNotInShop: '',
skuNotInSkn: '',
sknNotExist: '',
skuNotExist: '',
storageNumError: ''
};
import _ from 'lodash';
export default {
data() {
return {
model: false,
modal_loading: false,
fileName: ''
fileName: '',
successList: null,
sknNotInShop: null,
skuNotInSkn: null,
sknNotExist: null,
skuNotExist: null,
storageNumError: null,
failList: null
};
},
methods: {
... ... @@ -80,13 +139,39 @@
title: '导入失败',
desc: result.message
});
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);
}
},
uploadError() {
handleArray(array) {
if (!array) {
return null;
}
if (_.isEmpty(array)) {
return null;
}
let newArray = array.filter(i => i);
if (_.isEmpty(newArray)) {
return null;
}
return newArray;
},
uploadError(err) {
this.modal_loading = false;
this.$Notice.error({
title: '保存失败,请重试',
desc: err
});
},
uploadChange(files) {
... ... @@ -95,9 +180,11 @@
}
this.fileName = files[0].name;
this.resetErr();
},
close() {
this.model = false;
this.$emit('on-success');
},
save() {
this.modal_loading = true;
... ... @@ -106,6 +193,16 @@
reset() {
this.modal_loading = false;
this.fileName = '';
this.resetErr();
},
resetErr() {
this.successList = null;
this.sknNotInShop = null;
this.skuNotInSkn = null;
this.sknNotExist = null;
this.skuNotExist = null;
this.storageNumError = null;
this.failList = null;
}
},
computed: {
... ... @@ -116,6 +213,35 @@
};
</script>
<style lang="scss">
<style lang="scss" scoped>
.report {
max-height: 500px;
overflow: auto;
.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;
}
}
.err {
display: inline-block;
li {
display: inline-block;
color: red;
width: 70px;
}
}
}
</style>
\ No newline at end of file
... ...
... ... @@ -122,7 +122,7 @@
if (values.proRequisitionFormId !== 'undefined' &&
!_.isFinite(+values.proRequisitionFormId)) {
this.$Message.error('入库单号只能是数字', 3);
this.$Message.error('调拨单号只能是数字', 3);
return;
}
... ... @@ -161,11 +161,13 @@
return values;
},
productList(params) {
this.$Loading.start();
service.allotPurchaseList(params)
.then(res => {
const fmt = 'YYYY-MM-DD HH:mm:ss';
const list = res.data.records;
this.$Loading.finish();
_.each(list, i => {
i._colorName = i.factoryGoodsName || '';
i.createTime = moment.unix(i.createTime).format(fmt);
... ...
... ... @@ -63,8 +63,10 @@
},
methods: {
getExpList(params) {
this.$Loading.start();
service.allotExpressList(params)
.then(res => {
this.$Loading.finish();
this.handleData(res.data);
});
},
... ... @@ -96,7 +98,7 @@
expressNumber: 'expressNo',
sknFactoryCode: 'prodCode',
skuFactoryCode: 'prodBarCode',
proRequisitionFormId: 'orderNo'
proReqFormId: 'orderNo'
};
if (this.useFilter) {
... ... @@ -110,9 +112,9 @@
});
}
if (typeof data.proRequisitionFormId !== 'undefined' &&
!_.isFinite(+data.proRequisitionFormId)) {
this.$Message.error('入库单号只能是数字', 3);
if (typeof data.proReqFormId !== 'undefined' &&
!_.isFinite(+data.proReqFormId)) {
this.$Message.error('调拨单号只能是数字', 3);
return;
}
... ...
... ... @@ -132,7 +132,7 @@
if (typeof values.proReqFormId !== 'undefined' &&
!_.isFinite(+values.proReqFormId)) {
this.$Message.error('入库单号只能是数字', 3);
this.$Message.error('调拨单号只能是数字', 3);
return;
}
... ... @@ -163,8 +163,10 @@
return values;
},
productList(params) {
this.$Loading.start();
service.allotPurchaseList(params)
.then(res => {
this.$Loading.finish();
this.processData(res.data);
});
},
... ...
... ... @@ -4,7 +4,6 @@
const Context = require('../framework/context');
const xlsx2json = require('xlsx2json');
const Api = require('../common/api');
const apiDomain = global.yoho.apiDomain;
const _ = require('lodash');
const xlsxRead = (fileName) => {
... ... @@ -36,6 +35,8 @@ class XlsxService extends Context {
return {code: 500, message: '数据超出限制'};
}
data = data.filter(d => d.productSkn && d.productSku && d.number);
return this.postJitStore(data);
});
}
... ...