minipro_standard/common/css/lib.css
@@ -118,8 +118,9 @@ .rp { position: relative; } .ap { position: absolute; } .orange{ color: #EA531B !important;} .green{ color: #65C35D !important;} .orange{ color: #EA531B !important;} .yellow{ color: #F5A400 !important;}.bg_yellow{background-color: #F5A400} .green{ color: #00BF97 !important;}.bg_green{background-color: #00BF97} .blue{ color: #3C77DA !important;} .red{ color: #f00 !important;} .white{ color: #fff !important;} @@ -128,7 +129,7 @@ .wc{color:#F98107 !important;} .cm {color: #305ED5} .c1{color: #111}.c2{color: #222}.c3{ color: #333;}.c6{ color: #666;}.cc{ color: #ccc;}.cf{ color: #fff;} .c1{color: #111!important;}.c2{color: #222!important;}.c3{ color: #333!important;}.c6{ color: #666!important;}.cc{ color: #ccc!important;}.cf{ color: #fff!important;} /* /deep/ .uicon-close .u-icon--right{ position: absolute; right: 30rpx; top: 30rpx; z-index: 999;} */ .popCloseBtn{ position: absolute; width:50rpx; height:50rpx; right: 20rpx; top: 20rpx;} .fixedTL{ position: absolute; left: 0; top: 0;} minipro_standard/components/InOutInfo.vue
@@ -1,7 +1,7 @@ <template> <view class="p30 bg_w f26 info-style"> <view v-if="isOut" class="cm b f32">计划出库日期:{{ info.outPlandate }}</view> <view v-else class="cm b f32">计划入库日期:{{ info.inPlandate || info.planDate }}</view> <view v-if="isOut" class="cm b f32">计划出库日期:{{ info.outPlandate||'' }}</view> <view v-else class="cm b f32">计划入库日期:{{ info.inPlandate || info.planDate || '' }}</view> <view class="c2 mt25"> <text class="c6">来源类型:</text> {{ typeTstr(info.originType) }} minipro_standard/components/Search.vue
@@ -1,4 +1,5 @@ <template> <view class="search"> <view class="search_box"> <view class="search_input"> @@ -10,7 +11,7 @@ <image @click="openCate()" src="@/static/filter@2x.png" mode="widthFix"> </view> </view> <u-popup closeOnClickOverlay :show="open" @close="open=false" :round="10" mode="bottom"> <u-popup closeOnClickOverlay :show="open" @close="close" :round="10" mode="bottom"> <scroll-view scroll-y class="content"> <slot name="content"></slot> </scroll-view> @@ -42,7 +43,12 @@ }, // 打开弹窗 openCate() { this.$emit('scrollerBan', true) this.open = true }, close() { this.open = false this.$emit('scrollerBan', false) }, // 重置 closes() { @@ -83,7 +89,7 @@ justify-content: space-between; padding-left: 40rpx; padding-right: 40rpx; padding-bottom: env(safe-area-inset-bottom); padding-bottom: calc(env(safe-area-inset-bottom) + 20rpx); box-sizing: border-box; position: fixed; bottom: 0; minipro_standard/components/myTabber.vue
@@ -2,6 +2,7 @@ <view> <u-tabbar :value="index" :customStyle="{paddingTop: '5px',paddingBottom: '5px',}" @change="change" fixed activeColor="#222" @@ -31,6 +32,7 @@ <image src="@/static/nav_wode@2x.png" class="icon-style" mode=""></image> </view> </u-tabbar-item> </u-tabbar> </view> </template> minipro_standard/components/workOrderInfo.vue
@@ -2,84 +2,123 @@ <view class="p30 bg_w order-info"> <view class="bX"> <view class="cY"> <view class="mr10 b">{{ `${orederMessage.mmodel.name} |${orederMessage.procedureName}`}}</view> <u-tag size="mini" bgColor="#03AF76" text="正常"></u-tag> <view class="mr10 b">{{ `${orederMessage.mmodel.name || ''} | ${orederMessage.procedureName || ''}`}} </view> <!-- <u-tag size="mini" bgColor="#03AF76" text="正常"></u-tag> --> <div class="type bg_green" v-if="orederMessage.type === 0">正常</div> <div class="type bg_yellow" v-if="orederMessage.type === 2">返工返修</div> </view> <view class="status" :class="orederMessage.status==0?'wc':orederMessage.status==1?'green':orederMessage.status==3?'blue':orederMessage.status==7?'green':'c6'">{{ stausToStr(orederMessage.status) }}</view> </view> <view class="f24 c6 mt20">工单编号:{{ orederMessage.code || '-' }}</view> <view class="f24 mt20 bg_f7 ptb20 plr30 n"> <view class="c2 mb20"> <span class="c6">物料编码:</span> {{ orederMessage.mmodel ? orederMessage.mmodel.code : '-' }} </view> <view class="c2 mb20"> <span class="c6">计划开工:</span> {{ orederMessage.planDate || '-' }} </view> <view class="c2 mb20"> <span class="c6">生产批次:</span> {{ orederMessage.batch || '-' }} </view> <view class="c2 mb20"> <span class="c6">计划数量:</span> {{ orederMessage.planNum || '-' }}{{ orederMessage.umodel ? orederMessage.umodel.name : '-' }} </view> <view class="c2 mb20"> <span class="c6">生产设备:</span> {{ orederMessage.pgmodel ? `${orederMessage.pgmodel.code} - ${orederMessage.pgmodel.name}` : '-' }} </view> <view class="c2 flex"> <view class="c6" style="flex-shrink: 0;">生产人员:</view> <view class="flex1"> {{ orederMessage.proUserList ? orederMessage.proUserList.map(item => item.proUserDepartName).join(' / ') : '-' }} </view> </view> <view class="status" :class="orederMessage.status==0?'wc':orederMessage.status==1?'green':orederMessage.status==3?'blue':orederMessage.status==7?'green':'c6'"> {{ stausToStr(orederMessage.status) }}</view> </view> <view class="f24 c6 mt20">工单编号:{{ orederMessage.code || '-' }}</view> <view class="f24 mt20 bg_f7 ptb20 plr30 n"> <view class="c2 mb20"> <span class="c6">物料编码:</span> {{ orederMessage.mmodel ? orederMessage.mmodel.code : '-' }} </view> <view class="c2 mb20"> <span class="c6">计划开工:</span> {{ orederMessage.planDate || '-' }} </view> <view class="c2 mb20"> <span class="c6">生产批次:</span> {{ orederMessage.batch || '-' }} </view> <view class="c2 mb20"> <span class="c6">计划数量:</span> {{ orederMessage.planNum || '-' }}{{ orederMessage.umodel ? orederMessage.umodel.name : '-' }} </view> <view class="c2 mb20"> <span class="c6">生产设备:</span> {{ orederMessage.pgmodel ? `${orederMessage.pgmodel.code} - ${orederMessage.pgmodel.name}` : '-' }} </view> <view class="c2 flex"> <view class="c6" style="flex-shrink: 0;">生产人员:</view> <view class="flex1"> {{ orederMessage.proUserList ? orederMessage.proUserList.map(item => item.proUserDepartName).join(' / ') : '-' }} </view> </view> </view> </view> </template> <script> export default { name: "workOrderInfo", props: { orederMessage: { type: Object, default: () => {} } name: "workOrderInfo", props: { orederMessage: { type: Object, default: () => {} } }, data() { return { status: [ { status: 0, label: '已创建' }, { status: 1, label: '已备料' }, { status: 2, label: '已完工检' }, { status: 3, label: '已检验' }, { status: 4, label: '已报工' }, { status: 5, label: '已入库' }, { status: 6, label: '已取消' }, { status: 7, label: '进行中' } status: [{ status: 0, label: '已创建' }, { status: 1, label: '已备料' }, { status: 2, label: '已完工检' }, { status: 3, label: '已检验' }, { status: 4, label: '已报工' }, { status: 5, label: '已入库' }, { status: 6, label: '已取消' }, { status: 7, label: '生产中' } ] }; }, methods: { stausToStr(status) { let temp = this.status.find(item => item.status == status) return temp ? temp.label : '-' } }, methods: { stausToStr(status) { let temp = this.status.find(item => item.status == status) return temp ? temp.label : '-' } } } </script> <style lang="scss"> .status { height: 26rpx; font-size: 26rpx; font-weight: 400; color: #666666; line-height: 26rpx; } // .order-info { // border-bottom: 20rpx #f7f7f7 solid; // } <style lang="scss" scoped> .status { height: 26rpx; font-size: 26rpx; font-weight: 400; color: #666666; line-height: 26rpx; } .type { padding: 0 8rpx; color: white; margin-left: 10rpx; height: 38rpx; line-height: 38rpx; font-size: 22rpx; border: 8rpx; } // .order-info { // border-bottom: 20rpx #f7f7f7 solid; // } </style> minipro_standard/pages/allocation/allocation.vue
@@ -60,7 +60,9 @@ <button class="fp_footer_submit" @click="submit">确认</button> </view> <!-- 选择日期 --> <u-calendar :show="timeShow" @close="timeShow = false" @confirm="timeConfirm"></u-calendar> <!-- <u-calendar :show="timeShow" @close="timeShow = false" @confirm="timeConfirm"></u-calendar> --> <l-calendar :lunar="false" v-model="timeShow" @change="timeConfirm" :isRange="true" activeBgColor="#305ED5" rangeColor="#305ED5" rangeBgColor="rgba(48, 80, 213, 0.1)"></l-calendar> <!-- 选择设备 --> <u-picker :show="show1" :columns="equipment" @confirm="confirm" @cancel="show1 = false" keyName="text"></u-picker> </view> @@ -105,22 +107,12 @@ this.form.equipmentId = val.value[0].id this.form.equipmentName = val.value[0].text this.personnelData = [] getFindAll({ deviceId: this.form.equipmentId }).then(res => { if (res.code === 200 && res.data && res.data.length !== 0) { this.form.personnelId = [] let arr = [] res.data.forEach((item) => { arr.push({ text: item.dmodel.name + '-' + item.umodel.name, id: item.userId }) }) this.personnelData = arr } this.show1 = false }) this.getUser() }, timeConfirm(val) { this.form.startTime = val[0] // this.form.startTime = val[0] this.listData.startDate = val.startDate this.listData.endDate = val.endDate this.timeShow = false }, // 提交分配 @@ -153,9 +145,27 @@ res.data.forEach((element) => { arr.push({ text: element.code + '-' + element.name, id: element.id, checked: false }) }) this.form.equipmentId = arr[0].id this.form.equipmentName = arr[0].text this.getUser() this.equipment.push(arr) } }) }, getUser() { getFindAll({ deviceId: this.form.equipmentId }).then(res => { if (res.code === 200 && res.data && res.data.length !== 0) { this.form.personnelId = [] let arr = [] res.data.forEach((item) => { arr.push({ text: item.dmodel.name + '-' + item.umodel.name, id: item.userId }) }) this.personnelData = arr } this.show1 = false }) } } } minipro_standard/pages/index/index.vue
@@ -1,5 +1,8 @@ <template> <view class="index"> <template> <page-meta :page-style="ban ?'overflow: hidden;': ''"/> <view class="index" > <!-- :class="ban?'scroll-ban': ''" --> <!-- <view class="mask" @tap="tapMask" @touchmove="moveHandle"></view> --> <!-- <web-view v-if="show" @onPostMessage="onMessage" :src="'https://dmtest.ahapp.net/doumeeplant_h5/#/appletLogin?code=' + code"></web-view> --> <!-- {{$store.state.statusbarHeight}} --> @@ -10,7 +13,7 @@ 待办</view> <div class="content_search"> <v-Search @searchInput="searchInput" @submit="confirm" @reset="resetType" :isShow="true" placeholder="搜索关键字"> placeholder="搜索关键字" @scrollerBan="$event => ban=$event"> <template v-slot:content> <view class="rp contanir"> <view class="c2 b">类型</view> @@ -35,7 +38,7 @@ </view> </u-sticky> <scroll-view :style="{height: height}" v-if="projectList.length" scroll-y refresher-enabled="true" :refresher-triggered="triggered" @scrolltolower="loadMore" <scroll-view :style="{height: height}" v-if="projectList.length" scroll-y refresher-enabled="true" :refresher-triggered="triggered" @scrolltolower="loadMore" @refresherrefresh="refresh" > <view v-for="(item, index) in projectList" :key="index"> @@ -58,7 +61,7 @@ </view> </scroll-view> <view v-else class="tc c6">暂无数据...</view> <u-popup :show="show" @close="close" :round="8" zIndex="20000"> <!-- <u-popup :show="show" @close="close" :round="8" zIndex="20000"> <view class="rp p40 contanir"> <view class="c2 b">类型</view> <view class="content"> @@ -73,7 +76,7 @@ <view class="fx1 ptb20 sbtn_gray c9" @click="resetType">重置</view> <view class="fx1 ml20 ptb20 sbtn_green" @click="confirm">确定</view> </view> </view> </view> --> </u-popup> <myTabbar :index="0" /> </view> @@ -98,6 +101,7 @@ }, data() { return { ban: false, height: '', top: '', code: '', @@ -183,7 +187,7 @@ .in(this) .select('.content_search') .boundingClientRect((rect) => { that.height = `calc(100vh - ${rect.height + 80}px)` that.height = `calc(100vh - ${rect.height + 150}px)` that.top = `${rect.height}px` }) .exec() @@ -211,6 +215,10 @@ .then(res => { this.tagList[0].num = res.data.startNum this.tagList[1].num = res.data.endNum this.$store.commit('SETNUM', { d: res.data.startNum, y: res.data.endNum }) }) .catch(err => {}) }, @@ -409,13 +417,15 @@ }, resetType() { this.type = '' this.searchForm.type = '' this.searchForm.type = '' this.ban =false this.confirm() }, confirm() { this.searchForm.type = this.type this.show = false this.ban =false this.search() }, search() { @@ -557,5 +567,15 @@ } .content_search_x { height: 24rpx; } .mask { z-index: 8000; position: fixed; left: 0; top: 0; right: 0; bottom: 0; height: 100vh; background-color: rgba(0, 0, 0, 0.5); } </style> minipro_standard/pages/login/login.vue
@@ -7,7 +7,8 @@ </view> <view class="bg_w rd8 ptb30 pl40 bbox com-input flex input-height"> <image src="@/static/login_ic_code@2x.png" mode="" class="img40 mr25"></image> <input placeholder="企业代码" border="none" v-model="form.companyId"/> <!-- <input placeholder="企业代码" border="none" v-model="form.companyId"/> --> <u--input placeholder="企业代码" border="none" v-model="form.companyId"></u--input> </view> <view class="bg_w rd8 ptb30 pl40 bbox mt40 flex input-height"> <image src="@/static/login_ic_phone@2x.png" mode="" class="img40 mr25"></image> minipro_standard/pages/selectWorkOrder/selectWorkOrder.vue
@@ -39,10 +39,11 @@ <span class="purple" v-if="item.status === 3">已检验</span> <span v-if="item.status === 4">已报工</span> <span v-if="item.status === 5">已入库</span> <span v-if="item.status === 6">已取消</span> <span v-if="item.status === 6">已取消</span> <span v-if="item.status === 7">生产中</span> </div> </div> <span>工单编码: {{item.code}}</span> <span class="f24">工单编码: {{item.code}}</span> <div class="content_list_item_content"> <div class="content_list_item_content_item"> <div class="content_list_item_content_item_label">物料编码:</div> @@ -379,7 +380,7 @@ width: 80%; span { font-size: 32rpx; font-size: 24rpx; font-weight: 500; color: #333333; overflow: hidden; minipro_standard/pages_adjust/pages/OrderDetail/OrderDetail.vue
@@ -1,7 +1,11 @@ <template> <view> <workOrderInfo :orederMessage="info" /> <div class="bg_list"> <view class="content"> <workOrderInfo :orederMessage="info" /> <view class="bg_cate"> <view @click="clickIten(index)" :class="typeView == index ? 'bg_cate_item active' : 'bg_cate_item'" v-for="(item, index) in cate" :key="index">{{ item.name }}</view> </view> <div v-if="typeView==0" class="bg_list"> <div class="bg_list_item"> <div class="bg_list_item_top"> <div class="bg_list_item_top_left"> @@ -11,9 +15,9 @@ </div> <template v-if="feedingData && feedingData.length > 0"> <view> <view v-for="(item, index) in feedingData" :key="index"> <div class="bg_list_item_h"> <view class="plr30"> <view > <div v-for="(item, index) in feedingData" :key="index" class="bg_list_item_h"> <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <div class="bg_list_item_num_item_wl"> @@ -30,7 +34,7 @@ <div class="bg_list_item_num_item_sr"> <view class="cY"> <view class="mr10">{{ item.num }}</view> <span v-if="info.umodel">{{ info.umodel.name }}</span> <span>{{ item.unitName }}</span> </view> </div> @@ -59,7 +63,7 @@ </div> </div> <div class="bg_list_item_h"> <div class="bg_list_item_num"> <div class="bg_list_item_num plr30"> <div class="bg_list_item_num_item"> <span>良品数{{ info.umodel ? `(${info.umodel.name})` : '' }}</span> <div class="bg_list_item_num_item_sr"> @@ -70,7 +74,7 @@ </div> </div> <div class="bg_list_item_h"> <div class="bg_list_item_num"> <div class="bg_list_item_num plr30"> <div class="bg_list_item_num_item"> <span>不良数{{ info.umodel ? `(${info.umodel.name})` : '' }}</span> <div class="bg_list_item_num_item_sr"> @@ -85,21 +89,72 @@ <div class="bg_list_item_top"> <div class="bg_list_item_top_left"> <div class="bg_list_item_top_left_x bg_m"></div> <span>生产点检</span> <span>工资绩效</span> </div> </div> <div class="bg_list_item_h mb40 "> <div class="bg_list_item_num plr30" style="display: block;"> <div class="bX ptb15"> <div class="f30 c2">预计工资</div> <div class="f28" style="color:#4275FC">{{ (performance.salary / 10 / 10).toFixed(2) }}元</div> </div> <div class="f24 c6"> {{ performance.salaryType == 0 ? '计件' : '计时' }} | {{ (performance.salaryPrice / 10 / 10).toFixed(2) }}元/{{ performance.salaryType == 0 ? '件' : '时' }} | {{ complianceRate }}% </div> </div> <!-- <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <span>计件方式</span> <div class="bg_list_item_num_item_list"> {{ performance.salaryType == 0 ? '计件' : '计时' }} </div> </div> </div> --> <!-- <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <span>工资单价</span> <div class="bg_list_item_num_item_sr"> <span class="color1">{{ (performance.salaryPrice / 10 / 10).toFixed(2) }}元/{{ performance.salaryType == 0 ? '件' : '时' }}</span> </div> </div> </div> <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <span>达标率</span> <div class="bg_list_item_num_item_sr"> <span class="color1">{{ complianceRate }}%</span> </div> </div> </div> --> </div> </div> </div> <div v-else class="bg_list"> <!-- <div class="bg_list_item"> <div class="bg_list_item_top"> <div class="bg_list_item_top_left"> <div class="bg_list_item_top_left_x bg_m"></div> <span>生产点检</span> </div> </div> --> <template v-if="djData && djData.length > 0"> <div class="details_dj"> <div class="details_dj_list"> <scroll-view scroll-y="true" refresher-enabled="true" @scrolltolower="getLists"> <view v-for="(item, index) in djData" :key="index"> <div class="details_dj_list_item"> <span>{{ item.attrName }}:{{ item.val }}</span> <span>{{ item.userName }} {{ item.createTime }}</span> </div> </view> </scroll-view> <view v-for="(item, index) in djData" :key="index"> <div class="details_dj_list_item"> <span>{{ item.attrName }}:{{ item.val }}</span> <span>{{ item.userName }} {{ item.createTime }}</span> </div> </view> <!-- <scroll-view scroll-y="true" refresher-enabled="true" @scrolltolower="getLists"> </scroll-view> --> </div> </div> </template> @@ -109,50 +164,7 @@ </div> </template> </div> <div class="bg_list_item"> <div class="bg_list_item_top"> <div class="bg_list_item_top_left"> <div class="bg_list_item_top_left_x bg_m"></div> <span>工资绩效</span> </div> </div> <div class="bg_list_item_h"> <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <span>计件方式</span> <div class="bg_list_item_num_item_list"> {{ performance.salaryType == 0 ? '计件' : '计时' }} </div> </div> </div> <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <span>工资单价</span> <div class="bg_list_item_num_item_sr"> <span class="color1">{{ (performance.salaryPrice / 10 / 10).toFixed(2) }}元/{{ performance.salaryType == 0 ? '件' : '时' }}</span> </div> </div> </div> <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <span>预计工资</span> <div class="bg_list_item_num_item_sr"> <span class="color1">{{ (performance.salary / 10 / 10).toFixed(2) }}元</span> </div> </div> </div> <div class="bg_list_item_num"> <div class="bg_list_item_num_item"> <span>达标率</span> <div class="bg_list_item_num_item_sr"> <span class="color1">{{ complianceRate }}%</span> </div> </div> </div> </div> </div> </div> </div> </view> </template> @@ -189,7 +201,14 @@ workOrderInfo }, data() { return { return { cate: [{ name: '生产' }, { name: '点检' } ], workorderId: '', form: { time: '', @@ -248,19 +267,22 @@ complianceRate() { if (!this.performance) return 0; if (!this.performance.duration) return 0; if (!this.performance.salaryNum || this.performance.salaryTimes) return 0 if (!this.performance.qualifiedNum && !this.performance.unqualifiedNum) return 0; if (this.performance.salaryUnqualified == 1) { // 是否计入不良品 let a = ((Number(this.performance.qualifiedNum) + Number(this.performance.unqualifiedNum)) / (this.performance .duration / 3600)).toFixed(2) let b = (this.performance.salaryNum / (this.performance.salaryTimes / 3600)).toFixed(2) let b = (this.performance.salaryNum / (this.performance.salaryTimes / 3600)).toFixed(2) debugger return ((Number(a) / Number(b)) * 100).toFixed(2) // let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / ) // return total * infoBox.value.salary; } else { let a = (this.performance.qualifiedNum / (this.performance.duration / 3600)).toFixed(2) // let b = (this.arrType[this.form.index].num / (this.arrType[this.form.index].times / 3600)).toFixed(2) let b = (this.performance.salaryNum / (this.performance.salaryTimes / 3600)).toFixed(2) let b = (this.performance.salaryNum / (this.performance.salaryTimes / 3600)).toFixed(2) debugger return ((Number(a) / Number(b)) * 100).toFixed(2) } } @@ -484,8 +506,7 @@ getWorkorderRecordListStandard({ workorderId: this.workorderId }).then(res => { console.log(res.data[0]); debugger // console.log(res.data[0]); if (res.data.length > 0) { this.produceFrom.qualified = res.data[0].qualifiedNum this.produceFrom.undesirable = res.data[0].unqualifiedNum @@ -503,14 +524,18 @@ } </script> <style lang="scss" scoped> <style lang="scss" scoped> .content { height: 100vh; background-color: #f7f7f7; } .bg_cate { width: 100%; height: 88rpx; background: #FFFFFF; display: flex; align-items: center; border-top: 20rpx solid #f7f7f7; .active { box-sizing: border-box; color: #305ED5 !important; @@ -542,16 +567,7 @@ // margin-bottom: 40rpx; // border-bottom: 40rpx #f7f7f7 solid; .kong { text-align: center; padding: 30rpx 0; background: #ffffff; font-size: 25rpx; span { color: #474747; } } .bg_list_item_top { display: flex; @@ -621,23 +637,21 @@ .bg_list_item_h { width: 100%; padding: 0 30rpx; box-sizing: border-box; background: white; border-bottom: 1rpx solid #E5E5E5; padding: 15rpx 0; &:last-child { border: none !important; } .bg_list_item_num { width: 100%; min-height: 98rpx; background: white; background: white; box-sizing: border-box; display: flex; justify-content: center; align-items: center; border-bottom: 1rpx solid #E5E5E5; &:last-child { border: none !important; } .kong { text-align: center; font-size: 25rpx; @@ -651,10 +665,10 @@ display: flex; align-items: center; // height: 118rpx; padding: 15rpx 0; // padding: 15rpx 0; box-sizing: border-box; justify-content: space-between; border-bottom: 1rpx solid #E5E5E5; // border-bottom: 3rpx solid #111; &:last-child { border: none; @@ -1054,5 +1068,15 @@ } } } } .kong { text-align: center; padding: 30rpx 0; // background: #ffffff; font-size: 25rpx; span { color: #474747; } } </style> minipro_standard/pages_adjust/pages/manualFeed/manualFeed.vue
@@ -41,7 +41,7 @@ <div class="tl_list_item"> <div class="tl_list_item_label">投料数量{{ item.unitAttribute }}</div> <div class="tl_list_item_go"> <input type="text" @blur="changeNumber(item.num, index, item.unitAttribute)" <input type="text" @blur="changeNumber(item.num, index, item.unitAttribute)" v-model="item.num" /> </div> </div> @@ -153,26 +153,21 @@ unitAttribute: '' }) }, changeNumber(num, index, unitAttribute) { changeNumber(num, index, unitAttribute) { if (unitAttribute === 0 && num !== '') { if (!positiveInteger.test(num)) { uni.$u.toast({ message: '只能输入正整数' }) uni.$u.toast('只能输入正整数') this.materialList[index].num = '' } } else if (unitAttribute === 1 && num !== '') { if (!number.test(num)) { uni.$u.toast({ message: '只能输入正整数或小数(最多四位)' }) uni.$u.toast('只能输入正整数或小数(最多四位)') this.materialList[index].num = '' } } if (num <= 0) { uni.$u.toast({ message: '投料数量不能小于等于0' }) uni.$u.toast('投料数量不能小于等于0') this.materialList[index].num = '' } }, minipro_standard/pages_adjust/pages/newTransfer/newTransfer.vue
@@ -33,10 +33,10 @@ <image class="shanchu" src="@/static/chuku_ic_delete@2x.png" mode="widthFix" @click="dele(i)"></image> <text>{{item.materialName}}|{{item.materialCode}}</text> <text> <text class="green" v-if="item.qualityType === '0'">合格 |</text> <text class="yellow" v-if="item.qualityType === '1'">不良 |</text> <text class="red" v-if="item.qualityType === '2'">报废 |</text> <text>{{item.procedureName ? item.procedureName : '-'}} | </text> <text class="green" v-if="item.qualityType === '0'" decode>合格<text class="c6" decode>{{ division }}</text></text> <text class="yellow" v-if="item.qualityType === '1'" decode>不良<text class="c6" decode>{{ division }}</text></text> <text class="red" v-if="item.qualityType === '2'" decode>报废<text class="c6" decode>{{ division }}</text></text> <text decode>{{item.procedureName ? item.procedureName : '-'}}{{division}}</text> <text>{{item.batch ? item.batch : '-'}}</text> </text> <view class="zk_wl_item_num"> @@ -87,6 +87,7 @@ }, data() { return { division: ' / ', data: { type: '', outUserId: '', @@ -211,6 +212,7 @@ }).then(res => { if (res.code === 200) { uni.showToast({ title: '创建成功!', icon: 'success', duration: 2000 }); this.$store.dispatch('getUpcomingNum') setTimeout(() => { uni.navigateBack({ delta: 1 }); }, 2000) @@ -272,7 +274,7 @@ } text { font-size: 30rpx; font-size: 24rpx; font-weight: 400; color: #222222; } @@ -384,7 +386,7 @@ text { &:nth-child(1) { font-size: 30rpx; font-size: 24rpx; font-weight: 500; color: #222222; margin-bottom: 24rpx; minipro_standard/pages_adjust/pages/reportingForWork/reportingForWork.vue
@@ -15,202 +15,205 @@ <image src="@/static/ic_ar@2x.png" alt="" /> </view> </view> <view class="bg_list"> <view class="bg_list_item"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>生产信息</text> </view> </view> <view class="bg_list_item_h"> <view class="bg_list_item_num" @click="openDev"> <view class="bg_list_item_num_item"> <text>生产设备</text> <view class="bg_list_item_num_item_sr"> <text :style="{color: from.deviceName ? '#333' : ''}">{{from.deviceName ? from.deviceName : '请选择'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> <template v-if="plansId"> <view class="bg_list"> <view class="bg_list_item"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>生产信息</text> </view> </view> <view class="bg_list_item_num" @click="userShow = true"> <view class="bg_list_item_num_item"> <text>生产人员</text> <view class="bg_list_item_num_item_sr"> <text :style="{color: from.userName ? '#333' : ''}">{{from.userName ? from.userName : '请选择'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> </view> </view> </view> </view> <view class="bg_list_item"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>生产投料</text> </view> <view class="bg_list_item_top_right" @click="openMaterial" v-if="(hasBom == 1 && bomType != 1) || hasBom == 0"> <image src="@/static/gongdan_ic_shoudong@2x.png" alt="" /> <text>新增投料</text> </view> </view> <template v-if="wuList.length > 0 && !(hasBom == 1 && bomType == 1)"> <van-swipe-cell v-for="(item, index) in wuList" :key="index"> <view class="bg_list_item_h"> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <view class="bg_list_item_num_item_wl"> <text>{{ item.materialName }}{{ item.procedureName ? ` | ${item.procedureName}` : '' }}</text> <view class="bg_list_item_num_item_wl_lx"> <text class="green" v-if="item.qualityType == 0">合格 / </text> <text class="yellow" v-if="item.qualityType == 1">不良 / </text> <text class="red" v-if="item.qualityType == 2">报废 / </text> <text>{{ item.locationName || '-' }} / </text> <text>{{ item.batch || '-' }}</text> </view> </view> <view class="bg_list_item_num_item_sr"> <u--input placeholder="请输入" border="surround" type="number" :customStyle="{width: '100%'}" v-model="item.num" @input="inputwl(index)" ></u--input> <!-- <input type="number" v-model="item.num" @input="inputwl(index)" /> --> <text>{{ item.unitName }}</text> </view> <view class="bg_list_item_h"> <view class="bg_list_item_num" @click="openDev"> <view class="bg_list_item_num_item"> <text>生产设备</text> <view class="bg_list_item_num_item_sr"> <text :style="{color: from.deviceName ? '#333' : ''}">{{from.deviceName ? from.deviceName : '请选择'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> </view> </view> <template #right> <van-button style="height: 100%;" @click="deleItem(index)" square text="删除" type="danger" /> </template> </van-swipe-cell> </template> <template v-else-if="wuList.length == 0 && !(hasBom == 1 && bomType == 1)"> <view class="kong"> <text>暂无数据</text> </view> </template> <view class="kong" v-if="hasBom == 1 && bomType == 1"> <text>当前工序无需投料</text> </view> </view> <view class="bg_list_item bottomval"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>产出明细</text> </view> </view> <view class="bg_list_item_h"> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text><text>*</text>良品数</text> <view class="bg_list_item_num_item_sr"> <u--input placeholder="请输入" border="surround" type="number" :customStyle="{width: '180rpx'}" v-model="from.qualified" @input="changeNum(1)" ></u--input> <!-- <input type="number" v-model="from.qualified" @input="changeNum(1)" placeholder="请输入" /> --> <text v-if="from.processPlan">{{from.processPlan.unitName}}</text> <view class="bg_list_item_num" @click="userShow = true"> <view class="bg_list_item_num_item"> <text>生产人员</text> <view class="bg_list_item_num_item_sr"> <text :style="{color: from.userName ? '#333' : ''}">{{from.userName ? from.userName : '请选择'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>不良数</text> <view class="bg_list_item_num_item_sr"> <u--input placeholder="请输入" border="surround" type="number" :customStyle="{width: '180rpx'}" v-model="from.undesirable" @input="changeNum(2)" ></u--input> <!-- <input type="number" v-model="from.undesirable" @input="changeNum(2)" placeholder="请输入" /> --> <text v-if="from.processPlan">{{from.processPlan.unitName}}</text> </view> <view class="bg_list_item"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>生产投料</text> </view> <view class="bg_list_item_top_right" @click="openMaterial" v-if="(hasBom == 1 && bomType != 1) || hasBom == 0"> <image src="@/static/gongdan_ic_shoudong@2x.png" alt="" /> <text>新增投料</text> </view> </view> <template v-if="wuList.length > 0 && !(hasBom == 1 && bomType == 1)"> <van-swipe-cell v-for="(item, index) in wuList" :key="index"> <view class="bg_list_item_h"> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <view class="bg_list_item_num_item_wl"> <text>{{ item.materialName }}{{ item.procedureName ? ` | ${item.procedureName}` : '' }}</text> <view class="bg_list_item_num_item_wl_lx"> <text class="green" v-if="item.qualityType == 0">合格 / </text> <text class="yellow" v-if="item.qualityType == 1">不良 / </text> <text class="red" v-if="item.qualityType == 2">报废 / </text> <text>{{ item.locationName || '-' }} / </text> <text>{{ item.batch || '-' }}</text> </view> </view> <view class="bg_list_item_num_item_sr"> <u--input placeholder="请输入" border="surround" type="number" :customStyle="{width: '100%'}" v-model="item.num" @input="inputwl(index)" ></u--input> <!-- <input type="number" v-model="item.num" @input="inputwl(index)" /> --> <text>{{ item.unitName }}</text> </view> </view> </view> </view> <template #right> <van-button style="height: 100%;" @click="deleItem(index)" square text="删除" type="danger" /> </template> </van-swipe-cell> </template> <template v-else-if="wuList.length == 0 && !(hasBom == 1 && bomType == 1)"> <view class="kong"> <text>暂无数据</text> </view> </template> <view class="kong" v-if="hasBom == 1 && bomType == 1"> <text>当前工序无需投料</text> </view> </view> <view class="bg_list_item bottomval"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>产出明细</text> </view> </view> <view class="bg_list_item_h"> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text><text>*</text>良品数</text> <view class="bg_list_item_num_item_sr"> <u--input placeholder="请输入" border="surround" type="number" :customStyle="{width: '180rpx'}" v-model="from.qualified" @input="changeNum(1)" ></u--input> <!-- <input type="number" v-model="from.qualified" @input="changeNum(1)" placeholder="请输入" /> --> <text v-if="from.processPlan">{{from.processPlan.unitName}}</text> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>不良数</text> <view class="bg_list_item_num_item_sr"> <u--input placeholder="请输入" border="surround" type="number" :customStyle="{width: '180rpx'}" v-model="from.undesirable" @input="changeNum(2)" ></u--input> <!-- <input type="number" v-model="from.undesirable" @input="changeNum(2)" placeholder="请输入" /> --> <text v-if="from.processPlan">{{from.processPlan.unitName}}</text> </view> </view> </view> <view class="bg_list_item_num" v-if="from.undesirable > 0"> <view class="bg_list_item_num_item" @click="openBL"> <!-- <text>*</text> --> <text>不良项</text> <view class="bg_list_item_num_item_sr"> <text class="wulll" :style="{color: from.defectiveName ? '#305ED5' : ''}">{{from.defectiveName ? from.defectiveName : '设置'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> </view> </view> </view> <view class="bg_list_item_num" v-if="from.undesirable > 0"> <view class="bg_list_item_num_item" @click="openBL"> <!-- <text>*</text> --> <text>不良项</text> <view class="bg_list_item_num_item_sr"> <text class="wulll" :style="{color: from.defectiveName ? '#305ED5' : ''}">{{from.defectiveName ? from.defectiveName : '设置'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> <view class="bg_plan" @click="TimeShow = true"> <view class="bg_plan_label"> <text>报工时长</text> </view> <view class="bg_plan_label_val"> <text :style="{color: from.durationName ? '#333' : ''}">{{from.durationName ? from.durationName : '请选择'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> </view> <view class="bg_list_item" v-if="arrType && arrType.length > 0 && from.duration > 0"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>工资绩效</text> </view> </view> <view class="bg_list_item_h"> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>计件方式</text> <view class="bg_list_item_num_item_list"> <view :class="item.active ? 'bg_list_item_num_item_list_item active' : 'bg_list_item_num_item_list_item'" v-for="(item, index) in arrType" :key="index" @click="clickPerformanceType(index)">{{ item.name }}</view> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>工资单价</text> <view class="bg_list_item_num_item_sr"> <text class="color1">{{(arrType[from.index].salary / 10 / 10).toFixed(2)}}元/{{arrType[from.index].type == 0 ? '件' : '时'}}</text> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>预计工资</text> <view class="bg_list_item_num_item_sr"> <text class="color1">{{expectedSalary}}元</text> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>达标率</text> <view class="bg_list_item_num_item_sr"> <text class="color1">{{complianceRate}}%</text> </view> </view> </view> </view> </view> </view> <view class="bg_plan" @click="TimeShow = true"> <view class="bg_plan_label"> <text>报工时长</text> </view> <view class="bg_plan_label_val"> <text :style="{color: from.durationName ? '#333' : ''}">{{from.durationName ? from.durationName : '请选择'}}</text> <image src="@/static/ic_ar@2x.png" alt="" /> </view> <!-- 报工按钮 --> <view class="bh_zw"></view> <view class="bg_footer"> <view class="bg_footer_submit1" @click="continueSubmit">继续报工</view> <view class="bg_footer_submit" @click="submit">提交</view> </view> <view class="bg_list_item" v-if="arrType && arrType.length > 0 && from.duration > 0"> <view class="bg_list_item_top"> <view class="bg_list_item_top_left"> <view class="bg_list_item_top_left_x"></view> <text>工资绩效</text> </view> </view> <view class="bg_list_item_h"> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>计件方式</text> <view class="bg_list_item_num_item_list"> <view :class="item.active ? 'bg_list_item_num_item_list_item active' : 'bg_list_item_num_item_list_item'" v-for="(item, index) in arrType" :key="index" @click="clickPerformanceType(index)">{{ item.name }}</view> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>工资单价</text> <view class="bg_list_item_num_item_sr"> <text class="color1">{{(arrType[from.index].salary / 10 / 10).toFixed(2)}}元/{{arrType[from.index].type == 0 ? '件' : '时'}}</text> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>预计工资</text> <view class="bg_list_item_num_item_sr"> <text class="color1">{{expectedSalary}}元</text> </view> </view> </view> <view class="bg_list_item_num"> <view class="bg_list_item_num_item"> <text>达标率</text> <view class="bg_list_item_num_item_sr"> <text class="color1">{{complianceRate}}%</text> </view> </view> </view> </view> </view> </view> <!-- 报工按钮 --> <view class="bh_zw"></view> <view class="bg_footer"> <view class="bg_footer_submit1" @click="continueSubmit">继续报工</view> <view class="bg_footer_submit" @click="submit">提交</view> </view> </template> <!-- 生产人员 --> <user :show="userShow" @close="userShow = false" @value="onConfirm1" /> <!-- 生产设备 --> @@ -301,34 +304,39 @@ ...mapState(['userInfo']), // 预计工资 expectedSalary() { if (this.arrType.length === 0) return 0; if (this.arrType[this.from.index].type == 0) { if (!this.from.qualified) return 0 if (this.arrType[this.from.index].unqualified == 1) { // 是否计入不良品 let total = Number(this.from.qualified) + Number(this.from.undesirable) return (total * (this.arrType[from.index].salary / 10 / 10)).toFixed(2) let { index, qualified, undesirable, duration } = this.from let temp = this.arrType[index] if (temp.type == 0) { if (!qualified) return 0 if (temp.unqualified == 1) { // 是否计入不良品 let total = Number(qualified) + Number(undesirable) return (total * (temp.salary / 10 / 10)).toFixed(2) } else { return (Number(this.from.qualified) * (this.arrType[this.from.index].salary / 10 / 10)).toFixed(2) return (Number(qualified) * (temp.salary / 10 / 10)).toFixed(2) } } else { if (!this.from.duration) return 0; let h = (this.from.duration / 60 / 60).toFixed(2) return (Number(h) * (this.arrType[this.from.index].salary / 10 / 10)).toFixed(2) if (!duration) return 0; let h = (duration / 60 / 60).toFixed(2) return (Number(h) * (temp.salary / 10 / 10)).toFixed(2) } }, // 达标率 complianceRate() { if (this.arrType.length === 0) return 0; if (!this.from.qualified && !this.from.undesirable) return 0; if (!this.from.duration) return 0; if (!this.arrType[this.from.index].num) return 0; if (this.arrType[this.from.index].unqualified == 1) { // 是否计入不良品 let a = ((Number(this.from.qualified) + Number(this.from.undesirable)) / (this.from.duration / 3600)).toFixed(2) let b = (this.arrType[this.from.index].num / (this.arrType[this.from.index].times / 3600)).toFixed(2) let { index, qualified, undesirable, duration } = this.from let temp = this.arrType[index] if (!qualified && !undesirable) return 0; if (!duration) return 0; if (!temp.num) return 0; if (temp.unqualified == 1) { // 是否计入不良品 let a = ((Number(qualified) + Number(undesirable)) / (duration / 3600)).toFixed(2) let b = (temp.num / (temp.times / 3600)).toFixed(2) return ((Number(a) / Number(b)) * 100).toFixed(2) } else { let a = (this.from.qualified / (this.from.duration / 3600)).toFixed(2) let b = (this.arrType[this.from.index].num / (this.arrType[this.from.index].times / 3600)).toFixed(2) let a = (qualified / (duration / 3600)).toFixed(2) let b = (temp.num / (temp.times / 3600)).toFixed(2) return ((Number(a) / Number(b)) * 100).toFixed(2) } } @@ -360,8 +368,8 @@ this.wuList = [] this.from.defective = [] this.from.defectiveName = '' this.from.userName = '' this.from.userId = '' // this.from.userName = '' // this.from.userId = '' // 获取设备 getDeviceByCondition({ procedureId: data.obj.procedureId }) .then(res1 => { minipro_standard/pages_adjust/pages/spotCheck/spotCheck.vue
@@ -25,7 +25,7 @@ </div> </div> <div class="tl_list_item" v-if="item.type === ''"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_label">属性值1</div> <div class="tl_list_item_go"> <input type="text" v-model="item.num" placeholder="请输入" /> </div> @@ -34,7 +34,8 @@ <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <u-radio-group v-model="item.num" placement="row" @change="radioSelect"> <u-radio v-for="(item1, i) in item.data" :key="i" activeColor="#4275FC" :name="item1" :label="item1"> <u-radio v-for="(item1, i) in item.data" :key="i" activeColor="#4275FC" :name="item1" :label="item1"> </u-radio> </u-radio-group> </div> @@ -42,7 +43,7 @@ <div class="tl_list_item" v-else-if="item.type === 1"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <u-checkbox-group v-model="item.num" placement="row" > <u-checkbox-group v-model="item.num" placement="row"> <u-checkbox v-for="(item1, i) in item.data" :key="i" :label="item1" :name="item1"> </u-checkbox> </u-checkbox-group> @@ -53,15 +54,13 @@ <div class="tl_list_item_go"> <input type="text" v-model="item.num" :placeholder="item.tips" /> </div> </div><div class="tl_list_item" v-else-if="item.type === 3"> </div> <div class="tl_list_item" v-else-if="item.type === 3"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <u--input v-model="item.num" :placeholder="item.tips" placeholder="请输入内容" type="digit" border="surround" ></u--input> <input /> <div class="tl_list_item_go"> <input v-model="item.num" type="digit" :placeholder="item.tips" /> <!-- <u--input v-model="item.num" :placeholder="item.tips" type="digit" border="surround"></u--input> --> </div> </div> <div class="tl_list_item" @click="openTimer(index)" v-else-if="item.type === 4"> @@ -74,64 +73,6 @@ </div> </u-swipe-action-item> </u-swipe-action> <!-- <van-swipe-cell v-for="(item, index) in formList" :key="index"> <div class="tl_list"> <div class="tl_list_item" @click="open(index)"> <div class="tl_list_item_label">生产属性</div> <div class="tl_list_item_go"> <span :style="item.attributeName ? 'color: #000;' : ''">{{ item.attributeName ? item.attributeName : '请选择'}}</span> <van-icon name="arrow" color="#999999" /> </div> </div> <div class="tl_list_item" v-if="item.type === ''"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <input type="text" v-model="item.num" placeholder="请输入" /> </div> </div> <div class="tl_list_item" v-else-if="item.type === 0"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <u-radio-group v-model="item.num" placement="row"> <u-radio v-for="(item1, i) in item.data" :key="i" activeColor="#4275FC" :label="item1"> </u-radio> </u-radio-group> </div> </div> <div class="tl_list_item" v-else-if="item.type === 1"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <u-checkbox-group v-model="item.num" placement="row"> <u-checkbox v-for="(item1, i) in item.data" :key="i" :label="item1" :name="item1"> </u-checkbox> </u-checkbox-group> </div> </div> <div class="tl_list_item" v-else-if="item.type === 2"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <input type="text" v-model="item.num" :placeholder="item.tips" /> </div> </div> <div class="tl_list_item" v-else-if="item.type === 3"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <input type="text" v-model="item.num" :placeholder="item.tips" /> </div> </div> <div class="tl_list_item" @click="openTimer(index)" v-else-if="item.type === 4"> <div class="tl_list_item_label">属性值</div> <div class="tl_list_item_go"> <span :style="item.num ? 'color: #000;' : ''">{{item.num ? item.num : item.tips}}</span> <u-icon name="arrow" color="#999999" /> </div> </div> </div> <template #right> <van-button square style="height: 100%;" type="danger" text="删除" @click="dele(index)" /> </template> </van-swipe-cell> --> <div class="tl_zw"></div> <div class="tl_footer"> @@ -139,6 +80,8 @@ </div> <u-picker :show="show" :columns="[gzqjData]" title="选择生产属性" @confirm="gzqjConfirm" @cancel="show=false"> </u-picker> <u-datetime-picker :show="timer" v-model="value1" @cancel="timer=false" @confirm="onConfirm" mode="datetime"> </u-datetime-picker> </view> </template> @@ -159,9 +102,14 @@ data() { return { options1: [{ text: '删除' text: '删除', style: { backgroundColor: '#f00', } }], value1: Number(new Date()), show: false, timer: false, index: '', workOrderId: '', info: {}, @@ -223,6 +171,11 @@ this.index = index this.show = true }, // 打开日期插件 openTimer(index) { this.index = index this.timer = true }, gzqjConfirm({ value }) { @@ -270,35 +223,44 @@ return } this.formList.splice(index, 1) }, radioSelect(v) { console.log(v); }, onConfirm(value) { console.log(value); this.formList.forEach((item, index) => { if (this.index === index) { item.num = setTimeO(new Date(value.value), '-') } }) this.timer = false; }, radioSelect(v) { console.log(v); }, submit() { let isOpen = true let attrList = [] this.formList.forEach(item => { let isOpen = true let attrList = [] this.formList.forEach(item => { console.log('-------', item); if (item.type === 1) { if (item.type === 1) { if (item.attribute === '' || item.num.length === 0) { isOpen = false isOpen = false return } else { attrList.push({ val: item.num.join(' '), attrId: item.attribute }) } else { attrList.push({ val: item.num.join(' '), attrId: item.attribute }) } } else { } else { if (item.attribute === '' || item.num === '') { isOpen = false isOpen = false return } else { attrList.push({ val: item.num, attrId: item.attribute }) } else { attrList.push({ val: item.num, attrId: item.attribute }) } } }) @@ -306,13 +268,13 @@ uni.$u.toast('请将信息填写完整') return } createDJ({ attrList: attrList, id: this.workOrderId }).then(res => { if (res.code === 200) { uni.$emit('spotAdd') if (res.code === 200) { uni.$emit('spotAdd') uni.$u.toast('创建成功') setTimeout(() => { uni.navigateBack() @@ -379,7 +341,7 @@ flex-direction: column; background: white; padding: 0 30rpx; margin-bottom: 20rpx; // margin-bottom: 20rpx; .tl_list_item { min-height: 98rpx; @@ -394,7 +356,7 @@ .tl_list_item_label { font-size: 30rpx; font-weight: 400; font-weight: 400; flex-shrink: 1; color: #222222; } @@ -402,8 +364,9 @@ .tl_list_item_go { display: flex; align-items: center; flex: 1; flex: 1; justify-content: flex-end; input { text-align: right; width: 450rpx; @@ -454,13 +417,15 @@ justify-content: center; } } } /deep/ .u-checkbox-group { flex-wrap: wrap; max-width: 100%; } /deep/ .u-radio-group { flex-wrap: wrap; max-width: 100%; } /deep/ .u-checkbox-group { flex-wrap: wrap; max-width: 100%; } /deep/ .u-radio-group { flex-wrap: wrap; max-width: 100%; } </style> minipro_standard/pages_adjust/pages/workOrder/workOrder.vue
@@ -42,7 +42,7 @@ <span v-if="item.status === 4">已报工</span> <span v-if="item.status === 5">已入库</span> <span v-if="item.status === 6">已取消</span> <span class="green" v-if="item.status === 7">进行中</span> <span class="green" v-if="item.status === 7">生产中</span> </div> </div> <span class="f24">工单编号: {{item.code}}</span> @@ -162,18 +162,15 @@ this.searchForm = { mixParam: '', startDate: '', endDate: gsdate(new Date()), // endDate: gsdate(new Date()), endDate: '', statusList: [] } this.page.page = 1 this.pageCounts() this.loadData() this.search() }, searchInput(data) { this.searchForm.mixParam = data this.page.page = 1 this.pageCounts() this.loadData() this.search() }, loadData() { getList({ @@ -202,11 +199,10 @@ pageCounts() { pageCount({ ...this.searchForm, endDate: this.searchForm.endDate || '', endDate: this.searchForm.endDate || null, statusList: this.searchForm.statusList.length === 0 ? this.tagList[0].id : this.searchForm .statusList }).then(res => { console.log(res); if (res.code === 200) { this.tagList[0].num = String(res.data.startNum) this.tagList[1].num = String(res.data.ingNum) @@ -219,10 +215,11 @@ this.page.page = 1 this.loadData() }, dateConfirm(v) { dateConfirm(v) { console.log(v); this.isOpenDate = false this.searchForm.startDate = v[0] this.searchForm.endDate = v[v.length - 1] this.searchForm.startDate = v.startDate this.searchForm.endDate = v.endDate }, getLists() { this.page.page += 1 @@ -231,12 +228,12 @@ onRefresh() { if (this.triggered) return this.triggered = true; this.page.page = 1 this.loadData() this.search() }, search() { this.page.page = 1 this.loadData() this.pageCounts() }, jump(item) { // uni.navigateTo({ @@ -375,7 +372,7 @@ width: 80%; span { font-size: 32rpx; font-size: 24rpx; font-weight: 500; color: #333333; overflow: hidden; minipro_standard/pages_adjust/pages/workOrderReporting/workOrderReporting.vue
@@ -1,4 +1,5 @@ <template> <template> <page-meta :page-style="(badShow||statistics) ?'overflow: hidden;': ''"/> <view> <view class="tips-label">当前任务需要质检;产出后,请耐心等待质检员检验,并根据检验结果调整产出数据后再报工。</view> <workOrderInfo :orederMessage="info" /> @@ -124,8 +125,9 @@ :style="{ color: form.durationName ? '#333' : '' }">{{ form.durationName ? form.durationName : '请选择' }}</span> <image src="../../../static/ic_ar@2x.png" class="img_ar" mode=""></image> </div> </div> <div class="bg_list_item" v-if="form.duration && arrType && arrType.length > 0"> </div> <!-- form.duration && --> <div class="bg_list_item" v-if="arrType && arrType.length > 0"> <div class="bg_list_item_top"> <div class="bg_list_item_top_left"> <div class="bg_list_item_top_left_x bg_m"></div> @@ -175,31 +177,38 @@ </div> <div class="details_dj" v-if="typeView === 1"> <div class="details_dj_list"> <scroll-view scroll-y="true" refresher-enabled="true" @scrolltolower="getLists"> <u-swipe-action v-for="(item, index) in djData" :key="index"> <u-swipe-action-item :options="options" @click="dele(item.id)"> <div class="details_dj_list_item"> <span>{{ item.attrName }}:{{ item.val }}</span> <span>{{ item.userName }} {{ item.createTime }}</span> </div> </u-swipe-action-item> </u-swipe-action> </scroll-view> <div class="details_dj_list"> <u-swipe-action v-for="(item, index) in djData" :key="index"> <u-swipe-action-item :options="options" @click="dele(item.id)"> <div class="details_dj_list_item"> <span>{{ item.attrName }}:{{ item.val }}</span> <span>{{ item.userName }} {{ item.createTime }}</span> </div> </u-swipe-action-item> </u-swipe-action> </div> </div> <!-- v-if="info.status === 2 || info.procedureNeedcheck === 1" --> <template v-if="info.status === 2 || info.procedureNeedcheck === 1"> <!-- v-if="info.status === 2 || info.procedureNeedcheck === 1" --> <!-- status 0已创建、1已备料、2已完工、3已检验、4已报工、5已入库、6已取消、7生产中 --> <!-- procedureNeedcheck 工序是否需要检验才能报工 0是 1否 --> <template v-if="typeView == 0 &&( info.status === 2 || info.procedureNeedcheck === 1 )"> <div class="bh_zw"></div> <div class="bg_footer bg_f7"> <div class="bg_footer_submit bg_m" v-if="typeView == 0" @click="submit">确认报工</div> <!-- proxy.$auth('h5:workorder:processRecord') && --> </div> </template> <template v-if="typeView == 1 && info.status !== 4 && info.procedureNeedcheck !== 5 && info.procedureNeedcheck !== 6"> <div class="bh_zw"></div> <div class="bg_footer bg_f7"> <div class="bg_footer_submit1" @click="jumpdj" v-if="typeView == 1"> <image src="../../../static/gongdan_ic_shoudong@2x.png" class="fornt-img" mode=""></image> <span>新增点检</span> </div> </div> </template> </template> <u-safe-bottom></u-safe-bottom> <u-datetime-picker :show="TimeShow" @cancel="TimeShow=false" @confirm="timeConfirm" v-model="form.time" mode="time"></u-datetime-picker> <u-popup :show="badShow" @close="badShow=false" :round="8" closeable zIndex="20000"> @@ -375,23 +384,24 @@ return (Number(h) * (this.arrType[this.form.index].salary / 10 / 10)).toFixed(2) || 0 } }, complianceRate() { complianceRate() { let { index, duration } = this.form let { qualified, undesirable } = this.produceFrom if (this.arrType.length === 0) return 0; if (!this.produceFrom.qualified && !this.produceFrom.undesirable) return 0; if (!this.form.duration) return 0; if (!this.arrType[this.form.index].num) return 0; if (!qualified && !undesirable) return 0; if (!duration) return 0; if (!this.arrType[index].num) return 0; // 按件计算 // if (infoBox.value.type == 0) { if (this.arrType[this.form.index].unqualified == 1) { // 是否计入不良品 let a = ((Number(this.produceFrom.qualified) + Number(this.produceFrom.undesirable)) / (this.form .duration / 3600)).toFixed(2) let b = (this.arrType[this.form.index].num / (this.arrType[form.index].times / 3600)).toFixed(2) if (this.arrType[index].unqualified == 1) { // 是否计入不良品 let a = ((Number(qualified) + Number(undesirable)) / (duration / 3600)).toFixed(2) let b = (this.arrType[index].num / (this.arrType[index].times / 3600)).toFixed(2) return ((Number(a) / Number(b)) * 100).toFixed(2) // let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / ) // return total * infoBox.value.salary; } else { let a = (this.produceFrom.qualified / (this.form.duration / 3600)).toFixed(2) let b = (this.arrType[this.form.index].num / (this.arrType[this.form.index].times / 3600)).toFixed(2) let a = (qualified / (duration / 3600)).toFixed(2) let b = (this.arrType[index].num / (this.arrType[index].times / 3600)).toFixed(2) return ((Number(a) / Number(b)) * 100).toFixed(2) // return Number(from.qualified) * infoBox.value.salary; } @@ -461,7 +471,6 @@ timeConfirm({ value }) { console.log(value) let h = Number(value.substring(0, 2)) let m = Number(value.substring(3, 5)) let s = 0 @@ -876,11 +885,11 @@ }) return } total = total += item.num total += Number(item.num) arr.push(item) name += item.name + item.num + ';' } }) }) if (total != Number(this.produceFrom.undesirable)) { uni.showToast({ title: '不良数必须等于产出不良数', @@ -1048,7 +1057,11 @@ padding: 0 30rpx; box-sizing: border-box; background: white; &:last-child { .bg_list_item_num{ border: none !important; } } .bg_list_item_num { width: 100%; min-height: 98rpx; @@ -1057,11 +1070,6 @@ justify-content: center; align-items: center; border-bottom: 1rpx solid #E5E5E5; &:last-child { border: none !important; } .kong { text-align: center; font-size: 25rpx; @@ -1142,9 +1150,9 @@ span { flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; // overflow: hidden; // text-overflow: ellipsis; // white-space: nowrap; b { font-size: 30rpx; @@ -1209,9 +1217,9 @@ .wulll { width: 400rpx; text-align: right; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; // overflow: hidden; // white-space: nowrap; // text-overflow: ellipsis; } span { @@ -1233,7 +1241,7 @@ padding: 30rpx; box-sizing: border-box; background: #FFFFFF; margin-bottom: 40rpx; // margin-bottom: 40rpx; display: flex; align-items: center; justify-content: space-between; minipro_standard/pages_inspect/pages/InOperation/InOperation.vue
@@ -86,7 +86,7 @@ <span>{{item.locationName ? item.locationName : '-'}}</span> </div> </div> <div class="items"> <div class="items f24"> <div class="label">数量:</div> <div class="nr"> <input type="text" v-model="item.scanNum" placeholder="请输入" /> @@ -97,8 +97,8 @@ <div class="itemy" v-for="(item1, idx) in item.woutboundRedisCodeBeanList" :key="idx"> <div class="label">工装{{item1.scanCode}}:</div> <div class="nr">{{item1.num}}{{item1.unitName}}</div> <div class="dele" @click="dele(item1)"> <image src="../../../static/chuku_ic_delete@2x.png" class="img36" mode=""></image> <div class="dele" @click="woScanMaterialBeanList.splice(index, 1)"> <image src="../../../static/chuku_ic_delete@2x.png" class="img48" mode=""></image> </div> </div> </div> @@ -129,7 +129,7 @@ <span>{{item1.locationName}}</span> </div> </div> <div class="itemy_item"> <div class="itemy_item f24"> <div class="label">数量:</div> <div class="nr"> <!-- @input="inputNum(item1)" --> @@ -137,9 +137,11 @@ <span>{{item1.unitName}}</span> </div> </div> <!-- @click="dele()" --> <div class="dele" @click="dele(idx)"> <image src="../../../static/chuku_ic_delete@2x.png" class="img36" mode=""></image> <!-- @click="dele()" dele(index) { this.outboundList.splice(index, 1) }, --> <div class="dele" @click="seleMateriaList.splice(index, 1)"> <image src="../../../static/chuku_ic_delete@2x.png" class="img48" mode=""></image> </div> </div> </div> @@ -737,6 +739,7 @@ display: flex; align-items: center; margin-top: 15rpx; font-size: 24rpx; } .page_yxwl_list_item_num { minipro_standard/pages_inspect/pages/OutOperation/OutOperation.vue
@@ -1,785 +1,811 @@ <template> <view> <InOutInfo :info="info" /> <uni-collapse @change="change" @close="close" @open="open"> <uni-collapse-item :open="item1.wtransferDetailList.length" v-if="type==7" v-for="(item1, index) in warehouseList" :key="index"> <view class="p30 cY" style="border-bottom: 4rpx solid #f7f7f7;" slot="title"> <image src="../../../static/chuku_ic_cangku@2x.png" class="img36 mr10" mode=""></image> <view>{{ item1.warehouseName }}</view> </view> <view class="p30"> <div class="page_dck"> <div class="page_dck_title"> <div class="page_dck_title_x"></div> <span>待出库物料</span> </div> </div> <div class="page_content" v-for="(item, index) in item1.wtransferDetailList" :key="index" :name="index"> <div class="page_content_title"> <div class="page_content_title_top"> <span>{{ item.materialName + ' | ' + item.materialCode }}</span> <span>待出<span>{{ item.outPlannum }}</span> {{ item.unitName }}</span> </div> <div class="page_content_title_bottom"> <span class="green" v-if="item.qualityType === 0">合格 <span class="black">/</span> </span> <span class="warning" v-else-if="item.qualityType === 1">不良 <span class="black">/</span> </span> <span class="error" v-else-if="item.qualityType === 2">报废 <span class="black">/</span> </span> <span v-else>- / </span> <span>{{item.procedureName ? item.procedureName : '-'}} / </span> <span>{{item.batch ? item.batch : '-'}}</span> </div> </div> <div class="page_content_list" v-for="(childer, idxs) in item.wstockExtListVOList" v-if="childer.batch == item.batch" :key="idxs"> <div class="page_content_list_item"> <div class="page_content_list_item_label">出库货位:</div> <div class="page_content_list_item_nr">{{ childer.locationName }}</div> </div> <div class="page_content_list_items"> <div class="page_content_list_item_label">数量:</div> <div class="page_content_list_item_nr">{{ childer.num }}{{ childer.unitName }}</div> </div> <div class="page_content_list_item"> <div class="page_content_list_item_label">批次号:</div> <div class="page_content_list_item_nr">{{ childer.batch ? childer.batch : '-' }}</div> </div> </div> </div> </view> </uni-collapse-item> <uni-collapse-item v-if="type==8"> <view class="p30 cY" style="border-bottom: 4rpx solid #f7f7f7;" slot="title"> <image src="../../../static/chuku_ic_cangku@2x.png" class="img36 mr10" mode=""></image> <view>{{ info.warehouseName }}</view> </view> <view class="p30"> <div class="page_dck"> <div class="page_dck_title"> <div class="page_dck_title_x"></div> <span>待出库物料</span> </div> </div> <div class="page_content" v-for="(item, index) in woutboundDetailsWait" :key="index" :name="index"> <div class="page_content_title"> <div class="page_content_title_top"> <span>{{ item.materialName + ' | ' + item.materialCode }}</span> <span>待出 <span>{{ item.num }}</span> {{ item.unitName }}</span> </div> <div class="page_content_title_bottom"> <span class="green" v-if="item.qualityType === 0">合格 <span class="black">/</span> </span> <span class="warning" v-else-if="item.qualityType === 1">不良 <span class="black">/</span> </span> <span class="error" v-else-if="item.qualityType === 2">报废 <span class="black">/</span> </span> <span v-else>- / </span> <span>{{item.procedureName ? item.procedureName : '-'}} / </span> <span>{{item.batch ? item.batch : '-'}}</span> </div> </div> <div class="page_content_list" v-for="(items, ind) in item.wstockExtListVOList" v-if="items.batch == item.batch" :key="ind"> <div class="page_content_list_item"> <div class="page_content_list_item_label">批次号1:</div> <div class="page_content_list_item_nr">{{ items.batch ? items.batch : '-' }}</div> </div> <div class="page_content_list_items"> <div class="page_content_list_item_label">数量:</div> <div class="page_content_list_item_nr">{{ items.num }}{{ items.umodel.name }}</div> </div> <div class="page_content_list_item" v-if="items.lmodel"> <div class="page_content_list_item_label">出库货位:</div> <div class="page_content_list_item_nr">{{ items.lmodel.unionName }}</div> </div> </div> </div> </view> </uni-collapse-item> </uni-collapse> <div class="page_h"></div> <div class="page_yxwl"> <div class="page_yxwl_title"> <div class="left"> <div class="page_yxwl_title_x"></div> <span>已选择物料</span> </div> <div class="right" v-if="isZKD" @click="openxz"> <image src="../../../static/gongdan_ic_shoudong@2x.png" class="img36" mode=""></image><span>手动出库</span> </div> </div> <div class="page_yxwl_list" v-if="outboundList.length > 0"> <div class="page_yxwl_list_item" v-for="(item, index) in outboundList" :key="index"> <div class="page_yxwl_list_item_top"> <div class="page_yxwl_list_item_top_left">{{ item.materialName }} | {{ item.materialCode }} </div> </div> <div class="page_yxwl_list_item_sx"> <span class="green" v-if="item.qualityType == 0">合格 <span>/</span></span> <span class="yellow" v-else-if="item.qualityType == 1">不良 <span>/</span></span> <span class="red" v-else-if="item.qualityType == 2">报废 <span>/</span></span> <span v-else>- / </span> <span> {{ item.procedureName ? item.procedureName : '-' }} / </span> <span> {{ item.batch ? item.batch : '-' }}</span> </div> <div class="page_yxwl_list_item_num"> <div class="item"> <div class="label">出库货位:</div> <div class="nr"> <span>{{ item.locationName }}</span> </div> </div> <div class="item"> <div class="label">数量:</div> <div class="nr"> <!-- @input="changeNum(item)" --> <input type="number" v-model="item.num" placeholder="请输入"> <span>{{ item.unitName }}</span> </div> </div> <div class="dele" @click="dele(index)"> <!-- <img src="@/assets/icon/chuku_ic_delete@2x.png" alt="" /> --> <image src="../../../static/chuku_ic_delete@2x.png" class="img24" mode=""></image> </div> </div> </div> </div> <div class="page_yxwl_kong" v-else>暂无数据</div> </div> <div class="page_zw"></div> <!-- 提交按钮 --> <div class="page_footer"> <div class="page_footer_ck" @click="submit"> <span>确认出库</span> </div> </div> <SelectTraMultipleMaterial ref="selectTraMultipleMaterial" @selectes="selectMaterail" /> </view> </template> <script> import InOutInfo from '@/components/InOutInfo.vue' import SelectTraMultipleMaterial from '@/components/SelectTraMultipleMaterial.vue' import { QRCodeType } from '@/common/config.js' import { outScanAppliances, wTransferForInOut, wTransferForInOutUpload, wOutBoundForInOut, wOutBoundForUpload, transferToOutNew } from '@/util/api/ExWarehouse' import { getDB } from '@/util/api/agencyAPI' export default { components: { InOutInfo, SelectTraMultipleMaterial }, data() { return { type: '', id: '', dbid: '', isZKD: false, show: false, info: { <template> <view> <InOutInfo :info="info" /> <uni-collapse @change="change" @close="close" @open="open"> <uni-collapse-item :open="item1.wtransferDetailList.length" v-if="type==7" v-for="(item1, index) in warehouseList" :key="index"> <view class="p30 cY" style="border-bottom: 4rpx solid #f7f7f7;" slot="title"> <image src="../../../static/chuku_ic_cangku@2x.png" class="img36 mr10" mode=""></image> <view>{{ item1.warehouseName }}</view> </view> <view class="p30"> <div class="page_dck"> <div class="page_dck_title"> <div class="page_dck_title_x"></div> <span>待出库物料</span> </div> </div> <div class="page_content" v-for="(item, index) in item1.wtransferDetailList" :key="index" :name="index"> <div class="page_content_title"> <div class="page_content_title_top"> <span>{{ item.materialName + ' | ' + item.materialCode }}</span> <span>待出<span>{{ item.outPlannum }}</span> {{ item.unitName }}</span> </div> <div class="page_content_title_bottom"> <span class="green" v-if="item.qualityType === 0">合格 <span class="black">/</span> </span> <span class="warning" v-else-if="item.qualityType === 1">不良 <span class="black">/</span> </span> <span class="error" v-else-if="item.qualityType === 2">报废 <span class="black">/</span> </span> <span v-else>- / </span> <span>{{item.procedureName ? item.procedureName : '-'}} / </span> <span>{{item.batch ? item.batch : '-'}}</span> </div> </div> <div class="page_content_list" v-for="(childer, idxs) in item.wstockExtListVOList" :key="idxs"> <div class="page_content_list_item"> <div class="page_content_list_item_label">出库货位:</div> <div class="page_content_list_item_nr">{{ childer.locationName }}</div> </div> <div class="page_content_list_items"> <div class="page_content_list_item_label">数量:</div> <div class="page_content_list_item_nr">{{ childer.num }}{{ childer.unitName }}</div> </div> <div class="page_content_list_item"> <div class="page_content_list_item_label">批次号:</div> <div class="page_content_list_item_nr">{{ childer.batch ? childer.batch : '-' }}</div> </div> </div> </div> </view> </uni-collapse-item> <uni-collapse-item v-if="type==8"> <view class="p30 cY" style="border-bottom: 4rpx solid #f7f7f7;" slot="title"> <image src="../../../static/chuku_ic_cangku@2x.png" class="img36 mr10" mode=""></image> <view>{{ info.warehouseName }}</view> </view> <view class="p30"> <div class="page_dck"> <div class="page_dck_title"> <div class="page_dck_title_x"></div> <span>待出库物料</span> </div> </div> <div class="page_content" v-for="(item, index) in woutboundDetailsWait" :key="index" :name="index"> <div class="page_content_title"> <div class="page_content_title_top"> <span>{{ item.materialName + ' | ' + item.materialCode }}</span> <span>待出 <span>{{ item.num }}</span> {{ item.unitName }}</span> </div> <div class="page_content_title_bottom"> <span class="green" v-if="item.qualityType === 0">合格<text class="c6" decode>{{ split}}</text></span> <span class="warning" v-else-if="item.qualityType === 1">不良<text class="c6" decode>{{ split}}</text></span> <span class="error" v-else-if="item.qualityType === 2">报废<text class="c6" decode>{{ split}}</text></span> <span v-else>-<text class="c6" decode>{{ split}}</text></span> <span>{{item.procedureName ? item.procedureName : '-'}}<text class="c6" decode>{{ split}}</text></span> <span>{{item.batch ? item.batch : '-'}}</span> </div> </div> <div class="page_content_list" v-for="(items, ind) in item.wstockExtListVOList" :key="ind"> <div class="page_content_list_item"> <div class="page_content_list_item_label">批次号1:</div> <div class="page_content_list_item_nr">{{ items.batch ? items.batch : '-' }}</div> </div> <div class="page_content_list_items"> <div class="page_content_list_item_label">数量:</div> <div class="page_content_list_item_nr">{{ items.num }}{{ items.umodel.name }}</div> </div> <div class="page_content_list_item" v-if="items.lmodel"> <div class="page_content_list_item_label">出库货位:</div> <div class="page_content_list_item_nr">{{ items.lmodel.unionName }}</div> </div> </div> </div> </view> </uni-collapse-item> </uni-collapse> <div class="page_h"></div> <div class="page_yxwl"> <div class="page_yxwl_title"> <div class="left"> <div class="page_yxwl_title_x"></div> <span>已选择物料</span> </div> <div class="right" v-if="isZKD" @click="openxz"> <image src="../../../static/gongdan_ic_shoudong@2x.png" class="img36" mode=""></image> <span>手动出库</span> </div> </div> <div class="page_yxwl_list" v-if="outboundList.length > 0"> <div class="page_yxwl_list_item" v-for="(item, index) in outboundList" :key="index"> <div class="page_yxwl_list_item_top"> <div class="page_yxwl_list_item_top_left">{{ item.materialName }} | {{ item.materialCode }} </div> </div> <div class="page_yxwl_list_item_sx"> <span class="green" v-if="item.qualityType == 0">合格t<text class="c6" decode>{{ split}}</text></span> <span class="yellow" v-else-if="item.qualityType == 1">不良<text class="c6" decode>{{ split}}</text></span> <span class="red" v-else-if="item.qualityType == 2">报废<text class="c6" decode>{{ split}}</text></span> <span v-else>-<text class="c6" decode>{{ split}}</text></span> <span>{{ item.procedureName ? item.procedureName : '-' }}<text class="c6" decode>{{ split}}</text></span> <span>{{ item.batch ? item.batch : '-' }}</span> </div> <div class="page_yxwl_list_item_num"> <div class="item"> <div class="label">出库货位:</div> <div class="nr"> <span>{{ item.locationName }}</span> </div> </div> <div class="item f24"> <div class="label">数量:</div> <div class="nr"> <!-- @input="changeNum(item)" --> <input type="number" v-model="item.num" placeholder="请输入"> <span>{{ item.unitName }}</span> </div> </div> <div class="dele" @click="dele(index)"> <!-- <img src="@/assets/icon/chuku_ic_delete@2x.png" alt="" /> --> <image src="../../../static/chuku_ic_delete@2x.png" class="img48" mode=""></image> </div> </div> </div> </div> <div class="page_yxwl_kong" v-else>暂无数据</div> </div> <div class="page_zw"></div> <!-- 提交按钮 --> <div class="page_footer"> <div class="page_footer_ck" @click="submit"> <span>确认出库</span> </div> </div> <SelectTraMultipleMaterial ref="selectTraMultipleMaterial" @selectes="selectMaterail" /> </view> </template> <script> import InOutInfo from '@/components/InOutInfo.vue' import SelectTraMultipleMaterial from '@/components/SelectTraMultipleMaterial.vue' import { QRCodeType } from '@/common/config.js' import { outScanAppliances, wTransferForInOut, wTransferForInOutUpload, wOutBoundForInOut, wOutBoundForUpload, transferToOutNew } from '@/util/api/ExWarehouse' import { getDB } from '@/util/api/agencyAPI' export default { components: { InOutInfo, SelectTraMultipleMaterial }, data() { return { type: '', id: '', dbid: '', isZKD: false, show: false, info: { }, mainOrder: '', warehouseId: '', ids: [], warehouseList: [{ }], woutboundDetailsWait: [], outboundList: [] }; }, onLoad(option) { this.type = option.type this.id = option.id this.isZKD = this.type == QRCodeType.ZKD this.dbid = option.dbid if (option.dbid) { this.getDBs(option.dbid) } else { this.getInfo() } }, methods: { // 判断是否完成 getDBs(dbid) { getDB(dbid) .then(res => { let { data } = res if (data.status == 1) { // 已完成 } else { this.getInfo() split: ' / ', mainOrder: '', warehouseId: '', ids: [], warehouseList: [{ }], woutboundDetailsWait: [], outboundList: [] }; }, onLoad(option) { this.type = option.type this.id = option.id this.isZKD = this.type == QRCodeType.ZKD this.dbid = option.dbid if (option.dbid) { this.getDBs(option.dbid) } else { this.getInfo() } }, methods: { // 判断是否完成 getDBs(dbid) { getDB(dbid) .then(res => { let { data } = res if (data.status == 1) { // 已完成 } else { this.getInfo() } }) .catch(err => {}) }, getInfo() { let infoAction let data = { id: this.id } if (this.type == QRCodeType.CKD) { infoAction = wOutBoundForInOut data.wOutboundType = '0' } else if (this.type == QRCodeType.ZKD) { infoAction = wTransferForInOut data.wTransferType = '0' } infoAction(data).then(res => { this.mainOrder = res.data.id if (this.isZKD) { this.info = res.data.wtransfer this.warehouseList = res.data.wtransferWarehouseList this.warehouseId = this.warehouseList[0].warehouseId } else { this.info = res.data.woutbound this.woutboundDetailsWait = res.data.woutboundDetailsWait this.warehouseId = this.woutboundDetailsWait[0].warehouseId } }).catch(err => { uni.$u.toast(err) uni.navigateBack() }) }, change() {}, close() {}, open() {}, openxz() { this.$refs.selectTraMultipleMaterial.open({ transferId: this.id, warehouseId: this.warehouseId }) }, selectMaterail(v) { let tempList = this.warehouseList[0].wtransferDetailList let materials = JSON.parse(JSON.stringify(v.materials)) tempList.forEach(item => { let isOutList = false this.outboundList.forEach(selected => { if (selected.newId == item.id) { isOutList = true return } }) .catch(err => {}) }, getInfo() { let infoAction let data = { id: this.id } if (this.type == QRCodeType.CKD) { infoAction = wOutBoundForInOut data.wOutboundType = '0' } else if (this.type == QRCodeType.ZKD) { infoAction = wTransferForInOut data.wTransferType = '0' } infoAction(data).then(res => { this.mainOrder = res.data.id if (this.isZKD) { this.info = res.data.wtransfer this.warehouseList = res.data.wtransferWarehouseList this.warehouseId = this.warehouseList[0].warehouseId } else { this.info = res.data.woutbound this.woutboundDetailsWait = res.data.woutboundDetailsWait this.warehouseId = this.woutboundDetailsWait[0].warehouseId } }).catch(err => { uni.$u.toast(err) uni.navigateBack() }) }, change() {}, close() {}, open() {}, openxz() { this.$refs.selectTraMultipleMaterial.open({ transferId: this.id, warehouseId: this.warehouseId }) }, selectMaterail(v) { let tempList = this.warehouseList[0].wtransferDetailList let materials = v.materials materials.forEach(materail => { tempList.forEach(item => { item.wstockExtListVOList.forEach(hw => { if (materail.materialId == hw.materialId && materail.procedureId == hw .procedureId && materail.qualityType == hw.qualityType && materail.batch == hw.batch) { let isExist = false this.outboundList.forEach(selected => { if (selected.newId == item.id) { isExist = true if (!isOutList) { materials.forEach((materail, index) => { if (item.batch) { // 精确匹配 if (materail.materialId == item.materialId && materail.procedureId == item.procedureId && materail.qualityType == item.qualityType && materail.batch == item.batch ) { this.addToOutList(materail, item) materials.splice(index, 1) return } }) if (isExist) { uni.$u.toast('该物料已存在') } } else { if (materail.materialId == item.materialId && materail.procedureId == item.procedureId && materail.qualityType == item.qualityType ) { this.addToOutList(materail, item) materials.splice(index, 1) return } let obj = JSON.parse(JSON.stringify(materail)) obj.newId = item.id this.outboundList.push(obj) } }) }) } }) }, dele(index) { this.outboundList.splice(index, 1) }, submit() { if (this.type == QRCodeType.ZKD) { if (this.outboundList.length > 0) { let result = this.outboundList.reduce((a, b) => { if (a[b.newId]) { a[b.newId].push(b); } else { a[b.newId] = [b]; } return a; }, {}); let tempList = this.warehouseList[0].wtransferDetailList for (let i = 0; i < tempList.length; i++) { let item = tempList[i] for (let a in result) { if (item.id == a) { let total = 0 for (let b = 0; b < result[a].length; b++) { total = Number(total) + Number(result[a][b].num) } if (!total || total <= 0) { uni.$u.toast('出库物料数量必须大于0') return } console.log(total, item.outPlannum); if (total > item.outPlannum) { uni.$u.toast('出库数量不能大于待出库数量') return } } } } let submitTransferOutDetailDTOList = [] this.outboundList.forEach(item => { tempList.forEach(child => { if (item.newId == child.id) { submitTransferOutDetailDTOList.push({ outNum: item.num, wstockId: item.id, wtransferDetailId: child.id }) } }) }) transferToOutNew({ submitTransferOutDetailDTOList, wtransferId: this.id }).then(res => { if (res.code === 200) { this.$store.dispatch('getUpcomingNum') uni.$u.toast('操作成功') uni.$emit('success') uni.redirectTo({ url: `/pages_adjust/pages/warehousingDetails/warehousingDetails?id=${this.id}&dbid=${this.dbid}` }) // setTimeout(() => { // router.replace({ name: 'wTransferDetail', query: { id: info.value.wtransfer.id, dbid: route.query.dbid } }) // }, 2000) } }) } else { uni.$u.toast('请选择出库物料') addToOutList(materail, item) { let isExist = false this.outboundList.forEach(selected => { if (selected.newId == materail.id) { isExist = true return } } else if (this.type === QRCodeType.CKD) { wOutBoundForUpload({ id: this.id, wOutboundType: 0 }).then(res => { if (res.code === 200) { this.$store.dispatch('getUpcomingNum') uni.$u.toast('操作成功') uni.$emit('success') uni.redirectTo({ url: `/pages_adjust/pages/outboundDetails/outboundDetails?id=${this.id}` }) // setTimeout(() => { // // router.go(-1) // router.replace({ name: 'wOutboundDetail', query: { id: info.value.wtransfer.id } }) // }, 2000) } }) }) if (isExist) { uni.$u.toast('该物料已存在') } else { let obj = JSON.parse(JSON.stringify(materail)) obj.newId = item.id this.outboundList.push(obj) console.log(this.outboundList); } } } } </script> <style lang="scss"> .page_dck { .page_dck_title { display: flex; align-items: center; .page_dck_title_x { width: 8rpx; height: 30rpx; background: #4275FC; border-radius: 2rpx; margin-right: 16rpx; } span { font-size: 32rpx; font-weight: 500; color: #222222; } } } .page_content { margin-top: 36rpx; .page_content_title { display: flex; flex-direction: column; margin-bottom: 10rpx; .page_content_title_top { display: flex; align-items: center; justify-content: space-between; span { &:nth-child(1) { font-size: 30rpx; font-weight: 500; color: #222222; } &:nth-child(2) { flex-shrink: 0; font-size: 24rpx; font-weight: 400; color: #333333; span { font-size: 24rpx; color: $nav-color; } } } } .page_content_title_bottom { .green { color: $nav-stateColor7 !important; .black { color: black !important; } } .warning { color: $nav-stateColor5 !important; .black { color: black !important; } } .error { color: $nav-stateColor4 !important; .black { color: black !important; } } span { font-size: 24rpx; font-weight: 400; color: #666666; } } } .lineBorder { border: none !important; padding-bottom: 0 !important; margin-bottom: 24rpx; } .page_content_list { width: 100%; display: flex; align-items: center; flex-wrap: wrap; &:first-child { margin: 0; } &:last-child { border: none; } .page_content_list_nums { width: 30%; display: flex; .page_content_list_num_label { font-size: 26rpx; font-weight: 400; color: #666666; } .page_content_list_num_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } .page_content_list_num { width: 70%; display: flex; .page_content_list_num_label { font-size: 26rpx; font-weight: 400; color: #666666; } .page_content_list_num_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } .page_content_list_items { width: 30%; display: flex; margin-top: 24rpx; .page_content_list_item_label { font-size: 26rpx; font-weight: 400; color: #666666; flex-shrink: 0; } .page_content_list_item_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } .page_content_list_item { width: 70%; display: flex; .page_content_list_item_label { font-size: 26rpx; font-weight: 400; color: #666666; flex-shrink: 0; } .page_content_list_item_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } } } .page_h { height: 20rpx; } .page_yxwl { padding: 30rpx; background: #ffffff; .page_yxwl_title { display: flex; align-items: center; justify-content: space-between; .page_yxwl_title_x { width: 8rpx; height: 30rpx; background: #4275FC; border-radius: 2rpx; margin-right: 16rpx; } span { font-size: 32rpx; font-weight: 500; color: #222222; } .left { display: flex; align-items: center; .page_yxwl_title_x { width: 8rpx; height: 30rpx; background: #4275FC; border-radius: 2rpx; margin-right: 16rpx; } span { font-size: 32rpx; font-weight: 500; color: #222222; } } .right { display: flex; align-items: center; img { width: 28rpx; height: 28rpx; margin-right: 14rpx; } span { font-size: 26rpx; font-weight: 400; color: #222222; } } } .page_yxwl_list { display: flex; flex-direction: column; padding-bottom: 30rpx; border-bottom: 1rpx solid #ececec; &:last-child { margin-bottom: 0; border: none; } .page_yxwl_list_item { margin-top: 28rpx; .page_yxwl_list_item_top { display: flex; align-items: center; justify-content: space-between; .page_yxwl_list_item_top_left { font-size: 30rpx; font-weight: 500; color: #222222; } } .page_yxwl_list_item_sx { display: flex; align-items: center; margin-top: 15rpx; } .page_yxwl_list_item_num { display: flex; position: relative; margin-top: 36rpx; &:first-child { margin-top: 0; } .dele { position: absolute; right: -30rpx; width: 48rpx; height: 48rpx; img { width: 100%; height: 100%; } } .item { width: 50%; display: flex; align-items: center; .label { flex-shrink: 0; font-size: 26rpx; font-weight: 400; color: #666666; flex-shrink: 0; } .nr { flex: 1; display: flex; align-items: center; input { width: 130rpx; height: 40rpx; border-radius: 8rpx; border: 1rpx solid #E5E5E5; margin-right: 10rpx; } span { font-size: 26rpx; font-weight: 400; color: #222222; } } } } } } .page_yxwl_kong { padding: 50rpx 0; font-size: 25rpx; display: flex; align-items: center; justify-content: center; } } .page_zw { height: 160rpx; } .page_footer { width: calc(100% - 60rpx); background: #F7F7F7; display: flex; align-items: center; justify-content: space-between; position: fixed; bottom: 0; left: 30rpx; padding-bottom: 68rpx; z-index: 9999; .page_footer_qr { flex: 1; height: 88rpx; background: #fff; box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.08); border-radius: 8rpx; font-size: 32rpx; font-weight: 500; color: $nav-color; display: flex; align-items: center; justify-content: center; img { width: 30rpx; height: 30rpx; margin-right: 12rpx; } } .page_footer_ck { flex: 1; height: 88rpx; background: $nav-color; box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.08); border-radius: 8rpx; font-size: 32rpx; font-weight: 500; color: #FFFFFF; display: flex; align-items: center; justify-content: center; } } }, dele(index) { this.outboundList.splice(index, 1) }, submit() { if (this.type == QRCodeType.ZKD) { if (this.outboundList.length > 0) { let result = this.outboundList.reduce((a, b) => { if (a[b.newId]) { a[b.newId].push(b); } else { a[b.newId] = [b]; } return a; }, {}); let tempList = this.warehouseList[0].wtransferDetailList for (let i = 0; i < tempList.length; i++) { let item = tempList[i] for (let a in result) { if (item.id == a) { let total = 0 for (let b = 0; b < result[a].length; b++) { total = Number(total) + Number(result[a][b].num) } if (!total || total <= 0) { uni.$u.toast('出库物料数量必须大于0') return } console.log(total, item.outPlannum); if (total > item.outPlannum) { uni.$u.toast('出库数量不能大于待出库数量') return } } } } let submitTransferOutDetailDTOList = [] this.outboundList.forEach(item => { tempList.forEach(child => { if (item.newId == child.id) { submitTransferOutDetailDTOList.push({ outNum: item.num, wstockId: item.id, wtransferDetailId: child.id }) } }) }) transferToOutNew({ submitTransferOutDetailDTOList, wtransferId: this.id }).then(res => { if (res.code === 200) { this.$store.dispatch('getUpcomingNum') uni.$u.toast('操作成功') uni.$emit('success') uni.redirectTo({ url: `/pages_adjust/pages/warehousingDetails/warehousingDetails?id=${this.id}&dbid=${this.dbid}` }) // setTimeout(() => { // router.replace({ name: 'wTransferDetail', query: { id: info.value.wtransfer.id, dbid: route.query.dbid } }) // }, 2000) } }) } else { uni.$u.toast('请选择出库物料') } } else if (this.type === QRCodeType.CKD) { wOutBoundForUpload({ id: this.id, wOutboundType: 0 }).then(res => { if (res.code === 200) { this.$store.dispatch('getUpcomingNum') uni.$u.toast('操作成功') uni.$emit('success') uni.redirectTo({ url: `/pages_adjust/pages/outboundDetails/outboundDetails?id=${this.id}` }) // setTimeout(() => { // // router.go(-1) // router.replace({ name: 'wOutboundDetail', query: { id: info.value.wtransfer.id } }) // }, 2000) } }) } } } } </script> <style lang="scss"> .page_dck { .page_dck_title { display: flex; align-items: center; .page_dck_title_x { width: 8rpx; height: 30rpx; background: #4275FC; border-radius: 2rpx; margin-right: 16rpx; } span { font-size: 32rpx; font-weight: 500; color: #222222; } } } .page_content { margin-top: 36rpx; .page_content_title { display: flex; flex-direction: column; margin-bottom: 10rpx; .page_content_title_top { display: flex; align-items: center; justify-content: space-between; span { &:nth-child(1) { font-size: 30rpx; font-weight: 500; color: #222222; } &:nth-child(2) { flex-shrink: 0; font-size: 24rpx; font-weight: 400; color: #333333; span { font-size: 24rpx; color: $nav-color; } } } } .page_content_title_bottom { .green { color: $nav-stateColor7 !important; .black { color: black !important; } } .warning { color: $nav-stateColor5 !important; .black { color: black !important; } } .error { color: $nav-stateColor4 !important; .black { color: black !important; } } span { font-size: 24rpx; font-weight: 400; color: #666666; } } } .lineBorder { border: none !important; padding-bottom: 0 !important; margin-bottom: 24rpx; } .page_content_list { width: 100%; display: flex; align-items: center; flex-wrap: wrap; &:first-child { margin: 0; } &:last-child { border: none; } .page_content_list_nums { width: 30%; display: flex; .page_content_list_num_label { font-size: 26rpx; font-weight: 400; color: #666666; } .page_content_list_num_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } .page_content_list_num { width: 70%; display: flex; .page_content_list_num_label { font-size: 26rpx; font-weight: 400; color: #666666; } .page_content_list_num_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } .page_content_list_items { width: 30%; display: flex; margin-top: 24rpx; .page_content_list_item_label { font-size: 26rpx; font-weight: 400; color: #666666; flex-shrink: 0; } .page_content_list_item_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } .page_content_list_item { width: 70%; display: flex; .page_content_list_item_label { font-size: 26rpx; font-weight: 400; color: #666666; flex-shrink: 0; } .page_content_list_item_nr { font-size: 26rpx; font-weight: 400; color: #222222; } } } } .page_h { height: 20rpx; } .page_yxwl { padding: 30rpx; background: #ffffff; .page_yxwl_title { display: flex; align-items: center; justify-content: space-between; .page_yxwl_title_x { width: 8rpx; height: 30rpx; background: #4275FC; border-radius: 2rpx; margin-right: 16rpx; } span { font-size: 32rpx; font-weight: 500; color: #222222; } .left { display: flex; align-items: center; .page_yxwl_title_x { width: 8rpx; height: 30rpx; background: #4275FC; border-radius: 2rpx; margin-right: 16rpx; } span { font-size: 32rpx; font-weight: 500; color: #222222; } } .right { display: flex; align-items: center; img { width: 28rpx; height: 28rpx; margin-right: 14rpx; } span { font-size: 26rpx; font-weight: 400; color: #222222; } } } .page_yxwl_list { display: flex; flex-direction: column; padding-bottom: 30rpx; border-bottom: 1rpx solid #ececec; &:last-child { margin-bottom: 0; border: none; } .page_yxwl_list_item { margin-top: 28rpx; .page_yxwl_list_item_top { display: flex; align-items: center; justify-content: space-between; .page_yxwl_list_item_top_left { font-size: 30rpx; font-weight: 500; color: #222222; } } .page_yxwl_list_item_sx { display: flex; align-items: center; margin-top: 15rpx; font-size: 24rpx; } .page_yxwl_list_item_num { display: flex; position: relative; margin-top: 36rpx; &:first-child { margin-top: 0; } .dele { position: absolute; right: -30rpx; width: 48rpx; height: 48rpx; img { width: 100%; height: 100%; } } .item { width: 50%; display: flex; align-items: center; .label { flex-shrink: 0; font-size: 26rpx; font-weight: 400; color: #666666; flex-shrink: 0; } .nr { flex: 1; display: flex; align-items: center; input { width: 130rpx; height: 40rpx; border-radius: 8rpx; border: 1rpx solid #E5E5E5; margin-right: 10rpx; } span { font-size: 26rpx; font-weight: 400; color: #222222; } } } } } } .page_yxwl_kong { padding: 50rpx 0; font-size: 25rpx; display: flex; align-items: center; justify-content: center; } } .page_zw { height: 160rpx; } .page_footer { width: calc(100% - 60rpx); background: #F7F7F7; display: flex; align-items: center; justify-content: space-between; position: fixed; bottom: 0; left: 30rpx; padding-bottom: 68rpx; z-index: 9999; .page_footer_qr { flex: 1; height: 88rpx; background: #fff; box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.08); border-radius: 8rpx; font-size: 32rpx; font-weight: 500; color: $nav-color; display: flex; align-items: center; justify-content: center; img { width: 30rpx; height: 30rpx; margin-right: 12rpx; } } .page_footer_ck { flex: 1; height: 88rpx; background: $nav-color; box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.08); border-radius: 8rpx; font-size: 32rpx; font-weight: 500; color: #FFFFFF; display: flex; align-items: center; justify-content: center; } } </style> minipro_standard/uni.scss
@@ -111,6 +111,7 @@ image { display: block; } /* #endif */ minipro_standard/uni_modules/l-calendar/components/l-calendar/l-calendar.vue
@@ -691,7 +691,7 @@ justify-content: center; flex-direction: column; background-color: #fff; padding: 0 42rpx env(safe-area-inset-bottom); padding: 0 42rpx calc(env(safe-area-inset-bottom) + 20rpx); box-sizing: border-box; font-size: 24rpx; color: #666; @@ -703,7 +703,7 @@ .calendar-btn { width: 100%; button { background-color: #305ED5; color: #fff; platform_web/src/components/system/role/OperaRoleWindow.vue
@@ -68,7 +68,7 @@ for (const key in this.form) { this.form[key] = target[key] } this.type = type this.form.type = type }) }, confirm () { platform_web/src/views/system/role.vue
@@ -16,7 +16,7 @@ <!-- 表格和分页 --> <template v-slot:table-wrap> <ul class="toolbar" v-permissions="['system:role:create', 'system:role:delete']"> <li v-permissions="['system:role:create']"><el-button type="primary" @click="$refs.operaRoleWindow.open('新建角色', null, 1)" icon="el-icon-plus">新建</el-button></li> <li v-permissions="['system:role:create']"><el-button type="primary" @click="$refs.operaRoleWindow.open('新建角色', null, 0)" icon="el-icon-plus">新建</el-button></li> <li v-permissions="['system:role:delete']"><el-button @click="deleteByIdInBatch" icon="el-icon-delete">删除</el-button></li> </ul> <el-table @@ -48,9 +48,9 @@ fixed="right" > <template v-if="isAdmin || (row.code !== adminCode && userInfo.roles.findIndex(code => code === row.code) === -1)" slot-scope="{row}"> <el-button type="text" @click="$refs.operaRoleWindow.open('编辑角色', row, 1)" v-permissions="['system:role:update']">编辑</el-button> <el-button type="text" @click="$refs.permissionConfigWindow.open(row)" v-permissions="['system:role:createRolePermission']">配置权限</el-button> <el-button type="text" @click="$refs.menuConfigWindow.open('授权菜单', row)" icon="el-icon-menu" v-permissions="['system:role:createRoleMenu']">授权菜单</el-button> <el-button type="text" @click="$refs.operaRoleWindow.open('编辑角色', row, 0)" v-permissions="['system:role:update']">编辑</el-button> <el-button type="text" @click="$refs.permissionConfigWindow.open(row, 0)" v-permissions="['system:role:createRolePermission']">配置权限</el-button> <el-button type="text" @click="$refs.menuConfigWindow.open('授权菜单', row, 0)" icon="el-icon-menu" v-permissions="['system:role:createRoleMenu']">授权菜单</el-button> <el-button v-if="!row.fixed" type="text" style="color: red" @click="deleteById(row)" v-permissions="['system:role:delete']">删除</el-button> </template>