星油云站
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

903 lines
22 KiB

<template>
<view class="container">
<cu-custom class="main-totextbar bg-main-oil" :isBack="true" bgColor="bg-main-oil">
<block slot="backText">返回</block>
<block slot="content">新增商品</block>
</cu-custom>
<view id="chooseType" :class="currentBoxId == 'chooseType' ? 'show' : 'hidden'">
<uni-forms ref="productForm" :modelValue="productDate" :rules="rules" label-width="200rpx">
<uni-forms-item label="商品分类:" name="demandRegion">
<mulpicker v-model="productDate.demandRegion" :list="productList" rangekey="categoryName" code="id"
pidkey="id" childkey="classificationTwoList" :emitPath="true" :level="2"
:placeholder="'选择商品分类'" />
<uni-icons color="#666666" type="right" size="22"
style="position: absolute;right: 0;top: 10rpx;"></uni-icons>
</uni-forms-item>
<uni-forms-item label="商品名称:" name="productName">
<input type="text" v-model="productDate.productName" placeholder="请输入商品名称" />
</uni-forms-item>
<uni-forms-item label="关键词:" name="keyword">
<input type="text" v-model="productDate.keyword" placeholder="请输入关键词(空格分隔)" />
</uni-forms-item>
<uni-forms-item label="商品品牌:" name="brandId">
<!-- <input type="text" v-model="productDate.brandId" placeholder="请输入商品品牌" /> -->
<uni-data-select v-model="productDate.brandId" :localdata="brandIdList"
placeholder="请选择商品品牌"></uni-data-select>
</uni-forms-item>
<uni-forms-item label="商品售价:" name="price">
<input type="text" v-model="productDate.price" placeholder="请输入商品售价" />
</uni-forms-item>
<uni-forms-item label="商品上架:" name="productStatus">
<switch v-model="productDate.productStatus" :checked="productDate.productStatus=='1'"
color="#FE0606" @change="switchChange" style="transform:scale(0.7)" />
</uni-forms-item>
<uni-forms-item label="商品推荐:" name="age">
<view class='checkbox-con'>
<radio-group>
<label :class="item.checked?'checkbox checked':'checkbox'" @click="checkbox(index)"
v-for="(item, index) in radioItem" :key="item.value">
<checkbox :value="item.value" :checked="item.checked" />{{item.name}}
</label>
</radio-group>
</view>
</uni-forms-item>
</uni-forms>
<view class="buttons">
<view @click="closed">取消</view>
<view id="next" @click="changeBox">下一步</view>
</view>
</view>
<view id="instruction" :class="currentBoxId == 'instruction' ? 'show' : 'hidden'">
<uni-forms :modelValue="productDate" label-width="200rpx">
<uni-forms-item label="选择规格:">
<uni-data-select v-model="productDate.attributesTypeId" :localdata="attributesTypeList"
placeholder="请选择规格" @change="attributesData"></uni-data-select>
</uni-forms-item>
<view class="content" v-show="productDate.attributesTypeId">
<view style="margin: 10rpx 0;">商品规格:</view>
<view>
<uni-section type="line">
<view class="uni-px-5" v-for="(item,index) in attributesList">
<view style="display: inline-block;">{{item.attributeName}}:</view>
<view style="display: inline-block;">
<uni-data-checkbox mode="tag"
@change="changeCheckBox(item,index)" multiple v-model="item.checkboxAttributes"
:localdata="item.attributesList"></uni-data-checkbox>
</view>
</view>
</uni-section>
</view>
</view>
<view style="padding-bottom: 20rpx;border-bottom: 1rpx solid #f6f6f6;">
<view>批量填充:<text style="color: #999999;margin: 10rpx 0;">批量填充填入信息后,可以批量将内容填写到SKU 信息里</text></view>
<view style="display: inline-block;position: relative;" v-for="item in bottonList">
<view class="tagButton">
<input type="text" v-model="item.marketPrice" placeholder="市场价格" />
</view>
<view class="tagButton">
<input type="text" v-model="item.sellPrice" placeholder="销售价格" />
</view>
<view class="tagButton">
<input type="text" v-model="item.stock" placeholder="库存数量" />
</view>
<view class="tagButton">
<input type="text" v-model="item.integral" placeholder="积分价值" />
</view>
<view class="redButton" @tap="addStockList">确定</view>
</view>
</view>
<view style="padding: 20rpx 0;;border-bottom: 1rpx solid #f6f6f6;" v-for="(items,index) in stockList">
<view style="margin: 10rpx 0;">
<text style="color: red;">*</text>
<text>规格:</text>
<text v-for="(value,key,index) in JSON.parse(items.attributeJson)">
<text v-if="index==0">{{value}}</text>
<text v-else> + {{value}}</text>
</text>
</view>
<view class="tagButton">
<input type="text" v-model="items.marketPrice" placeholder="市场价格" />
</view>
<view class="tagButton">
<input type="text" v-model="items.sellPrice" placeholder="销售价格" />
</view>
<view class="tagButton">
<input type="text" v-model="items.stock" placeholder="库存数量" />
</view>
<view class="tagButton">
<input type="text" v-model="items.integral" placeholder="积分价值" />
</view>
<view style="display: inline-block;vertical-align: top;margin-top: 10rpx;"
@click="deleteCheckAll(index)">删除</view>
</view>
<view>
<view style="margin: 10rpx 0;">
<text style="color: red;">*</text>
商品图片:
<text style="color: #999999;">最多可上传10张图片</text>
</view>
<view class="imageList" v-for="(items,index) in productDate.images">
<view class="imageBlack" v-if="items.mainMark==1">
<image :src="items.url"></image>
<view class="cameraText">商品主图</view>
<uni-icons class="cameraClear" type="clear" size="20" @tap="clearImage(index)"></uni-icons>
</view>
<view class="imageBlack" v-else-if="items.mainMark!=1">
<image :src="items.url"></image>
<view class="cameraText" @click="setMainImage(items,index)">设为主图</view>
<uni-icons class="cameraClear" type="clear" size="20" @tap="clearImage(index)"></uni-icons>
</view>
</view>
<view class="imageBlack" style="background-color: #fafafa;" @tap="srcFileImage">
<view style="margin-top: 46rpx;">
<uni-icons type="camera-filled" size="30"></uni-icons>
</view>
</view>
</view>
</uni-forms>
<view class="buttons">
<view id="previous" @click="changeBox">上一步</view>
<view @click="addCompleted">完成</view>
</view>
</view>
</view>
</template>
<script>
import utils from '@/utils/encode'
import serve from '@/api/packageIntegral/productList.js'
import mulpicker from '@/packageIntegral/components/mulpicker.vue'
export default {
components: {
mulpicker
},
data() {
return {
currentBoxId: 'chooseType', //当前显示的view的id
isBoxShow: false,
productDate: {
productStatus: '1',
newMark: 1,
images: []
},
productList: [],
brandIdList: [],
radioItem: [{
name: '新品',
checked: true
}, {
name: '推荐',
checked: false
}],
rules: {
demandRegion: {
rules: [{
required: true,
errorMessage: '请选择商品分类'
}]
},
productName: {
rules: [{
required: true,
errorMessage: '请输入商品名称'
}]
},
brandId: {
rules: [{
required: true,
errorMessage: '请选择商品品牌'
}]
},
price: {
rules: [{
required: true,
errorMessage: '请输入商品售价'
}]
},
},
attributesTypeList: [],
attributesList: [],
bottonList: [{
marketPrice: '',
sellPrice: '',
stock: '',
integral: ''
}],
stockList: [],
checkedList: []
}
},
onLoad() {
this.classfication()
this.getProductBrands()
this.getAttributesType()
},
watch: {
'productDate.demandRegion'(val) {
if (val) {
this.productDate.categoryOneId = val.split(',')[0]
this.productDate.categoryTwoId = val.split(',')[1]
}
},
'productDate.attributesTypeId'(val) {
if (!val) {
this.stockList = []
}
}
},
methods: {
switchChange(e) {
if (e.detail.value == true) {
this.productDate.productStatus = '1'
} else if (e.detail.value == false) {
this.productDate.productStatus = '2'
}
},
classfication() {
serve.classification().then(res => {
this.productList = res.data
})
},
getProductBrands() {
this.brandIdList = []
serve.getProductBrands().then(res => {
res.data.forEach(tab => {
this.brandIdList.push({
value: tab.id,
text: tab.brandName
})
})
})
},
checkbox(e) {
var index = e; //获取当前点击的下标
var checkboxArr = this.radioItem; //选项集合
if (checkboxArr[index].checked) return; //如果点击的当前已选中则返回
checkboxArr.forEach(item => {
item.checked = false
})
checkboxArr[index].checked = true; //改变当前选中的checked值
if (checkboxArr[0].checked == true) {
this.productDate.newMark = 1
} else {
this.productDate.newMark = 2
}
if (checkboxArr[1].checked == true) {
this.productDate.recommend = 1
} else {
this.productDate.recommend = 2
}
},
changeBox(e) {
let currentFlag = e.currentTarget.id;
if (currentFlag == 'next') {
this.$refs.productForm.validate().then(res => {
if (this.isNumber(this.productDate.price) == false) {
uni.showToast({
title: '商品售价不是数字',
icon: 'none'
})
return
}
switch (currentFlag) {
case 'next':
this.currentBoxId = 'instruction'
break;
case 'previous':
this.currentBoxId = 'chooseType'
break;
default:
this.currentBoxId = 'viewInstruction'
break;
}
if (currentFlag == 'next') {
this.getAttributesType()
}
}).catch(err => {})
} else {
switch (currentFlag) {
case 'next':
this.currentBoxId = 'instruction'
break;
case 'previous':
this.currentBoxId = 'chooseType'
break;
default:
this.currentBoxId = 'viewInstruction'
break;
}
}
},
getAttributesType() {
this.attributesTypeList = []
serve.getAttributesType().then(res => {
res.data.forEach(tab => {
this.attributesTypeList.push({
value: tab.id,
text: tab.name,
number: tab.number,
attributesList: tab.attributesList
})
})
})
},
attributesData() {
this.bottonList = [{
marketPrice: '',
sellPrice: '',
stock: '',
integral: ''
}]
this.stockList = []
if (this.productDate.attributesTypeId) {
this.attributesTypeList.forEach(tab => {
if (tab.value == this.productDate.attributesTypeId) {
this.attributesList = tab.attributesList
this.attributesList.forEach(tab => {
tab.attributesList = []
tab.checkboxAttributes=[]
tab.attributeContent.split(',').forEach(item => {
tab.attributesList.push({
value: item,
text: item
})
})
})
}
})
} else {
this.attributesList = []
}
},
changeCheckBox(item, index) {
if (this.checkedList.length < index + 1) {
this.checkedList.push({
attributeId: item.id,
checked: item.checkboxAttributes[index]
})
} else {
let checked = []
item.checkboxAttributes.forEach(tab => {
checked.push(tab)
})
this.checkedList[index].checked = checked.join(',')
}
let arrays = []
this.attributesList.forEach(tab=>{
arrays.push(tab.checkboxAttributes)
})
let arrList = this.combineArrays(arrays)
this.stockCheck(arrList)
},
combineArrays(arr) {
if (arr.length === 0) {
return [];
} else if (arr.length === 1) {
return arr[0];
} else if (arr.length === 2 && JSON.stringify(arr[1])=='[]') {
let result = [];
arr[0].forEach(tab=>{
result.push([tab])
})
return result;
} else {
let result = [];
let subCombinations = this.combineArrays(arr.slice(1));
for (let elem of arr[0]) {
if (Array.isArray(subCombinations)) {
for (let subComb of subCombinations) {
result.push([elem].concat(subComb));
}
} else {
result.push([elem, subCombinations]);
}
}
return result;
}
},
stockCheck(arrList) {
this.stockList = []
let obj = {
marketPrice: '',
sellPrice: '',
stock: '',
integral: ''
}
arrList.forEach(tab=>{
let data = {}
let tabName = ''
let tabValue = ''
tab.forEach((item,i)=>{
tabName = this.attributesList[i].attributeName
tabValue = item
data[tabName] = tabValue
})
obj.attributeJson = JSON.stringify(data)
let stockObj = JSON.parse(JSON.stringify(obj))
this.stockList.push(stockObj)
})
},
deleteCheckAll(i) {
this.stockList.splice(i, 1)
},
addStockList() {
this.stockList.forEach(tab => {
tab.marketPrice = this.bottonList[0].marketPrice
tab.sellPrice = this.bottonList[0].sellPrice
tab.stock = this.bottonList[0].stock
tab.integral = this.bottonList[0].integral
})
},
//调起上传图片
srcFileImage() {
let _that = this
let imageUrl = ''
uni.chooseImage({
count: 1, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: function(res) {
const JSESSIONID = utils.uuid()
uni.uploadFile({
url: 'http://uat.xingoil.com/adminapi/oil-oss/obejct/uploadFile',
filePath: res.tempFilePaths[0],
formData: {
ossKey: 'xingyou',
pathKey: 'publicxingyou',
encrypt: 'PUBLIC',
},
name: 'file',
header: {
"Content-Type": "multipart/form-data",
"Authorization": uni.getStorageSync('Authorization'),
'dataSources': 'MP',
"imei": uni.getStorageSync('unionid'),
"openId": uni.getStorageSync('openid'),
'JSESSIONID': JSESSIONID,
'token': utils.md5Salt(JSESSIONID)
},
success(e) {
let obj = JSON.parse(e.data),
imageUrl = obj.data.publicUrl
_that.getImage(imageUrl)
},
fail(err) {}
})
},
fail() {
console.log('相机调用失败')
}
})
},
getImage(imageUrl) {
if (this.productDate.images.length < 10) {
if (JSON.stringify(this.productDate.images) == '[]') {
this.productDate.images.push({
url: imageUrl,
mainMark: 1
})
} else {
this.productDate.images.push({
url: imageUrl,
mainMark: ''
})
}
} else {
uni.showToast({
title: '最多只能上传十张图片~',
icon: 'none'
})
}
},
setMainImage(items, index) {
let obj = items
obj.mainMark = 1
this.productDate.images.splice(index, 1)
this.productDate.images.forEach((tab, i) => {
tab.mainMark = ''
})
this.productDate.images.unshift(obj)
},
clearImage(index) {
if (this.productDate.images[index].mainMark == 1) {
this.productDate.images.splice(index, 1)
this.productDate.images[0].mainMark = 1
} else {
this.productDate.images.splice(index, 1)
}
},
closed() {
uni.navigateTo({
url: '/pages/index/index'
})
},
isNumber(value) {
return /^[0-9]+$/.test(value);
},
addCompleted() {
if (this.radioItem[0].checked = true) {
this.productDate.newMark == 1
} else {
this.productDate.newMark == 2
}
if (this.radioItem[1].checked = true) {
this.productDate.recommend == 1
} else {
this.productDate.recommend == 2
}
if (!this.productDate.attributesTypeId) {
uni.showToast({
title: '请选择请选择规格',
icon: 'none'
})
return
}
this.attributesList.forEach(tab=>{
if(JSON.stringify(tab.checkboxAttributes) == '[]'){
uni.showToast({
title: '请选择商品规格',
icon: 'none'
})
throw Error(`请选择商品规格!`)
}
})
if (JSON.stringify(this.stockList.length) == '[]') {
uni.showToast({
title: '请选择商品规格',
icon: 'none'
})
return
} else {
this.stockList.forEach(tab => {
if (!tab.marketPrice) {
uni.showToast({
title: '市场价格必填!',
icon: 'none'
})
throw Error(`市场价格必填!`)
} else {
if (this.isNumber(tab.marketPrice) == false) {
uni.showToast({
title: '市场价格不是数字!',
icon: 'none'
})
throw Error(`市场价格不是数字!`)
}
}
if (!tab.sellPrice) {
uni.showToast({
title: '销售价格必填!',
icon: 'none'
})
throw Error(`销售价格必填!`)
} else {
if (this.isNumber(tab.sellPrice) == false) {
uni.showToast({
title: '销售价格不是数字!',
icon: 'none'
})
throw Error(`销售价格不是数字!`)
}
}
if (!tab.stock) {
uni.showToast({
title: '库存数量必填!',
icon: 'none'
})
throw Error(`库存数量必填!`)
} else {
if (this.isNumber(tab.stock) == false) {
uni.showToast({
title: '库存数量不是数字!',
icon: 'none'
})
throw Error(`库存数量不是数字!`)
}
}
if (!tab.integral) {
uni.showToast({
title: '积分价值必填!',
icon: 'none'
})
throw Error(`积分价值必填!`)
} else {
if (this.isNumber(tab.integral) == false) {
uni.showToast({
title: '积分价值不是数字!',
icon: 'none'
})
throw Error(`积分价值不是数字!`)
}
}
})
}
if (JSON.stringify(this.productDate.images) == '[]') {
uni.showToast({
title: '请上传商品图片',
icon: 'none'
})
return
}
this.productDate.checkedList = this.checkedList
this.productDate.stockList = this.stockList
serve.saveProduct(this.productDate).then(res => {
uni.showToast({
title: res.msg,
icon: 'none'
})
this.closed()
})
}
}
}
</script>
<style lang="scss" scoped>
.fadeBox {
width: 100%;
margin-bottom: 20rpx;
}
#chooseType {
padding: 30rpx;
mulpicker {
height: 72rpx;
line-height: 72rpx;
}
/deep/ .uni-forms {
width: 100%;
}
.content {
font-size: 28rpx;
font-weight: bold;
}
/deep/ .uni-forms-item {
width: 100%;
}
/deep/ .uni-forms-item__label {
color: #333 !important;
font-size: 30rpx;
font-weight: 700;
}
/deep/ .uni-forms-item__content {
width: 100%;
input {
height: 72rpx;
line-height: 72rpx;
}
}
switch {
margin-top: 9rpx;
}
switch::before {
content: '';
}
switch::after {
content: '';
}
}
#instruction {
padding: 30rpx;
mulpicker {
height: 72rpx;
line-height: 72rpx;
}
/deep/ .uni-forms {
width: 100%;
}
/deep/ .uni-forms-item {
width: 100%;
}
/deep/ .uni-forms-item__label {
color: #333 !important;
font-size: 30rpx;
font-weight: 700;
}
/deep/ .uni-forms-item__content {
width: 100%;
input {
height: 72rpx;
line-height: 72rpx;
}
}
.content {
padding-bottom: 20rpx;
border-bottom: 1rpx solid #F6F6F6;
}
.tagButton {
display: inline-block;
width: 133rpx;
background: #f5f5f5;
color: #666666;
border-radius: 8rpx;
line-height: 58rpx;
text-align: center;
margin: 8rpx;
input {
height: 58rpx;
}
}
.checkedTag {
background-color: #2979ff;
color: #FFFFFF;
}
.redButton {
position: absolute;
right: -84rpx;
top: 10rpx;
display: inline-block;
width: 84rpx;
height: 58rpx;
background: red;
color: #fff;
border-radius: 10rpx;
line-height: 58rpx;
text-align: center;
}
.commodityImage {
display: inline-block;
max-width: calc(100%-150rpx);
}
.imageList {
display: inline-block;
width: 140rpx;
margin: 0 10rpx;
}
.imageBlack {
display: inline-block;
width: 140rpx;
height: 140rpx;
vertical-align: middle;
text-align: center;
position: relative;
>image {
width: 100%;
height: 100%;
}
.cameraText {
width: 140rpx;
height: 30rpx;
text-align: center;
line-height: 30rpx;
position: absolute;
background-color: #333;
opacity: 0.3;
color: #FFFFFF;
left: 0rpx;
top: 110rpx;
}
.cameraClear {
position: absolute;
left: 120rpx;
top: -10rpx;
z-index: 20;
}
}
}
.checkbox-con {
margin-top: 40rpx;
text-align: center;
position: relative;
}
.checkbox {
width: 180rpx;
height: 76rpx;
line-height: 76rpx;
font-size: 30rpx;
color: #666666;
border: 1rpx solid #B6B6B6;
border-radius: 5rpx;
display: inline-block;
margin: 0 10rpx 20rpx 0;
position: absolute;
top: 50rpx;
&:nth-of-type(1) {
left: -190rpx;
}
&:nth-of-type(2) {
left: 50rpx;
}
}
.checked {
color: #FFFFFF;
background: #FE0606;
border: 1rpx solid #FE0606;
}
.checkbox checkbox {
display: none
}
.buttons {
width: 100%;
display: flex;
justify-content: space-evenly;
margin-top: 180rpx;
>view {
width: 250rpx;
height: 76rpx;
text-align: center;
line-height: 76rpx;
border-radius: 10rpx;
font-size: 28rpx;
&:nth-of-type(1) {
background: #FFFFFF;
border: 1rpx solid #B6B6B6;
color: #333;
}
&:nth-of-type(2) {
background: #FE0505;
color: #fff;
}
}
}
.show {
display: flex;
flex-wrap: wrap;
}
.hidden {
display: none;
}
</style>