小小儁爺
2024-06-04 909097fb4e143250de194c928d91cc95a4ed2c5a
1.生产报工2.外协收发料功能优化
已添加4个文件
已修改7个文件
5249 ■■■■■ 文件已修改
.hbuilderx/launch.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/drag-ball/drag-ball.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages.json 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/scgl/scbg.vue 1204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/scgl/scbg2.vue 927 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/wwgl/wxfl.vue 805 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/wwgl/wxfl2.vue 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/wwgl/wxsl.vue 1056 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/wwgl/wxsl2.vue 682 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/znfx/chda.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/znfx/scjd.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.hbuilderx/launch.json
@@ -2,7 +2,7 @@
    "version" : "1.0",
    "configurations" : [
        {
            "playground" : "custom",
            "playground" : "standard",
            "type" : "uni-app:app-android"
        },
        {
components/drag-ball/drag-ball.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,75 @@
<template>
    <view class="holdon">
        <image class="ball" :style="'left:'+(moveX == 0 & x>0? x:moveX)+'px;top:'+(moveY == 0 & y>0? y:moveY)+'px'"
            @touchstart="drag_start" @touchmove.prevent="drag_hmove" :src="image" mode="aspectFill">
        </image>
    </view>
</template>
<script>
    export default {
        props: {
            x: {
                type: Number,
                default: 0
            },
            y: {
                type: Number,
                default: 0
            },
            image: {
                type: String,
                default: ''
            }
        },
        data() {
            return {
                start: [0, 0],
                moveY: 0,
                moveX: 0
            }
        },
        methods: {
            drag_start(event) {
                this.start[0] = event.touches[0].clientX - event.target.offsetLeft;
                this.start[1] = event.touches[0].clientY - event.target.offsetTop;
            },
            drag_hmove(event) {
                let tag = event.touches;
                this.moveX = tag[0].clientX - this.start[0];
                this.moveY = tag[0].clientY - this.start[1];
            }
        }
    }
</script>
<style lang="less">
    .holdon {
        width: 100%;
        height: 100%;
    }
    .ball {
        // width: 70upx;
        // height: 70upx;
        // background: linear-gradient(to bottom, #F8F8FF, #87CEFA);
        // border-radius: 50%;
        // box-shadow: 0 0 15upx #87CEFA;
        // color: #fff;
        // font-size: 30upx;
        width: 70px;
        height: 70px;
        border-radius: 50%;
        margin: auto;
        background: url('@/static/img/scan.png') no-repeat;
        box-shadow: #436df5 0px 0px 20px;
        background-size: 100% 100%;
        display: flex;
        justify-content: center;
        align-items: center;
        position: fixed !important;
        z-index: 1000000;
    }
</style>
pages.json
@@ -200,6 +200,14 @@
            }
        },
        {
            "path": "pages/scgl/scbg2",
            "style": {
                "navigationBarTitleText": "生产报工",
                "navigationStyle": "custom",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/wwgl/wxfl",
            "style": {
                "navigationBarTitleText": "外协发料",
@@ -208,6 +216,14 @@
            }
        },
        {
            "path": "pages/wwgl/wxfl2",
            "style": {
                "navigationBarTitleText": "外协发料",
                "navigationStyle": "custom",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/wwgl/wxsl",
            "style": {
                "navigationBarTitleText": "外协收料",
@@ -216,6 +232,14 @@
            }
        },
        {
            "path": "pages/wwgl/wxsl2",
            "style": {
                "navigationBarTitleText": "外协收料",
                "navigationStyle": "custom",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/znfx/scfx",
            "style": {
                "navigationBarTitleText": "生产分析",
pages/scgl/scbg.vue
@@ -3,333 +3,223 @@
        <page-nav title="生产报工"></page-nav>
        <view v-show="topContent.length===0">
            <div class="sacnBody">
                <div class="scanImg" @click="topScanClick"></div>
                <div class="scanText">请扫描任务条码</div>
            </div>
        <view class="flex_center" style="margin: 20rpx;">
            <!-- #ifdef H5 -->
            <u--input prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" :placeholder="placeholder"
                style="width:100%;background-color: #fff;border-radius: 40rpx;" border="surround" suffixIcon="scan"
                suffixIconStyle="color: #909399;font-size: 22px;" v-model="inputBoxValue"
                @change="confirmInputBoxValue">
                <template slot="suffix">
                    <u-icon name="scan" color="#909399" size="24" @click="scanClick"></u-icon>
                </template>
            </u--input>
            <!-- #endif -->
            <!-- #ifdef APP-PLUS -->
            <u-input prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" :placeholder="placeholder"
                style="width:100%;background-color: #fff;border-radius: 40rpx;" border="surround" suffixIcon="scan"
                suffixIconStyle="color: #909399;font-size: 22px;" v-model="inputBoxValue"
                @change="confirmInputBoxValue">
                <template slot="suffix">
                    <u-icon name="scan" color="#909399" size="24" @click="scanClick"></u-icon>
                </template>
            </u-input>
            <!-- #endif -->
            <view class="flex_center marginLeft20" @click="popupShow=true">
                <u--text size='16' color='#909399' text="筛选"></u--text>
                <u--image :showLoading="true" src="../../static/img/sift.png" width="20px" height="20px"></u--image>
            </view>
        </view>
        <view v-show="topContent.length!==0">
            <view class="mainContent" :style="{maxHeight:'1260rpx',overflow: 'scroll'}">
                <!-- æŠ¥å·¥ä¿¡æ¯ -->
                <u-gap height="5" bgColor="#eff0f1"></u-gap>
                <view class="head" style="padding-bottom: 10rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                æŠ¥å·¥ä¿¡æ¯
                            </view>
                        </view>
                    </view>
                    <view class="marginTop20 marginLeft20 marginRight20 flex_between">
                        <u-radio-group class="flex_column">
                            <view class="marginBottom20 " v-for="(item,index) in topContent" :key="item.wo_code">
                                <view class="flex_between">
                                    <view style="display: flex;">
                                        <view class="flex_column titleFont">
                                            <view>工单编号:</view>
                                            <view>产品编码:</view>
                                            <view>产品名称:</view>
                                            <view>产品规格:</view>
                                            <view>当前工序:</view>
                                            <view>任务数量:</view>
                                            <view>未报/已报:</view>
                                            <view>下道工序:</view>
                                        </view>
                                        <view class="flex_column contentFont">
                                            <view>{{item.wo_code}}</view>
                                            <view>{{item.partnumber}}</view>
                                            <view>{{item.partname}}</view>
                                            <view>{{item.partspec.toString().length===0?'/':item.partspec}}</view>
                                            <view>{{item.stepname}}</view>
                                            <view>{{item.planqty}}</view>
                                            <view>{{item.noreportqty}}/{{item.reportqty}}</view>
                                            <view>{{item.nextstepname?item.nextstepname:'/'}}</view>
                                        </view>
                                    </view>
        <u-alert :title="alertTitle" type="info"></u-alert>
                                </view>
        <!-- æŠ˜å é¢æ¿ -->
        <!-- <u-collapse @change="change" @close="close" @open="open"> -->
        <!-- @change="collapseChange" -->
        <u-collapse style="max-height: 590px;overflow: auto;">
            <!-- :value='parseFloat(item.ordergoodqty)+"/"+parseFloat(item.orderqty)' -->
            <u-collapse-item style="position: relative;" :title="item.ordercode" :name='item.ordercode'
                :value='parseFloat(item.ordergoodqty)+"/"+parseFloat(item.orderqty)'
                :label="item.children.length===0?'未派发':''" :disabled='item.children.length===0'
                v-for="item in collapseArr" :key="item.ordercode">
                            </view>
                        </u-radio-group>
                    </view>
                <view style="position: absolute;width: 200rpx;left: 30rpx;top:34px;font-size: 24rpx;color: #999;">
                    {{item.partname}} {{item.partspec}}
                </view>
                <!-- æŠ¥å·¥æ“ä½œ -->
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <view class="head  marginLeft10 marginRight10" style="padding-bottom: 20rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                æŠ¥å·¥æ“ä½œ
                            </view>
                        </view>
                <!-- <view style="position: absolute;width: 26%;left: 44%;top:16px;"> -->
                <view style="position: absolute;width: 120px;left: 44%;top:16px;color:#0659ff"
                    @click="progressClick(item.ordercode)">
                    <!-- {{item.partname}}{{item.partspec}} -->
                    <u-line-progress :percentage="parseFloat((item.ordergoodqty*100/item.orderqty).toFixed(2))"
                        inactiveColor="#d1d6f5" height="10" activeColor="#0659ff"></u-line-progress>
                </view>
                <!--             <view style="position: absolute;width: 100px;right: 33px;  top:13px; ">
                    <view class="" style="display: flex;justify-content: flex-end;">
                        <view style="color: #0659ff;">
                            {{parseFloat(item.ordergoodqty)}}
                        </view>
                        <view>
                            /{{ parseFloat(item.orderqty)}}
                        </view>
                    </view>
                </view>
 -->
                <view v-if="radiovalue==='生产工单'" style="margin:0 0  5px">
                    <view class="flex_column">
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                            <view style="display: flex;" class="titleFont">
                                <view style="color: red;margin-right: 6rpx;">*</view> è®¡ä»¶æ–¹å¼ï¼š
                            </view>
                            <u-radio-group v-model="reckway" @change='radioGroupChange'>
                                <u-radio shape="circle" label="班组" name="班组" labelSize="16"></u-radio>
                                <u-radio shape="circle" label="个人" style="margin-left: 20rpx;" name="个人" labelSize="16">
                                </u-radio>
                            </u-radio-group>
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品编码:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partcode}}</view>
                        </view>
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;"
                            v-if="reckway==='班组'">
                            <view style="display: flex;" class="titleFont">
                                <view style="color: red;margin-right: 6rpx;">*</view> ç”Ÿäº§ç­ç»„:
                            </view>
                            <view @click='userGroupSheetClick' class="custominputClass">
                                <view v-show='userGroupSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='userGroupSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{userGroupSheetValue}}
                                </view>
                                <u-icon :name="!userGroupSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品名称:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partname}}</view>
                        </view>
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品规格:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partspec?item.partspec:'/'}}
                            </view>
                        </view>
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                            <!-- v-if="reckway==='个人'" -->
                            <view style="display: flex;" class="titleFont">
                                <view style="color: red;margin-right: 6rpx;">*</view> æŠ¥å·¥äººå‘˜ï¼š
                            </view>
                            <view @click='operSheetClick' class="custominputClass">
                                <view v-show='operSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='operSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{operSheetValue}}
                                </view>
                                <u-icon :name="!operSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                            <view style="display: flex;" class="titleFont">
                                <view style="color: #fff;margin-right: 6rpx;">*</view> è®¾å¤‡åç§°ï¼š
                            </view>
                            <view @click='epqSheetClick' class="custominputClass">
                                <view v-show='eqpSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='eqpSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{eqpSheetValue}}
                                </view>
                                <u-icon :name="!eqpSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                        <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                            <view style="color: red;margin-right: 6rpx;">*</view> æŠ¥å·¥æ•°é‡ï¼š
                            <view class='inputClass'>
                                <u--input placeholder="请输入" :adjustPosition='false' border="surround" type='number'
                                    v-model="reportqty">
                                </u--input>
                            </view>
                        </view>
                    </view>
                </view>
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <!-- {{item.children}} -->
                <!-- <u--text class="u-collapse-content"> -->
                <u-steps :current="-1" inactiveColor='#0659FF' direction="column">
                    <view v-for="(it,ind) in item.children" :key="item.ordercode+it.name+ind"
                        @click="gotoPage(item.ordercode,it.code)" style="display: flex;align-items: center;">
                <view class="head  marginLeft10 marginRight10" style="padding-bottom: 20rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                ä¸è‰¯ç»Ÿè®¡
                        <u-steps-item :title="it.code+'/'+it.name+it.spec"></u-steps-item>
                        <view class="" style="width: 100px;">
                            <u-line-progress :percentage="parseFloat((it.goodqty*100/it.planqty).toFixed(2))"
                                inactiveColor="#d1d6f5" height="10" activeColor="#0659ff"></u-line-progress>
                        </view>
                        <view style="width: 30%;text-align: right;">
                            <view class="" style="display: flex;justify-content: flex-end;">
                                <view style="color: #0659ff;">
                                    {{parseFloat(it.goodqty)}}
                                </view>
                                <view>
                                    /{{ parseFloat(it.planqty)}}
                                </view>
                            </view>
                        </view>
                    </view>
                    <view class="flex_column ">
                </u-steps>
                <!-- </u--text> -->
                        <u-button type="primary" :plain="true" icon='plus-circle' text="添加"
                            style="width: 90%;margin: 20rpx auto;" @click="add"></u-button>
            </u-collapse-item>
        </u-collapse>
                        <view v-for='(item,index) in ngqtyArr' class="badSheetClass" :key="item.uid">
        <!-- å¼¹å‡ºå±‚ -->
        <!-- closeIconPos='top-left' closeOnClickOverlay  closeable='true' -->
        <u-popup :show="popupShow" mode="right" @close="popupClose" @open="popupOpen">
            <view style="margin: 120px 10px 20px;" class="flex_column">
                            <view class="badNumber">{{index+1}}</view>
                            <u-icon name="trash" size="20" class="trash" v-if="ngqtyArr.length!==1"
                                @click="trashDelete(index)" color="rgb(0, 102, 255)"></u-icon>
                            <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                                <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯æ•°é‡ï¼š
                                <view class='inputClass'>
                                    <u--input placeholder="请输入" border="surround" :adjustPosition='false' type='number'
                                        v-model="item.ngqty"></u--input>
                                </view>
                            </view>
                            <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                                <view style="display: flex;" class="titleFont">
                                    <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯åŽŸå› ï¼š
                                </view>
                                <view @click='badSheetClick(item)' class="custominputClass">
                                    <view v-show='item.badSheetValue.length===0' style="color: rgb(192, 196, 204);">请选择
                                    </view>
                                    <view v-show='item.badSheetValue.length!==0' class="ellipsis"
                                        style="width: 390rpx;">
                                        {{item.badSheetValue}}
                                    </view>
                                    <u-icon :name="item.arrowDown?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                                </view>
                            </view>
                            <u-divider></u-divider>
                        </view>
                <!--         <view style="display: flex;">
                    <view>
                        å•据类型:
                    </view>
                    <u-radio-group v-model="radiovalue" placement="column" @change="groupChange"
                        style="margin-top: 4px;">
                        <u-radio :customStyle="{marginBottom: '8px'}" v-for="(item, index) in radiolist"
                            :key="index+item.name" :label="item.name" iconSize='16' labelSize='16' :name="item.name">
                        </u-radio>
                    </u-radio-group>
                </view> -->
                <view style="margin-top: 20px;display: flex;align-items: center;">
                    <view class="">
                        äº§å“ä¿¡æ¯ï¼š
                    </view>
                    <view class="">
                        <u-button :hairline="true" shape="circle" icon="map" :plain="true"
                            style="width: 100px;height: 26px;" type="primary" text="选择产品" @click="chosePart"></u-button>
                    </view>
                </view>
                <view style="display: flex;flex-wrap: wrap;">
                    <u-tag style="width:220rpx;" :text="item.name" v-for="item in tagArr" :key="item.code"
                        :closable="true" :show="item.close" @close="tagClose(item)"></u-tag>
                </view>
                <!--     <view class="head" style="margin-top: 10px;">
                    <view class="head_block" style="height: 80rpx; display: flex;justify-content: space-around;">
                        <u-button :plain='today' style="width: 70px;height: 25px;" @click="dateChange('today')"
                            type="primary" shape="circle" text="今日">
                        </u-button>
                        <u-button :plain='month' style="width: 70px;height: 25px;" @click="dateChange('month')"
                            type="primary" shape="circle" text="本月">
                        </u-button>
                        <u-button :plain='custom' style="width: 70px;height: 25px;" @click="dateChange('custom')"
                            type="primary" shape="circle" text="自定义"></u-button>
                    </view>
                </view>
                <view v-if="!custom" class="flex_column"
                    style="display: flex;justify-content: space-around;width: 100%;">
                    <view class="" style="display: flex;justify-content: space-evenly;width: 100%;">
                        <view class="titleFont">开始日期</view>
                        <view class="titleFont">~</view>
                        <view class="titleFont">结束日期</view>
                    </view>
                    <u-button type="info" icon='calendar' iconColor="#0659FF" size="" @click="calendarClick"
                        :text="calendarRange">
                    </u-button>
                </view> -->
                <!-- <uni-calendar ref="calendar" :range='true' :insert="false" @confirm="calendarConfirm" /> -->
            </view>
        </u-popup>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <u-button size="large" :loading="isDisabledSubmitButton" loadingText="正在提交,请稍等..." type="primary"
                @click="submit" text="报工">
            </u-button>
            <!-- ç”Ÿäº§ç­ç»„ -->
            <u-picker v-if="topContent.length!==0" :show="userGroupSheetShow" :columns="userGroupColumns"
                :itemHeight='55' :closeOnClickOverlay='true' @close='userGroupSheetShow=false'
                @confirm='userGroupPickerConfirm' @cancel='userGroupSheetShow=false'>
            </u-picker>
            <!--  è®¾å¤‡åç§° -->
            <u-picker v-if="topContent.length!==0" :show="eqpSheetShow" :columns="eqpColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='eqpSheetShow=false' @confirm='eqpPickerConfirm'
                @cancel='eqpSheetShow=false'>
            </u-picker>
            <!-- ä¸è‰¯åŽŸå›  -->
            <u-action-sheet v-if="topContent.length!==0" :actions="badSelectArr" :safeAreaInsetBottom='true'
                :closeOnClickOverlay="true" :closeOnClickAction="true" @close="badSelectClose" :show="badSheetShow"
                @select='badSheetSelect'>
                <view style="min-height: 100rpx;">
                    <u-checkbox-group @change="checkboxChange" size='20px' v-model="checkBoxValue" iconPlacement="right"
                        placement="column">
                        <view v-for="(item,index) in badSelectArr">
                            <u-checkbox activeColor="rgb(0, 102, 255)" labelSize='18' :key="item.code+index"
                                :name='item.name' :label="item.name">
                            </u-checkbox>
                        </view>
                    </u-checkbox-group>
                </view>
            </u-action-sheet>
            <!--  æŠ¥å·¥äººå‘˜ -->
            <u-action-sheet v-if="topContent.length!==0" :actions="userSelectArrAll" :safeAreaInsetBottom='true'
                :closeOnClickOverlay="true" :closeOnClickAction="true" @close="userSheetShow=false"
                :show="userSheetShow" @select='userSheetSelect'>
                <view style="min-height: 100rpx;padding: 20rpx 20rpx 30rpx 20rpx;">
                    <u-checkbox-group @change="userCheckboxChange" size='20px' v-model="userCheckBoxValue"
                        iconPlacement="right" placement="column">
                        <view v-for="(item,index) in userSelectArrAll">
                            <u-checkbox activeColor="rgb(0, 102, 255)" labelSize='18' :key="item.code+index"
                                :name='item.name' :label="item.name">
                            </u-checkbox>
                        </view>
                    </u-checkbox-group>
                </view>
            </u-action-sheet>
            <!-- æŠ¥å·¥äººå‘˜ -->
            <u-picker v-if="topContent.length!==0" :show="operSheetShow" :columns="operColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='operSheetShow=false' @confirm='operPickerConfirm'
                @cancel='operSheetShow=false'>
            </u-picker>
        </view>
        <!--     <view v-show="topContent.length!==0" style="position: absolute; bottom: 210rpx;right: 20rpx;">
            <div class="scanImg2" @click="topScanClick"></div>
            </div>
        </view> -->
        <!-- æ‚¬æµ®çƒ -->
        <!--     <view
            v-show="topContent.length!==0&&!userGroupSheetShow&&!eqpSheetShow&&!operSheetShow&&!badSheetShow"
            @click="topScanClick">
            <drag-ball :x='$DeviceInformation.screenWidth*0.8' :y="$DeviceInformation.screenHeight*0.7"></drag-ball>
        </view> -->
        <!-- <scan-code></scan-code> -->
        <!-- æ‚¬æµ®çƒ -->
        <view @click="scan2">
            <drag-ball :x='300' :y="600"></drag-ball>
        </view>
    </view>
