小小儁爺
2024-06-04 909097fb4e143250de194c928d91cc95a4ed2c5a
pages/scgl/scbg.vue
@@ -3,393 +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="15" 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="15" 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">
                        <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 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'
                           @change='ngqtyChange' type='number' v-model="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' class="custominputClass">
                        <view v-show='badSheetValue.length===0' style="color: rgb(192, 196, 204);">请选择</view>
                        <view v-show='badSheetValue.length!==0' class="ellipsis" style="width: 390rpx;">
                           {{badSheetValue}}
                        </view>
                        <u-icon :name="!badSheetShow?'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;">
                        <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> -->
                  <!-- 可能上拉显示 要换成下拉显示 -->
                  <!--       <uni-section style="width: 100%;" title=''>
                     <uni-data-select v-model="operSheetValue" :clear='false' emptyText :localdata="operSheetList">
                     </uni-data-select>
                  </uni-section>
                   -->
               </view>
            </view>
            <!-- 报工人员信息 -->
            <!--          <u-gap height="15" v-if="reckway==='班组'" bgColor="#eff0f1"></u-gap>
            <view class="head marginLeft10 marginRight10" v-if="reckway==='班组'">
               <view class="head_block">
                  <view class="head_left">
                     <view class="head_bar"></view>
                     <view class="head_title">
                        不良原因明细
            <!-- {{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 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-button type="primary" icon='plus-circle' plain
                  style="height: 100rpx;width: 98%;margin-top: 10rpx;" @click="addUser" class='addClass'
                  text="添加">
               </u-button>
            </u-steps>
            <!-- </u--text> -->
               <view class="flex_between titleFont" style="margin: 20rpx 40rpx 30rpx;">
                  <view>序号</view>
                  <view :style="{width:'200rpx'}">人员名称</view>
                  <view style="width: 184rpx;">分配比例(%)</view>
                  <view>操作</view>
         </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">
               <view class="flex_column marginLeft20 marginRight20" :key="item.usercode"
                  v-for="(item,index) in userArr">
                  <view class="flex_between marginLeft20 marginRight20 contentFont">
                     <view style="width: 60rpx;text-align: center;">{{(index+1)}}</view>
                     <view style="width: 200rpx;text-align: center;">{{item.username}}</view>
                     <view style="width: 240rpx; text-align: center;color: rgb(41, 121, 255);">
                        <u-number-box @focus='isAsyncChange=true' @blur='isAsyncChange=false'
                           :key="item.usercode" :asyncChange='isAsyncChange' step="0.01" :name='item.usercode'
                           @change='numberBoxChange' decimal-length="2" :value="item.ratio" inputWidth='110'>
                        </u-number-box>
                     </view>
                     <u-icon @click="deleteUser(item)" style="width: 50rpx;text-align: center;" name="trash"
                        min='0' max='100' color="#2979ff" size="24">
                     </u-icon>
                  </view>
                  <u-divider></u-divider>
               </view>
                  </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="20" 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="badSheetShow=false" :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>
         <u-modal v-if="topContent.length!==0" :show="modalShow" :showCancelButton='true' cancelText='取消'
            @close="modalShow=false" :closeOnClickOverlay="true" style=" " @cancel="modalCancel"
            @confirm="modalConfirm" title="不良明细" :content='modalContent'>
            <!--       <uni-section style="width: 100%;" title=''>
               <uni-data-select v-model="userSelectValue" :clear='false' emptyText :localdata="userSelectArr"
                  @change="userChange">
               </uni-data-select>
            </uni-section> -->
            <!--    <view style="display: flex;flex-direction: column;">
               <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" @change='ngqtyChange' type='number'
                        v-model="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' class="custominputClass">
                     <view v-show='badSheetValue.length===0' style="color: rgb(192, 196, 204);">请选择</view>
                     <view v-show='badSheetValue.length!==0' class="ellipsis" style="width: 390rpx;">
                        {{badSheetValue}}
                     </view>
                     <u-icon :name="!badSheetShow?'arrow-down-fill':'arrow-up-fill'"></u-icon>
                  </view>
               </view>
            </view> -->
         </u-modal>
      </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&&!modalShow&&!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() {
@@ -402,65 +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: '', //报工数量
            ngqty: '', //不良数量
            badSelectArr: [], //不良原因下拉数组
            badSheetValue: '', //不良原因选中值
            badSheetShow: false,
            checkBoxValue: [], //不良原因显示值
            operSheetValue: '', //操作人员选中值
            operSheetShow: false,
            operSheetList: [], //操作人员数组
            userArr: [], //报工人员信息数组
            modalShow: false,
            modalContent: '', //模态框数
            userSelectValue: '', //下拉选项值
            userSelectArrAll: [], //所有人员下拉数组
            userSelectArr: [
               // {
               //    value: '1001',
               //    text: '小美1'
               // },
            ], //人员下拉数组
            userGroupColumns: [], //
            eqpColumns: [], //
            operColumns: [], //
            isAsyncChange: false,
            today: true,
            month: false,
            custom: true,
            userCheckBoxValue: [],
            userSheetShow: false
            // 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: [
               // {
               //    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'
               // },
            ], //已选中的产品标签
         }
      },
      created() {
@@ -469,137 +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(',')
            // this.userCheckBoxValue = ['001']
            // this.$forceUpdate()
            // console.log(this.userCheckBoxValue);
         },
         //获取开工信息
         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)
               // this.getGroupsPermissions(res.data.wkshopcode)
               // let o = res.data.wo_code + ';' + res.data.stepcode
               // this.getEqpPermissionsPlus(o)
               // this.getDefectPermissions(o)
               // this.getPersonPermissions()
            const {
               data: res
            } = await ProductionScheduleKanban(data)
            } else if (res.code === '200' && res.count !== 1) {
               this.$u.toast('此工序已报工!')
            }
            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;
