123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- <template>
- <!--商品关联系统表单-->
- <view v-if="value.length>0" class="wrapper virtual_form bg-f boder-24 px-30">
- <view class='item acea-row row-between-wrapper'
- :class="{on:(item.name=='radios' || item.name=='checkboxs'),on2:item.name == 'dateranges',on3:item.name == 'citys',pd0:item.name == 'uploadPicture'}"
- v-for="(item,index) in orderNewForm" :key="index">
- <view class="name">
- <text class="item-require" v-if="item.titleShow.val">*</text>
- {{ item.titleConfig.val }}
- </view>
- <!-- radio -->
- <view v-if="item.name=='radios'" class="discount">
- <radio-group @change="radioChange($event, index, item)" class="acea-row row-middle row-right">
- <label class="radio" v-for="(j,jindex) in item.wordsConfig.list" :key="jindex">
- <view class="acea-row row-middle">
- <!-- #ifndef MP -->
- <radio :value="jindex.toString()" :checked='j.show' />
- <!-- #endif -->
- <!-- #ifdef MP -->
- <radio :value="jindex" :checked='j.show' />
- <!-- #endif -->
- <view>{{j.val}}</view>
- </view>
- </label>
- </radio-group>
- </view>
- <!-- checkbox -->
- <view v-if="item.name=='checkboxs'" class="discount acea-row">
- <checkbox-group @change="checkboxChange($event, index, item)" class="acea-row row-middle row-right">
- <label class="radio" v-for="(j,jindex) in item.wordsConfig.list" :key="jindex">
- <view class="acea-row row-middle">
- <!-- #ifndef MP -->
- <checkbox :value="jindex.toString()" :checked="j.show" style="transform:scale(0.9)" />
- <!-- #endif -->
- <!-- #ifdef MP -->
- <checkbox :value="jindex" :checked="j.show" style="transform:scale(0.9)" />
- <!-- #endif -->
- <view>{{j.val}}</view>
- </view>
- </label>
- </checkbox-group>
- </view>
- <!-- text -->
- <view v-if="item.name=='texts' && item.valConfig.tabVal == 0" class="discount">
- <input type="text" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder"
- v-model="item.value" />
- </view>
- <!-- number -->
- <view v-if="item.name=='texts' && item.valConfig.tabVal == 4" class="discount">
- <input type="number" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder"
- v-model="item.value" />
- </view>
- <!-- email -->
- <view v-if="item.name=='texts' && item.valConfig.tabVal == 3" class="discount">
- <input type="text" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder"
- v-model="item.value" />
- </view>
- <!-- data -->
- <view v-if="item.name=='dates'" class="discount">
- <picker mode="date" :value="item.value" @change="bindDateChange($event,index)">
- <view class="acea-row row-between-wrapper text-28rpx">
- <view v-if="item.value == ''" class="text--w111-ccc">{{item.tipConfig.val}}</view>
- <view v-else>{{item.value}}</view>
- <text class='iconfont icon-xiangxia'></text>
- </view>
- </picker>
- </view>
- <!-- dateranges -->
- <view v-if="item.name=='dateranges'" class="discount">
- <uni-datetime-picker v-model="item.value" type="daterange" class="text-28rpx flex" @maskClick="maskClick">
- <view v-if="item.value == ''" class="text--w111-ccc">请选择</view>
- <view v-else>{{item.value.length?item.value[0]+' - '+item.value[1]:item.tipConfig.val}}</view>
- <text class='iconfont icon-xiangxia'></text>
- </uni-datetime-picker>
- </view>
- <!-- time -->
- <view v-if="item.name=='times'" class="discount">
- <picker mode="time" :value="item.value" @change="bindTimeChange($event,index)"
- :placeholder="item.tipConfig.value">
- <view class="acea-row row-between-wrapper text-28rpx">
- <view v-if="item.value == ''" class="text--w111-ccc">{{item.tipConfig.val}}</view>
- <view v-else>{{item.value}}</view>
- <text class='iconfont icon-xiangxia'></text>
- </view>
- </picker>
- </view>
- <!-- timeranges -->
- <view v-if="item.name=='timeranges'" class="discount acea-row row-between-wrapper"
- @click="getTimeranges(index)">
- <view v-if="item.value" class="text-28rpx">{{item.value}}</view>
- <view v-else class="text--w111-ccc text-28rpx">{{item.tipConfig.val}}</view>
- <text class='iconfont icon-xiangxia'></text>
- </view>
- <!-- select -->
- <view v-if="item.name=='selects'" class="discount">
- <picker :value="item.value" :range="item.wordsConfig.list" @change="bindSelectChange($event,index,item)"
- range-key="val">
- <view class="acea-row row-between-wrapper">
- <view v-if="item.value" class="text-28rpx">{{item.value}}</view>
- <view v-else class="text--w111-ccc text-28rpx">请选择</view>
- <text class='iconfont icon-xiangxia'></text>
- </view>
- </picker>
- </view>
- <!-- city -->
- <view v-if="item.name=='citys'" class="discount" @click="changeRegion(index)">
- <view class="acea-row row-middle row-right">
- <view class="city text--w111-ccc" v-if="item.value == ''">{{item.tipConfig.val}}</view>
- <view class="city text-28rpx" v-else>{{item.value}}</view>
- <text class='iconfont icon-xiangxia'></text>
- </view>
- </view>
- <!-- id -->
- <view v-if="item.name=='texts' && item.valConfig.tabVal == 2" class="discount">
- <input type="idcard" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder"
- v-model="item.value" />
- </view>
- <!-- phone -->
- <view v-if="item.name=='texts' && item.valConfig.tabVal == 1" class="discount">
- <input type="number" :placeholder="item.tipConfig.val" class="text-28rpx" placeholder-class="placeholder"
- v-model="item.value" />
- </view>
- <!-- img -->
- <view v-if="item.name=='uploadPicture'" class="confirmImg" style="padding-bottom: 0;">
- <view class='upload acea-row row-middle justify-end'>
- <view class='pictrue' v-for="(items,indexs) in item.value" :key="indexs">
- <image :src='items' mode="aspectFill"></image>
- <view class="close acea-row row-center-wrapper" @tap='DelPic(index,indexs)'>
- <view class="iconfont icon-guanbi1"></view>
- </view>
- </view>
- <view class='pictrue acea-row row-center-wrapper row-column' @tap='uploadpic(item)' style="margin-right: 0"
- v-if="item.value.length < item.numConfig.val">
- <view>上传图片</view>
- </view>
- </view>
- </view>
- </view>
- <!-- 时间选择 -->
- <timerangesFrom :isShow='isShow' :time='timeranges' @confrim="confrim" @cancel="cancels"></timerangesFrom>
- <areaWindow ref="areaWindow" :display="display" :address='addressInfoArea' :cityShow='cityShow'
- @submit="OnChangeAddress" @changeClose="changeAddressClose"></areaWindow>
- </view>
- </template>
- <script>
- import areaWindow from '../areaWindow';
- import timerangesFrom from '../timeranges';
- import uniDatetimePicker from '../uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue';
- import dayjs from "@/plugin/dayjs/dayjs.min.js";
- const CACHE_CITY = {};
- export default {
- props: {
- value: {
- type: Array,
- default: function() {
- return []
- }
- },
- },
- components: {
- areaWindow,
- timerangesFrom,
- uniDatetimePicker
- },
- data() {
- return {
- orderNewForm: [],
- isShow: false,
- timerangesIndex: 0,
- display: false,
- addressInfoArea: [],
- cityShow: 2,
- timeranges: [],
- }
- },
- watch: {
- orderNewForm: {
- handler(newVal) {
- this.$emit('input', newVal);
- },
- deep: true,
- },
- },
- mounted() {
- this.getFromData()
- },
- methods: {
- getFromData() {
- let formData = [...this.value];
- formData.forEach((item, index, arr) => {
- this.$set(item, 'value', "");
- CACHE_CITY[index] = ''; //清空省市区
- if (item.name == 'texts') {
- if (item.defaultValConfig.val) {
- item.value = item.defaultValConfig.val
- } else {
- item.value = ''
- }
- } else if (item.name == 'radios') {
- item.value = item.wordsConfig.list[0].val
- } else if (item.name == 'uploadPicture') {
- item.value = [];
- } else if (item.name == 'dateranges') {
- if (item.valConfig.tabVal == 0) {
- if (item.valConfig.tabData == 0) {
- let obj = dayjs(new Date(Number(new Date().getTime()))).format('YYYY-MM-DD');
- item.value = [obj, obj]
- } else {
- let data1 = dayjs(new Date(Number(new Date(item.valConfig.specifyDate[0])
- .getTime()))).format('YYYY-MM-DD');
- let data2 = dayjs(new Date(Number(new Date(item.valConfig.specifyDate[1])
- .getTime()))).format('YYYY-MM-DD');
- item.value = [data1, data2];
- }
- } else {
- item.value = [];
- }
- } else {
- if (['times', 'dates', 'timeranges'].indexOf(item.name) != -1) {
- if (item.valConfig.tabVal == 0) { //显示默认值
- if (item.valConfig.tabData == 0) {
- if (item.name == 'times') {
- item.value = dayjs(new Date(Number(new Date().getTime()))).format('HH:mm');
- } else if (item.name == 'dates') {
- item.value = dayjs(new Date(Number(new Date().getTime()))).format(
- 'YYYY-MM-DD');
- } else {
- let current = dayjs(new Date(Number(new Date().getTime()))).format(
- 'HH:mm');
- item.value = current + ' - ' + current;
- }
- } else {
- if (item.name == 'times' || item.name == 'dates') {
- item.value = item.valConfig.specifyDate;
- } else {
- item.value = item.valConfig.specifyDate[0] + ' - ' + item.valConfig
- .specifyDate[1];
- }
- }
- } else {
- item.value = '';
- }
- } else {
- item.value = '';
- }
- }
- })
- function sortNumber(a, b) {
- return a.timestamp - b.timestamp;
- }
- formData.sort(sortNumber);
- this.$set(this, 'orderNewForm', formData);
- },
- // 单选
- radioChange(e, index, item) {
- this.orderNewForm[index].value = item.wordsConfig.list[e.detail.value].val
- },
- // 多选
- checkboxChange(e, index, item) {
- let obj = e.detail.value;
- let val = '';
- item.wordsConfig.list.forEach((j, jindex) => {
- obj.forEach(x => {
- if (jindex == x) {
- val = val + (val ? ',' : '') + j.val;
- }
- })
- })
- this.orderNewForm[index].value = val
- },
- //日期
- bindDateChange(e, index) {
- this.orderNewForm[index].value = e.target.value
- this.$forceUpdate()
- },
- //时间
- bindTimeChange(e, index) {
- this.orderNewForm[index].value = e.target.value
- },
- //时间选择
- getTimeranges(index) {
- this.isShow = true
- this.timerangesIndex = index
- },
- //时间选择回调
- confrim(e) {
- this.isShow = false;
- this.orderNewForm[this.timerangesIndex].value = e.time;
- let arrayNew = [];
- e.val.forEach(item => {
- arrayNew.push(Number(item))
- })
- this.timeranges = arrayNew;
- },
- //关闭时间选择弹窗
- cancels() {
- this.isShow = false;
- },
- //sel选择
- bindSelectChange(e, index, item) {
- this.$set(this.orderNewForm[index], 'value', item.wordsConfig.list[e.detail.value].val);
- },
- //城市地址选择
- changeRegion(index) {
- if (!this.orderNewForm[index].value) {
- this.addressInfoArea = [];
- }
- this.timerangesIndex = index;
- this.cityShow = Number(this.orderNewForm[index].valConfig.tabVal) + 1;
- this.display = true;
- if (CACHE_CITY[index]) {
- this.addressInfoArea = CACHE_CITY[index];
- }
- },
- //选择地址回调
- OnChangeAddress(address) {
- // let addr = '';
- let addr = address.map(v => v.regionName).join('/');
- this.orderNewForm[this.timerangesIndex].value = addr;
- CACHE_CITY[this.timerangesIndex] = address;
- },
- // 关闭地址弹窗;
- changeAddressClose() {
- this.display = false;
- },
- /**上传文件*/
- uploadpic(item) {
- let that = this;
- that.$util.uploadImageOne({
- url: 'upload/image',
- name: 'multipart',
- model: "order",
- pid: 0
- }, function(res) {
- let pics = item.value || []
- pics.push(res);
- that.$set(item, 'value', pics);
- });
- },
- //删除图片
- DelPic(index, indexs) {
- let pic = this.orderNewForm[index].value;
- this.orderNewForm[index].value.splice(indexs, 1);
- this.$set(this.orderNewForm[index], 'value', this.orderNewForm[index].value);
- },
- }
- }
- </script>
- <style scoped lang="scss">
- .item {
- font-size: 28rpx;
- color: #282828;
- margin-top: 20rpx;
- }
- .name{
- width: 168rpx;
- }
- .virtual_form {
- .uni-input-wrapper {
- text-align: right;
- }
- .item-require {
- color: red;
- margin-right: 4rpx;
- }
- .item {
- padding: 27rpx 0;
- .pd0 {
- padding-bottom: 0;
- }
- .radio {
- margin: 0 22rpx 0 22rpx;
- padding: 10rpx 0;
- }
- .discount .placeholder {
- color: #ccc;
- text-align: right;
- font-size: 28rpx;
- }
- .discount {
- max-width: 480rpx;
- font-size: 28rpx;
- text-align: right;
- &.discount_voice {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- max-width: 460rpx;
- text-align: right;
- }
- .iconfont {
- color: #515151;
- font-size: 20rpx;
- margin-left: 12rpx;
- }
- .num {
- font-size: 28rpx;
- margin-right: 20rpx;
- }
- }
- }
- }
- </style>
|