</template>
<script>
    import {
        MesOrderStepStart,
        PersonPermissions,
        EqpPermissionsPlus,
        GroupsPermissions,
        GroupsPersonPermissions,
        DefectPermissions,
        SavaMesOrderStepReport,
        LabelBarCode
        ProductionScheduleKanban
    } from '../../config/api.js';
    // import scanCode from '@/components/scan-code/scan-code.vue'
    export default {
        // components: {
        // scanCode
        // },
        onLoad(option) {
            // const _this = this
            // uni.$off('scancodedate') // æ¯æ¬¡è¿›æ¥å…ˆ ç§»é™¤å…¨å±€è‡ªå®šä¹‰äº‹ä»¶ç›‘听器
            // uni.$on('scancodedate', function(content) {
            //     console.log("扫描到的内容为:", content)
            //     // _this.getMesOrderStepStart(content)
            const _this = this
            uni.$off('scancodedate') // æ¯æ¬¡è¿›æ¥å…ˆ ç§»é™¤å…¨å±€è‡ªå®šä¹‰äº‹ä»¶ç›‘听器
            uni.$on('scancodedate', function(content) {
                console.log("扫描到的内容为:", content)
                _this.getCheckScanDeviceQrCodeData(content)
            })
            //     if (_this.topContent.find(i => i.wo_code + ';' + i.stepcode === content)) {
            //         _this.$u.toast('此条码已扫描,已在列表中!')
            //     } else {
            //         _this.getMesOrderStepStart(content)
            //     }
            // })
            console.log(option, 8)
        },
        onPullDownRefresh() {
@@ -342,83 +232,63 @@
        data() {
            return {
                topRightMessageCount: 0,
                isDisabledSubmitButton: false,
                formData: {},
                reckway: '个人', //计件方式    group代表是班组   person ä»£è¡¨æ˜¯ä¸ªäºº
                userGroupSheetValue: '', //生产班组下拉选中的值
                eqpSheetValue: '', //设备名称下拉选中的值
                userGroupSheetList: [], //生产班组下拉数组
                eqpSheetList: [], //设备名称下拉数组
                userGroupSheetShow: false, //上拉列表是否展开
                eqpSheetShow: false,
                topContent: [
                    //     {
                    //     nextstepcode: "GX005",
                    //     nextstepname: "入库",
                    //     noputqty: 0,
                    //     noreportqty: 100,
                    //     partname: "8504光机",
                    //     partnumber: "302",
                    //     partspec: "/",
                    //     planqty: 100,
                    //     reportqty: 0,
                    //     seq: "1",
                    //     startqty: 100,
                    //     stepcode: "GX001",
                    //     stepdesc: "",
                    //     stepname: "领料",
                    //     wo_code: "MO-2022-11-0035_1",
                    // },
                topRightMessageCount: '',
                inputBoxValue: '',
                alertTitle: '',
                popupShow: false, //弹出层是否显示
                collapseArr: [ //折叠面板数据
                ],
                collapseArrAll: [], //所有
                placeholder: '请输入工单信息',
                radiovalue: '生产工单', //单据类型
                // SO:销售订单  MO:生产订单  PO:生产工单
                radiolist: [{
                        name: '销售订单'
                    },
                    {
                        name: '生产订单'
                    },
                    {
                        name: '生产工单'
                    },
                ],
                reportqty: '', //报工数量
                today: true,
                month: false,
                custom: true,
                ngqty: '', //不良数量
                // calendarRange: new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                // 10), //系统当前日期
                calendarRange: new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                    2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10), //当月日期
                ngqtyArr: [{
                        uid: new Date().getTime(),
                        ngqty: '',
                        badSheetValue: '',
                        arrowDown: true //向下箭头
                    },
                tagArr: [
                    // {
                    //     ngqty: '',
                    //     badSheetValue: '',
                    //     arrowDown: true //向下箭头
                    //     close: true,
                    //     name: '电池包',
                    //     code: '1002'
                    // }, {
                    //     close: true,
                    //     name: '电脑',
                    //     code: '1003'
                    // }, {
                    //     close: true,
                    //     name: '8054光机',
                    //     code: '1004'
                    // }, {
                    //     close: true,
                    //     name: 'G71674冲锋枪',
                    //     code: '1005'
                    // }, {
                    //     close: true,
                    //     name: '8051光机',
                    //     code: '1006'
                    // },
                ], //不良数量、不良原因数组
                ], //已选中的产品标签
                badSelectArr: [], //不良原因下拉数组
                badSheetValue: '', //不良原因选中值
                badSheetShow: false,
                checkBoxValue: [], //不良原因显示值
                operSheetValue: '', //操作人员选中值
                operSheetShow: false,
                operSheetList: [], //操作人员数组
                userArr: [], //报工人员信息数组
                userSelectValue: '', //下拉选项值
                userSelectArrAll: [], //所有人员下拉数组
                userSelectArr: [
                    // {
                    //     value: '1001',
                    //     text: '小美1'
                    // },
                ], //人员下拉数组
                userGroupColumns: [], //
                eqpColumns: [], //
                operColumns: [], //
                isAsyncChange: false,
                userCheckBoxValue: [],
                userSheetShow: false
            }
        },
        created() {
@@ -427,124 +297,107 @@
        mounted() {
            this.init()
            // this.getMesOrderStepStart('MO-2024-01-0004_1;102')
            this.getSellectAllApi()
            this.getProductionScheduleKanban()
        },
        methods: {
            init() {
                uni.stopPullDownRefresh();
            },
            async getSellectAllApi() {
                await this.getGroupsPermissions() //获取生产班组
                await this.getEqpPermissionsPlus() //获取设备名称
                await this.getDefectPermissions() //获取缺陷下拉
                await this.getPersonPermissions() //获取操作人员
            },
            gotoPage(p1, p2) {
                let orderstep = null
            //获取生产班组
            async getGroupsPermissions(wkshopcode) {
                const res = await GroupsPermissions()
                if (res.code === '200') {
                    // æ•°ç»„对象  æ›¿æ¢å¯¹è±¡é”®å
                    this.userGroupSheetList = res.data.map(({
                        usergroupcode,
                        usergroupname
                    }) => ({
                        code: usergroupcode,
                        name: usergroupname
                    }))
                    this.userGroupColumns = [this.userGroupSheetList.map(i => i.name)]
                if (p1) {
                    orderstep = p1 + ';' + p2
                } else {
                    orderstep = ''
                }
            },
            // èŽ·å–è®¾å¤‡åç§°
            async getEqpPermissionsPlus() {
                const res = await EqpPermissionsPlus()
                if (res.code === '200') {
                    this.eqpSheetList = res.data
                    this.eqpColumns = [this.eqpSheetList.map(i => i.name)]
                }
            },
            // èŽ·å–ä¸è‰¯åŽŸå› 
            async getDefectPermissions(orderstepqrcode) {
                const res = await DefectPermissions()
                if (res.code === '200') {
                    this.badSelectArr = res.data
                }
            },
            // èŽ·å–æŠ¥å·¥äººå‘˜
            async getPersonPermissions() {
                const res = await PersonPermissions()
                if (res.code === '200') {
                    // this.operSheetList = res.data
                    this.operSheetList = res.data.map(({
                        usercode,
                        username
                    }) => ({
                        code: usercode,
                        name: username
                    }))
                    this.operColumns = [this.operSheetList.map(i => i.name)]
                    this.userSelectArrAll = this.operSheetList
                }
            },
            // æ ¹æ®ç”Ÿäº§ç­ç»„获取人员
            async getGroupsPersonPermissions(groupcode) {
                const res = await GroupsPersonPermissions({
                    groupcode
                uni.navigateTo({
                    url: './scbg2?orderstep=' + orderstep
                })
                if (res.code === '200') {
                    this.userCheckBoxValue = []
            },
                    if (res.data[0].usercode_list && res.data[0].usercode_list.length > 0) {
                        this.userSelectArrAll.forEach(i => {
            getCheckboxValue(val) {
                this.tagArr = []
                val.forEach(i => {
                    this.tagArr.push({
                        close: true,
                        name: i.split('/')[1].trim(),
                        code: i.split('/')[0].trim()
                    })
                })
            },
                            if (res.data[0].usercode_list.split(',').includes(i.code)) {
                                this.userCheckBoxValue.push(i.name)
                            }
                        })
                    }
                    this.operSheetValue = this.userCheckBoxValue.join(',')
            // æŽ¥å£èŽ·å–
            async getProductionScheduleKanban() {
                let ordertype = '' // SO:销售订单  MO:生产订单  PO:生产工单
                switch (this.radiovalue) {
                    case '生产工单':
                        this.alertTitle = '工单数量(共/个)'
                        this.placeholder = '请输入工单信息'
                        ordertype = 'PO'
                        break
                    case '生产订单':
                        this.alertTitle = '生产订单数量(共/个)'
                        this.placeholder = '请输入生产订单信息'
                        ordertype = 'MO'
                        break
                    case '销售订单':
                        this.alertTitle = '销售订单数量(共/个)'
                        this.placeholder = '请输入销售订单信息'
                        ordertype = 'SO'
                        break
                }
            },
            userSheetSelect() {
            },
            userCheckboxChange(val) {
                this.userCheckBoxValue = val.join(',')
            },
            //获取开工信息
            async getMesOrderStepStart(orderstepqrcode) {
                const data = {
                    OperType: 'ZZ',
                    SelectType: '',
                    wocode: orderstepqrcode ? orderstepqrcode.split(';')[0] : '',
                    stepcode: orderstepqrcode ? orderstepqrcode.split(';')[1] : ''
                    ordertype,
                    partcode: this.tagArr.map(i => i.code).join(','),
                    Ratetime: this.calendarRange,
                }
                const res = await MesOrderStepStart(this.global.formatData(data))
                if (res.code === '200' && res.count === 1) {
                    this.formData = res.data
                    this.topContent.unshift(res.data)
                } else if (res.code === '200' && res.count !== 1) {
                    this.$u.toast('此工序已报工!')
                }
                const {
                    data: res
                } = await ProductionScheduleKanban(data)
                this.collapseArr = res
                this.collapseArrAll = res
                this.alertTitle = this.alertTitle.split('/')[0] + this.collapseArr.length + this.alertTitle.split('/')[
                    1]
            },
            // æ‰«ç äº‹ä»¶
            //输入框回车确认事件
            confirmInputBoxValue(val) {
                this.collapseArr = this.collapseArrAll.filter((p) => {
                    return p.ordercode.indexOf(val) !== -1
                })
                switch (this.radiovalue) {
                    case '生产工单':
                        this.alertTitle = '工单数量(共/个)'
                        break
                    case '生产订单':
                        this.alertTitle = '生产订单数量(共/个)'
                        break
                    case '销售订单':
                        this.alertTitle = '销售订单数量(共/个)'
                        break
                }
                this.alertTitle = this.alertTitle.split('/')[0] + this.collapseArr.length + this.alertTitle.split('/')[
                    1]
            },
            // ç‚¹å‡»æ‰«ç 
            scanClick() {
                this.topScanClick()
            },
            // æ‰«ç æ¡†ç‚¹å‡»
            topScanClick() {
                let that = this;
@@ -555,12 +408,36 @@
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        that.scanContent = res.result;
                        if (that.topContent.find(i => i.wo_code + ';' + i.stepcode === res.result)) {
                            that.$u.toast('此条码已扫描,已在列表中!')
                        } else {
                            that.getMesOrderStepStart(res.result)
                        }
                        that.getCheckScanDeviceQrCodeData(that.scanContent);
                    },
                    complete: function(res) {
                    },
                    fail: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                    }
                });
            },
            scan2() {
                let that = this;
                uni.scanCode({
                    onlyFromCamera: true,
                    // scanType: ['barCode', 'qrCode'],
                    scanType: ['qrCode'],
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        // that.scanContent = res.result;
                        uni.navigateTo({
                            url: './scbg2?orderstep=' + res.result
                        })
                    },
                    complete: function(res) {
@@ -574,256 +451,110 @@
                });
            },
            async submit() {
                // ä¸‹åˆå†™ç”Ÿäº§æŠ¥å·¥æäº¤
            getCheckScanDeviceQrCodeData(code) {
                this.inputBoxValue = code
                this.confirmInputBoxValue(this.inputBoxValue)
            },
                if (this.reckway === '班组' && this.userGroupSheetValue === "") {
                    return uni.$u.toast('生产班组不能为空!')
                }
                if (this.reckway === '个人' && this.operSheetValue === "") {
                    return uni.$u.toast('报工人员不能为空!')
                }
                if (this.eqpSheetValue === "") {
                    return uni.$u.toast('设备名称不能为空!')
                }
                if (this.reportqty === "") {
                    return uni.$u.toast('报工数量不能为空!')
                }
                if (this.reckway === '班组' && this.operSheetValue.length === 0) {
                    return uni.$u.toast('报工人员信息不能为空!')
                }
            // å¼¹å‡ºå±‚æ”¶èµ·
            popupClose() {
                this.getProductionScheduleKanban()
                this.popupShow = false
            },
                let badcode = []
            // å¼¹å‡ºå±‚弹出
            popupOpen() {
                if (this.badSheetValue.length > 0) {
                    this.badSelectArr.forEach(i => {
                        if (this.badSheetValue.split(',').includes(i.name)) {
                            badcode.push(i.code)
                        }
                    })
                }
            },
                let reportuser = []
            // é€‰æ‹©äº§å“
            chosePart() {
                let arr = []
                this.tagArr.forEach(i => {
                    arr.push(i.code + '/' + i.name)
                })
                uni.navigateTo({
                    url: '../znfx/chda?param=' + JSON.stringify(arr)
                });
            },
                if (this.operSheetValue.length > 0) {
                    this.userSelectArrAll.forEach(i => {
                        if (this.operSheetValue.split(',').includes(i.name)) {
                            reportuser.push(i.code)
                        }
                    })
                }
                // ä¸è‰¯åŽŸå› 
                const defectlist = []
                //不良数量
                let ngqtyNumber = 0
                this.ngqtyArr.forEach(i => {
                    if (i.badSheetValue.toString().length > 0) {
                        let codeArr = []
                        ngqtyNumber += parseFloat(i.ngqty)
                        i.badSheetValue.split(',').forEach(j => {
                            codeArr.push(this.badSelectArr.find(i => i.name === j).code)
                        })
                        defectlist.push({
                            badqty: i.ngqty,
                            defect_code: codeArr.join(',')
                        })
            // tag标签关闭
            tagClose(val) {
                this.tagArr.forEach((i, j) => {
                    if (i.code === val.code) {
                        i.close = false
                        this.tagArr.splice(j, 1)
                    }
                })
                if (parseFloat(this.reportqty) + parseFloat(ngqtyNumber) > parseFloat(this.topContent[0]
                        .noreportqty)) {
                    return uni.$u.toast('报工数量加不良数量不能大于未报数量!')
                }
                const D = {
                    rightcode: '0601',
                    partcode: this.topContent[0].partnumber,
                    qty: parseFloat(this.reportqty),
                    onelabqty: parseFloat(this.reportqty)
                }
                const {
                    data: R
                } = await LabelBarCode(D)
                const data = {
                    mesordercode: this.topContent[0].wo_code,
                    partcode: this.topContent[0].partnumber,
                    stepseq: this.topContent[0].seq,
                    stepcode: this.topContent[0].stepcode,
                    stepprice: this.topContent[0].stepprice,
                    eqpcode: this.eqpSheetList.find(i => i.name === this.eqpSheetValue).code,
                    reckway: this.reckway === '班组' ? 'group' : 'person',
                    usergroupcode: this.userGroupSheetValue ? this.userGroupSheetList.find(i => i.name === this
                        .userGroupSheetValue).code : '', // ç­ç»„编码
                    reportuser: this.reckway === '班组' ? reportuser.join(',') : this.userSelectArrAll.find(i => i
                        .name === this.operSheetValue).code,
                    taskqty: this.topContent[0].planqty,
                    startqty: parseFloat(this.reportqty),
                    reportqty: parseFloat(this.reportqty),
                    inbarcode: R[0].labcode, //入库条码
                    defectlist,
                    // defectlist: badcode.length > 0 ? [{
                    //     defect_code: badcode.join(','),
                    //     badqty: this.ngqty
                    // }] : [],
                    remarks: ''
                }
                // console.log(JSON.parse(JSON.stringify(data)), 7777)
                this.isDisabledSubmitButton = true
                const res = await SavaMesOrderStepReport(data)
                if (res.code === '200') {
                    uni.$u.toast('报工成功!')
                    this.topContent = []
                    this.formData = {}
                    this.reportqty = ''
                    // this.ngqty = ''
                    this.reckway = '个人'
                    this.userGroupSheetValue = ''
                    this.eqpSheetValue = ''
                    this.ngqtyArr = [{
                        uid: new Date().getTime(),
                        ngqty: '',
                        badSheetValue: '',
                        arrowDown: true //向下箭头
                    }]
                    // this.userGroupSheetList = []
                    // this.eqpSheetList = []
                    // this.badSelectArr = []
                    this.badSheetValue = []
                    this.checkBoxValue = []
                    this.operSheetValue = ''
                    // this.operSheetList = []
                    // this.userArr = []
                    this.userSelectValue = ''
                    // this.userSelectArrAll = []
                    // this.userSelectArr = []
                    // this.userGroupColumns = []
                    // this.eqpColumns = []
                    // this.operColumns = []
                    this.userCheckBoxValue = []
                    this.userSheetShow = false
                    this.isDisabledSubmitButton = false
                }
            },
            userGroupSheetSelect(val) {
                this.userGroupSheetValue = val.name
                this.userGroupSheetShow = false
            },
            userGroupSheetClick() {
                this.userGroupSheetShow = true
            },
            eqpSheetSelect(val) {
                this.eqpSheetValue = val.name
                this.eqpSheetShow = false
            },
            epqSheetClick() {
                this.eqpSheetShow = true
            },
            badSheetSelect(val) {
                // console.log(val,9999999)
            },
            badSheetClick(item) {
                if (!item.ngqty) {
                    return uni.$u.toast('请先填写不良数量!')
                }
                item.arrowDown = !item.arrowDown
                this.checkBoxValue = item.badSheetValue.split(',')
                this.badSheetShow = true
            },
            badSelectClose() {
                let index = this.ngqtyArr.findIndex(i => !i.arrowDown)
            // æ—¶é—´èŒƒå›´åˆ‡æ¢
            dateChange(val) {
                if (val === 'today') {
                    this.today = false
                    this.month = true
                    this.custom = true
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                        10)
                } else if (val === 'month') {
                    this.today = true
                    this.month = false
                    this.custom = true
                this.ngqtyArr[index].badSheetValue = this.checkBoxValue.join(',')
                this.ngqtyArr[index].arrowDown = true
                    this.calendarRange = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                        2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10)
                this.checkBoxValue = []
                this.badSheetShow = false
            },
            checkboxChange(val) {
                this.badSheetValue = val.join(',')
            },
            operSheetClick() {
                if (this.reckway === '个人') {
                    this.operSheetShow = true
                }
                if (this.reckway === '班组') {
                    this.userSheetShow = true
                } else if (val === 'custom') {
                    this.today = true
                    this.month = true
                    this.custom = false
                    this.calendarRange = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                        2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10)
                }
            },
            //单选框值改变时
            radioGroupChange(val) {
                this.userGroupSheetValue = ''
                this.operSheetValue = ''
            // æ—¥åŽ†æ—¶é—´ç‚¹å‡»
            calendarClick() {
                this.$refs.calendar.open();
            },
            // æ·»åŠ 
            add() {
                if (this.ngqtyArr.find(i => i.badSheetValue === '')) {
                    return uni.$u.toast('请先完善前面不良选项!')
            // æ—¥åŽ†ç¡®å®šäº‹ä»¶ç‚¹å‡»
            calendarConfirm(val) {
                if (val.range.before < val.range.after) {
                    this.calendarRange = val.range.before + '~' + val.range.after
                } else {
                    this.calendarRange = val.range.after + '~' + val.range.before
                }
                this.ngqtyArr.unshift({
                    uid: new Date().getTime(),
                    ngqty: '',
                    badSheetValue: '',
                    arrowDown: true //向下箭头
                })
            },
            //删除
            trashDelete(index) {
                console.log(index)
                this.ngqtyArr.splice(index, 1)
                if (val.range.before === '') {
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + val.range.after
                }
                if (val.range.after === '') {
                    this.calendarRange = val.range.before + '~' + new Date().toISOString().slice(0, 10)
                }
                if (val.range.before === '' && val.range.after === '') {
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                        10)
                }
                // this.getData()
            },
            userChange(val) {
                this.userSelectValue = val
            // å•选按钮切换
            groupChange(val) {
                console.log(val)
            },
            userGroupPickerConfirm(val) {
                console.log(val, 11)
                this.getGroupsPersonPermissions(this.userGroupSheetList.find(i => i.name === val.value[0]).code)
                this.userGroupSheetValue = val.value[0]
                this.userGroupSheetShow = false
            },
            eqpPickerConfirm(val) {
                this.eqpSheetValue = val.value[0]
                this.eqpSheetShow = false
            },
            operPickerConfirm(val) {
                this.operSheetValue = val.value[0]
                this.operSheetShow = false
            }
        }
    }
</script>
@@ -835,75 +566,74 @@
        display: block;
    }
    .custominputClass {
        width: 412rpx;
        display: flex;
        justify-content: space-between;
        border: 3rpx #eff0f1 solid;
        border-radius: 10rpx;
        padding: 0 16rpx;
    ::v-deep .u-alert__text--info--light {
        margin-bottom: 0;
        font-size: 32rpx !important;
        padding-left: 10rpx;
        color: #212121 !important;
        font-weight: lighter;
    }
    ::v-deep .u-alert--info--light {
        background-color: rgba(255, 255, 255, 0.7);
    }
    ::v-deep .u-steps-item__wrapper {
        background-color: #eee;
    }
    ::v-deep .u-steps-item__line--column {
        display: none;
    }
    ::v-deep .u-slide-right-enter-active {
        width: 70%;
    }
    ::v-deep .uicon-calendar {
        font-size: 36rpx !important;
    }
    ::v-deep .u-cell__title-text {
        font-size: 28rpx;
        color: #212121;
    }
    ::v-deep .u-cell__value {
        font-size: 28rpx;
        // color: transparent;
        color: #212121;
    }
    .ellipsis {
        text-overflow: ellipsis;
        overflow: hidden;
        white-space: nowrap;
    ::v-deep .u-cell__label {
        margin-top: 0;
        line-height: 12px;
    }
    .scanImg2 {
        width: 70px;
        height: 70px;
        border-radius: 50%;
        margin: auto;
        background: url('@/static/img/scan.png') no-repeat;
        box-shadow: #436df5 0px 0px 20px;
        background-size: 100% 100%;
    ::v-deep .uicon-arrow-right {
        font-size: 14px !important;
        color: #212121 !important;
    }
    ::v-deep .addClass .uicon-plus-circle {
        font-size: 50rpx !important;
        margin-right: 20rpx !important;
    ::v-deep .u-line-progress__text {
        // margin-right: -20px;
        // color: #212121;
        // width: 100px;
        // margin-top: 10px;
        display: none;
    }
    ::v-deep .addClass .u-button__text {
        font-size: 46rpx !important;
    ::v-deep .u-text__value--content {
        font-size: 12px !important;
    }
    ::v-deep .u-modal__content {
        padding-bottom: 260rpx;
        margin-bottom: 100rpx;
    ::v-deep .u-tag__close {
        background: #436df5 !important;
    }
    ::v-deep .u-action-sheet {
        max-height: 600rpx !important;
        overflow: auto !important;
    }
    ::v-deep .u-checkbox-label--right {
        padding: 30rpx;
        border-bottom: 1rpx solid #eee;
    }
    .badSheetClass {
        position: relative;
    }
    .badNumber {
        position: absolute;
        top: 20rpx;
        left: 20rpx;
        font-size: 26rpx;
        color: rgb(0, 102, 255)
    }
    .trash {
        position: absolute;
        top: 20rpx;
        right: 30rpx;
        font-size: 26rpx;
    ::v-deep .u-cell__body {
        padding-bottom: 40rpx;
    }
</style>
pages/scgl/scbg2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,927 @@
<template>
    <view>
        <page-nav title="生产报工"></page-nav>
        <view v-show="topContent.length===0">
            <div class="sacnBody">
                <div class="scanImg" @click="topScanClick"></div>
                <div class="scanText">请扫描任务条码</div>
            </div>
        </view>
        <view v-show="topContent.length!==0">
            <view class="mainContent" :style="{maxHeight:'1260rpx',overflow: 'scroll'}">
                <!-- æŠ¥å·¥ä¿¡æ¯ -->
                <u-gap height="5" bgColor="#eff0f1"></u-gap>
                <view class="head" style="padding-bottom: 10rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                æŠ¥å·¥ä¿¡æ¯
                            </view>
                        </view>
                    </view>
                    <view class="marginTop20 marginLeft20 marginRight20 flex_between">
                        <u-radio-group class="flex_column">
                            <view class="marginBottom20 " v-for="(item,index) in topContent" :key="item.wo_code">
                                <view class="flex_between">
                                    <view style="display: flex;">
                                        <view class="flex_column titleFont">
                                            <view>工单编号:</view>
                                            <view>产品编码:</view>
                                            <view>产品名称:</view>
                                            <view>产品规格:</view>
                                            <view>当前工序:</view>
                                            <view>任务数量:</view>
                                            <view>未报/已报:</view>
                                            <view>下道工序:</view>
                                        </view>
                                        <view class="flex_column contentFont">
                                            <view>{{item.wo_code}}</view>
                                            <view>{{item.partnumber}}</view>
                                            <view>{{item.partname}}</view>
                                            <view>{{item.partspec.toString().length===0?'/':item.partspec}}</view>
                                            <view>{{item.stepname}}</view>
                                            <view>{{item.planqty}}</view>
                                            <view>{{item.noreportqty}}/{{item.reportqty}}</view>
                                            <view>{{item.nextstepname?item.nextstepname:'/'}}</view>
                                        </view>
                                    </view>
                                </view>
                            </view>
                        </u-radio-group>
                    </view>
                </view>
                <!-- æŠ¥å·¥æ“ä½œ -->
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <view class="head  marginLeft10 marginRight10" style="padding-bottom: 20rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                æŠ¥å·¥æ“ä½œ
                            </view>
                        </view>
                    </view>
                    <view class="flex_column">
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                            <view style="display: flex;" class="titleFont">
                                <view style="color: red;margin-right: 6rpx;">*</view> è®¡ä»¶æ–¹å¼ï¼š
                            </view>
                            <u-radio-group v-model="reckway" @change='radioGroupChange'>
                                <u-radio shape="circle" label="班组" name="班组" labelSize="16"></u-radio>
                                <u-radio shape="circle" label="个人" style="margin-left: 20rpx;" name="个人" labelSize="16">
                                </u-radio>
                            </u-radio-group>
                        </view>
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;"
                            v-if="reckway==='班组'">
                            <view style="display: flex;" class="titleFont">
                                <view style="color: red;margin-right: 6rpx;">*</view> ç”Ÿäº§ç­ç»„:
                            </view>
                            <view @click='userGroupSheetClick' class="custominputClass">
                                <view v-show='userGroupSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='userGroupSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{userGroupSheetValue}}
                                </view>
                                <u-icon :name="!userGroupSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                            <!-- v-if="reckway==='个人'" -->
                            <view style="display: flex;" class="titleFont">
                                <view style="color: red;margin-right: 6rpx;">*</view> æŠ¥å·¥äººå‘˜ï¼š
                            </view>
                            <view @click='operSheetClick' class="custominputClass">
                                <view v-show='operSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='operSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{operSheetValue}}
                                </view>
                                <u-icon :name="!operSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                        <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                            <view style="display: flex;" class="titleFont">
                                <view style="color: #fff;margin-right: 6rpx;">*</view> è®¾å¤‡åç§°ï¼š
                            </view>
                            <view @click='epqSheetClick' class="custominputClass">
                                <view v-show='eqpSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='eqpSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{eqpSheetValue}}
                                </view>
                                <u-icon :name="!eqpSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                        <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                            <view style="color: red;margin-right: 6rpx;">*</view> æŠ¥å·¥æ•°é‡ï¼š
                            <view class='inputClass'>
                                <u--input placeholder="请输入" :adjustPosition='false' border="surround" type='number'
                                    v-model="reportqty">
                                </u--input>
                            </view>
                        </view>
                    </view>
                </view>
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <view class="head  marginLeft10 marginRight10" style="padding-bottom: 20rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                ä¸è‰¯ç»Ÿè®¡
                            </view>
                        </view>
                    </view>
                    <view class="flex_column ">
                        <u-button type="primary" :plain="true" icon='plus-circle' text="添加"
                            style="width: 90%;margin: 20rpx auto;" @click="add"></u-button>
                        <view v-for='(item,index) in ngqtyArr' class="badSheetClass" :key="item.uid">
                            <view class="badNumber">{{index+1}}</view>
                            <u-icon name="trash" size="20" class="trash" v-if="ngqtyArr.length!==1"
                                @click="trashDelete(index)" color="rgb(0, 102, 255)"></u-icon>
                            <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                                <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯æ•°é‡ï¼š
                                <view class='inputClass'>
                                    <u--input placeholder="请输入" border="surround" :adjustPosition='false' type='number'
                                        v-model="item.ngqty"></u--input>
                                </view>
                            </view>
                            <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                                <view style="display: flex;" class="titleFont">
                                    <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯åŽŸå› ï¼š
                                </view>
                                <view @click='badSheetClick(item)' class="custominputClass">
                                    <view v-show='item.badSheetValue.length===0' style="color: rgb(192, 196, 204);">请选择
                                    </view>
                                    <view v-show='item.badSheetValue.length!==0' class="ellipsis"
                                        style="width: 390rpx;">
                                        {{item.badSheetValue}}
                                    </view>
                                    <u-icon :name="item.arrowDown?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                                </view>
                            </view>
                            <u-divider></u-divider>
                        </view>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <u-button size="large" :loading="isDisabledSubmitButton" loadingText="正在提交,请稍等..." type="primary"
                @click="submit" text="报工">
            </u-button>
            <!-- ç”Ÿäº§ç­ç»„ -->
            <u-picker v-if="topContent.length!==0" :show="userGroupSheetShow" :columns="userGroupColumns"
                :itemHeight='55' :closeOnClickOverlay='true' @close='userGroupSheetShow=false'
                @confirm='userGroupPickerConfirm' @cancel='userGroupSheetShow=false'>
            </u-picker>
            <!--  è®¾å¤‡åç§° -->
            <u-picker v-if="topContent.length!==0" :show="eqpSheetShow" :columns="eqpColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='eqpSheetShow=false' @confirm='eqpPickerConfirm'
                @cancel='eqpSheetShow=false'>
            </u-picker>
            <!-- ä¸è‰¯åŽŸå›  -->
            <u-action-sheet v-if="topContent.length!==0" :actions="badSelectArr" :safeAreaInsetBottom='true'
                :closeOnClickOverlay="true" :closeOnClickAction="true" @close="badSelectClose" :show="badSheetShow"
                @select='badSheetSelect'>
                <view style="min-height: 100rpx;">
                    <u-checkbox-group @change="checkboxChange" size='20px' v-model="checkBoxValue" iconPlacement="right"
                        placement="column">
                        <view v-for="(item,index) in badSelectArr">
                            <u-checkbox activeColor="rgb(0, 102, 255)" labelSize='18' :key="item.code+index"
                                :name='item.name' :label="item.name">
                            </u-checkbox>
                        </view>
                    </u-checkbox-group>
                </view>
            </u-action-sheet>
            <!--  æŠ¥å·¥äººå‘˜ -->
            <u-action-sheet v-if="topContent.length!==0" :actions="userSelectArrAll" :safeAreaInsetBottom='true'
                :closeOnClickOverlay="true" :closeOnClickAction="true" @close="userSheetShow=false"
                :show="userSheetShow" @select='userSheetSelect'>
                <view style="min-height: 100rpx;padding: 20rpx 20rpx 30rpx 20rpx;">
                    <u-checkbox-group @change="userCheckboxChange" size='20px' v-model="userCheckBoxValue"
                        iconPlacement="right" placement="column">
                        <view v-for="(item,index) in userSelectArrAll">
                            <u-checkbox activeColor="rgb(0, 102, 255)" labelSize='18' :key="item.code+index"
                                :name='item.name' :label="item.name">
                            </u-checkbox>
                        </view>
                    </u-checkbox-group>
                </view>
            </u-action-sheet>
            <!-- æŠ¥å·¥äººå‘˜ -->
            <u-picker v-if="topContent.length!==0" :show="operSheetShow" :columns="operColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='operSheetShow=false' @confirm='operPickerConfirm'
                @cancel='operSheetShow=false'>
            </u-picker>
        </view>
        <!--     <view v-show="topContent.length!==0" style="position: absolute; bottom: 210rpx;right: 20rpx;">
            <div class="scanImg2" @click="topScanClick"></div>
            </div>
        </view> -->
        <!-- æ‚¬æµ®çƒ -->
        <!--     <view
            v-show="topContent.length!==0&&!userGroupSheetShow&&!eqpSheetShow&&!operSheetShow&&!badSheetShow"
            @click="topScanClick">
            <drag-ball :x='$DeviceInformation.screenWidth*0.8' :y="$DeviceInformation.screenHeight*0.7"></drag-ball>
        </view> -->
        <!-- <scan-code></scan-code> -->
    </view>
</template>
<script>
    import {
        MesOrderStepStart,
        PersonPermissions,
        EqpPermissionsPlus,
        GroupsPermissions,
        GroupsPersonPermissions,
        DefectPermissions,
        SavaMesOrderStepReport,
        LabelBarCode
    } from '../../config/api.js';
    // import scanCode from '@/components/scan-code/scan-code.vue'
    export default {
        // components: {
        // scanCode
        // },
        onLoad(option) {
            if (option.orderstep) {
                this.fromType = '1'
                this.getMesOrderStepStart(option.orderstep)
            } else {
                this.fromType = '2'
            }
            // const _this = this
            // uni.$off('scancodedate') // æ¯æ¬¡è¿›æ¥å…ˆ ç§»é™¤å…¨å±€è‡ªå®šä¹‰äº‹ä»¶ç›‘听器
            // uni.$on('scancodedate', function(content) {
            //     console.log("扫描到的内容为:", content)
            //     // _this.getMesOrderStepStart(content)
            //     if (_this.topContent.find(i => i.wo_code + ';' + i.stepcode === content)) {
            //         _this.$u.toast('此条码已扫描,已在列表中!')
            //     } else {
            //         _this.getMesOrderStepStart(content)
            //     }
            // })
        },
        onPullDownRefresh() {
            setTimeout(() => {
                this.init(() => {
                    uni.stopPullDownRefresh();
                })
            }, 1000);
        },
        data() {
            return {
                topRightMessageCount: 0,
                isDisabledSubmitButton: false,
                formData: {},
                reckway: '个人', //计件方式    group代表是班组   person ä»£è¡¨æ˜¯ä¸ªäºº
                userGroupSheetValue: '', //生产班组下拉选中的值
                eqpSheetValue: '', //设备名称下拉选中的值
                userGroupSheetList: [], //生产班组下拉数组
                eqpSheetList: [], //设备名称下拉数组
                userGroupSheetShow: false, //上拉列表是否展开
                eqpSheetShow: false,
                topContent: [
                    //     {
                    //     nextstepcode: "GX005",
                    //     nextstepname: "入库",
                    //     noputqty: 0,
                    //     noreportqty: 100,
                    //     partname: "8504光机",
                    //     partnumber: "302",
                    //     partspec: "/",
                    //     planqty: 100,
                    //     reportqty: 0,
                    //     seq: "1",
                    //     startqty: 100,
                    //     stepcode: "GX001",
                    //     stepdesc: "",
                    //     stepname: "领料",
                    //     wo_code: "MO-2022-11-0035_1",
                    // },
                ],
                reportqty: '', //报工数量
                ngqty: '', //不良数量
                ngqtyArr: [{
                        uid: new Date().getTime(),
                        ngqty: '',
                        badSheetValue: '',
                        arrowDown: true //向下箭头
                    },
                    // {
                    //     ngqty: '',
                    //     badSheetValue: '',
                    //     arrowDown: true //向下箭头
                    // },
                ], //不良数量、不良原因数组
                badSelectArr: [], //不良原因下拉数组
                badSheetValue: '', //不良原因选中值
                badSheetShow: false,
                checkBoxValue: [], //不良原因显示值
                operSheetValue: '', //操作人员选中值
                operSheetShow: false,
                operSheetList: [], //操作人员数组
                userArr: [], //报工人员信息数组
                userSelectValue: '', //下拉选项值
                userSelectArrAll: [], //所有人员下拉数组
                userSelectArr: [
                    // {
                    //     value: '1001',
                    //     text: '小美1'
                    // },
                ], //人员下拉数组
                userGroupColumns: [], //
                eqpColumns: [], //
                operColumns: [], //
                isAsyncChange: false,
                userCheckBoxValue: [],
                userSheetShow: false,
                fromType: '1', //来源于哪里   æ˜¯é¡µé¢1还是2
            }
        },
        created() {
        },
        mounted() {
            this.init()
            // this.getMesOrderStepStart('MO-2024-01-0004_1;102')
            this.getSellectAllApi()
        },
        methods: {
            init() {
                uni.stopPullDownRefresh();
            },
            async getSellectAllApi() {
                await this.getGroupsPermissions() //获取生产班组
                await this.getEqpPermissionsPlus() //获取设备名称
                await this.getDefectPermissions() //获取缺陷下拉
                await this.getPersonPermissions() //获取操作人员
            },
            //获取生产班组
            async getGroupsPermissions(wkshopcode) {
                const res = await GroupsPermissions()
                if (res.code === '200') {
                    // æ•°ç»„对象  æ›¿æ¢å¯¹è±¡é”®å
                    this.userGroupSheetList = res.data.map(({
                        usergroupcode,
                        usergroupname
                    }) => ({
                        code: usergroupcode,
                        name: usergroupname
                    }))
                    this.userGroupColumns = [this.userGroupSheetList.map(i => i.name)]
                }
            },
            // èŽ·å–è®¾å¤‡åç§°
            async getEqpPermissionsPlus() {
                const res = await EqpPermissionsPlus()
                if (res.code === '200') {
                    this.eqpSheetList = res.data
                    this.eqpColumns = [this.eqpSheetList.map(i => i.name)]
                }
            },
            // èŽ·å–ä¸è‰¯åŽŸå› 
            async getDefectPermissions(orderstepqrcode) {
                const res = await DefectPermissions()
                if (res.code === '200') {
                    this.badSelectArr = res.data
                }
            },
            // èŽ·å–æŠ¥å·¥äººå‘˜
            async getPersonPermissions() {
                const res = await PersonPermissions()
                if (res.code === '200') {
                    // this.operSheetList = res.data
                    this.operSheetList = res.data.map(({
                        usercode,
                        username
                    }) => ({
                        code: usercode,
                        name: username
                    }))
                    this.operColumns = [this.operSheetList.map(i => i.name)]
                    this.userSelectArrAll = this.operSheetList
                }
            },
            // æ ¹æ®ç”Ÿäº§ç­ç»„获取人员
            async getGroupsPersonPermissions(groupcode) {
                const res = await GroupsPersonPermissions({
                    groupcode
                })
                if (res.code === '200') {
                    this.userCheckBoxValue = []
                    if (res.data[0].usercode_list && res.data[0].usercode_list.length > 0) {
                        this.userSelectArrAll.forEach(i => {
                            if (res.data[0].usercode_list.split(',').includes(i.code)) {
                                this.userCheckBoxValue.push(i.name)
                            }
                        })
                    }
                    this.operSheetValue = this.userCheckBoxValue.join(',')
                }
            },
            userSheetSelect() {
            },
            userCheckboxChange(val) {
                this.userCheckBoxValue = val.join(',')
            },
            //获取开工信息
            async getMesOrderStepStart(orderstepqrcode) {
                const data = {
                    OperType: 'ZZ',
                    SelectType: '',
                    wocode: orderstepqrcode ? orderstepqrcode.split(';')[0] : '',
                    stepcode: orderstepqrcode ? orderstepqrcode.split(';')[1] : ''
                }
                const res = await MesOrderStepStart(this.global.formatData(data))
                if (res.code === '200' && res.count === 1) {
                    this.formData = res.data
                    this.topContent.unshift(res.data)
                } else if (res.code === '200' && res.count !== 1) {
                    this.$u.toast('此工序已报工!')
                }
            },
            // æ‰«ç äº‹ä»¶
            topScanClick() {
                let that = this;
                uni.scanCode({
                    onlyFromCamera: true,
                    // scanType: ['barCode', 'qrCode'],
                    scanType: ['qrCode'],
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        if (that.topContent.find(i => i.wo_code + ';' + i.stepcode === res.result)) {
                            that.$u.toast('此条码已扫描,已在列表中!')
                        } else {
                            that.getMesOrderStepStart(res.result)
                        }
                    },
                    complete: function(res) {
                    },
                    fail: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                    }
                });
            },
            async submit() {
                // ä¸‹åˆå†™ç”Ÿäº§æŠ¥å·¥æäº¤
                if (this.reckway === '班组' && this.userGroupSheetValue === "") {
                    return uni.$u.toast('生产班组不能为空!')
                }
                if (this.reckway === '个人' && this.operSheetValue === "") {
                    return uni.$u.toast('报工人员不能为空!')
                }
                if (this.eqpSheetValue === "") {
                    return uni.$u.toast('设备名称不能为空!')
                }
                if (this.reportqty === "") {
                    return uni.$u.toast('报工数量不能为空!')
                }
                if (this.reckway === '班组' && this.operSheetValue.length === 0) {
                    return uni.$u.toast('报工人员信息不能为空!')
                }
                let badcode = []
                if (this.badSheetValue.length > 0) {
                    this.badSelectArr.forEach(i => {
                        if (this.badSheetValue.split(',').includes(i.name)) {
                            badcode.push(i.code)
                        }
                    })
                }
                let reportuser = []
                if (this.operSheetValue.length > 0) {
                    this.userSelectArrAll.forEach(i => {
                        if (this.operSheetValue.split(',').includes(i.name)) {
                            reportuser.push(i.code)
                        }
                    })
                }
                // ä¸è‰¯åŽŸå› 
                const defectlist = []
                //不良数量
                let ngqtyNumber = 0
                this.ngqtyArr.forEach(i => {
                    if (i.badSheetValue.toString().length > 0) {
                        let codeArr = []
                        ngqtyNumber += parseFloat(i.ngqty)
                        i.badSheetValue.split(',').forEach(j => {
                            codeArr.push(this.badSelectArr.find(i => i.name === j).code)
                        })
                        defectlist.push({
                            badqty: i.ngqty,
                            defect_code: codeArr.join(',')
                        })
                    }
                })
                if (parseFloat(this.reportqty) + parseFloat(ngqtyNumber) > parseFloat(this.topContent[0]
                        .noreportqty)) {
                    return uni.$u.toast('报工数量加不良数量不能大于未报数量!')
                }
                const D = {
                    rightcode: '0601',
                    partcode: this.topContent[0].partnumber,
                    qty: parseFloat(this.reportqty),
                    onelabqty: parseFloat(this.reportqty)
                }
                const {
                    data: R
                } = await LabelBarCode(D)
                const data = {
                    mesordercode: this.topContent[0].wo_code,
                    partcode: this.topContent[0].partnumber,
                    stepseq: this.topContent[0].seq,
                    stepcode: this.topContent[0].stepcode,
                    stepprice: this.topContent[0].stepprice,
                    eqpcode: this.eqpSheetList.find(i => i.name === this.eqpSheetValue).code,
                    reckway: this.reckway === '班组' ? 'group' : 'person',
                    usergroupcode: this.userGroupSheetValue ? this.userGroupSheetList.find(i => i.name === this
                        .userGroupSheetValue).code : '', // ç­ç»„编码
                    reportuser: this.reckway === '班组' ? reportuser.join(',') : this.userSelectArrAll.find(i => i
                        .name === this.operSheetValue).code,
                    taskqty: this.topContent[0].planqty,
                    startqty: parseFloat(this.reportqty),
                    reportqty: parseFloat(this.reportqty),
                    inbarcode: R[0].labcode, //入库条码
                    defectlist,
                    // defectlist: badcode.length > 0 ? [{
                    //     defect_code: badcode.join(','),
                    //     badqty: this.ngqty
                    // }] : [],
                    remarks: ''
                }
                // console.log(JSON.parse(JSON.stringify(data)), 7777)
                this.isDisabledSubmitButton = true
                const res = await SavaMesOrderStepReport(data)
                if (res.code === '200') {
                    uni.$u.toast('报工成功!')
                    this.topContent = []
                    this.formData = {}
                    this.reportqty = ''
                    // this.ngqty = ''
                    this.reckway = '个人'
                    this.userGroupSheetValue = ''
                    this.eqpSheetValue = ''
                    this.ngqtyArr = [{
                        uid: new Date().getTime(),
                        ngqty: '',
                        badSheetValue: '',
                        arrowDown: true //向下箭头
                    }]
                    // this.userGroupSheetList = []
                    // this.eqpSheetList = []
                    // this.badSelectArr = []
                    this.badSheetValue = []
                    this.checkBoxValue = []
                    this.operSheetValue = ''
                    // this.operSheetList = []
                    // this.userArr = []
                    this.userSelectValue = ''
                    // this.userSelectArrAll = []
                    // this.userSelectArr = []
                    // this.userGroupColumns = []
                    // this.eqpColumns = []
                    // this.operColumns = []
                    this.userCheckBoxValue = []
                    this.userSheetShow = false
                    if (this.fromType === '1') {
                        let pages = getCurrentPages(); // é¡µé¢é›†åˆ
                        let beforePage = pages[pages.length - 2]; //上一个页面
                        beforePage.$vm.getProductionScheduleKanban()
                        uni.navigateBack()
                    }
                    this.isDisabledSubmitButton = false
                }
            },
            userGroupSheetSelect(val) {
                this.userGroupSheetValue = val.name
                this.userGroupSheetShow = false
            },
            userGroupSheetClick() {
                this.userGroupSheetShow = true
            },
            eqpSheetSelect(val) {
                this.eqpSheetValue = val.name
                this.eqpSheetShow = false
            },
            epqSheetClick() {
                this.eqpSheetShow = true
            },
            badSheetSelect(val) {
                // console.log(val,9999999)
            },
            badSheetClick(item) {
                if (!item.ngqty) {
                    return uni.$u.toast('请先填写不良数量!')
                }
                item.arrowDown = !item.arrowDown
                this.checkBoxValue = item.badSheetValue.split(',')
                this.badSheetShow = true
            },
            badSelectClose() {
                let index = this.ngqtyArr.findIndex(i => !i.arrowDown)
                this.ngqtyArr[index].badSheetValue = this.checkBoxValue.join(',')
                this.ngqtyArr[index].arrowDown = true
                this.checkBoxValue = []
                this.badSheetShow = false
            },
            checkboxChange(val) {
                this.badSheetValue = val.join(',')
            },
            operSheetClick() {
                if (this.reckway === '个人') {
                    this.operSheetShow = true
                }
                if (this.reckway === '班组') {
                    this.userSheetShow = true
                }
            },
            //单选框值改变时
            radioGroupChange(val) {
                this.userGroupSheetValue = ''
                this.operSheetValue = ''
            },
            // æ·»åŠ 
            add() {
                if (this.ngqtyArr.find(i => i.badSheetValue === '')) {
                    return uni.$u.toast('请先完善前面不良选项!')
                }
                this.ngqtyArr.unshift({
                    uid: new Date().getTime(),
                    ngqty: '',
                    badSheetValue: '',
                    arrowDown: true //向下箭头
                })
            },
            //删除
            trashDelete(index) {
                console.log(index)
                this.ngqtyArr.splice(index, 1)
            },
            userChange(val) {
                this.userSelectValue = val
            },
            userGroupPickerConfirm(val) {
                console.log(val, 11)
                this.getGroupsPersonPermissions(this.userGroupSheetList.find(i => i.name === val.value[0]).code)
                this.userGroupSheetValue = val.value[0]
                this.userGroupSheetShow = false
            },
            eqpPickerConfirm(val) {
                this.eqpSheetValue = val.value[0]
                this.eqpSheetShow = false
            },
            operPickerConfirm(val) {
                this.operSheetValue = val.value[0]
                this.operSheetShow = false
            }
        }
    }
</script>
<style lang="scss" scoped>
    @import url('@/style/global.css');
    ::v-deep .uicon-arrow-left>span {
        display: block;
    }
    .custominputClass {
        width: 412rpx;
        display: flex;
        justify-content: space-between;
        border: 3rpx #eff0f1 solid;
        border-radius: 10rpx;
        padding: 0 16rpx;
    }
    .ellipsis {
        text-overflow: ellipsis;
        overflow: hidden;
        white-space: nowrap;
    }
    .scanImg2 {
        width: 70px;
        height: 70px;
        border-radius: 50%;
        margin: auto;
        background: url('@/static/img/scan.png') no-repeat;
        box-shadow: #436df5 0px 0px 20px;
        background-size: 100% 100%;
    }
    ::v-deep .addClass .uicon-plus-circle {
        font-size: 50rpx !important;
        margin-right: 20rpx !important;
    }
    ::v-deep .addClass .u-button__text {
        font-size: 46rpx !important;
    }
    ::v-deep .u-modal__content {
        padding-bottom: 260rpx;
        margin-bottom: 100rpx;
    }
    ::v-deep .u-action-sheet {
        max-height: 600rpx !important;
        overflow: auto !important;
    }
    ::v-deep .u-checkbox-label--right {
        padding: 30rpx;
        border-bottom: 1rpx solid #eee;
    }
    .badSheetClass {
        position: relative;
    }
    .badNumber {
        position: absolute;
        top: 20rpx;
        left: 20rpx;
        font-size: 26rpx;
        color: rgb(0, 102, 255)
    }
    .trash {
        position: absolute;
        top: 20rpx;
        right: 30rpx;
        font-size: 26rpx;
    }
</style>
pages/wwgl/wxfl.vue
@@ -1,163 +1,225 @@
<template>
    <view>
        <page-nav title="委外发料"></page-nav>
        <page-nav title="外协发料"></page-nav>
        <view v-show="topContent.length===0">
            <div class="sacnBody">
                <div class="scanImg" @click="topScanClick"></div>
                <div class="scanText">扫描任务条码</div>
            </div>
        <view class="flex_center" style="margin: 20rpx;">
            <!-- #ifdef H5 -->
            <u--input prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" :placeholder="placeholder"
                style="width:100%;background-color: #fff;border-radius: 40rpx;" border="surround" suffixIcon="scan"
                suffixIconStyle="color: #909399;font-size: 22px;" v-model="inputBoxValue"
                @change="confirmInputBoxValue">
                <template slot="suffix">
                    <u-icon name="scan" color="#909399" size="24" @click="scanClick"></u-icon>
                </template>
            </u--input>
            <!-- #endif -->
            <!-- #ifdef APP-PLUS -->
            <u-input prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" :placeholder="placeholder"
                style="width:100%;background-color: #fff;border-radius: 40rpx;" border="surround" suffixIcon="scan"
                suffixIconStyle="color: #909399;font-size: 22px;" v-model="inputBoxValue"
                @change="confirmInputBoxValue">
                <template slot="suffix">
                    <u-icon name="scan" color="#909399" size="24" @click="scanClick"></u-icon>
                </template>
            </u-input>
            <!-- #endif -->
            <view class="flex_center marginLeft20" @click="popupShow=true">
                <u--text size='16' color='#909399' text="筛选"></u--text>
                <u--image :showLoading="true" src="../../static/img/sift.png" width="20px" height="20px"></u--image>
            </view>
        </view>
        <view v-show="topContent.length!==0" class="mainContent">
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å‘料信息
        <u-alert :title="alertTitle" type="info"></u-alert>
        <!-- æŠ˜å é¢æ¿ -->
        <!-- <u-collapse @change="change" @close="close" @open="open"> -->
        <!-- @change="collapseChange" -->
        <u-collapse style="max-height: 590px;overflow: auto;">
            <!-- :value='parseFloat(item.ordergoodqty)+"/"+parseFloat(item.orderqty)' -->
            <u-collapse-item style="position: relative;" :title="item.ordercode" :name='item.ordercode'
                :value='parseFloat(item.ordergoodqty)+"/"+parseFloat(item.orderqty)'
                :label="item.children.length===0?'未派发':''" :disabled='item.children.length===0'
                v-for="item in collapseArr" :key="item.ordercode">
                <view style="position: absolute;width: 200rpx;left: 30rpx;top:34px;font-size: 24rpx;color: #999;">
                    {{item.partname}} {{item.partspec}}
                </view>
                <!-- <view style="position: absolute;width: 26%;left: 44%;top:16px;"> -->
                <view style="position: absolute;width: 120px;left: 44%;top:16px;color:#0659ff"
                    @click="progressClick(item.ordercode)">
                    <!-- {{item.partname}}{{item.partspec}} -->
                    <u-line-progress :percentage="parseFloat((item.ordergoodqty*100/item.orderqty).toFixed(2))"
                        inactiveColor="#d1d6f5" height="10" activeColor="#0659ff"></u-line-progress>
                </view>
                <!--             <view style="position: absolute;width: 100px;right: 33px;  top:13px; ">
                    <view class="" style="display: flex;justify-content: flex-end;">
                        <view style="color: #0659ff;">
                            {{parseFloat(item.ordergoodqty)}}
                        </view>
                        <view>
                            /{{ parseFloat(item.orderqty)}}
                        </view>
                    </view>
                </view>
 -->
                <view class="marginLeft20 marginRight20" style="height: 360rpx;" v-if="topContent.length!==0">
                    <view class="marginBottom20" style="display: flex;">
                        <!--  v-for="item in purchorderArr"  -->
                        <view class="flex_column titleFont">
                            <view>工单编号:</view>
                            <view>产品编码:</view>
                            <view>产品名称:</view>
                            <view>产品规格:</view>
                            <view>当前工序:</view>
                            <view>任务数量:</view>
                            <view>未发/已发:</view>
                <view v-if="radiovalue==='生产工单'" style="margin:0 0  5px">
                    <view class="flex_column">
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品编码:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partcode}}</view>
                        </view>
                        <view class="flex_column contentFont">
                            <view>{{topContent[0].wo_code}}</view>
                            <view>{{topContent[0].partnumber}}</view>
                            <view>{{topContent[0].partname}}</view>
                            <view>{{topContent[0].partspec?topContent[0].partspec:'/'}}</view>
                            <view>{{topContent[0].stepname}}</view>
                            <view>{{topContent[0].planqty}}</view>
                            <view>{{topContent[0].startqty+'/'+topContent[0].reportqty}}</view>
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品名称:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partname}}</view>
                        </view>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block" style="justify-content: flex-start;height: 70rpx;padding-bottom: 10rpx;">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å¤–协供方
                        </view>
                    </view>
                    <view style="margin-left: 20rpx;">
                        <view @click='WXSheetClick' class="custominputClass">
                            <view v-show='WXSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                            <view v-show='WXSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                {{WXSheetValue}}
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品规格:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partspec?item.partspec:'/'}}
                            </view>
                            <u-icon :name="!WXSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                        </view>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block" style="justify-content: flex-start;height: 70rpx;padding-bottom: 10rpx;">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å¤–协人员
                <!-- {{item.children}} -->
                <!-- <u--text class="u-collapse-content"> -->
                <u-steps :current="-1" inactiveColor='#0659FF' direction="column">
                    <view v-for="(it,ind) in item.children" :key="item.ordercode+it.name+ind"
                        @click="gotoPage(item.ordercode,it.code)" style="display: flex;align-items: center;">
                        <u-steps-item :title="it.code+'/'+it.name+it.spec"></u-steps-item>
                        <view class="" style="width: 100px;">
                            <u-line-progress :percentage="parseFloat((it.goodqty*100/it.planqty).toFixed(2))"
                                inactiveColor="#d1d6f5" height="10" activeColor="#0659ff"></u-line-progress>
                        </view>
                    </view>
                    <view style="margin-left: 20rpx;">
                        <view @click='userSheetClick' class="custominputClass">
                            <view v-show='userSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                            <view v-show='userSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                {{userSheetValue}}
                        <view style="width: 30%;text-align: right;">
                            <view class="" style="display: flex;justify-content: flex-end;">
                                <view style="color: #0659ff;">
                                    {{parseFloat(it.goodqty)}}
                                </view>
                                <view>
                                    /{{ parseFloat(it.planqty)}}
                                </view>
                            </view>
                            <u-icon :name="!userSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                        </view>
                    </view>
                </u-steps>
                <!-- </u--text> -->
            </u-collapse-item>
        </u-collapse>
        <!-- å¼¹å‡ºå±‚ -->
        <!-- closeIconPos='top-left' closeOnClickOverlay  closeable='true' -->
        <u-popup :show="popupShow" mode="right" @close="popupClose" @open="popupOpen">
            <view style="margin: 120px 10px 20px;" class="flex_column">
                <!--         <view style="display: flex;">
                    <view>
                        å•据类型:
                    </view>
                    <u-radio-group v-model="radiovalue" placement="column" @change="groupChange"
                        style="margin-top: 4px;">
                        <u-radio :customStyle="{marginBottom: '8px'}" v-for="(item, index) in radiolist"
                            :key="index+item.name" :label="item.name" iconSize='16' labelSize='16' :name="item.name">
                        </u-radio>
                    </u-radio-group>
                </view> -->
                <view style="margin-top: 20px;display: flex;align-items: center;">
                    <view class="">
                        äº§å“ä¿¡æ¯ï¼š
                    </view>
                    <view class="">
                        <u-button :hairline="true" shape="circle" icon="map" :plain="true"
                            style="width: 100px;height: 26px;" type="primary" text="选择产品" @click="chosePart"></u-button>
                    </view>
                </view>
                <view style="display: flex;flex-wrap: wrap;">
                    <u-tag style="width:220rpx;" :text="item.name" v-for="item in tagArr" :key="item.code"
                        :closable="true" :show="item.close" @close="tagClose(item)"></u-tag>
                </view>
                <!--     <view class="head" style="margin-top: 10px;">
                    <view class="head_block" style="height: 80rpx; display: flex;justify-content: space-around;">
                        <u-button :plain='today' style="width: 70px;height: 25px;" @click="dateChange('today')"
                            type="primary" shape="circle" text="今日">
                        </u-button>
                        <u-button :plain='month' style="width: 70px;height: 25px;" @click="dateChange('month')"
                            type="primary" shape="circle" text="本月">
                        </u-button>
                        <u-button :plain='custom' style="width: 70px;height: 25px;" @click="dateChange('custom')"
                            type="primary" shape="circle" text="自定义"></u-button>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block" style="justify-content: flex-start;height: 70rpx;padding-bottom: 10rpx;">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å‘料数量
                        </view>
                <view v-if="!custom" class="flex_column"
                    style="display: flex;justify-content: space-around;width: 100%;">
                    <view class="" style="display: flex;justify-content: space-evenly;width: 100%;">
                        <view class="titleFont">开始日期</view>
                        <view class="titleFont">~</view>
                        <view class="titleFont">结束日期</view>
                    </view>
                    <view style="margin-left: 20rpx;">
                        <view class='inputClass'>
                            <u--input placeholder="请输入" border="surround" type='number' v-model="fqty">
                            </u--input>
                        </view>
                    </view>
                </view>
                    <u-button type="info" icon='calendar' iconColor="#0659FF" size="" @click="calendarClick"
                        :text="calendarRange">
                    </u-button>
                </view> -->
                <!-- <uni-calendar ref="calendar" :range='true' :insert="false" @confirm="calendarConfirm" /> -->
            </view>
        </u-popup>
            <u-picker v-if="topContent.length!==0" :show="WXSheetShow" :columns="WXColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='WXSheetShow=false' @confirm='WXPickerConfirm'
                @cancel='WXSheetShow=false'>
            </u-picker>
            <u-picker v-if="topContent.length!==0" :show="userSheetShow" :columns="userColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='userSheetShow=false' @confirm='userPickerConfirm'
                @cancel='userSheetShow=false'>
            </u-picker>
        </view>
        <u-button size="large" v-show="topContent.length!==0" :loading="isDisabledSubmitButton"
            loadingText="正在提交,请稍等..." type="primary" @click="submit" text="发料">
        </u-button>
        <!-- æ‚¬æµ®çƒ -->
        <!--     <view v-show="topContent.length!==0&&!WXSheetShow&&!userSheetShow" @click="topScanClick">
            <drag-ball :x='$DeviceInformation.screenWidth*0.8' :y="$DeviceInformation.screenHeight*0.7"></drag-ball>
        </view> -->
        <!-- <scan-code></scan-code> -->
        <!-- æ‚¬æµ®çƒ -->
        <view @click="scan2">
            <drag-ball :x='300' :y="600"></drag-ball>
        </view>
    </view>
</template>
<script>
    import {
        MesOrderStepStart,
        CustomerPermissions,
        PersonPermissions,
        SavaMesOrderStepOut
        ProductionScheduleKanban
    } from '../../config/api.js';
    // import scanCode from '@/components/scan-code/scan-code.vue'
    export default {
        onLoad(option) {
            const _this = this
            uni.$off('scancodedate') // æ¯æ¬¡è¿›æ¥å…ˆ ç§»é™¤å…¨å±€è‡ªå®šä¹‰äº‹ä»¶ç›‘听器
            uni.$on('scancodedate', function(content) {
                console.log("扫描到的内容为:", content)
                _this.getCheckScanDeviceQrCodeData(content)
            })
            console.log(option, 8)
        },
        onPullDownRefresh() {
@@ -171,45 +233,60 @@
        data() {
            return {
                topRightMessageCount: '',
                inputBoxValue: '',
                alertTitle: '',
                popupShow: false, //弹出层是否显示
                collapseArr: [ //折叠面板数据
                ],
                collapseArrAll: [], //所有
                placeholder: '请输入工单信息',
                radiovalue: '生产工单', //单据类型
                // SO:销售订单  MO:生产订单  PO:生产工单
                radiolist: [{
                        name: '销售订单'
                    },
                    {
                        name: '生产订单'
                    },
                    {
                        name: '生产工单'
                    },
                ],
                isDisabledSubmitButton: false,
                today: true,
                month: false,
                custom: true,
                topContent: [],
                // {
                // "wo_code": "MO-2023-06-0003_1",
                // "partnumber": "308",
                // "partname": "电池包",
                // "partspec": "",
                // "seq": "2",
                // "stepcode": "ZSStep03",
                // "stepname": "去毛刺",
                // "nextstepcode": "ZSStep06",
                // "nextstepname": "包装2",
                // "stepdesc": "",
                // "wkshopcode": "ZS001",
                // "wkshopname": "注塑车间",
                // "planqty": 50.00,
                // "startqty": 29.00,
                // "noreportqty": 29.00,
                // "reportqty": 21.00,
                // "noputqty": 0.0,
                // "list": null
                // }, //扫描任务条码所带出来的内容
                WXSheetValue: '',
                WXSheetShow: false, //上拉列表是否展开
                WXColumns: [],
                WXSheetList: [],
                // calendarRange: new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                // 10), //系统当前日期
                calendarRange: new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                    2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10), //当月日期
                userSheetValue: '',
                userSheetShow: false,
                userColumns: [],
                userSheetList: [],
                fqty: null,
                tagArr: [
                    // {
                    //     close: true,
                    //     name: '电池包',
                    //     code: '1002'
                    // }, {
                    //     close: true,
                    //     name: '电脑',
                    //     code: '1003'
                    // }, {
                    //     close: true,
                    //     name: '8054光机',
                    //     code: '1004'
                    // }, {
                    //     close: true,
                    //     name: 'G71674冲锋枪',
                    //     code: '1005'
                    // }, {
                    //     close: true,
                    //     name: '8051光机',
                    //     code: '1006'
                    // },
                ], //已选中的产品标签
            }
@@ -220,67 +297,28 @@
        mounted() {
            this.init()
            // this.getMesOrderStepStart('MO-2023-09-0002_1;106')
            this.handleSelectAllApi()
            this.getProductionScheduleKanban()
        },
        methods: {
            init() {
                uni.stopPullDownRefresh();
            },
            gotoPage(p1, p2) {
                let orderstep = null
            async handleSelectAllApi() {
                await this.getCustomerPermissions()
                await this.getPersonPermissions()
            },
            async getPersonPermissions(val) {
                const data = {
                    usercode: val
                }
                const res = await PersonPermissions(this.global.formatData(data))
                this.userSheetList = res.data
                this.userColumns = [res.data.map(i => i.username)]
            },
            async getCustomerPermissions(val) {
                const data = {
                    orderstepqrcode: val
                }
                const res = await CustomerPermissions(this.global.formatData(data))
                this.WXSheetList = res.data
                this.WXColumns = [res.data.map(i => i.name)]
            },
            async getMesOrderStepStart(val) {
                const data = {
                    OperType: 'WX',
                    SelectType: 'OUT',
                    wocode: val ? val.split(';')[0] : '',
                    stepcode: val ? val.split(';')[1] : ''
                }
                const res = await MesOrderStepStart(this.global.formatData(data))
                console.log(res, 3)
                if (res.code === '200') {
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.fqty = null
                    this.topContent = []
                    this.topContent.push(res.data)
                if (p1) {
                    orderstep = p1 + ';' + p2
                } else {
                    orderstep = ''
                }
                uni.navigateTo({
                    url: './wxfl2?orderstep=' + orderstep
                })
            },
            //  ä»»åŠ¡æ¡ç   çš„æ‰«ç æ¡†ç‚¹å‡»
            topScanClick() {
            scan2() {
                let that = this;
                uni.scanCode({
@@ -290,8 +328,11 @@
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        // that.scanContent = res.result;
                        that.getMesOrderStepStart(res.result)
                        uni.navigateTo({
                            url: './wxfl2?orderstep=' + res.result
                        })
                    },
                    complete: function(res) {
@@ -305,108 +346,215 @@
                });
            },
            WXSheetClick() {
                this.WXSheetShow = true
            getCheckboxValue(val) {
                this.tagArr = []
                val.forEach(i => {
                    this.tagArr.push({
                        close: true,
                        name: i.split('/')[1].trim(),
                        code: i.split('/')[0].trim()
                    })
                })
            },
            WXPickerConfirm(val) {
                this.WXSheetValue = val.value[0]
                this.WXSheetShow = false
            },
            userSheetClick() {
                this.userSheetShow = true
            },
            userPickerConfirm(val) {
                this.userSheetValue = val.value[0]
                this.userSheetShow = false
            },
            async submit() {
                if (!this.WXSheetValue) {
                    return uni.$u.toast('外协供方不能为空!')
            // æŽ¥å£èŽ·å–
            async getProductionScheduleKanban() {
                let ordertype = '' // SO:销售订单  MO:生产订单  PO:生产工单
                switch (this.radiovalue) {
                    case '生产工单':
                        this.alertTitle = '工单数量(共/个)'
                        this.placeholder = '请输入工单信息'
                        ordertype = 'PO'
                        break
                    case '生产订单':
                        this.alertTitle = '生产订单数量(共/个)'
                        this.placeholder = '请输入生产订单信息'
                        ordertype = 'MO'
                        break
                    case '销售订单':
                        this.alertTitle = '销售订单数量(共/个)'
                        this.placeholder = '请输入销售订单信息'
                        ordertype = 'SO'
                        break
                }
                if (!this.userSheetValue) {
                    return uni.$u.toast('外协人员不能为空!')
                }
                if (!this.fqty) {
                    return uni.$u.toast('发料数量不能为空!')
                }
                if (parseFloat(this.fqty) > parseFloat(this.topContent[0].startqty)) {
                    return uni.$u.toast('发料数量不能大于未发数量!')
                }
                // const header = {
                //     'Content-Type': 'application/x-www-form-urlencoded',
                //     'rediskey': uni.getStorageSync('rediskey'),
                //     'admin': uni.getStorageSync('usercode'),
                //     'username': encodeURIComponent(uni.getStorageSync('username')),
                //     'navTabId': uni.getStorageSync('usercode'),
                //     'userid': uni.getStorageSync('userid'),
                //     'guid': uni.getStorageSync('guid'),
                //     'usertype': 'APP'
                // }
                const data = {
                    mesordercode: this.topContent[0].wo_code, // å·¥å•编号
                    partcode: this.topContent[0].partnumber, // äº§å“ç¼–码
                    stepseq: this.topContent[0].seq, // å·¥åºåºå·
                    stepcode: this.topContent[0].stepcode, // å·¥åºç¼–码
                    wxcode: this.WXSheetList.find(i => i.name === this.WXSheetValue).code, // å¤–协供应商编码
                    outuser: this.userSheetList.find(i => i.username === this.userSheetValue).usercode, // å‘料人员
                    taskqty: this.topContent[0].planqty, // ä»»åŠ¡æ•°é‡
                    fqty: this.fqty // å‘料数量
                    ordertype,
                    partcode: this.tagArr.map(i => i.code).join(','),
                    Ratetime: this.calendarRange,
                }
                const {
                    data: res
                } = await ProductionScheduleKanban(data)
                this.collapseArr = res
                this.collapseArrAll = res
                this.alertTitle = this.alertTitle.split('/')[0] + this.collapseArr.length + this.alertTitle.split('/')[
                    1]
            },
            //输入框回车确认事件
            confirmInputBoxValue(val) {
                this.collapseArr = this.collapseArrAll.filter((p) => {
                    return p.ordercode.indexOf(val) !== -1
                })
                switch (this.radiovalue) {
                    case '生产工单':
                        this.alertTitle = '工单数量(共/个)'
                        break
                    case '生产订单':
                        this.alertTitle = '生产订单数量(共/个)'
                        break
                    case '销售订单':
                        this.alertTitle = '销售订单数量(共/个)'
                        break
                }
                this.alertTitle = this.alertTitle.split('/')[0] + this.collapseArr.length + this.alertTitle.split('/')[
                    1]
            },
            // ç‚¹å‡»æ‰«ç 
            scanClick() {
                this.topScanClick()
            },
            // æ‰«ç æ¡†ç‚¹å‡»
            topScanClick() {
                let that = this;
                uni.scanCode({
                    onlyFromCamera: true,
                    // scanType: ['barCode', 'qrCode'],
                    scanType: ['qrCode'],
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        that.scanContent = res.result;
                        that.getCheckScanDeviceQrCodeData(that.scanContent);
                    },
                    complete: function(res) {
                    },
                    fail: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                    }
                });
            },
            getCheckScanDeviceQrCodeData(code) {
                this.inputBoxValue = code
                this.confirmInputBoxValue(this.inputBoxValue)
            },
            // å¼¹å‡ºå±‚æ”¶èµ·
            popupClose() {
                this.getProductionScheduleKanban()
                this.popupShow = false
            },
            // å¼¹å‡ºå±‚弹出
            popupOpen() {
            },
            // é€‰æ‹©äº§å“
            chosePart() {
                let arr = []
                this.tagArr.forEach(i => {
                    arr.push(i.code + '/' + i.name)
                })
                uni.navigateTo({
                    url: '../znfx/chda?param=' + JSON.stringify(arr)
                });
            },
            // tag标签关闭
            tagClose(val) {
                this.tagArr.forEach((i, j) => {
                    if (i.code === val.code) {
                        i.close = false
                        this.tagArr.splice(j, 1)
                    }
                })
            },
            // æ—¶é—´èŒƒå›´åˆ‡æ¢
            dateChange(val) {
                if (val === 'today') {
                    this.today = false
                    this.month = true
                    this.custom = true
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                        10)
                } else if (val === 'month') {
                    this.today = true
                    this.month = false
                    this.custom = true
                    this.calendarRange = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                        2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10)
                } else if (val === 'custom') {
                    this.today = true
                    this.month = true
                    this.custom = false
                    this.calendarRange = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                        2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10)
                }
            },
            // æ—¥åŽ†æ—¶é—´ç‚¹å‡»
            calendarClick() {
                this.$refs.calendar.open();
            },
            // æ—¥åŽ†ç¡®å®šäº‹ä»¶ç‚¹å‡»
            calendarConfirm(val) {
                if (val.range.before < val.range.after) {
                    this.calendarRange = val.range.before + '~' + val.range.after
                } else {
                    this.calendarRange = val.range.after + '~' + val.range.before
                }
                console.log(JSON.stringify(data), 6)
                this.isDisabledSubmitButton = true
                const res = await SavaMesOrderStepOut(data)
                if (res.code === '200') {
                    uni.$u.toast('发料成功!')
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.fqty = null
                    this.topContent = []
                    this.isDisabledSubmitButton = false
                if (val.range.before === '') {
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + val.range.after
                }
                if (val.range.after === '') {
                    this.calendarRange = val.range.before + '~' + new Date().toISOString().slice(0, 10)
                }
                if (val.range.before === '' && val.range.after === '') {
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                        10)
                }
                // this.getData()
            },
                // this.isDisabledSubmitButton = true
                // uni.uploadFile({
                //     url: this.$baseUrl + '/AppProductionManagement/SavaMesOrderStepOut',
                //     files: [{
                //         "uri": "/"
                //     }],
                //     header: header,
                //     formData: data,
                //     success: (res) => {
                //         uni.$u.toast('发料成功!')
                //         this.WXSheetValue = ''
                //         this.userSheetValue = ''
                //         this.fqty = null
                //         this.topContent = []
                //         this.isDisabledSubmitButton = false
                //     },
                //     fail(res) {
                //         uni.$u.toast('发料失败!')
                //         this.isDisabledSubmitButton = false
                //     },
                // })
            // å•选按钮切换
            groupChange(val) {
                console.log(val)
            },
            }
        }
    }
</script>
@@ -418,13 +566,74 @@
        display: block;
    }
    .custominputClass {
        width: 412rpx;
        display: flex;
        justify-content: space-between;
        border: 3rpx #eff0f1 solid;
        border-radius: 10rpx;
        padding: 0 16rpx;
        line-height: 68rpx;
    ::v-deep .u-alert__text--info--light {
        margin-bottom: 0;
        font-size: 32rpx !important;
        padding-left: 10rpx;
        color: #212121 !important;
        font-weight: lighter;
    }
    ::v-deep .u-alert--info--light {
        background-color: rgba(255, 255, 255, 0.7);
    }
    ::v-deep .u-steps-item__wrapper {
        background-color: #eee;
    }
    ::v-deep .u-steps-item__line--column {
        display: none;
    }
    ::v-deep .u-slide-right-enter-active {
        width: 70%;
    }
    ::v-deep .uicon-calendar {
        font-size: 36rpx !important;
    }
    ::v-deep .u-cell__title-text {
        font-size: 28rpx;
        color: #212121;
    }
    ::v-deep .u-cell__value {
        font-size: 28rpx;
        // color: transparent;
        color: #212121;
    }
    ::v-deep .u-cell__label {
        margin-top: 0;
        line-height: 12px;
    }
    ::v-deep .uicon-arrow-right {
        font-size: 14px !important;
        color: #212121 !important;
    }
    ::v-deep .u-line-progress__text {
        // margin-right: -20px;
        // color: #212121;
        // width: 100px;
        // margin-top: 10px;
        display: none;
    }
    ::v-deep .u-text__value--content {
        font-size: 12px !important;
    }
    ::v-deep .u-tag__close {
        background: #436df5 !important;
    }
    ::v-deep .u-cell__body {
        padding-bottom: 40rpx;
    }
</style>
pages/wwgl/wxfl2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,444 @@
<template>
    <view>
        <page-nav title="委外发料"></page-nav>
        <view v-show="topContent.length===0">
            <div class="sacnBody">
                <div class="scanImg" @click="topScanClick"></div>
                <div class="scanText">扫描任务条码</div>
            </div>
        </view>
        <view v-show="topContent.length!==0" class="mainContent">
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å‘料信息
                        </view>
                    </view>
                </view>
                <view class="marginLeft20 marginRight20" style="height: 360rpx;" v-if="topContent.length!==0">
                    <view class="marginBottom20" style="display: flex;">
                        <!--  v-for="item in purchorderArr"  -->
                        <view class="flex_column titleFont">
                            <view>工单编号:</view>
                            <view>产品编码:</view>
                            <view>产品名称:</view>
                            <view>产品规格:</view>
                            <view>当前工序:</view>
                            <view>任务数量:</view>
                            <view>未发/已发:</view>
                        </view>
                        <view class="flex_column contentFont">
                            <view>{{topContent[0].wo_code}}</view>
                            <view>{{topContent[0].partnumber}}</view>
                            <view>{{topContent[0].partname}}</view>
                            <view>{{topContent[0].partspec?topContent[0].partspec:'/'}}</view>
                            <view>{{topContent[0].stepname}}</view>
                            <view>{{topContent[0].planqty}}</view>
                            <view>{{topContent[0].startqty+'/'+topContent[0].reportqty}}</view>
                        </view>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block" style="justify-content: flex-start;height: 70rpx;padding-bottom: 10rpx;">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å¤–协供方
                        </view>
                    </view>
                    <view style="margin-left: 20rpx;">
                        <view @click='WXSheetClick' class="custominputClass">
                            <view v-show='WXSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                            <view v-show='WXSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                {{WXSheetValue}}
                            </view>
                            <u-icon :name="!WXSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                        </view>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block" style="justify-content: flex-start;height: 70rpx;padding-bottom: 10rpx;">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å¤–协人员
                        </view>
                    </view>
                    <view style="margin-left: 20rpx;">
                        <view @click='userSheetClick' class="custominputClass">
                            <view v-show='userSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                            <view v-show='userSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                {{userSheetValue}}
                            </view>
                            <u-icon :name="!userSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                        </view>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block" style="justify-content: flex-start;height: 70rpx;padding-bottom: 10rpx;">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            å‘料数量
                        </view>
                    </view>
                    <view style="margin-left: 20rpx;">
                        <view class='inputClass'>
                            <u--input placeholder="请输入" border="surround" type='number' v-model="fqty">
                            </u--input>
                        </view>
                    </view>
                </view>
            </view>
            <u-picker v-if="topContent.length!==0" :show="WXSheetShow" :columns="WXColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='WXSheetShow=false' @confirm='WXPickerConfirm'
                @cancel='WXSheetShow=false'>
            </u-picker>
            <u-picker v-if="topContent.length!==0" :show="userSheetShow" :columns="userColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='userSheetShow=false' @confirm='userPickerConfirm'
                @cancel='userSheetShow=false'>
            </u-picker>
        </view>
        <u-button size="large" v-show="topContent.length!==0" :loading="isDisabledSubmitButton"
            loadingText="正在提交,请稍等..." type="primary" @click="submit" text="发料">
        </u-button>
        <!-- æ‚¬æµ®çƒ -->
        <!--     <view v-show="topContent.length!==0&&!WXSheetShow&&!userSheetShow" @click="topScanClick">
            <drag-ball :x='$DeviceInformation.screenWidth*0.8' :y="$DeviceInformation.screenHeight*0.7"></drag-ball>
        </view> -->
        <!-- <scan-code></scan-code> -->
    </view>
</template>
<script>
    import {
        MesOrderStepStart,
        CustomerPermissions,
        PersonPermissions,
        SavaMesOrderStepOut
    } from '../../config/api.js';
    // import scanCode from '@/components/scan-code/scan-code.vue'
    export default {
        onLoad(option) {
            if (option.orderstep) {
                this.fromType = '1'
                this.getMesOrderStepStart(option.orderstep)
            } else {
                this.fromType = '2'
            }
        },
        onPullDownRefresh() {
            setTimeout(() => {
                this.init(() => {
                    uni.stopPullDownRefresh();
                })
            }, 1000);
        },
        data() {
            return {
                topRightMessageCount: '',
                isDisabledSubmitButton: false,
                topContent: [],
                // {
                // "wo_code": "MO-2023-06-0003_1",
                // "partnumber": "308",
                // "partname": "电池包",
                // "partspec": "",
                // "seq": "2",
                // "stepcode": "ZSStep03",
                // "stepname": "去毛刺",
                // "nextstepcode": "ZSStep06",
                // "nextstepname": "包装2",
                // "stepdesc": "",
                // "wkshopcode": "ZS001",
                // "wkshopname": "注塑车间",
                // "planqty": 50.00,
                // "startqty": 29.00,
                // "noreportqty": 29.00,
                // "reportqty": 21.00,
                // "noputqty": 0.0,
                // "list": null
                // }, //扫描任务条码所带出来的内容
                WXSheetValue: '',
                WXSheetShow: false, //上拉列表是否展开
                WXColumns: [],
                WXSheetList: [],
                userSheetValue: '',
                userSheetShow: false,
                userColumns: [],
                userSheetList: [],
                fqty: null,
                fromType: '1',
            }
        },
        created() {
        },
        mounted() {
            this.init()
            // this.getMesOrderStepStart('MO-2023-09-0002_1;106')
            this.handleSelectAllApi()
        },
        methods: {
            init() {
                uni.stopPullDownRefresh();
            },
            async handleSelectAllApi() {
                await this.getCustomerPermissions()
                await this.getPersonPermissions()
            },
            async getPersonPermissions(val) {
                const data = {
                    usercode: val
                }
                const res = await PersonPermissions(this.global.formatData(data))
                this.userSheetList = res.data
                this.userColumns = [res.data.map(i => i.username)]
            },
            async getCustomerPermissions(val) {
                const data = {
                    orderstepqrcode: val
                }
                const res = await CustomerPermissions(this.global.formatData(data))
                this.WXSheetList = res.data
                this.WXColumns = [res.data.map(i => i.name)]
            },
            async getMesOrderStepStart(val) {
                const data = {
                    OperType: 'WX',
                    SelectType: 'OUT',
                    wocode: val ? val.split(';')[0] : '',
                    stepcode: val ? val.split(';')[1] : ''
                }
                const res = await MesOrderStepStart(this.global.formatData(data))
                console.log(res, 3)
                if (res.code === '200') {
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.fqty = null
                    this.topContent = []
                    this.topContent.push(res.data)
                }
            },
            //  ä»»åŠ¡æ¡ç   çš„æ‰«ç æ¡†ç‚¹å‡»
            topScanClick() {
                let that = this;
                uni.scanCode({
                    onlyFromCamera: true,
                    // scanType: ['barCode', 'qrCode'],
                    scanType: ['qrCode'],
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        that.getMesOrderStepStart(res.result)
                    },
                    complete: function(res) {
                    },
                    fail: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                    }
                });
            },
            WXSheetClick() {
                this.WXSheetShow = true
            },
            WXPickerConfirm(val) {
                this.WXSheetValue = val.value[0]
                this.WXSheetShow = false
            },
            userSheetClick() {
                this.userSheetShow = true
            },
            userPickerConfirm(val) {
                this.userSheetValue = val.value[0]
                this.userSheetShow = false
            },
            async submit() {
                if (!this.WXSheetValue) {
                    return uni.$u.toast('外协供方不能为空!')
                }
                if (!this.userSheetValue) {
                    return uni.$u.toast('外协人员不能为空!')
                }
                if (!this.fqty) {
                    return uni.$u.toast('发料数量不能为空!')
                }
                if (parseFloat(this.fqty) > parseFloat(this.topContent[0].startqty)) {
                    return uni.$u.toast('发料数量不能大于未发数量!')
                }
                // const header = {
                //     'Content-Type': 'application/x-www-form-urlencoded',
                //     'rediskey': uni.getStorageSync('rediskey'),
                //     'admin': uni.getStorageSync('usercode'),
                //     'username': encodeURIComponent(uni.getStorageSync('username')),
                //     'navTabId': uni.getStorageSync('usercode'),
                //     'userid': uni.getStorageSync('userid'),
                //     'guid': uni.getStorageSync('guid'),
                //     'usertype': 'APP'
                // }
                const data = {
                    mesordercode: this.topContent[0].wo_code, // å·¥å•编号
                    partcode: this.topContent[0].partnumber, // äº§å“ç¼–码
                    stepseq: this.topContent[0].seq, // å·¥åºåºå·
                    stepcode: this.topContent[0].stepcode, // å·¥åºç¼–码
                    wxcode: this.WXSheetList.find(i => i.name === this.WXSheetValue).code, // å¤–协供应商编码
                    outuser: this.userSheetList.find(i => i.username === this.userSheetValue).usercode, // å‘料人员
                    taskqty: this.topContent[0].planqty, // ä»»åŠ¡æ•°é‡
                    fqty: this.fqty // å‘料数量
                }
                console.log(JSON.stringify(data), 6)
                this.isDisabledSubmitButton = true
                const res = await SavaMesOrderStepOut(data)
                if (res.code === '200') {
                    uni.$u.toast('发料成功!')
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.fqty = null
                    this.topContent = []
                    if (this.fromType === '1') {
                        let pages = getCurrentPages(); // é¡µé¢é›†åˆ
                        let beforePage = pages[pages.length - 2]; //上一个页面
                        beforePage.$vm.getProductionScheduleKanban()
                        uni.navigateBack()
                    }
                    this.isDisabledSubmitButton = false
                }
                // this.isDisabledSubmitButton = true
                // uni.uploadFile({
                //     url: this.$baseUrl + '/AppProductionManagement/SavaMesOrderStepOut',
                //     files: [{
                //         "uri": "/"
                //     }],
                //     header: header,
                //     formData: data,
                //     success: (res) => {
                //         uni.$u.toast('发料成功!')
                //         this.WXSheetValue = ''
                //         this.userSheetValue = ''
                //         this.fqty = null
                //         this.topContent = []
                //         this.isDisabledSubmitButton = false
                //     },
                //     fail(res) {
                //         uni.$u.toast('发料失败!')
                //         this.isDisabledSubmitButton = false
                //     },
                // })
            }
        }
    }
</script>
<style lang="scss" scoped>
    @import url('@/style/global.css');
    ::v-deep .uicon-arrow-left>span {
        display: block;
    }
    .custominputClass {
        width: 412rpx;
        display: flex;
        justify-content: space-between;
        border: 3rpx #eff0f1 solid;
        border-radius: 10rpx;
        padding: 0 16rpx;
        line-height: 68rpx;
    }
</style>
pages/wwgl/wxsl.vue
@@ -1,271 +1,225 @@
<template>
    <view>
        <page-nav title="委外收料"></page-nav>
        <page-nav title="外协收料"></page-nav>
        <view v-show="topContent.length===0">
            <div class="sacnBody">
                <div class="scanImg" @click="topScanClick"></div>
                <div class="scanText">扫描任务条码</div>
            </div>
        <view class="flex_center" style="margin: 20rpx;">
            <!-- #ifdef H5 -->
            <u--input prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" :placeholder="placeholder"
                style="width:100%;background-color: #fff;border-radius: 40rpx;" border="surround" suffixIcon="scan"
                suffixIconStyle="color: #909399;font-size: 22px;" v-model="inputBoxValue"
                @change="confirmInputBoxValue">
                <template slot="suffix">
                    <u-icon name="scan" color="#909399" size="24" @click="scanClick"></u-icon>
                </template>
            </u--input>
            <!-- #endif -->
            <!-- #ifdef APP-PLUS -->
            <u-input prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399" :placeholder="placeholder"
                style="width:100%;background-color: #fff;border-radius: 40rpx;" border="surround" suffixIcon="scan"
                suffixIconStyle="color: #909399;font-size: 22px;" v-model="inputBoxValue"
                @change="confirmInputBoxValue">
                <template slot="suffix">
                    <u-icon name="scan" color="#909399" size="24" @click="scanClick"></u-icon>
                </template>
            </u-input>
            <!-- #endif -->
            <view class="flex_center marginLeft20" @click="popupShow=true">
                <u--text size='16' color='#909399' text="筛选"></u--text>
                <u--image :showLoading="true" src="../../static/img/sift.png" width="20px" height="20px"></u--image>
            </view>
        </view>
        <view v-show="topContent.length!==0" class="mainContent">
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            æ”¶æ–™ä¿¡æ¯
        <u-alert :title="alertTitle" type="info"></u-alert>
        <!-- æŠ˜å é¢æ¿ -->
        <!-- <u-collapse @change="change" @close="close" @open="open"> -->
        <!-- @change="collapseChange" -->
        <u-collapse style="max-height: 590px;overflow: auto;">
            <!-- :value='parseFloat(item.ordergoodqty)+"/"+parseFloat(item.orderqty)' -->
            <u-collapse-item style="position: relative;" :title="item.ordercode" :name='item.ordercode'
                :value='parseFloat(item.ordergoodqty)+"/"+parseFloat(item.orderqty)'
                :label="item.children.length===0?'未派发':''" :disabled='item.children.length===0'
                v-for="item in collapseArr" :key="item.ordercode">
                <view style="position: absolute;width: 200rpx;left: 30rpx;top:34px;font-size: 24rpx;color: #999;">
                    {{item.partname}} {{item.partspec}}
                </view>
                <!-- <view style="position: absolute;width: 26%;left: 44%;top:16px;"> -->
                <view style="position: absolute;width: 120px;left: 44%;top:16px;color:#0659ff"
                    @click="progressClick(item.ordercode)">
                    <!-- {{item.partname}}{{item.partspec}} -->
                    <u-line-progress :percentage="parseFloat((item.ordergoodqty*100/item.orderqty).toFixed(2))"
                        inactiveColor="#d1d6f5" height="10" activeColor="#0659ff"></u-line-progress>
                </view>
                <!--             <view style="position: absolute;width: 100px;right: 33px;  top:13px; ">
                    <view class="" style="display: flex;justify-content: flex-end;">
                        <view style="color: #0659ff;">
                            {{parseFloat(item.ordergoodqty)}}
                        </view>
                        <view>
                            /{{ parseFloat(item.orderqty)}}
                        </view>
                    </view>
                </view>
 -->
                <view v-if="radiovalue==='生产工单'" style="margin:0 0  5px">
                    <view class="flex_column">
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品编码:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partcode}}</view>
                        </view>
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品名称:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partname}}</view>
                        </view>
                        <view style="display:flex">
                            <view class="titleFont" style="font-size: 14px;">产品规格:</view>
                            <view class="contentFont" style="font-size: 14px;">{{item.partspec?item.partspec:'/'}}
                            </view>
                        </view>
                    </view>
                </view>
                <view class="marginLeft20 marginRight20" style="height: 410rpx;" v-if="topContent.length!==0">
                    <view class="marginBottom20" style="display: flex;">
                        <!--  v-for="item in purchorderArr"  -->
                        <view class="flex_column titleFont">
                            <view>工单编号:</view>
                            <view>产品编码:</view>
                            <view>产品名称:</view>
                            <view>产品规格:</view>
                            <view>当前工序:</view>
                            <view>任务数量:</view>
                            <view>未收/已收:</view>
                            <view>下道工序:</view>
                <!-- {{item.children}} -->
                <!-- <u--text class="u-collapse-content"> -->
                <u-steps :current="-1" inactiveColor='#0659FF' direction="column">
                    <view v-for="(it,ind) in item.children" :key="item.ordercode+it.name+ind"
                        @click="gotoPage(item.ordercode,it.code)" style="display: flex;align-items: center;">
                        <u-steps-item :title="it.code+'/'+it.name+it.spec"></u-steps-item>
                        <view class="" style="width: 100px;">
                            <u-line-progress :percentage="parseFloat((it.goodqty*100/it.planqty).toFixed(2))"
                                inactiveColor="#d1d6f5" height="10" activeColor="#0659ff"></u-line-progress>
                        </view>
                        <view class="flex_column contentFont">
                            <view>{{topContent[0].wo_code}}</view>
                            <view>{{topContent[0].partnumber}}</view>
                            <view>{{topContent[0].partname}}</view>
                            <view>{{topContent[0].partspec?topContent[0].partspec:'/'}}</view>
                            <view>{{topContent[0].stepname}}</view>
                            <view>{{topContent[0].planqty}}</view>
                            <view>{{topContent[0].startqty+'/'+topContent[0].reportqty}}</view>
                            <view>{{topContent[0].nextstepname?topContent[0].nextstepname:'/'}}</view>
                        <view style="width: 30%;text-align: right;">
                            <view class="" style="display: flex;justify-content: flex-end;">
                                <view style="color: #0659ff;">
                                    {{parseFloat(it.goodqty)}}
                                </view>
                                <view>
                                    /{{ parseFloat(it.planqty)}}
                                </view>
                            </view>
                        </view>
                    </view>
                </u-steps>
                <!-- </u--text> -->
            </u-collapse-item>
        </u-collapse>
        <!-- å¼¹å‡ºå±‚ -->
        <!-- closeIconPos='top-left' closeOnClickOverlay  closeable='true' -->
        <u-popup :show="popupShow" mode="right" @close="popupClose" @open="popupOpen">
            <view style="margin: 120px 10px 20px;" class="flex_column">
                <!--         <view style="display: flex;">
                    <view>
                        å•据类型:
                    </view>
                    <u-radio-group v-model="radiovalue" placement="column" @change="groupChange"
                        style="margin-top: 4px;">
                        <u-radio :customStyle="{marginBottom: '8px'}" v-for="(item, index) in radiolist"
                            :key="index+item.name" :label="item.name" iconSize='16' labelSize='16' :name="item.name">
                        </u-radio>
                    </u-radio-group>
                </view> -->
                <view style="margin-top: 20px;display: flex;align-items: center;">
                    <view class="">
                        äº§å“ä¿¡æ¯ï¼š
                    </view>
                    <view class="">
                        <u-button :hairline="true" shape="circle" icon="map" :plain="true"
                            style="width: 100px;height: 26px;" type="primary" text="选择产品" @click="chosePart"></u-button>
                    </view>
                </view>
                <view style="display: flex;flex-wrap: wrap;">
                    <u-tag style="width:220rpx;" :text="item.name" v-for="item in tagArr" :key="item.code"
                        :closable="true" :show="item.close" @close="tagClose(item)"></u-tag>
                </view>
                <!--     <view class="head" style="margin-top: 10px;">
                    <view class="head_block" style="height: 80rpx; display: flex;justify-content: space-around;">
                        <u-button :plain='today' style="width: 70px;height: 25px;" @click="dateChange('today')"
                            type="primary" shape="circle" text="今日">
                        </u-button>
                        <u-button :plain='month' style="width: 70px;height: 25px;" @click="dateChange('month')"
                            type="primary" shape="circle" text="本月">
                        </u-button>
                        <u-button :plain='custom' style="width: 70px;height: 25px;" @click="dateChange('custom')"
                            type="primary" shape="circle" text="自定义"></u-button>
                    </view>
                </view>
                <view v-if="!custom" class="flex_column"
                    style="display: flex;justify-content: space-around;width: 100%;">
                    <view class="" style="display: flex;justify-content: space-evenly;width: 100%;">
                        <view class="titleFont">开始日期</view>
                        <view class="titleFont">~</view>
                        <view class="titleFont">结束日期</view>
                    </view>
                    <u-button type="info" icon='calendar' iconColor="#0659FF" size="" @click="calendarClick"
                        :text="calendarRange">
                    </u-button>
                </view> -->
                <!-- <uni-calendar ref="calendar" :range='true' :insert="false" @confirm="calendarConfirm" /> -->
            </view>
        </u-popup>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            æ”¶æ–™æ“ä½œ
                        </view>
                    </view>
                </view>
                <view class="flex_column">
                    <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                        <view style="display: flex;" class="titleFont">
                            <view style="color: red;margin-right: 6rpx;">*</view> å¤–协供方
                        </view>
                        <view style="margin-left: 20rpx;">
                            <view @click='WXSheetClick' class="custominputClass">
                                <view v-show='WXSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='WXSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{WXSheetValue}}
                                </view>
                                <u-icon :name="!WXSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                    </view>
                    <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                        <view style="display: flex;" class="titleFont">
                            <view style="color: red;margin-right: 6rpx;">*</view> æ”¶æ–™äººå‘˜
                        </view>
                        <view style="margin-left: 20rpx;">
                            <view @click='userSheetClick' class="custominputClass">
                                <view v-show='userSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='userSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{userSheetValue}}
                                </view>
                                <u-icon :name="!userSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                    </view>
                    <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                        <view style="color: red;margin-right: 6rpx;">*</view> æ”¶æ–™æ•°é‡
                        <view style="margin-left: 20rpx;">
                            <view class='inputClass'>
                                <u--input placeholder="请输入" border="surround" type='number' v-model="sqty">
                                </u--input>
                            </view>
                        </view>
                    </view>
                </view>
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <view class="head" v-if="topContent.length!==0">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title" style="font-weight: bolder;">
                                å¯æ”¶æ–™ä¾›åº”商
                            </view>
                        </view>
                    </view>
                    <view class="flex_column marginLeft20 marginRight20 marginBottom20 titleFont">
                        <view v-for='(i,index) in topContent[0].list'
                            v-if="parseFloat(i.fqty) - parseFloat(i.sqty) - parseFloat(i.ng_qty) - parseFloat(i.laborbad_qty)- parseFloat(i.materielbad_qty)>0"
                            style="display: flex;">
                            <view>{{index+1}}</view>
                            <view class="ellipsis" style="width: 400rpx;margin: 0 30rpx;">{{i.tp}}</view>
                            <view>
                                {{ parseFloat(i.fqty) - parseFloat(i.sqty) - parseFloat(i.ng_qty) - parseFloat(i.laborbad_qty)- parseFloat(i.materielbad_qty)}}
                            </view>
                            <!-- <view>ä»¶</view> -->
                        </view>
                    </view>
                </view>
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <view class="head  marginLeft10 marginRight10" style="padding-bottom: 20rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                ä¸è‰¯ç»Ÿè®¡
                            </view>
                        </view>
                    </view>
                    <view class="flex_column ">
                        <u-button type="primary" :plain="true" icon='plus-circle' text="添加"
                            style="width: 90%;margin: 20rpx auto;" @click="add"></u-button>
                        <view v-for='(item,index) in ngqtyArr' class="badSheetClass" :key="item.uid">
                            <view class="badNumber">{{index+1}}</view>
                            <u-icon name="trash" size="20" class="trash" v-if="ngqtyArr.length!==1"
                                @click="trashDelete(index)" color="rgb(0, 102, 255)"></u-icon>
                            <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                                <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯æ•°é‡ï¼š
                                <view class='inputClass'>
                                    <u--input placeholder="请输入" border="surround" :adjustPosition='false' type='number'
                                        v-model="item.ngqty"></u--input>
                                </view>
                            </view>
                            <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                                <view style="display: flex;" class="titleFont">
                                    <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯åŽŸå› ï¼š
                                </view>
                                <view @click='badSheetClick(item)' class="custominputClass">
                                    <view v-show='item.badSheetValue.length===0' style="color: rgb(192, 196, 204);">请选择
                                    </view>
                                    <view v-show='item.badSheetValue.length!==0' class="ellipsis"
                                        style="width: 390rpx;">
                                        {{item.badSheetValue}}
                                    </view>
                                    <u-icon :name="item.arrowDown?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                                </view>
                            </view>
                            <u-divider></u-divider>
                        </view>
                    </view>
                </view>
            </view>
            <u-picker v-if="topContent.length!==0" :show="WXSheetShow" :columns="WXColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='WXSheetShow=false' @confirm='WXPickerConfirm'
                @cancel='WXSheetShow=false'>
            </u-picker>
            <u-picker v-if="topContent.length!==0" :show="userSheetShow" :columns="userColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='userSheetShow=false' @confirm='userPickerConfirm'
                @cancel='userSheetShow=false'>
            </u-picker>
            <!-- ä¸è‰¯åŽŸå›  -->
            <u-action-sheet v-if="topContent.length!==0" :actions="badSelectArr" :safeAreaInsetBottom='true'
                :closeOnClickOverlay="true" :closeOnClickAction="true" @close="badSelectClose" :show="badSheetShow"
                @select='badSheetSelect'>
                <view style="min-height: 100rpx;">
                    <u-checkbox-group @change="checkboxChange" size='20px' v-model="checkBoxValue" iconPlacement="right"
                        placement="column">
                        <view v-for="(item,index) in badSelectArr">
                            <u-checkbox activeColor="rgb(0, 102, 255)" labelSize='18' :key="item.code+index"
                                :name='item.name' :label="item.name">
                            </u-checkbox>
                        </view>
                    </u-checkbox-group>
                </view>
            </u-action-sheet>
        </view>
        <u-button size="large" v-show="topContent.length!==0" :loading="isDisabledSubmitButton"
            loadingText="正在提交,请稍等..." type="primary" @click="submit" text="收料">
        </u-button>
        <!-- æ‚¬æµ®çƒ -->
        <!--     <view v-show="topContent.length!==0&&!WXSheetShow&&!userSheetShow&&!badSheetShow" @click="topScanClick">
            <drag-ball :x='$DeviceInformation.screenWidth*0.8' :y="$DeviceInformation.screenHeight*0.7"></drag-ball>
        </view> -->
        <!-- <scan-code></scan-code> -->
        <!-- æ‚¬æµ®çƒ -->
        <view @click="scan2">
            <drag-ball :x='300' :y="600"></drag-ball>
        </view>
    </view>