@@ -610,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) {
@@ -628,252 +450,111 @@
            });
         },
         // 步进器值改变时
         numberBoxChange(val) {
            this.userArr.find(i => i.usercode === val.name).ratio = parseFloat(val.value).toFixed(2)
         getCheckScanDeviceQrCodeData(code) {
            this.inputBoxValue = code
            this.confirmInputBoxValue(this.inputBoxValue)
         },
         ngqtyChange(val) {
            if (!parseFloat(val)) {
               this.badSheetValue = ''
               this.checkBoxValue = ''
            }
         // 弹出层收起
         popupClose() {
            this.getProductionScheduleKanban()
            this.popupShow = false
         },
         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 (parseFloat(this.reportqty) + parseFloat(this.ngqty) > parseFloat(this.topContent[0].noreportqty)) {
               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)
                  }
               })
            }
            if (this.ngqty !== '') {
               if (badcode.length === 0) {
                  return uni.$u.toast('不良原因未选择!')
               }
            }
            let reportuser = []
            if (this.operSheetValue.length > 0) {
               this.userSelectArrAll.forEach(i => {
                  if (this.operSheetValue.split(',').includes(i.name)) {
                     reportuser.push(i.code)
                  }
               })
            }
            console.log(this.userSelectValue);
            // reportuser = this.userArr.map(i => i.usercode).join(';') //报工人员
            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: 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.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
            }
         // 弹出层弹出
         popupOpen() {
         },
         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() {
            if (!this.ngqty) {
               return uni.$u.toast('请先填写不良数量!')
            }
            this.badSheetShow = true
         },
         checkboxChange(val) {
            this.badSheetValue = val.join(',')
            console.log(this.badSheetValue, 5);
         },
         operSheetClick() {
            if (this.reckway === '个人') {
               this.operSheetShow = true
            }
            if (this.reckway === '班组') {
               this.userSheetShow = true
            }
         // 选择产品
         chosePart() {
            let arr = []
            this.tagArr.forEach(i => {
               arr.push(i.code + '/' + i.name)
            })
            uni.navigateTo({
               url: '../znfx/chda?param=' + JSON.stringify(arr)
            });
         },
         operSheetSelect(val) {
            this.operSheetValue = val.name
            this.operSheetShow = false
         },
         // 添加人员按钮
         addUser() {
            this.userSelectArr = []
            this.userSelectArrAll.forEach(i => {
               if (!this.userArr.map(j => j.usercode).includes(i.code)) {
                  this.userSelectArr.push({
                     value: i.code,
                     text: i.name
                  })
         // tag标签关闭
         tagClose(val) {
            this.tagArr.forEach((i, j) => {
               if (i.code === val.code) {
                  i.close = false
                  this.tagArr.splice(j, 1)
               }
            })
            this.modalShow = true
         },
         },
         // 删除人员按钮
         deleteUser(item) {
            this.userArr = this.userArr.filter(i => i.usercode !== item.usercode)
         // 时间范围切换
         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
         },
         // 模态框取消按钮
         modalCancel() {
            this.modalShow = false
            this.userSelectValue = ''
         },
         // 模态框确认按钮
         modalConfirm() {
            if (this.userSelectValue) {
               this.userArr.unshift({
                  usercode: this.userSelectValue,
                  username: this.userSelectArrAll.find(i => i.code === this.userSelectValue).name
               })
               this.userSelectValue = ''
            } else {
               uni.$u.toast('请选择报工人员!')
               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)
            }
            this.modalShow = false
         },
         // 日历时间点击
         calendarClick() {
            this.$refs.calendar.open();
         },
         userChange(val) {
            this.userSelectValue = val
         // 日历确定事件点击
         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
            }
            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()
         },
         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
         // 单选按钮切换
         groupChange(val) {
            console.log(val)
         },
         eqpPickerConfirm(val) {
            this.eqpSheetValue = val.value[0]
            this.eqpSheetShow = false
         },
         operPickerConfirm(val) {
            this.operSheetValue = val.value[0]
            this.operSheetShow = false
         }
      }
   }
</script>
@@ -885,67 +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-number-box__minus {
      height: 50rpx !important;
   }
   ::v-deep .u-number-box__input {
      height: 50rpx !important;
   }
   ::v-deep .u-number-box__plus {
      height: 50rpx !important;
   }
   ::v-deep .u-checkbox-label--right {
      padding: 30rpx;
      border-bottom: 1rpx solid #eee;
   ::v-deep .u-cell__body {
      padding-bottom: 40rpx;
   }
</style>