<template> <view> <!--导航栏 navbar--> <u-navbar title="委托详情" id="header" :border-bottom="false" :background="{backgroundColor: 'whitesmoke'}"> </u-navbar> <!--主体内容--> <view class="body u-p-30" :style="{ bottom: footerHeight + 'px', top: headerHeight+ 'px'}"> <view class="u-flex u-p-b-20"> <view class="item-status"> {{ this.statusList[this.detail.status] }} </view> <text class="item-status u-flex-1 text-right"> 截止日期: {{this.detail.expirationDate }} </text> </view> <!--所选面料--> <view class="u-p-r-30 u-p-b-30 u-p-l-30 bg-fff u-m-b-20"> <view class="u-l-height-44">所选面料</view> <view > <hs-material-thumbnail :item="item"></hs-material-thumbnail> </view> </view> <!--面料颜色要求--> <view class="bg-fff u-p-r-30 u-p-b-30 u-p-l-30 u-m-b-20"> <view class="u-border-bottom u-l-height-44">面料颜色要求</view> <view class="u-flex u-m-t-18 u-m-b-8"> <view class="u-m-r-40 label">已指定颜色</view> <view class="u-line-1 u-flex-1 content"> {{ activeColorText }} </view> </view> <view class="u-flex u-m-t-18 u-m-b-8"> <view class="u-m-r-40 label">可用颜色数</view> <view class="u-line-1 u-flex-1 content"> {{detail.colourQuantity}}个 </view> </view> </view> <!--风格款数要求--> <view class="bg-fff u-p-r-30 u-p-b-30 u-p-l-30 u-m-b-20"> <view class="u-border-bottom u-l-height-44">风格款数要求</view> <view v-for="(item,index) in brandList" :key="item.id"> <view class="u-flex u-m-t-18 u-m-b-8"> <view class="u-m-r-40 label">风格{{index+1}}</view> <view class="u-line-1 u-flex-1 content"> {{item.name}} </view> </view> <view class="u-flex u-m-t-18 u-m-b-8"> <view class="u-m-r-40 label">风格{{index+1}}款数</view> <view class="u-line-1 u-flex-1 content"> {{item.quantity}}款 </view> </view> </view> </view> <!--其他要求--> <view class="bg-fff u-p-r-30 u-p-b-30 u-p-l-30 "> <view class="u-border-bottom u-l-height-44">其他要求</view> <view class="u-flex u-m-t-18 u-m-b-8"> <view class="u-m-r-40 label">参考品牌</view> <view class="u-line-1 u-flex-1 content"> {{ detail.referToBrand }} </view> </view> <view class="u-flex u-m-t-18 u-m-b-8"> <view class="u-m-r-40 label">其他描述</view> <view class="u-line-1 u-flex-1 content"> {{ detail.otherDescribe }} </view> </view> </view> </view> <!--底部按钮--> <view class="footer" id="footer" v-if="footerShow"> <view class="footer-btn"> <!--待选款 显示选款按钮 状态9 --> <view class="custom-style-round-circle custom-style-btn custom-style" v-if="this.detail.status === 9"> <view class="custom-style-right submit" @click="submitData"> <view class="title">选款</view> <view class="desc">已完成数量:<text class="color">11</text></view> </view> </view> <!--拆单 拆单按钮 状态 1 5 6 --> <view class="custom-style-round-circle custom-style-btn custom-style" v-if="this.detail.status === 1 || this.detail.status === 5 || this.detail.status === 6"> <view class="custom-style-left save" @click="toBack">返回</view> <view class="custom-style-right submit" @click="toSplitItem"> 拆单 </view> </view> <!--待发布 立即按钮 状态 4 --> <view class="custom-style-round-circle custom-style-btn custom-style" v-if="this.detail.status === 4"> <view class="custom-style-left save" @click="toEditItem">编辑</view> <view class="custom-style-right submit" @click="submitData"> 立即发布 </view> </view> </view> </view> <!--提示--> <u-toast ref="uToast" /> </view> </template> <script> import dom from "./mixins/dom" import styleTree from "./mixins/styleTree" import HsTipTitle from "../../components/hs-tip-title/hs-tip-title"; import HsMaterialThumbnail from "../../components/hs-material-thumbnail/hs-material-thumbnail"; export default { name: "index", components: {HsMaterialThumbnail, HsTipTitle}, mixins:[dom,styleTree], data(){ return{ // 1-无人接单、2-延误、3-待定超过、4-待发布、5-审核中、6-待接单、7-已接单、8-已寄样、9-待选款、10-已结束 // 拆单 [无人接单 1、] // 延误 [延误 2] // 选款 [待定超过 3] // 撤回 编辑 [待发布 4] // 取消 拆单 [审核中 5] // 撤回 拆单 [待接单 6] // 寄样 已接单 7 // 没有按钮 已寄样 8 // 选款 待选款 9 // 没有按钮 已结束 10 statusList: ["","无人接单","延误","待定超过","待发布","审核中","待接单","已接单","已寄样","待选款","已结束"], timePickerShow: false, brandSelectShow: false, colorPickerShow: false, modal:{ show: false, content: "确认删除?" }, activeIndex: -1, detail:{ materialId: 1, // todo 主数据面料id fileCode: '', // 面料主图code colourQuantity: 0, //可用颜色数量 designRequirementsDTOList: [ // { // "styleId": 1, //风格要求id // "quantity": 20 //风格要求款数 // } ], status: 1, colourList: [], //选中颜色 expirationDate: "", //截止日期 referToBrand: "", // 参考品牌 otherDescribe: "", //其他描述 }, brandSelectList: [], // 风格 tree colors: [], //颜色组 colorDialog:{ show: false, levels: [0], selectList: [], }, footerHeight: 0, headerHeight: 0, } }, computed:{ item(){ // console.log(this.detail) return{ materialName: this.detail.mdmMaterialName, materialCategory: this.detail.mdmMaterialCategory, materialDoorWidth: this.detail.mdmMaterialClothWidth, materialElement: this.detail.mdmMaterialComponent, } }, footerShow(){ let status = this.detail.status; return status !== 8 || status !== 10 }, // 风格款数 brandList(){ return this.detail.designRequirementsDTOList.filter((item) => { return item.isDeleted === false }) }, // 总的颜色数据源 colorTree(){ function arr2Tree(data, id = "colourGroup") { const newList = [], map = Array.from( new Set( data.map((item) => { return item["colourGroup"]; }) ) ); for (let i = 0; i < data.length; i++) { let item = data[i], name = item[id], index = map.indexOf(name); if (newList[index]) { newList[index]["children"].push(item); } else { newList.push({ colour: name, children: [item] }); } } return newList; }; return arr2Tree(this.colors); }, // 当前页选择颜色显示的内容 activeColorTree(){ let { levels } = this.colorDialog; function filter(data,levels){ let active = []; function f(data,level,index){ let {children} = data[level[index]]; if(index === level.length - 1){ active = children return; }else{ index++; f(children,level,index) } } if(data.length > 0){ f(data,levels,0) } return active; } let data = filter([{children:this.colorTree}] || [],levels); return data.map((item) => { return { ...item, ...{ selectLength: this.setLength(item,this.activeColorIds), selectText: this.setText(item,this.activeColorIds), checked: this.detail.colourList .filter((item) =>{ return item.isDeleted === false }) .map(($item) => { return $item.mdmColourId }) .indexOf(item.mdmColourId) > -1 } } }) }, // 选中的颜色id List activeColorIds(){ return this.detail.colourList .filter((item) =>{ return item.isDeleted === false }) .map((item) =>{ return item.mdmColourId }); }, // 选中的颜色id List activeColorText(){ return this.detail.colourList .filter((item) =>{ return item.isDeleted === false }) .map((item) =>{ return item.colour }) .join("|"); }, // 最小颜色长度 minColorsLength(){ return this.detail.colourList.length }, // 风格款数 总数 total(){ return this.detail.designRequirementsDTOList .filter((item) =>{ return item.isDeleted !== true }) .reduce((total,currentValue) =>{ return total + currentValue.quantity; },0) } }, async onLoad({id}) { // 获取颜色组 this.getColors(); // 获取风格数据 await this.getStyleTreeList(); // 获取详情 if(id){ this.getItemMsg(id); } }, mounted() { this.uGetRect("#footer").then(res =>{ this.footerHeight = res.height; }) this.uGetRect("#header").then(res =>{ this.headerHeight = res.height; }) }, methods:{ filterStyleNameById(id){ /** * 回填品类 显示 string => [] * @param data * @param value * @return [Array] * */ function filterCategory(data,value){ let res = []; function filters(data,value,parent = []){ for (let i = 0; i < data.length; i++) { if(data[i].id == value){ res = [].concat(parent,data[i]) }else{ if(data[i].children && data[i].children.length > 0){ filters( data[i].children, value, parent.concat(data[i]) ) } } } } filters(data,value) return res; } return filterCategory(this.brandSelectList,id).map((item) =>{ return item.name }).join("|") }, getItemMsg(id){ this.detail.id = id; this.$http("orderTicket.detail", id).then(res =>{ let { code, data } = res; if(code === 200){ if(Object.keys(data).length > 0){ this.detail = { designRequirementsDTOList: data.orderTicketStyleRequirementsVOList.map((item) =>{ return { ...item, name: this.filterStyleNameById(item.styleId) } }), colourList: data.orderTicketColourVOList.map((item) =>{ return { ...item, ...{ colour : item.mdmColourName } } }), id: data.id, materialId: data.mdmMaterialId, expirationDate: data.expirationDate, referToBrand: data.referToBrand, otherDescribe: data.otherDescribe, colourQuantity: data.colourQuantity, status: data.status, mdmMaterialName: data.mdmMaterialName, mdmMaterialCategory: data.mdmMaterialCategory, mdmMaterialClothWidth: data.mdmMaterialClothWidth, mdmMaterialComponent: data.mdmMaterialComponent, } }else{ this.$refs.uToast.show({ title: res.msg, callback: ()=>{ this.toBack(); } }); } } }) }, getColors(){ this.$http("colors.getColors").then(res =>{ let { code, data } = res; if(code === 200){ this.colors = data.map((item) =>{ let res = { ...item, mdmColourId: item.id }; delete res.id; return res; }); } }) }, // !---- // 返回 toBack(){ this.$Router.back(); }, // 取消发布 cancel(){ this.$http('orderTicket.abolishByIds', [this.detail.id]).then(res => { let { code, data } = res; if (code === 200) { this.$refs.uToast.show({ title: '取消成功' }); this.toBack(); } }); }, // 删除 toDel(){ this.$http('orderTicket.del', [this.detail.id]).then(res => { let { code, data } = res; if (code === 200) { this.$refs.uToast.show({ title: '删除成功' }); this.toBack(); } }); }, // 跳转到拆单 toSplitItem(){ this.$Router.push({ path: '/pages/designCommissioned/splitItem', query: { id: this.detail.id } }) }, // 跳转到详情 编辑 toEditItem(){ this.$Router.push({ path: '/pages/designCommissioned/addItem', query: { id: this.detail.id } }) }, // 跳转到选款 toSelectItem(){ }, // ----! setLength(item,target){ if(item.children){ return item.children.filter($item =>{ return target.indexOf($item.mdmColourId) > -1 }).length }else{ return 0 } }, setText(item,target){ if(item.children){ return item.children.filter($item =>{ return target.indexOf($item.mdmColourId) > -1 }).map(($item) =>{ return $item.colour }).join(" | ") }else{ return "" } }, colorsReset(){ this.detail.colourList = [] }, colorsConfirm(){ if(this.colorDialog.levels.length > 1){ this.colorDialogLevelPop() }else{ this.colorDialog.show = false; } }, // 层级选择 treeClick(treeItem,index) { if(this.colorDialog.levels.length > 1){ let $list = this.detail.colourList; let $index = $list.findIndex(($item) => { return $item.mdmColourId === treeItem.mdmColourId }); if($index > -1){ let item = $list[$index]; if(item.id){ this.$set($list,$index,{ ...item, isDeleted: !item.isDeleted, }) }else{ $list.splice($index,1) } }else{ this.detail.colourList.push({ ...treeItem, isDeleted: false }) } this.detail.colourQuantity = this.detail.colourList.length }else{ this.colorDialog.levels.push(index); } }, colorDialogLevelPop(){ this.colorDialog.levels.pop(); }, addBrandList(){ this.brandSelectShow = true; }, // 风格款数新增 brandSelectCallback(e){ this.detail.designRequirementsDTOList.push({ quantity: 0, styleId: e[e.length - 1].value, isDeleted: false, name: e.map((item) => { return item.label }).join("|") }) }, // 显示删除模态框 showDelModal(item){ this.modal.show = true; this.activeIndex = item; }, // 显示删除模态框 modalConfirm(){ this.delBrandRow(); }, delBrandRow() { let { id } = this.activeIndex; if(id){ let $data = this.detail.designRequirementsDTOList; let index = $data.findIndex((item) => { return item === this.activeIndex }); this.$set($data,index,{ ...$data[index], isDeleted: true }) }else{ let index = this.brandList.findIndex((item) => { return item === this.activeIndex }) if(index > -1){ this.detail.designRequirementsDTOList.splice(index,1) } } }, timePickerCallback(e){ let { day, month, year, } = e; this.detail.expirationDate = [year,month,day].join("-") }, submit(data){ let submitStatus = this.detail.id ? "orderTicket.update":"orderTicket.save" this.$http(submitStatus,{ ...data, ...this.detail }).then(res => { }) }, saveData(){ this.submit({ operationType: 1 }) }, submitData(){ this.submit({ operationType: 2 }) } } } </script> <style scoped lang="scss"> @mixin vue-flex($direction: row) { /* #ifndef APP-NVUE */ display: flex; flex-direction: $direction; /* #endif */ } .label{ color: rgba(0,0,0,0.40); font-size: 28rpx; min-width: 140rpx; } .context{ color: #000; font-size: 28rpx; } .u-l-height-32{ height: 64rpx; line-height: 64rpx; } .u-l-height-44{ height: 88rpx; line-height: 88rpx; } .u-m-l-75{ margin-left: 150rpx;} .u-m-l-53{ margin-left: 108rpx;} .del{ color: #FA5353; } .bg-fff{ background: #fff; } .body{ background: #fafafa; position: absolute; width: 100%; height: auto; left: 0; right: 0; bottom: 0; top: 0; overflow-y: auto; } .tree { @include vue-flex; flex-wrap: wrap; .tree-level { @include vue-flex; width: 100%; font-size: 32rpx; .active-text{ color: #DDA973; } .tree-level-text { flex: 1; overflow: hidden; .tree-level-text--selected { font-size: 28rpx; color: red; } } } } .brandList-tip{ height: 88rpx; background: #fcfaf7; border: 1px solid rgba(68,53,37,0.10); border-radius: 8rpx; line-height: 88rpx; padding-left: 30rpx; } .custom-style{ color: #fff; height: 88rpx; line-height: 88rpx; @include vue-flex; &-btn{ overflow: hidden; } &-round-circle{ border-radius: 100rpx; } /*background: #000;*/ .custom-style-left{ width: 240rpx; background: #d6d6d6; text-align: center } .custom-style-right{ flex: 1; background: rgba(0,0,0,0.80);text-align: center} .save{ font-size: 34rpx; color: #000000; } .submit{ font-weight: 500; font-size: 34rpx; //line-height: 100%; .title{ //margin: 8rpx 0; } .desc{ font-size: 20rpx; .color{ color: #DDA973; } } } } .footer { position: fixed; width: 100%; bottom: 0; z-index: 998; background: #fff; box-shadow: 0px -4rpx 6rpx 0px rgba(178,182,214,0.10); padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom); .footer-btn{ padding: 20rpx 60rpx; } } </style>