</template>
<script>
    import {
        MesOrderStepStart,
        CustomerPermissions,
        PersonPermissions,
        DefectPermissions,
        SavaMesOrderStepIn,
        LabelBarCode
        ProductionScheduleKanban
    } from '../../config/api.js';
    // import scanCode from '@/components/scan-code/scan-code.vue'
    export default {
        onLoad(option) {
            const _this = this
            uni.$off('scancodedate') // æ¯æ¬¡è¿›æ¥å…ˆ ç§»é™¤å…¨å±€è‡ªå®šä¹‰äº‹ä»¶ç›‘听器
            uni.$on('scancodedate', function(content) {
                console.log("扫描到的内容为:", content)
                _this.getCheckScanDeviceQrCodeData(content)
            })
            console.log(option, 8)
        },
        onPullDownRefresh() {
@@ -279,70 +233,60 @@
        data() {
            return {
                topRightMessageCount: '',
                isDisabledSubmitButton: false,
                topContent: [],
                // {
                // "wo_code": "MO-2023-06-0003_1",
                // "partnumber": "308",
                // "partname": "电池包",
                // "partspec": "",
                // "seq": "2",
                // "stepcode": "ZSStep03",
                // "stepname": "去毛刺",
                // "nextstepcode": "ZSStep06",
                // "nextstepname": "包装2",
                // "stepdesc": "",
                // "wkshopcode": "ZS001",
                // "wkshopname": "注塑车间",
                // "planqty": 50.00,
                // "startqty": 29.00,
                // "noreportqty": 29.00,
                // "reportqty": 21.00,
                // "noputqty": 0.0,
                // "list": null
                // }, //扫描任务条码所带出来的内容
                WXSheetValue: '',
                WXSheetShow: false, //上拉列表是否展开
                WXColumns: [],
                WXSheetList: [],
                userSheetValue: '',
                userSheetShow: false,
                userColumns: [],
                userSheetList: [],
                sqty: null,
                ngqty: null,
                badSelectArr: [],
                checkBoxValue: '',
                badSheetShow: false,
                badSheetValue: '',
                ngqtyArr: [{
                        uid: new Date().getTime(),
                        ngqty: '',
                        badSheetValue: '',
                        arrowDown: true //向下箭头
                inputBoxValue: '',
                alertTitle: '',
                popupShow: false, //弹出层是否显示
                collapseArr: [ //折叠面板数据
                ],
                collapseArrAll: [], //所有
                placeholder: '请输入工单信息',
                radiovalue: '生产工单', //单据类型
                // SO:销售订单  MO:生产订单  PO:生产工单
                radiolist: [{
                        name: '销售订单'
                    },
                    {
                        name: '生产订单'
                    },
                    {
                        name: '生产工单'
                    },
                ],
                today: true,
                month: false,
                custom: true,
                // calendarRange: new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                // 10), //系统当前日期
                calendarRange: new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                    2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10), //当月日期
                tagArr: [
                    // {
                    //     ngqty: '',
                    //     badSheetValue: '',
                    //     arrowDown: true //向下箭头
                    //     close: true,
                    //     name: '电池包',
                    //     code: '1002'
                    // }, {
                    //     close: true,
                    //     name: '电脑',
                    //     code: '1003'
                    // }, {
                    //     close: true,
                    //     name: '8054光机',
                    //     code: '1004'
                    // }, {
                    //     close: true,
                    //     name: 'G71674冲锋枪',
                    //     code: '1005'
                    // }, {
                    //     close: true,
                    //     name: '8051光机',
                    //     code: '1006'
                    // },
                ], //不良数量、不良原因数组
                notes: null //备注
                ], //已选中的产品标签
            }
@@ -353,77 +297,27 @@
        mounted() {
            this.init()
            // this.getMesOrderStepStart('MO-2023-09-0002_1;106')
            this.handleSelectAllApi()
            this.getProductionScheduleKanban()
        },
        methods: {
            init() {
                uni.stopPullDownRefresh();
            },
            async handleSelectAllApi() {
                await this.getCustomerPermissions()
                await this.getPersonPermissions()
                await this.getDefectPermissions()
            },
            async getPersonPermissions(val) {
                const data = {
                    usercode: val
                }
                const res = await PersonPermissions(this.global.formatData(data))
                this.userSheetList = res.data
                this.userColumns = [res.data.map(i => i.username)]
            },
            async getCustomerPermissions() {
                const res = await CustomerPermissions()
                this.WXSheetList = res.data
                this.WXColumns = [res.data.map(i => i.name)]
            },
            // èŽ·å–ä¸è‰¯åŽŸå› 
            async getDefectPermissions() {
                const res = await DefectPermissions()
                if (res.code === '200') {
                    this.badSelectArr = res.data
                }
            },
            async getMesOrderStepStart(val) {
                const data = {
                    OperType: 'WX',
                    SelectType: 'IN',
                    wocode: val ? val.split(';')[0] : '',
                    stepcode: val ? val.split(';')[1] : ''
            gotoPage(p1, p2) {
                let orderstep = null
                if (p1) {
                    orderstep = p1 + ';' + p2
                } else {
                    orderstep = ''
                }
                const res = await MesOrderStepStart(this.global.formatData(data))
                console.log(res, 3)
                if (res.code === '200') {
                    // this.getCustomerPermissions(val)
                    // this.getMesOrderSelectUser(val)
                    // this.getDefectPermissions(val)
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.checkBoxValue = ''
                    this.badSheetValue = ''
                    this.sqty = null
                    this.ngqty = null
                    this.notes = null
                    this.topContent = []
                    this.topContent.push(res.data)
                }
                // console.log(this.topContent,6)
                uni.navigateTo({
                    url: './wxsl2?orderstep=' + orderstep
                })
            },
            //  ä»»åŠ¡æ¡ç   çš„æ‰«ç æ¡†ç‚¹å‡»
            topScanClick() {
            scan2() {
                let that = this;
                uni.scanCode({
@@ -433,8 +327,11 @@
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        // that.scanContent = res.result;
                        that.getMesOrderStepStart(res.result)
                        uni.navigateTo({
                            url: './wxsl2?orderstep=' + res.result
                        })
                    },
                    complete: function(res) {
@@ -447,172 +344,216 @@
                });
            },
            badSheetClick(item) {
                if (!item.ngqty) {
                    return uni.$u.toast('请先填写不良数量!')
                }
                item.arrowDown = !item.arrowDown
                this.checkBoxValue = item.badSheetValue.split(',')
                this.badSheetShow = true
            },
            badSheetSelect(val) {
                console.log('执行了!')
            },
            checkboxChange(val) {
                this.badSheetValue = val.join(',')
            },
            WXSheetClick() {
                this.WXSheetShow = true
            },
            WXPickerConfirm(val) {
                this.WXSheetValue = val.value[0]
                this.WXSheetShow = false
            },
            userSheetClick() {
                this.userSheetShow = true
            },
            userPickerConfirm(val) {
                this.userSheetValue = val.value[0]
                this.userSheetShow = false
            },
            // æ·»åŠ 
            add() {
                // if (this.ngqtyArr.find(i => i.badSheetValue === '')) {
                //     return uni.$u.toast('请先完善前面不良选项!')
                // }
                this.ngqtyArr.unshift({
                    uid: new Date().getTime(),
                    ngqty: '',
                    badSheetValue: '',
                    arrowDown: true //向下箭头
            getCheckboxValue(val) {
                this.tagArr = []
                val.forEach(i => {
                    this.tagArr.push({
                        close: true,
                        name: i.split('/')[1].trim(),
                        code: i.split('/')[0].trim()
                    })
                })
            },
            //删除
            trashDelete(index) {
                this.ngqtyArr.splice(index, 1)
            },
            badSelectClose() {
                let index = this.ngqtyArr.findIndex(i => !i.arrowDown)
                this.ngqtyArr[index].badSheetValue = this.checkBoxValue.join(',')
                this.ngqtyArr[index].arrowDown = true
                this.checkBoxValue = []
                this.badSheetShow = false
            },
            async submit() {
                if (!this.WXSheetValue) {
                    return uni.$u.toast('外协供方不能为空!')
            // æŽ¥å£èŽ·å–
            async getProductionScheduleKanban() {
                let ordertype = '' // SO:销售订单  MO:生产订单  PO:生产工单
                switch (this.radiovalue) {
                    case '生产工单':
                        this.alertTitle = '工单数量(共/个)'
                        this.placeholder = '请输入工单信息'
                        ordertype = 'PO'
                        break
                    case '生产订单':
                        this.alertTitle = '生产订单数量(共/个)'
                        this.placeholder = '请输入生产订单信息'
                        ordertype = 'MO'
                        break
                    case '销售订单':
                        this.alertTitle = '销售订单数量(共/个)'
                        this.placeholder = '请输入销售订单信息'
                        ordertype = 'SO'
                        break
                }
                if (!this.userSheetValue) {
                    return uni.$u.toast('收料人员不能为空!')
                }
                if (!this.sqty) {
                    return uni.$u.toast('收料数量不能为空!')
                }
                let t = this.topContent[0].list.find(i => i.tp === this.WXSheetValue)
                if (!t) {
                    return uni.$u.toast('请选择可收料的供应商!')
                }
                if (!this.ngqtyArr[0].ngqty && (parseFloat(this.sqty) > parseFloat(t.fqty) - parseFloat(t.sqty) -
                        parseFloat(t
                            .ng_qty) - parseFloat(t.laborbad_qty) - parseFloat(t.materielbad_qty))) {
                    return uni.$u.toast('收料数量不能大于该供应商的可收收料!')
                }
                // ä¸è‰¯åŽŸå› 
                const defectlist = []
                //不良数量
                let ngqtyNumber = 0
                this.ngqtyArr.forEach(i => {
                    if (i.badSheetValue.toString().length > 0) {
                        let codeArr = []
                        ngqtyNumber += parseFloat(i.ngqty)
                        i.badSheetValue.split(',').forEach(j => {
                            codeArr.push(this.badSelectArr.find(i => i.name === j).code)
                        })
                        defectlist.push({
                            badqty: i.ngqty,
                            defect_code: codeArr.join(',')
                        })
                    }
                })
                if ((parseFloat(this.sqty) + parseFloat(ngqtyNumber) > parseFloat(t.fqty) - parseFloat(t
                        .sqty) - parseFloat(t.ng_qty) - parseFloat(t.laborbad_qty) - parseFloat(t.materielbad_qty))) {
                    return uni.$u.toast('收料数量+不良数量不能大于该供应商的可收收料!')
                }
                const D = {
                    rightcode: '0601',
                    partcode: this.topContent[0].partnumber,
                    qty: parseFloat(this.sqty),
                    onelabqty: parseFloat(this.sqty)
                }
                const {
                    data: R
                } = await LabelBarCode(D)
                const data = {
                    mesordercode: this.topContent[0].wo_code, // å·¥å•编号
                    partcode: this.topContent[0].partnumber, // äº§å“ç¼–码
                    stepseq: this.topContent[0].seq, // å·¥åºåºå·
                    stepcode: this.topContent[0].stepcode, // å·¥åºç¼–码
                    wxcode: this.WXSheetList.find(i => i.name === this.WXSheetValue).code, // å¤–协供应商编码
                    inuser: this.userSheetList.find(i => i.username === this.userSheetValue).usercode, // å‘料人员
                    taskqty: this.topContent[0].planqty, // ä»»åŠ¡æ•°é‡
                    sqty: this.sqty, // æ”¶æ–™æ•°é‡
                    // ngqty: !this.ngqty ? 0 : this.ngqty,
                    remarks: this.notes,
                    defectlist,
                    inbarcode: R[0].labcode, //入库条码
                    ordertype,
                    partcode: this.tagArr.map(i => i.code).join(','),
                    Ratetime: this.calendarRange,
                }
                const {
                    data: res
                } = await ProductionScheduleKanban(data)
                this.collapseArr = res
                this.collapseArrAll = res
                this.alertTitle = this.alertTitle.split('/')[0] + this.collapseArr.length + this.alertTitle.split('/')[
                    1]
            },
            //输入框回车确认事件
            confirmInputBoxValue(val) {
                this.collapseArr = this.collapseArrAll.filter((p) => {
                    return p.ordercode.indexOf(val) !== -1
                })
                switch (this.radiovalue) {
                    case '生产工单':
                        this.alertTitle = '工单数量(共/个)'
                        break
                    case '生产订单':
                        this.alertTitle = '生产订单数量(共/个)'
                        break
                    case '销售订单':
                        this.alertTitle = '销售订单数量(共/个)'
                        break
                }
                this.alertTitle = this.alertTitle.split('/')[0] + this.collapseArr.length + this.alertTitle.split('/')[
                    1]
            },
            // ç‚¹å‡»æ‰«ç 
            scanClick() {
                this.topScanClick()
            },
            // æ‰«ç æ¡†ç‚¹å‡»
            topScanClick() {
                let that = this;
                uni.scanCode({
                    onlyFromCamera: true,
                    // scanType: ['barCode', 'qrCode'],
                    scanType: ['qrCode'],
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        that.scanContent = res.result;
                        that.getCheckScanDeviceQrCodeData(that.scanContent);
                    },
                    complete: function(res) {
                    },
                    fail: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                    }
                });
            },
            getCheckScanDeviceQrCodeData(code) {
                this.inputBoxValue = code
                this.confirmInputBoxValue(this.inputBoxValue)
            },
            // å¼¹å‡ºå±‚æ”¶èµ·
            popupClose() {
                this.getProductionScheduleKanban()
                this.popupShow = false
            },
            // å¼¹å‡ºå±‚弹出
            popupOpen() {
            },
            // é€‰æ‹©äº§å“
            chosePart() {
                let arr = []
                this.tagArr.forEach(i => {
                    arr.push(i.code + '/' + i.name)
                })
                uni.navigateTo({
                    url: '../znfx/chda?param=' + JSON.stringify(arr)
                });
            },
            // tag标签关闭
            tagClose(val) {
                this.tagArr.forEach((i, j) => {
                    if (i.code === val.code) {
                        i.close = false
                        this.tagArr.splice(j, 1)
                    }
                })
            },
            // æ—¶é—´èŒƒå›´åˆ‡æ¢
            dateChange(val) {
                if (val === 'today') {
                    this.today = false
                    this.month = true
                    this.custom = true
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                        10)
                } else if (val === 'month') {
                    this.today = true
                    this.month = false
                    this.custom = true
                    this.calendarRange = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                        2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10)
                } else if (val === 'custom') {
                    this.today = true
                    this.month = true
                    this.custom = false
                    this.calendarRange = new Date().getFullYear() + '-' + (new Date().getMonth() + 1).toString().padStart(
                        2, '0') + '-01' + '~' + new Date().toISOString().slice(0, 10)
                }
            },
            // æ—¥åŽ†æ—¶é—´ç‚¹å‡»
            calendarClick() {
                this.$refs.calendar.open();
            },
            // æ—¥åŽ†ç¡®å®šäº‹ä»¶ç‚¹å‡»
            calendarConfirm(val) {
                if (val.range.before < val.range.after) {
                    this.calendarRange = val.range.before + '~' + val.range.after
                } else {
                    this.calendarRange = val.range.after + '~' + val.range.before
                }
                console.log(JSON.parse(JSON.stringify(data)), 6)
                this.isDisabledSubmitButton = true
                const res = await SavaMesOrderStepIn(data)
                if (res.code === '200') {
                    uni.$u.toast('收料成功!')
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.checkBoxValue = ''
                    this.badSheetValue = ''
                    this.sqty = null
                    this.ngqty = null
                    this.notes = null
                    this.topContent = []
                    this.isDisabledSubmitButton = false
                if (val.range.before === '') {
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + val.range.after
                }
                if (val.range.after === '') {
                    this.calendarRange = val.range.before + '~' + new Date().toISOString().slice(0, 10)
                }
                if (val.range.before === '' && val.range.after === '') {
                    this.calendarRange = new Date().toISOString().slice(0, 10) + '~' + new Date().toISOString().slice(0,
                        10)
                }
                // this.getData()
            },
            }
            // å•选按钮切换
            groupChange(val) {
                console.log(val)
            },
        }
    }
</script>
@@ -624,43 +565,74 @@
        display: block;
    }
    ::v-deep .u-action-sheet {
        max-height: 600rpx !important;
        overflow: auto !important;
    ::v-deep .u-alert__text--info--light {
        margin-bottom: 0;
        font-size: 32rpx !important;
        padding-left: 10rpx;
        color: #212121 !important;
        font-weight: lighter;
    }
    ::v-deep .u-checkbox-label--right {
        padding: 30rpx;
        border-bottom: 1rpx solid #eee;
    ::v-deep .u-alert--info--light {
        background-color: rgba(255, 255, 255, 0.7);
    }
    .custominputClass {
        width: 412rpx;
        display: flex;
        justify-content: space-between;
        border: 3rpx #eff0f1 solid;
        border-radius: 10rpx;
        padding: 0 16rpx;
        line-height: 68rpx;
    ::v-deep .u-steps-item__wrapper {
        background-color: #eee;
    }
    .badSheetClass {
        position: relative;
    ::v-deep .u-steps-item__line--column {
        display: none;
    }
    .badNumber {
        position: absolute;
        top: 20rpx;
        left: 20rpx;
        font-size: 26rpx;
        color: rgb(0, 102, 255)
    ::v-deep .u-slide-right-enter-active {
        width: 70%;
    }
    .trash {
        position: absolute;
        top: 20rpx;
        right: 30rpx;
        font-size: 26rpx;
    ::v-deep .uicon-calendar {
        font-size: 36rpx !important;
    }
    ::v-deep .u-cell__title-text {
        font-size: 28rpx;
        color: #212121;
    }
    ::v-deep .u-cell__value {
        font-size: 28rpx;
        // color: transparent;
        color: #212121;
    }
    ::v-deep .u-cell__label {
        margin-top: 0;
        line-height: 12px;
    }
    ::v-deep .uicon-arrow-right {
        font-size: 14px !important;
        color: #212121 !important;
    }
    ::v-deep .u-line-progress__text {
        // margin-right: -20px;
        // color: #212121;
        // width: 100px;
        // margin-top: 10px;
        display: none;
    }
    ::v-deep .u-text__value--content {
        font-size: 12px !important;
    }
    ::v-deep .u-tag__close {
        background: #436df5 !important;
    }
    ::v-deep .u-cell__body {
        padding-bottom: 40rpx;
    }
</style>
pages/wwgl/wxsl2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,682 @@
<template>
    <view>
        <page-nav title="委外收料"></page-nav>
        <view v-show="topContent.length===0">
            <div class="sacnBody">
                <div class="scanImg" @click="topScanClick"></div>
                <div class="scanText">扫描任务条码</div>
            </div>
        </view>
        <view v-show="topContent.length!==0" class="mainContent">
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            æ”¶æ–™ä¿¡æ¯
                        </view>
                    </view>
                </view>
                <view class="marginLeft20 marginRight20" style="height: 410rpx;" v-if="topContent.length!==0">
                    <view class="marginBottom20" style="display: flex;">
                        <!--  v-for="item in purchorderArr"  -->
                        <view class="flex_column titleFont">
                            <view>工单编号:</view>
                            <view>产品编码:</view>
                            <view>产品名称:</view>
                            <view>产品规格:</view>
                            <view>当前工序:</view>
                            <view>任务数量:</view>
                            <view>未收/已收:</view>
                            <view>下道工序:</view>
                        </view>
                        <view class="flex_column contentFont">
                            <view>{{topContent[0].wo_code}}</view>
                            <view>{{topContent[0].partnumber}}</view>
                            <view>{{topContent[0].partname}}</view>
                            <view>{{topContent[0].partspec?topContent[0].partspec:'/'}}</view>
                            <view>{{topContent[0].stepname}}</view>
                            <view>{{topContent[0].planqty}}</view>
                            <view>{{topContent[0].startqty+'/'+topContent[0].reportqty}}</view>
                            <view>{{topContent[0].nextstepname?topContent[0].nextstepname:'/'}}</view>
                        </view>
                    </view>
                </view>
            </view>
            <u-gap height="10" bgColor="#eff0f1"></u-gap>
            <view class="head">
                <view class="head_block">
                    <view class="head_left">
                        <view class="head_bar"></view>
                        <view class="head_title" style="font-weight: bolder;">
                            æ”¶æ–™æ“ä½œ
                        </view>
                    </view>
                </view>
                <view class="flex_column">
                    <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                        <view style="display: flex;" class="titleFont">
                            <view style="color: red;margin-right: 6rpx;">*</view> å¤–协供方
                        </view>
                        <view style="margin-left: 20rpx;">
                            <view @click='WXSheetClick' class="custominputClass">
                                <view v-show='WXSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='WXSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{WXSheetValue}}
                                </view>
                                <u-icon :name="!WXSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                    </view>
                    <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                        <view style="display: flex;" class="titleFont">
                            <view style="color: red;margin-right: 6rpx;">*</view> æ”¶æ–™äººå‘˜
                        </view>
                        <view style="margin-left: 20rpx;">
                            <view @click='userSheetClick' class="custominputClass">
                                <view v-show='userSheetValue===""' style="color: rgb(192, 196, 204);">请选择</view>
                                <view v-show='userSheetValue!==""' class="ellipsis" style="width: 390rpx;">
                                    {{userSheetValue}}
                                </view>
                                <u-icon :name="!userSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                            </view>
                        </view>
                    </view>
                    <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                        <view style="color: red;margin-right: 6rpx;">*</view> æ”¶æ–™æ•°é‡
                        <view style="margin-left: 20rpx;">
                            <view class='inputClass'>
                                <u--input placeholder="请输入" border="surround" type='number' v-model="sqty">
                                </u--input>
                            </view>
                        </view>
                    </view>
                </view>
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <view class="head" v-if="topContent.length!==0">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title" style="font-weight: bolder;">
                                å¯æ”¶æ–™ä¾›åº”商
                            </view>
                        </view>
                    </view>
                    <view class="flex_column marginLeft20 marginRight20 marginBottom20 titleFont">
                        <view v-for='(i,index) in topContent[0].list'
                            v-if="parseFloat(i.fqty) - parseFloat(i.sqty) - parseFloat(i.ng_qty) - parseFloat(i.laborbad_qty)- parseFloat(i.materielbad_qty)>0"
                            style="display: flex;">
                            <view>{{index+1}}</view>
                            <view class="ellipsis" style="width: 400rpx;margin: 0 30rpx;">{{i.tp}}</view>
                            <view>
                                {{ parseFloat(i.fqty) - parseFloat(i.sqty) - parseFloat(i.ng_qty) - parseFloat(i.laborbad_qty)- parseFloat(i.materielbad_qty)}}
                            </view>
                            <!-- <view>ä»¶</view> -->
                        </view>
                    </view>
                </view>
                <u-gap height="10" bgColor="#eff0f1"></u-gap>
                <view class="head  marginLeft10 marginRight10" style="padding-bottom: 20rpx;">
                    <view class="head_block">
                        <view class="head_left">
                            <view class="head_bar"></view>
                            <view class="head_title">
                                ä¸è‰¯ç»Ÿè®¡
                            </view>
                        </view>
                    </view>
                    <view class="flex_column ">
                        <u-button type="primary" :plain="true" icon='plus-circle' text="添加"
                            style="width: 90%;margin: 20rpx auto;" @click="add"></u-button>
                        <view v-for='(item,index) in ngqtyArr' class="badSheetClass" :key="item.uid">
                            <view class="badNumber">{{index+1}}</view>
                            <u-icon name="trash" size="20" class="trash" v-if="ngqtyArr.length!==1"
                                @click="trashDelete(index)" color="rgb(0, 102, 255)"></u-icon>
                            <view class="flex_center titleFont" style="margin: 0rpx 20rpx 10rpx;line-height: 56rpx;">
                                <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯æ•°é‡ï¼š
                                <view class='inputClass'>
                                    <u--input placeholder="请输入" border="surround" :adjustPosition='false' type='number'
                                        v-model="item.ngqty"></u--input>
                                </view>
                            </view>
                            <view class="flex_center" style="margin: 0rpx 20rpx 10rpx;line-height: 76rpx;">
                                <view style="display: flex;" class="titleFont">
                                    <view style="color: #fff;margin-right: 6rpx;">*</view> ä¸è‰¯åŽŸå› ï¼š
                                </view>
                                <view @click='badSheetClick(item)' class="custominputClass">
                                    <view v-show='item.badSheetValue.length===0' style="color: rgb(192, 196, 204);">请选择
                                    </view>
                                    <view v-show='item.badSheetValue.length!==0' class="ellipsis"
                                        style="width: 390rpx;">
                                        {{item.badSheetValue}}
                                    </view>
                                    <u-icon :name="item.arrowDown?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                                </view>
                            </view>
                            <u-divider></u-divider>
                        </view>
                    </view>
                </view>
            </view>
            <u-picker v-if="topContent.length!==0" :show="WXSheetShow" :columns="WXColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='WXSheetShow=false' @confirm='WXPickerConfirm'
                @cancel='WXSheetShow=false'>
            </u-picker>
            <u-picker v-if="topContent.length!==0" :show="userSheetShow" :columns="userColumns" :itemHeight='55'
                :closeOnClickOverlay='true' @close='userSheetShow=false' @confirm='userPickerConfirm'
                @cancel='userSheetShow=false'>
            </u-picker>
            <!-- ä¸è‰¯åŽŸå›  -->
            <u-action-sheet v-if="topContent.length!==0" :actions="badSelectArr" :safeAreaInsetBottom='true'
                :closeOnClickOverlay="true" :closeOnClickAction="true" @close="badSelectClose" :show="badSheetShow"
                @select='badSheetSelect'>
                <view style="min-height: 100rpx;">
                    <u-checkbox-group @change="checkboxChange" size='20px' v-model="checkBoxValue" iconPlacement="right"
                        placement="column">
                        <view v-for="(item,index) in badSelectArr">
                            <u-checkbox activeColor="rgb(0, 102, 255)" labelSize='18' :key="item.code+index"
                                :name='item.name' :label="item.name">
                            </u-checkbox>
                        </view>
                    </u-checkbox-group>
                </view>
            </u-action-sheet>
        </view>
        <u-button size="large" v-show="topContent.length!==0" :loading="isDisabledSubmitButton"
            loadingText="正在提交,请稍等..." type="primary" @click="submit" text="收料">
        </u-button>
        <!-- æ‚¬æµ®çƒ -->
        <!--     <view v-show="topContent.length!==0&&!WXSheetShow&&!userSheetShow&&!badSheetShow" @click="topScanClick">
            <drag-ball :x='$DeviceInformation.screenWidth*0.8' :y="$DeviceInformation.screenHeight*0.7"></drag-ball>
        </view> -->
        <!-- <scan-code></scan-code> -->
    </view>
</template>
<script>
    import {
        MesOrderStepStart,
        CustomerPermissions,
        PersonPermissions,
        DefectPermissions,
        SavaMesOrderStepIn,
        LabelBarCode
    } from '../../config/api.js';
    // import scanCode from '@/components/scan-code/scan-code.vue'
    export default {
        onLoad(option) {
            if (option.orderstep) {
                this.fromType = '1'
                this.getMesOrderStepStart(option.orderstep)
            } else {
                this.fromType = '2'
            }
        },
        onPullDownRefresh() {
            setTimeout(() => {
                this.init(() => {
                    uni.stopPullDownRefresh();
                })
            }, 1000);
        },
        data() {
            return {
                topRightMessageCount: '',
                isDisabledSubmitButton: false,
                topContent: [],
                // {
                // "wo_code": "MO-2023-06-0003_1",
                // "partnumber": "308",
                // "partname": "电池包",
                // "partspec": "",
                // "seq": "2",
                // "stepcode": "ZSStep03",
                // "stepname": "去毛刺",
                // "nextstepcode": "ZSStep06",
                // "nextstepname": "包装2",
                // "stepdesc": "",
                // "wkshopcode": "ZS001",
                // "wkshopname": "注塑车间",
                // "planqty": 50.00,
                // "startqty": 29.00,
                // "noreportqty": 29.00,
                // "reportqty": 21.00,
                // "noputqty": 0.0,
                // "list": null
                // }, //扫描任务条码所带出来的内容
                WXSheetValue: '',
                WXSheetShow: false, //上拉列表是否展开
                WXColumns: [],
                WXSheetList: [],
                userSheetValue: '',
                userSheetShow: false,
                userColumns: [],
                userSheetList: [],
                sqty: null,
                ngqty: null,
                badSelectArr: [],
                checkBoxValue: '',
                badSheetShow: false,
                badSheetValue: '',
                ngqtyArr: [{
                        uid: new Date().getTime(),
                        ngqty: '',
                        badSheetValue: '',
                        arrowDown: true //向下箭头
                    },
                    // {
                    //     ngqty: '',
                    //     badSheetValue: '',
                    //     arrowDown: true //向下箭头
                    // },
                ], //不良数量、不良原因数组
                notes: null, //备注
                fromType: '1'
            }
        },
        created() {
        },
        mounted() {
            this.init()
            // this.getMesOrderStepStart('MO-2023-09-0002_1;106')
            this.handleSelectAllApi()
        },
        methods: {
            init() {
                uni.stopPullDownRefresh();
            },
            async handleSelectAllApi() {
                await this.getCustomerPermissions()
                await this.getPersonPermissions()
                await this.getDefectPermissions()
            },
            async getPersonPermissions(val) {
                const data = {
                    usercode: val
                }
                const res = await PersonPermissions(this.global.formatData(data))
                this.userSheetList = res.data
                this.userColumns = [res.data.map(i => i.username)]
            },
            async getCustomerPermissions() {
                const res = await CustomerPermissions()
                this.WXSheetList = res.data
                this.WXColumns = [res.data.map(i => i.name)]
            },
            // èŽ·å–ä¸è‰¯åŽŸå› 
            async getDefectPermissions() {
                const res = await DefectPermissions()
                if (res.code === '200') {
                    this.badSelectArr = res.data
                }
            },
            async getMesOrderStepStart(val) {
                const data = {
                    OperType: 'WX',
                    SelectType: 'IN',
                    wocode: val ? val.split(';')[0] : '',
                    stepcode: val ? val.split(';')[1] : ''
                }
                const res = await MesOrderStepStart(this.global.formatData(data))
                console.log(res, 3)
                if (res.code === '200') {
                    // this.getCustomerPermissions(val)
                    // this.getMesOrderSelectUser(val)
                    // this.getDefectPermissions(val)
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.checkBoxValue = ''
                    this.badSheetValue = ''
                    this.sqty = null
                    this.ngqty = null
                    this.notes = null
                    this.topContent = []
                    this.topContent.push(res.data)
                }
                // console.log(this.topContent,6)
            },
            //  ä»»åŠ¡æ¡ç   çš„æ‰«ç æ¡†ç‚¹å‡»
            topScanClick() {
                let that = this;
                uni.scanCode({
                    onlyFromCamera: true,
                    // scanType: ['barCode', 'qrCode'],
                    scanType: ['qrCode'],
                    success: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                        that.getMesOrderStepStart(res.result)
                    },
                    complete: function(res) {
                    },
                    fail: function(res) {
                        console.log('条码类型:' + res.scanType);
                        console.log('条码内容:' + res.result);
                    }
                });
            },
            badSheetClick(item) {
                if (!item.ngqty) {
                    return uni.$u.toast('请先填写不良数量!')
                }
                item.arrowDown = !item.arrowDown
                this.checkBoxValue = item.badSheetValue.split(',')
                this.badSheetShow = true
            },
            badSheetSelect(val) {
                console.log('执行了!')
            },
            checkboxChange(val) {
                this.badSheetValue = val.join(',')
            },
            WXSheetClick() {
                this.WXSheetShow = true
            },
            WXPickerConfirm(val) {
                this.WXSheetValue = val.value[0]
                this.WXSheetShow = false
            },
            userSheetClick() {
                this.userSheetShow = true
            },
            userPickerConfirm(val) {
                this.userSheetValue = val.value[0]
                this.userSheetShow = false
            },
            // æ·»åŠ 
            add() {
                // if (this.ngqtyArr.find(i => i.badSheetValue === '')) {
                //     return uni.$u.toast('请先完善前面不良选项!')
                // }
                this.ngqtyArr.unshift({
                    uid: new Date().getTime(),
                    ngqty: '',
                    badSheetValue: '',
                    arrowDown: true //向下箭头
                })
            },
            //删除
            trashDelete(index) {
                this.ngqtyArr.splice(index, 1)
            },
            badSelectClose() {
                let index = this.ngqtyArr.findIndex(i => !i.arrowDown)
                this.ngqtyArr[index].badSheetValue = this.checkBoxValue.join(',')
                this.ngqtyArr[index].arrowDown = true
                this.checkBoxValue = []
                this.badSheetShow = false
            },
            async submit() {
                if (!this.WXSheetValue) {
                    return uni.$u.toast('外协供方不能为空!')
                }
                if (!this.userSheetValue) {
                    return uni.$u.toast('收料人员不能为空!')
                }
                if (!this.sqty) {
                    return uni.$u.toast('收料数量不能为空!')
                }
                let t = this.topContent[0].list.find(i => i.tp === this.WXSheetValue)
                if (!t) {
                    return uni.$u.toast('请选择可收料的供应商!')
                }
                if (!this.ngqtyArr[0].ngqty && (parseFloat(this.sqty) > parseFloat(t.fqty) - parseFloat(t.sqty) -
                        parseFloat(t
                            .ng_qty) - parseFloat(t.laborbad_qty) - parseFloat(t.materielbad_qty))) {
                    return uni.$u.toast('收料数量不能大于该供应商的可收收料!')
                }
                // ä¸è‰¯åŽŸå› 
                const defectlist = []
                //不良数量
                let ngqtyNumber = 0
                this.ngqtyArr.forEach(i => {
                    if (i.badSheetValue.toString().length > 0) {
                        let codeArr = []
                        ngqtyNumber += parseFloat(i.ngqty)
                        i.badSheetValue.split(',').forEach(j => {
                            codeArr.push(this.badSelectArr.find(i => i.name === j).code)
                        })
                        defectlist.push({
                            badqty: i.ngqty,
                            defect_code: codeArr.join(',')
                        })
                    }
                })
                if ((parseFloat(this.sqty) + parseFloat(ngqtyNumber) > parseFloat(t.fqty) - parseFloat(t
                        .sqty) - parseFloat(t.ng_qty) - parseFloat(t.laborbad_qty) - parseFloat(t.materielbad_qty))) {
                    return uni.$u.toast('收料数量+不良数量不能大于该供应商的可收收料!')
                }
                const D = {
                    rightcode: '0601',
                    partcode: this.topContent[0].partnumber,
                    qty: parseFloat(this.sqty),
                    onelabqty: parseFloat(this.sqty)
                }
                const {
                    data: R
                } = await LabelBarCode(D)
                const data = {
                    mesordercode: this.topContent[0].wo_code, // å·¥å•编号
                    partcode: this.topContent[0].partnumber, // äº§å“ç¼–码
                    stepseq: this.topContent[0].seq, // å·¥åºåºå·
                    stepcode: this.topContent[0].stepcode, // å·¥åºç¼–码
                    wxcode: this.WXSheetList.find(i => i.name === this.WXSheetValue).code, // å¤–协供应商编码
                    inuser: this.userSheetList.find(i => i.username === this.userSheetValue).usercode, // å‘料人员
                    taskqty: this.topContent[0].planqty, // ä»»åŠ¡æ•°é‡
                    sqty: this.sqty, // æ”¶æ–™æ•°é‡
                    // ngqty: !this.ngqty ? 0 : this.ngqty,
                    remarks: this.notes,
                    defectlist,
                    inbarcode: R[0].labcode, //入库条码
                }
                console.log(JSON.parse(JSON.stringify(data)), 6)
                this.isDisabledSubmitButton = true
                const res = await SavaMesOrderStepIn(data)
                if (res.code === '200') {
                    uni.$u.toast('收料成功!')
                    this.WXSheetValue = ''
                    this.userSheetValue = ''
                    this.checkBoxValue = ''
                    this.badSheetValue = ''
                    this.sqty = null
                    this.ngqty = null
                    this.notes = null
                    this.topContent = []
                    if (this.fromType === '1') {
                        let pages = getCurrentPages(); // é¡µé¢é›†åˆ
                        let beforePage = pages[pages.length - 2]; //上一个页面
                        beforePage.$vm.getProductionScheduleKanban()
                        uni.navigateBack()
                    }
                    this.isDisabledSubmitButton = false
                }
            }
        }
    }
</script>
<style lang="scss" scoped>
    @import url('@/style/global.css');
    ::v-deep .uicon-arrow-left>span {
        display: block;
    }
    ::v-deep .u-action-sheet {
        max-height: 600rpx !important;
        overflow: auto !important;
    }
    ::v-deep .u-checkbox-label--right {
        padding: 30rpx;
        border-bottom: 1rpx solid #eee;
    }
    .custominputClass {
        width: 412rpx;
        display: flex;
        justify-content: space-between;
        border: 3rpx #eff0f1 solid;
        border-radius: 10rpx;
        padding: 0 16rpx;
        line-height: 68rpx;
    }
    .badSheetClass {
        position: relative;
    }
    .badNumber {
        position: absolute;
        top: 20rpx;
        left: 20rpx;
        font-size: 26rpx;
        color: rgb(0, 102, 255)
    }
    .trash {
        position: absolute;
        top: 20rpx;
        right: 30rpx;
        font-size: 26rpx;
    }
</style>
pages/znfx/chda.vue
@@ -28,9 +28,9 @@
        <view style="max-height: 540px;overflow: auto;">
            <u-checkbox-group v-model="checkboxValue" iconPlacement="right" placement="column" @change="checkboxChange">
                <u-checkbox :key="item.code.trim()+'/'+item.name"
                    :label="item.code.trim()+'/'+item.name" :labelSize='16' :size='16'
                    :borderBottom='true' v-for="item in collapseArr" :name="item.code+'/'+item.name">
                <u-checkbox :key="item.code.trim()+'/'+item.name" :label="item.code.trim()+'/'+item.name"
                    :labelSize='16' :size='16' :borderBottom='true' v-for="item in collapseArr"
                    :name="item.code+'/'+item.name">
                </u-checkbox>
            </u-checkbox-group>
        </view>
@@ -72,6 +72,7 @@
                inputBoxValue: '',
                alertTitle: '',
                collapseArrAll: [],
                collapseArr: [],
                checkboxValue: [],
@@ -89,11 +90,14 @@
            init() {
                uni.stopPullDownRefresh();
            },
            //输入框回车确认事件
            confirmInputBoxValue(val) {
                console.log('确认', val)
                this.getInventoryTreePermissions(val)
                // this.getInventoryTreePermissions(val)
                this.collapseArr = this.collapseArrAll.filter((p) => {
                    return p.code.indexOf(val) !== -1
                })
            },
@@ -101,7 +105,9 @@
                const {
                    data: res
                } = await InventoryTreePermissions(param === undefined ? '' : param)
                } = await InventoryTreePermissions()
                this.collapseArrAll = res
                this.collapseArr = res
                this.alertTitle = '产品(共' + res.length + '个)'
            },
pages/znfx/scjd.vue
@@ -47,9 +47,15 @@
                :label="item.children.length===0?'未派发':''" :disabled='item.children.length===0'
                v-for="item in collapseArr" :key="item.ordercode">
                <view style="position: absolute;width: 200rpx;left: 30rpx;top:34px;font-size: 24rpx;color: #999;">
                    {{item.partname}} {{item.partspec}}
                </view>
                <!-- <view style="position: absolute;width: 26%;left: 44%;top:16px;"> -->
                <view style="position: absolute;width: 100px;left: 44%;top:16px;"
                <view style="position: absolute;width: 120px;left: 44%;top:16px;color:#0659ff"
                    @click="progressClick(item.ordercode)">
                    <!-- {{item.partname}}{{item.partspec}} -->
                    <u-line-progress :percentage="parseFloat((item.ordergoodqty*100/item.orderqty).toFixed(2))"
                        inactiveColor="#d1d6f5" height="10" activeColor="#0659ff"></u-line-progress>
                </view>
@@ -580,4 +586,8 @@
    ::v-deep .u-tag__close {
        background: #436df5 !important;
    }
    ::v-deep .u-cell__body {
        padding-bottom: 40rpx;
    }
</style>