<template>
|
<div class="bg">
|
<!-- 工单信息 -->
|
<V-WorkOrderInfo :info="info"></V-WorkOrderInfo>
|
<!-- 扫码投料/产出 -->
|
<!-- <div class="details_cz">
|
<div class="details_cz_smtl" @click="jump1('tl')" v-if="proxy.$auth('h5:workorderinput:create')">
|
<img src="@/assets/icon/gongdan_ic_saoma@2x.png" alt="" />
|
<span>扫码投料</span>
|
</div>
|
<div style="width: 20px"></div>
|
<div class="details_cz_smtl" @click="jump1('cc')" v-if="proxy.$auth('h5:workorderoutput:create')">
|
<img src="@/assets/icon/gongdan_ic_saoma@2x.png" alt="" />
|
<span>扫码产出</span>
|
</div>
|
</div> -->
|
<div class="bg_cate">
|
<div @click="clickIten(index)" :class="typeView == index ? 'bg_cate_item active' : 'bg_cate_item'"
|
v-for="(item, index) in cate" :key="index">{{ item.name }}</div>
|
</div>
|
<!-- 投料明细/合格产出明细/不良产出明细 -->
|
<div class="bg_list" v-if="typeView === 0">
|
<div class="bg_list_item">
|
<div class="bg_list_item_top">
|
<div class="bg_list_item_top_left">
|
<div class="bg_list_item_top_left_x"></div>
|
<span>投料明细</span>
|
<!-- <span class="blue left">{{tlTotal()}}</span> -->
|
</div>
|
<div class="bg_list_item_top_right" @click="jumpTL"
|
v-if="proxy.$auth('h5:workorderinput:create') && (info.bomType !== 1 || info.bomType == 0 || !info.bomType)">
|
<img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" />
|
<span>手动录入</span>
|
</div>
|
</div>
|
<template v-if="feedingData && feedingData.length > 0">
|
<van-swipe-cell v-for="(item, index) in feedingData" :key="index">
|
<div class="bg_list_item_h">
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<!-- <span>{{item.code}}</span> -->
|
<div class="bg_list_item_num_item_wl">
|
<span> {{ item.materialName }}{{ item.procedureName ? ` | ${item.procedureName}` : ''
|
}}</span>
|
<div class="bg_list_item_num_item_wl_lx">
|
<span class="green" v-if="item.qualityType == 0">合格 / </span>
|
<span class="yellow" v-if="item.qualityType == 1">不良 / </span>
|
<span class="red" v-if="item.qualityType == 2">报废 / </span>
|
<span>{{ item.locationName }}</span>
|
<span>{{ item.batch ? ` / ${item.batch}` : '' }}</span>
|
</div>
|
</div>
|
<div class="bg_list_item_num_item_sr">
|
<input v-model="item.num" :disabled="!proxy.$auth('h5:workorderinput:update')"
|
@blur="change(item.id, item.num, 'T', item.maxNum, item, item.unitAttribute)" type="number" />
|
<span>{{ item.unitName }}</span>
|
</div>
|
</div>
|
</div>
|
</div>
|
|
<template #right v-if="proxy.$auth('h5:workorderinput:delete')">
|
<van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'T')" type="danger" />
|
</template>
|
</van-swipe-cell>
|
</template>
|
<template v-else>
|
<div class="kong">
|
<span>暂无数据</span>
|
</div>
|
</template>
|
</div>
|
<div class="bg_list_item">
|
<div class="bg_list_item_top">
|
<div class="bg_list_item_top_left">
|
<div class="bg_list_item_top_left_x"></div>
|
<span>产出明细</span>
|
</div>
|
</div>
|
<!-- <template v-if="produceData && produceData.length > 0"> -->
|
<!-- v-for="(item, index) in produceData" :key="index" -->
|
<van-swipe-cell>
|
<div class="bg_list_item_h">
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>良品数({{ info.umodel ? info.umodel.name : '' }})</span>
|
<div class="bg_list_item_num_item_sr">
|
<!-- :disabled="!proxy.$auth('h5:workorderoutput:update')" -->
|
<!-- @blur="change(item.id, item.num, 'C', item.maxNum, item)" -->
|
<input type="number" v-model="produceFrom.qualified"
|
@blur="changeCC('0', produceFrom.qualified, produceFrom.qualifiedId)" placeholder="请输入" />
|
<span v-if="info.umodel">{{ info.umodel.name }}</span>
|
</div>
|
</div>
|
</div>
|
</div>
|
</van-swipe-cell>
|
<van-swipe-cell>
|
<div class="bg_list_item_h">
|
<div class="bg_list_item_num">
|
<!-- @blur="change(item.id, item.num, 'C', item.maxNum, item)" -->
|
<div class="bg_list_item_num_item">
|
<span>不良数({{ info.umodel ? info.umodel.name : '' }})</span>
|
<div class="bg_list_item_num_item_sr">
|
<!-- :disabled="!proxy.$auth('h5:workorderoutput:update')" -->
|
<!-- @blur="change(item.id, item.num, 'C', item.maxNum, item)" -->
|
<input type="number" v-model="produceFrom.undesirable"
|
@blur="changeCC('1', produceFrom.undesirable, produceFrom.undesirableId)" placeholder="请输入" />
|
<span v-if="info.umodel">{{ info.umodel.name }}</span>
|
</div>
|
</div>
|
</div>
|
</div>
|
</van-swipe-cell>
|
<van-swipe-cell v-if="produceFrom.undesirable > 0">
|
<div class="bg_list_item_h">
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item" @click="show = true">
|
<span>不良项</span>
|
<div class="bg_list_item_num_item_sr">
|
<span class="wulll" :style="{ color: from.defectiveName ? '#305ED5' : '' }">{{ from.defectiveName ?
|
from.defectiveName : '设置' }}</span>
|
<img src="@/assets/icon/ic_ar@2x.png" alt="" />
|
</div>
|
</div>
|
</div>
|
</div>
|
</van-swipe-cell>
|
<!-- </template>
|
<template v-else>
|
<div class="kong">
|
<span>暂无数据</span>
|
</div>
|
</template> -->
|
</div>
|
<div class="bg_plan" @click="TimeShow = true">
|
<div class="bg_plan_label">
|
<span>报工时长</span>
|
</div>
|
<div class="bg_plan_label_val">
|
<span :style="{ color: from.durationName ? '#333' : '' }">{{ from.durationName ? from.durationName : '请选择' }}</span>
|
<img src="@/assets/icon/ic_ar@2x.png" alt="" />
|
</div>
|
</div>
|
<div class="bg_list_item" v-if="arrType && arrType.length > 0">
|
<div class="bg_list_item_top">
|
<div class="bg_list_item_top_left">
|
<div class="bg_list_item_top_left_x"></div>
|
<span>工资绩效</span>
|
</div>
|
</div>
|
<div class="bg_list_item_h">
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>计件方式</span>
|
<div class="bg_list_item_num_item_list">
|
<div :class="item.active ? 'bg_list_item_num_item_list_item active' : 'bg_list_item_num_item_list_item'"
|
v-for="(item, index) in arrType" :key="index" @click="clickPerformanceType(index)">{{ item.name }}</div>
|
<!-- <div class="bg_list_item_num_item_list_item active" v-if="infoBox.type == 0">计件</div>
|
<div class="bg_list_item_num_item_list_item active" v-if="infoBox.type == 1">计时</div> -->
|
</div>
|
</div>
|
</div>
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>工资单价</span>
|
<div class="bg_list_item_num_item_sr">
|
<span class="color1">{{ (arrType[from.index].salary / 10 / 10).toFixed(2) }}元/{{ arrType[from.index].type ==
|
0 ? '件' : '时' }}</span>
|
<!-- <span class="color1">{{infoBox.salary / 100}}元/{{infoBox.type == 0 ? '件' : '时'}}</span> -->
|
</div>
|
</div>
|
</div>
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>预计工资</span>
|
<div class="bg_list_item_num_item_sr">
|
<span class="color1">{{ expectedSalary }}元</span>
|
</div>
|
</div>
|
</div>
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>达标率</span>
|
<div class="bg_list_item_num_item_sr">
|
<span class="color1">{{ complianceRate }}%</span>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
<!-- <div class="bg_list_item">
|
<div class="bg_list_item_top">
|
<div class="bg_list_item_top_left">
|
<div class="bg_list_item_top_left_x"></div>
|
<span>合格产出明细</span>
|
<span class="blue left">{{ccTotal()}}</span>
|
</div>
|
<div class="bg_list_item_top_right" @click="jumpCC" v-if="proxy.$auth('h5:workorderoutput:create')">
|
<img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" />
|
<span>手动录入</span>
|
</div>
|
</div>
|
<template v-if="produceData && produceData.length > 0">
|
<van-swipe-cell v-for="(item, index) in produceData" :key="index">
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>{{item.code}}</span>
|
<div class="bg_list_item_num_item_sr">
|
<input v-model="item.num" :disabled="!proxy.$auth('h5:workorderoutput:update')" @blur="change(item.id, item.num, 'C', item.maxNum, item)" type="number" />
|
<span>{{item.company}}</span>
|
</div>
|
</div>
|
</div>
|
<template #right v-if="proxy.$auth('h5:workorderoutput:delete')">
|
<van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'C')" type="danger" />
|
</template>
|
</van-swipe-cell>
|
</template>
|
<template v-else>
|
<div class="kong">
|
<span>暂无数据</span>
|
</div>
|
</template>
|
</div>
|
|
<div class="bg_list_item">
|
<div class="bg_list_item_top">
|
<div class="bg_list_item_top_left">
|
<div class="warning"></div>
|
<span>不良产出明细</span>
|
<span class="yellow left">{{blTotal()}}</span>
|
</div>
|
</div>
|
<template v-if="undesirable && undesirable.length > 0">
|
<van-swipe-cell v-for="(item, index) in undesirable" :key="index">
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>{{item.code}}</span>
|
<div class="bg_list_item_num_item_sr">
|
<input v-model="item.num" :disabled="!proxy.$auth('h5:workorderoutput:update')" @blur="change(item.id, item.num, 'C', item.maxNum, item)" type="number" />
|
<span>{{item.company}}</span>
|
</div>
|
</div>
|
</div>
|
<template #right v-if="proxy.$auth('h5:workorderoutput:delete')">
|
<van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'C')" type="danger" />
|
</template>
|
</van-swipe-cell>
|
</template>
|
<template v-else>
|
<div class="kong">
|
<span>暂无数据</span>
|
</div>
|
</template>
|
</div>
|
|
<div class="bg_list_item">
|
<div class="bg_list_item_top">
|
<div class="bg_list_item_top_left">
|
<div class="error"></div>
|
<span>报废产出明细</span>
|
<span class="red left">{{bfTotal()}}</span>
|
</div>
|
</div>
|
<template v-if="scrap && scrap.length > 0">
|
<van-swipe-cell v-for="(item, index) in scrap" :key="index">
|
<div class="bg_list_item_num">
|
<div class="bg_list_item_num_item">
|
<span>{{item.code}}</span>
|
<div class="bg_list_item_num_item_sr">
|
<input v-model="item.num" :disabled="!proxy.$auth('h5:workorderoutput:update')" @blur="change(item.id, item.num, 'C', item.maxNum, item)" type="number" />
|
<span>{{item.company}}</span>
|
</div>
|
</div>
|
</div>
|
<template #right v-if="proxy.$auth('h5:workorderoutput:delete')">
|
<van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'C')" type="danger" />
|
</template>
|
</van-swipe-cell>
|
</template>
|
<template v-else>
|
<div class="kong">
|
<span>暂无数据</span>
|
</div>
|
</template>
|
</div> -->
|
</div>
|
<div class="details_dj" v-if="typeView === 1">
|
<!-- <div class="details_dj_title">
|
<div class="details_dj_title_left">
|
<div class="details_x"></div>
|
<span>生产点检</span>
|
</div>
|
<div class="details_dj_title_right" @click="jumpdj" v-if="proxy.$auth('h5:workorder:processRecord')">
|
<img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" />
|
<span>手动录入</span>
|
</div>
|
</div> -->
|
<div class="details_dj_list">
|
<van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了~" @load="pageDJs">
|
<van-swipe-cell v-for="(item, index) in djData" :key="index">
|
<div class="details_dj_list_item">
|
<span>{{ item.attrName }}:{{ item.val }}</span>
|
<span>{{ item.userName }} {{ item.createTime }}</span>
|
</div>
|
<template #right>
|
<van-button square type="danger" style="height: 100%;" @click="dele(item.id)" text="删除" />
|
</template>
|
</van-swipe-cell>
|
</van-list>
|
</div>
|
</div>
|
<!-- 报工按钮 -->
|
<template v-if="info.status === 2 || info.procedureNeedcheck === 1">
|
<div class="bh_zw"></div>
|
<div class="bg_footer">
|
<div class="bg_footer_submit" v-if="typeView == 0" @click="submit">确认报工</div>
|
<!-- proxy.$auth('h5:workorder:processRecord') && -->
|
<div class="bg_footer_submit1" @click="jumpdj" v-if="typeView == 1">
|
<img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" />
|
<span>新增点检</span>
|
</div>
|
</div>
|
</template>
|
<!-- 扫码组件 -->
|
<v-ScanCode :openCode="openCode" :infos="['请扫描工装码']" @closePopup="closePopup" @onDecode="onDecode" />
|
<!-- 报工统计数据 -->
|
<van-popup v-model:show="statistics" round :closeable="true" position="bottom">
|
<div class="tg">
|
<div class="tg_header">请确认报工信息</div>
|
<div class="tg_table">
|
<div class="tg_table_header">
|
<div class="tg_table_header_item">类型</div>
|
<div class="tg_table_header_item">物料名称</div>
|
<!-- <div class="tg_table_header_item">工装数量</div> -->
|
<div class="tg_table_header_item">物料数量</div>
|
</div>
|
<div class="nr" v-if="statisticsData.length > 0">
|
<div class="tg_table_nr" v-for="(item, index) in statisticsData" :key="index">
|
<div class="tg_table_nr_item">{{ item.name }}</div>
|
<div class="tg_table_nr_item">{{ item.materialName }}</div>
|
<!-- <div class="tg_table_nr_item">{{item.gznum}}</div> -->
|
<div class="tg_table_nr_item" :style="item.name === '工单未投料' ? 'color: #DE5243' : ''">{{ item.num }}</div>
|
</div>
|
</div>
|
<div class="nr" v-else>
|
<div class="tg_table_nr">
|
<div class="tg_table_nr_item1">暂无数据</div>
|
</div>
|
</div>
|
</div>
|
<div class="tg_footer">
|
<button class="tg_footer_qr" @click="submitBG"
|
v-if="proxy.$auth('h5:workorderoutput:confirm') && isSubmit">确认报工</button>
|
<div class="tg_footer_fh" @click="gofh" v-else-if="!isSubmit">返回修改</div>
|
</div>
|
</div>
|
</van-popup>
|
<!-- 时间 -->
|
<van-popup v-model:show="TimeShow" round position="bottom" :style="{ height: '50%' }">
|
<van-datetime-picker v-model="from.time" type="time" title="选择时间" @confirm="onConfirm2" @cancel="onCancel2" />
|
</van-popup>
|
<!-- 选择不良项 -->
|
<van-popup v-model:show="show" round position="bottom">
|
<div class="bl">
|
<div class="bl_head">
|
<img src="@/assets/icon/ic_close@2x.png" style="opacity: 0;" alt="" />
|
<span>不良项</span>
|
<!-- <span>确认</span> -->
|
<img src="@/assets/icon/ic_close@2x.png" @click="show = false" alt="" />
|
</div>
|
<div class="bl_list">
|
<div class="bl_list_item" v-for="(item, i) in cateList" :key="i" @click="changeChecked(i)">
|
<div class="bl_list_item_left">
|
<input type="checkbox" :checked="item.active" />
|
<span>{{ item.name }}</span>
|
</div>
|
<div class="bl_list_item_right">
|
<input type="number" @click.stop v-model="item.num" placeholder="0" />
|
</div>
|
</div>
|
</div>
|
<div class="bl_footer" @click="onConfirm3">确认</div>
|
</div>
|
</van-popup>
|
</div>
|
</template>
|
|
<script setup lang="ts">
|
import { getCurrentInstance, nextTick, onMounted, ref, reactive, computed, onActivated } from 'vue'
|
import { useRouter, useRoute } from "vue-router"
|
import { Dialog, Toast } from 'vant'
|
import { REGULAR } from '@/utils/utils'
|
import { categoryExtList, queryOne, queryList } from '@/apis/PlanningAPI'
|
import {
|
getBarcodeContent,
|
queryById,
|
getOrocessRecord,
|
deleteCT,
|
updateById,
|
comfirmDone,
|
comfirmDoneStandard,
|
getListByCondition,
|
allForStandard,
|
pageDJ,
|
deletedj,
|
dealWorkorderRecordStandard,
|
getWorkorderRecordListStandard
|
} from '@/apis/WorkOrderAPI'
|
import { QRCodeType } from '@/enum'
|
const { proxy }: any = getCurrentInstance()
|
const { $Bus } = getCurrentInstance().appContext.config.globalProperties
|
import VWorkOrderInfo from '@/components/common/WorkOrderInfo.vue'
|
|
const router = useRouter()
|
const route = useRoute()
|
|
let TimeShow = ref(false)
|
|
let from: any = reactive({
|
time: '',
|
defective: [],
|
defectiveName: '',
|
durationName: '0小时0分钟',
|
duration: 0,
|
index: 0
|
})
|
|
let cate = ref([{ name: '生产' }, { name: '点检' }])
|
let typeView = ref(0)
|
|
const clickIten = (i: number) => {
|
typeView.value = i
|
if (i === 1) {
|
finished.value = false
|
page.capacity = 1
|
pageDJs()
|
}
|
}
|
|
// 预计工资
|
const expectedSalary = computed(() => {
|
if (arrType.value.length === 0) return 0;
|
// 按件计算
|
if (arrType.value[from.index].type == 0) {
|
if (!produceFrom.qualified) return 0
|
if (arrType.value[from.index].unqualified == 1) { // 是否计入不良品
|
let total = Number(produceFrom.qualified) + Number(produceFrom.undesirable)
|
return (total * (arrType.value[from.index].salary / 100)).toFixed(2) || 0
|
} else {
|
return (Number(produceFrom.qualified) * (arrType.value[from.index].salary / 100)).toFixed(2) || 0
|
}
|
} else {
|
if (!from.duration) return 0;
|
let h = (from.duration / 60 / 60).toFixed(2)
|
return (Number(h) * (arrType.value[from.index].salary / 10 / 10)).toFixed(2) || 0
|
}
|
})
|
|
// 达标率
|
const complianceRate = computed(() => {
|
if (arrType.value.length === 0) return 0;
|
if (!produceFrom.qualified && !produceFrom.undesirable) return 0;
|
if (!from.duration) return 0;
|
if (!arrType.value[from.index].num) return 0;
|
// 按件计算
|
// if (infoBox.value.type == 0) {
|
if (arrType.value[from.index].unqualified == 1) { // 是否计入不良品
|
let a = ((Number(produceFrom.qualified) + Number(produceFrom.undesirable)) / (from.duration / 3600)).toFixed(2)
|
let b = (arrType.value[from.index].num / (arrType.value[from.index].times / 3600)).toFixed(2)
|
console.log(a)
|
console.log(b)
|
return ((Number(a) / Number(b)) * 100).toFixed(2)
|
// let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / )
|
// return total * infoBox.value.salary;
|
} else {
|
let a = (produceFrom.qualified / (from.duration / 3600)).toFixed(2)
|
let b = (arrType.value[from.index].num / (arrType.value[from.index].times / 3600)).toFixed(2)
|
console.log(a)
|
console.log(b)
|
return ((Number(a) / Number(b)) * 100).toFixed(2)
|
// return Number(from.qualified) * infoBox.value.salary;
|
}
|
// } else {
|
// console.log('按时长')
|
// }
|
})
|
|
const loading = ref(false);
|
const finished = ref(false);
|
let show = ref(false)
|
// 点检数据
|
let djData: any = ref([])
|
// 分页查询数据
|
let page = reactive({
|
capacity: 10,
|
page: 0
|
})
|
|
let infoBox: any = ref(null) // 工资绩效
|
|
// 产出合格/不良
|
let produceFrom: any = reactive({
|
qualifiedId: '',
|
qualified: '', // 合格
|
undesirableId: '',
|
undesirable: '' // 不良
|
})
|
|
let cateList: any = ref([]) // 不良项
|
|
// 详情数据
|
const info: any = ref({})
|
|
// 判断是否能提交
|
let isSubmit: any = ref<boolean>(false)
|
|
// 不良明细
|
let undesirable: any = ref([])
|
|
// 报废明细
|
let scrap: any = ref([])
|
|
// 扫码类型
|
let type: any = ref('')
|
|
let arrType: any = ref([])
|
|
// 统计数据
|
let statisticsData: any = ref([
|
// {
|
// name: '工单投料',
|
// materialName: '黄沙',
|
// num: 0
|
// },
|
// {
|
// name: '工单合格产出',
|
// materialName: '黄沙',
|
// num: 0
|
// },
|
// {
|
// name: '工单不良产出',
|
// materialName: '黄沙',
|
// num: 0
|
// },
|
// {
|
// name: '工单未投料',
|
// materialName: '黄沙',
|
// num: 0
|
// }
|
])
|
|
// 投料数据
|
const feedingData: any = ref([])
|
|
// 产出数据
|
const produceData: any = ref([])
|
|
// 控制扫码显示隐藏
|
const openCode = ref<boolean>(false)
|
|
// 控制报工统计
|
const statistics = ref<boolean>(false)
|
|
const changeChecked = (i: number) => {
|
cateList.value[i].active = !cateList.value[i].active
|
}
|
|
const getData = () => {
|
categoryExtList({
|
cateType: "3"
|
}).then(res => {
|
if (res.code === 200) {
|
res.data.forEach((item: any) => {
|
item.active = false
|
item.num = ''
|
})
|
cateList.value = res.data
|
}
|
})
|
}
|
|
const onConfirm2 = (e: string) => {
|
let h = Number(e.substring(0, 2))
|
let m = Number(e.substring(3, 5))
|
let s = 0
|
if (h > 0) {
|
s += h * 60 * 60
|
}
|
if (m > 0) {
|
s += m * 60
|
}
|
from.duration = s
|
from.durationName = `${h}小时${m}分钟`
|
TimeShow.value = false
|
}
|
|
const onCancel2 = () => {
|
TimeShow.value = false
|
}
|
|
const onConfirm3 = () => {
|
let isOpen = false
|
cateList.value.forEach((item: any, index: number) => {
|
if (item.active) {
|
isOpen = true
|
}
|
})
|
if (!isOpen) return Toast('请选择不良项')
|
let arr: any = []
|
let total: any = 0
|
let name: any = ''
|
cateList.value.forEach((item: any, index: number) => {
|
if (item.active) {
|
if (item.num <= 0) {
|
return Toast('不良数量必须大于0')
|
}
|
total = total += item.num
|
arr.push(item)
|
name += item.name + item.num + ';'
|
}
|
})
|
if (total !== produceFrom.undesirable) return Toast('不良数必须等于产出不良数')
|
from.defective = arr
|
from.defectiveName = name
|
show.value = false
|
}
|
|
// 投料统计
|
const tlTotal = (): string => {
|
if (feedingData.value.length > 0) {
|
let total: number = 0
|
feedingData.value.forEach((element: any) => {
|
total = total + element.num
|
})
|
return `${total}`
|
}
|
return ''
|
}
|
|
// 修改产出
|
const changeCC = (downType: string, num: number, recordId: string) => {
|
if (!num) return
|
if ((produceFrom.qualified + produceFrom.undesirable) > info.value.planNum) {
|
return Toast.fail({ message: '产出数量不能大于计划数量', duration: 2000 })
|
}
|
if (num >= 0) {
|
from.defective = []
|
from.defectiveName = ''
|
// dealWorkorderRecordStandard({
|
// downType, num, recordId, workorderId: route.query.id
|
// }).then(res => {
|
// if (res.code === 200) {
|
// getOrocessRecordCC()
|
// }
|
// })
|
} else {
|
if (downType == 0) {
|
produceFrom.qualified = 0
|
} else {
|
produceFrom.undesirable = 0
|
}
|
Toast.fail({ message: '产出数量不能小于0', duration: 2000 })
|
}
|
}
|
|
// 跳转点检
|
const jumpdj = () => {
|
router.push({ name: 'spotCheck', query: { id: route.query.id } })
|
}
|
|
// 删除点检
|
const dele = (id: string | number): void => {
|
deletedj(id)
|
.then(res => {
|
if (res.code === 200) {
|
djData.value = []
|
finished.value = false
|
page.page = 1
|
djData.value = []
|
pageDJs()
|
}
|
})
|
}
|
|
// 点检数据
|
const pageDJs = () => {
|
if (!finished.value) {
|
page.page = page.page + 1
|
loading.value = true
|
pageDJ({
|
capacity: page.capacity,
|
page: page.page,
|
model: {
|
workorderId: route.query.id
|
}
|
}).then(res => {
|
if (res.code === 200 && res.data && res.data.records.length !== 0) {
|
djData.value.push(...res.data.records)
|
} else {
|
finished.value = true
|
}
|
loading.value = false
|
}).catch(err => {
|
loading.value = false
|
finished.value = true
|
})
|
}
|
}
|
|
// 统计
|
const ccTotal = (): string => {
|
if (produceData.value.length > 0) {
|
let total: number = 0
|
produceData.value.forEach((element: any) => {
|
total = total + element.num
|
})
|
return `${total}${produceData.value[0].company}`
|
}
|
return ''
|
}
|
|
// 统计
|
const blTotal = (): string => {
|
if (undesirable.value.length > 0) {
|
let total: number = 0
|
undesirable.value.forEach((element: any) => {
|
total = total + element.num
|
})
|
return `${total}${undesirable.value[0].company}`
|
}
|
return ''
|
}
|
|
// 统计
|
const bfTotal = (): string => {
|
if (scrap.value.length > 0) {
|
let total: number = 0
|
scrap.value.forEach((element: any) => {
|
total = total + element.num
|
})
|
return `${total}${scrap.value[0].company}`
|
}
|
return ''
|
}
|
|
// 切换绩效类型
|
const clickPerformanceType = (i: number) => {
|
from.index = i
|
arrType.value.forEach((item: any, index: number) => {
|
if (i === index) {
|
from.type = item.id
|
}
|
item.active = index === i
|
})
|
}
|
|
// 删除产出/投料
|
const deleItem = (id: any, type: string) => {
|
Dialog.confirm({
|
title: '提示',
|
message: '确定删除此条记录吗?',
|
}).then(() => {
|
deleteCT(id)
|
.then(res => {
|
if (res.code === 200 && type === 'C') {
|
getOrocessRecordCC()
|
} else if (res.code === 200 && type === 'T') {
|
getOrocessRecords()
|
}
|
})
|
}).catch(() => {
|
// on cancel
|
})
|
}
|
|
// 跳转手动产出
|
const jumpCC = () => {
|
router.push({ name: 'manualOutput', query: { id: route.query.id, num: produceData.value.length > 0 ? produceData.value[0].num : '' } })
|
}
|
|
// 跳转手动投料
|
const jumpTL = () => {
|
router.push({ name: 'manualFeeding', query: { id: route.query.id } })
|
}
|
|
// 关闭扫码组件
|
const closePopup = (): void => {
|
openCode.value = false
|
}
|
|
// 获取扫码值
|
const onDecode = (data: string[]): void => {
|
getBarcodeContent({
|
barcode: data[0]
|
}).then(res => {
|
if (res.code === 200) {
|
if (res.data.barcodeType === QRCodeType.GZ) {
|
if (type.value === 'tl') { // 投料操作
|
getListByCondition({ id: res.data.id })
|
.then(gz => {
|
if (gz.code === 200) {
|
if (gz.data[0].status !== 1) {
|
router.push({ name: 'codeScanningFeeding', query: { id: route.query.id, gzId: res.data.id } })
|
} else {
|
Toast.fail({ message: '扫描的工装状态不能为空', duration: 2000 })
|
}
|
}
|
})
|
}
|
if (type.value === 'cc') { // 产出操作
|
router.push({ name: 'codeScanningOutput', query: { id: route.query.id, gzId: res.data.id } })
|
}
|
} else {
|
Toast({ message: '请扫描正确的篮筐码', duration: 2000 })
|
}
|
}
|
})
|
nextTick(() => {
|
openCode.value = false
|
})
|
}
|
|
// 跳转手动投料
|
const jump = () => {
|
router.push({ name: 'manualFeeding', query: { id: route.query.id } })
|
}
|
|
// 跳转扫码投料
|
const jump1 = (types: string) => {
|
type.value = types
|
openCode.value = true
|
}
|
|
// 查询工单详情
|
const queryByIds = () => {
|
queryById(route.query.id).then(res => {
|
if (res.code === 200) {
|
info.value = res.data
|
// 获取工资绩效数据
|
queryList({
|
deleted: 0,
|
departId: res.data.factoryId,
|
materialId: res.data.materialId,
|
procedureId: res.data.procedureId
|
}).then((result: any) => {
|
if (result.code === 200) {
|
if (result.data && result.data.length > 0) {
|
result.data.forEach((item: any, index: number) => {
|
item.name = item.type == 0 ? '计件' : '计时'
|
item.id = item.type
|
item.active = index == 0
|
})
|
arrType.value = result.data
|
} else {
|
arrType.value = []
|
}
|
// infoBox.value = result.data
|
}
|
// if (result.code === 200) {
|
// infoBox.value = result.data
|
// }
|
})
|
}
|
})
|
}
|
|
// 查询工单生产记录---投料
|
const getOrocessRecords = () => {
|
feedingData.value = []
|
allForStandard({
|
workorderId: route.query.id,
|
type: 0
|
}).then(res => {
|
if (res.code === 200) {
|
feedingData.value = res.data
|
// res.data.forEach((item: any) => {
|
// feedingData.value.push({ id: item.id, company: item.umodel.name, gz: item.amodel.code, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num })
|
// })
|
}
|
})
|
}
|
|
// 查询工单生产记录---产出
|
const getOrocessRecordCC = () => {
|
produceData.value = []
|
undesirable.value = []
|
scrap.value = []
|
getWorkorderRecordListStandard({
|
workorderId: route.query.id
|
}).then(res => {
|
if (res.code === 200) {
|
if (res.data.length > 0) {
|
res.data.forEach((item: any) => {
|
if (item.doneType === 1) {
|
produceFrom.undesirable = item.num
|
produceFrom.undesirableId = item.id
|
} else {
|
produceFrom.qualified = item.num
|
produceFrom.qualifiedId = item.id
|
}
|
})
|
}
|
// res.data.forEach((item: any) => {
|
// if (item.doneType === 0 || !item.doneType) { // 合格 | 混合
|
|
// produceData.value.push({ id: item.id, company: item.umodel.name, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num })
|
// } else if (item.doneType === 1) { // 不良
|
// undesirable.value.push({ id: item.id, company: item.umodel.name, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num })
|
// } else if (item.doneType === 2) { // 报废
|
// scrap.value.push({ id: item.id, company: item.umodel.name, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num })
|
// }
|
// })
|
}
|
})
|
}
|
|
// 编辑投料/产出
|
const change = (id: any, num: any, type: any, maxNum: number, item: object, unitAttribute: number): void => {
|
let obj: any = item
|
if (type === 'T') {
|
if (unitAttribute == 0 && num != '') {
|
if (!REGULAR.positiveInteger.test(num)) {
|
obj.num = obj.ynum
|
Toast({ message: '只能输入正整数' })
|
return
|
}
|
}
|
if (unitAttribute == 1 && num != '') {
|
if (!REGULAR.number.test(num)) {
|
Toast({ message: '只能输入正整数或小数(最多四位)' })
|
obj.num = obj.ynum
|
return
|
}
|
}
|
if (num > maxNum) {
|
obj.num = obj.ynum
|
Toast.fail({ message: '超出工装总数' })
|
return
|
}
|
} else if (type === 'C' && num > info.value.planNum) {
|
obj.num = obj.ynum
|
Toast.fail({ message: '产出数量不能超过计划数量' })
|
return
|
}
|
updateById({ id: id, num: num }).then(res => {
|
if (res.code === 200 && type === 'T') {
|
getOrocessRecords()
|
} else if (res.code === 200 && type === 'C') {
|
// getOrocessRecordCC()
|
}
|
})
|
}
|
|
// 确认报工
|
const submit = () => {
|
if (info.value.bomType === 1) { // 拉式
|
console.log('拉式')
|
statisticsData.value = []
|
if (produceFrom.qualified <= 0 && produceFrom.undesirable <= 0) {
|
Toast.fail({ message: '产出明细不能为空' })
|
return
|
}
|
if (info.value.hasBom === 0) {
|
console.log('无bom')
|
// let data: any = [
|
// { name: '工单投料', gznum: feedingData.value.length, wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 },
|
// { name: '工单合格产出', gznum: produceData.value.length, wlmc: produceData.value.length > 0 ? produceData.value[0].name : '', wlnum: 0 },
|
// { name: '工单不良产出', gznum: 0, wlmc: '', wlnum: 0 },
|
// { name: '工单未投料', gznum: '', wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 }
|
// ]
|
// if (undesirable.value.length > 0) { // 判断有没有不良
|
// data[2].wlmc = undesirable.value[0].name
|
// data[2].gznum = data[2].gznum + undesirable.value.length
|
// }
|
// if (scrap.value.length > 0) { // 判断有没有不良
|
// data[2].wlmc = scrap.value[0].name
|
// data[2].gznum = data[2].gznum + scrap.value.length
|
// }
|
// let tl: number = 0
|
// let cc: number = 0
|
// let bl: number = 0
|
// undesirable.value.forEach((item: any) => { // 不良
|
// bl = bl + item.num
|
// })
|
// scrap.value.forEach((item: any) => { // 报废
|
// bl = bl + item.num
|
// })
|
// if (produceData.value.length > 0) { // 判断有没有合格产出
|
// produceData.value.forEach((item: any) => { // 产出
|
// cc = cc + item.num
|
// })
|
// }
|
// feedingData.value.forEach((item: any) => { // 投料
|
// tl = tl + item.num
|
// })
|
// data[0].wlnum = tl.toString() + info.value.umodel.name
|
// if (produceData.value.length > 0) {
|
// data[1].wlnum = cc.toString() + info.value.umodel.name
|
// }
|
// data[2].wlnum = bl.toString() + info.value.umodel.name
|
// let total: number = info.value.planNum - (Number(cc) + Number(bl))
|
// data[data.length - 1].wlnum = (info.value.planNum - Number(cc) - Number(bl)).toString() + info.value.umodel.name
|
// if (total === 0) {
|
// isSubmit.value = true
|
// } else {
|
// isSubmit.value = false
|
// }
|
|
let arr: any = []
|
let tl = 0
|
let res = getGroupNum(feedingData.value)
|
for (let i in res) {
|
let num = 0
|
res[i].forEach((item: any) => {
|
num += item.num
|
})
|
arr.push({ name: '工单投料', materialName: i + res[i][0].procedureName, num: num })
|
}
|
feedingData.value.forEach((item: any) => {
|
tl += item.num
|
})
|
statisticsData.value = [...statisticsData.value, ...arr]
|
statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified })
|
statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable })
|
statisticsData.value.push({ name: '工单未投料', materialName: '', num: info.value.planNum - Number(produceFrom.qualified) - Number(produceFrom.undesirable) })
|
let total: number = info.value.planNum - (Number(produceFrom.qualified) + Number(produceFrom.undesirable))
|
if (total === 0) {
|
isSubmit.value = true
|
} else {
|
isSubmit.value = false
|
}
|
// if (Number(tl) <= info.value.planNum) {
|
// let total: number = Number(tl) - Number(cc) - Number(bl) // 是否有余
|
// data[data.length - 1].wlnum = (Number(tl) - Number(cc) - Number(bl)).toString() + info.value.umodel.name
|
// if (total === 0) {
|
// isSubmit.value = true
|
// } else {
|
// isSubmit.value = false
|
// }
|
// } else {
|
// isSubmit.value = false
|
// }
|
// statisticsData.value = data
|
} else if (info.value.hasBom === 1) { // 有bom情况
|
console.log('有bom')
|
// let cc: number = 0
|
// let bl: number = 0
|
// let newData: any = {}
|
// if (feedingData.value.length > 0) { // 投料
|
// feedingData.value.forEach((e: any) => {
|
// if (Object.keys(newData).indexOf('' + e.name) === -1) {
|
// newData[e.name] = []
|
// }
|
// newData[e.name].push(e)
|
// })
|
// for (let key in newData) {
|
// let obj = { name: '工单投料', gznum: newData[key].length, wlmc: key, wlnum: 0, num: 0 }
|
// newData[key].forEach((item: any) => {
|
// obj.wlnum = obj.wlnum + item.num
|
// obj.num = item.num
|
// })
|
// obj.wlnum = obj.wlnum.toString() + newData[key][0].company as never
|
// statisticsData.value.push(obj)
|
// }
|
// }
|
// if (produceData.value.length > 0) { // 产出
|
// produceData.value.forEach((item: any) => {
|
// cc = cc + item.num
|
// })
|
// statisticsData.value.push({ name: '工单合格产出', gznum: produceData.value.length, wlmc: info.value.mmodel.name, wlnum: cc + info.value.umodel.name, num: cc })
|
// }
|
// if (undesirable.value.length > 0 || scrap.value.length > 0) { // 不良/报废
|
// undesirable.value.forEach((item: any) => {
|
// bl = bl + item.num
|
// })
|
// scrap.value.forEach((item: any) => {
|
// bl = bl + item.num
|
// })
|
// statisticsData.value.push({ name: '工单不良产出', gznum: undesirable.value.length + scrap.value.length, wlmc: info.value.mmodel.name, wlnum: bl + info.value.umodel.name, num: bl })
|
// }
|
// let totaltl: number = 0
|
// let totalcc: number = 0
|
// let totalbl: number = 0
|
// statisticsData.value.forEach((item: any) => {
|
// if (item.name === '工单投料') {
|
// totaltl = totaltl + item.num
|
// } else if (item.name === '工单合格产出') {
|
// totalcc = totalcc + item.num
|
// } else if (item.name === '工单不良产出') {
|
// totalbl = totalbl + item.num
|
// }
|
// })
|
// isSubmit.value = totalcc + totalbl <= info.value.planNum;
|
let arr: any = []
|
let tl = 0
|
let res = getGroupNum(feedingData.value)
|
for (let i in res) {
|
let num = 0
|
res[i].forEach((item: any) => {
|
num += item.num
|
})
|
arr.push({ name: '工单投料', materialName: i, num: num })
|
}
|
feedingData.value.forEach((item: any) => {
|
tl += item.num
|
})
|
statisticsData.value = [...statisticsData.value, ...arr]
|
statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified })
|
statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable })
|
isSubmit.value = produceFrom.qualified + produceFrom.undesirable <= info.value.planNum;
|
}
|
} else {
|
console.log('推式')
|
if (feedingData.value.length === 0) {
|
Toast.fail({ message: '投料明细不能为空' })
|
return
|
}
|
if (produceFrom.qualified <= 0 && produceFrom.undesirable <= 0) {
|
Toast.fail({ message: '产出明细不能为空' })
|
return
|
}
|
statisticsData.value = []
|
if (info.value.hasBom === 0) {
|
console.log('无bom')
|
// let data: any = [
|
// { name: '工单投料', gznum: feedingData.value.length, wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 },
|
// { name: '工单合格产出', gznum: produceData.value.length, wlmc: produceData.value.length > 0 ? produceData.value[0].name : '', wlnum: 0 },
|
// { name: '工单不良产出', gznum: 0, wlmc: '', wlnum: 0 },
|
// { name: '工单未投料', gznum: '', wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 }
|
// ]
|
// if (undesirable.value.length > 0) { // 判断有没有不良
|
// data[2].wlmc = undesirable.value[0].name
|
// data[2].gznum = data[2].gznum + undesirable.value.length
|
// }
|
// if (scrap.value.length > 0) { // 判断有没有不良
|
// data[2].wlmc = scrap.value[0].name
|
// data[2].gznum = data[2].gznum + scrap.value.length
|
// }
|
// let tl = 0
|
// let cc = 0
|
// let bl = 0
|
// undesirable.value.forEach((item: any) => { // 不良
|
// bl = bl + item.num
|
// })
|
// scrap.value.forEach((item: any) => { // 报废
|
// bl = bl + item.num
|
// })
|
// if (produceData.value.length > 0) { // 判断有没有合格产出
|
// produceData.value.forEach((item: any) => { // 产出
|
// cc = cc + item.num
|
// })
|
// }
|
// feedingData.value.forEach((item: any) => { // 投料
|
// tl = tl + item.num
|
// })
|
// data[0].wlnum = tl.toString() + info.value.umodel.name
|
// if (produceData.value.length > 0) {
|
// data[1].wlnum = cc.toString() + info.value.umodel.name
|
// }
|
// data[2].wlnum = bl.toString() + info.value.umodel.name
|
// if (Number(tl) <= info.value.planNum) {
|
// let total: number = Number(tl) - Number(cc) - Number(bl) // 是否有余
|
// data[data.length - 1].wlnum = (Number(tl) - Number(cc) - Number(bl)).toString() + info.value.umodel.name
|
// if (total === 0) {
|
// isSubmit.value = true
|
// } else {
|
// isSubmit.value = false
|
// }
|
// } else {
|
// isSubmit.value = false
|
// }
|
// statisticsData.value = data
|
let arr: any = []
|
let tl = 0
|
let res = getGroupNum(feedingData.value)
|
for (let i in res) {
|
let num = 0
|
res[i].forEach((item: any) => {
|
num += item.num
|
})
|
arr.push({ name: '工单投料', materialName: i + '-' + res[i][0].procedureName, num: num })
|
}
|
feedingData.value.forEach((item: any) => {
|
tl += item.num
|
})
|
statisticsData.value = [...statisticsData.value, ...arr]
|
statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified })
|
statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable })
|
if (Number(tl) <= info.value.planNum) {
|
let total: number = Number(tl) - Number(produceFrom.qualified) - Number(produceFrom.undesirable) // 是否有余
|
statisticsData.value.push({ name: '工单未投料', materialName: '', num: (Number(tl) - Number(produceFrom.qualified) - Number(produceFrom.undesirable)).toFixed(2) })
|
if (total === 0) {
|
isSubmit.value = true
|
} else {
|
isSubmit.value = false
|
}
|
} else {
|
isSubmit.value = false
|
}
|
} else if (info.value.hasBom === 1) { // 有bom情况
|
console.log('有bom')
|
let arr: any = []
|
let tl = 0
|
let res = getGroupNum(feedingData.value)
|
for (let i in res) {
|
let num = 0
|
res[i].forEach((item: any) => {
|
num += item.num
|
})
|
arr.push({ name: '工单投料', materialName: i, num: num })
|
}
|
feedingData.value.forEach((item: any) => {
|
tl += item.num
|
})
|
statisticsData.value = [...statisticsData.value, ...arr]
|
statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified })
|
statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable })
|
// isSubmit.value = produceFrom.qualified + produceFrom.undesirable <= info.value.planNum;
|
isSubmit.value = true
|
}
|
}
|
statistics.value = true
|
}
|
|
// 根据某个字段进行分组
|
const getGroupNum = (arr: any) => {
|
let newArry: any = {};
|
for (let i = 0; i < arr.length; i++) {
|
if (newArry[arr[i].materialName]) {
|
newArry[arr[i].materialName].push(arr[i])
|
} else {
|
newArry[arr[i].materialName] = [arr[i]]
|
}
|
}
|
return newArry;
|
}
|
|
// 返回修改
|
const gofh = () => {
|
statistics.value = false
|
}
|
|
// 确认报工
|
const submitBG = () => {
|
// if (!from.duration || from.duration <= 0) {
|
// return Toast('报工时长不能为空')
|
// }
|
let createUnqualifiedDTOList = from.defective.map((item: any) => {
|
return {
|
categoryId: item.id,
|
unQualifiedNum: item.num
|
}
|
})
|
let createWorkorderRecordDTO = {
|
workorderId: route.query.id,
|
duration: from.duration ? from.duration : 0,
|
qualifiedNum: produceFrom.qualified ? produceFrom.qualified : 0,
|
unQualifiedNum: produceFrom.undesirable ? produceFrom.undesirable : 0
|
}
|
// id: route.query.id
|
comfirmDoneStandard({
|
createUnqualifiedDTOList,
|
createWorkorderRecordDTO
|
}).then(res => {
|
if (res.code === 200) {
|
Toast.success({ message: '报工成功', forbidClick: true, duration: 2000 })
|
setTimeout(() => {
|
router.go(-2)
|
}, 2000)
|
}
|
})
|
}
|
|
onActivated(() => {
|
// $Bus.on('callback1', (res: any)=>{
|
// console.log(res)
|
// if (res == 1) {
|
// djData.value = []
|
// finished.value = false
|
// page.page = 1
|
// djData.value = []
|
// pageDJs()
|
// }
|
// })
|
// queryByIds()
|
// getOrocessRecords()
|
// getData()
|
})
|
|
onMounted(() => {
|
// $Bus.on('callback1', (res: any)=>{
|
// if (res == 1) {
|
// djData.value = []
|
// finished.value = false
|
// page.page = 1
|
// djData.value = []
|
// pageDJs()
|
// }
|
// })
|
// pageDJs()
|
|
queryByIds()
|
getOrocessRecords()
|
getData()
|
|
// getOrocessRecordCC()
|
})
|
</script>
|
|
<style lang="scss" scoped>
|
.bg {
|
width: 100%;
|
/*height: 100%;*/
|
position: absolute;
|
background: #F7F7F7;
|
|
.bg_plan {
|
width: 100%;
|
// height: 98px;
|
padding: 30px;
|
box-sizing: border-box;
|
background: #FFFFFF;
|
margin-bottom: 40px;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
|
span {
|
font-size: 30px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #222222;
|
|
b {
|
color: red;
|
}
|
}
|
|
.bg_plan_nr {
|
display: flex;
|
flex-direction: column;
|
|
span {
|
font-size: 24px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #666666;
|
margin-top: 20px;
|
|
&:first-child {
|
font-size: 32px;
|
font-family: PingFangSC-Medium, PingFang SC;
|
font-weight: 500;
|
color: #333333;
|
margin-top: 0 !important;
|
}
|
}
|
}
|
|
.bg_plan_label_val {
|
display: flex;
|
align-items: center;
|
|
span {
|
font-size: 28px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #999999;
|
}
|
|
img {
|
width: 12px;
|
height: 24px;
|
margin-left: 20px;
|
}
|
}
|
}
|
|
.details_cz {
|
width: 100%;
|
padding: 30px;
|
box-sizing: border-box;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
|
.details_cz_sdtl {
|
width: 330px;
|
height: 76px;
|
background: #FFFFFF;
|
border-radius: 36px;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
|
img {
|
width: 28px;
|
height: 28px;
|
margin-right: 14px;
|
}
|
|
span {
|
font-size: 26px;
|
font-weight: 400;
|
color: #222222;
|
}
|
}
|
|
.details_cz_smtl {
|
/*width: 330px;*/
|
flex: 1;
|
height: 76px;
|
background: $nav-color;
|
border-radius: 36px;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
|
img {
|
width: 28px;
|
height: 28px;
|
margin-right: 14px;
|
}
|
|
span {
|
font-size: 26px;
|
font-weight: 400;
|
color: #ffffff;
|
}
|
}
|
}
|
|
.bg_cate {
|
width: 100%;
|
height: 88px;
|
background: #FFFFFF;
|
margin-top: 20px;
|
display: flex;
|
align-items: center;
|
|
.active {
|
box-sizing: border-box;
|
color: #305ED5 !important;
|
border-bottom: 2PX solid #305ED5;
|
}
|
|
.bg_cate_item {
|
flex: 1;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
font-size: 30px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #555555;
|
}
|
}
|
|
.bg_list {
|
width: 100%;
|
display: flex;
|
flex-direction: column;
|
margin-top: 30px;
|
|
.bg_list_item {
|
display: flex;
|
flex-direction: column;
|
margin-bottom: 40px;
|
|
.kong {
|
text-align: center;
|
padding: 30px 0;
|
background: #ffffff;
|
font-size: 25px;
|
|
span {
|
color: #474747;
|
}
|
}
|
|
.bg_list_item_top {
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
padding-left: 30px;
|
padding-right: 30px;
|
margin-bottom: 30px;
|
|
.bg_list_item_top_left {
|
display: flex;
|
align-items: center;
|
|
.left {
|
margin-left: 12px;
|
font-size: 28px;
|
}
|
|
.warning {
|
width: 8px;
|
height: 30px;
|
border-radius: 2px;
|
margin-right: 12px;
|
background: $nav-stateColor5 !important;
|
}
|
|
.error {
|
width: 8px;
|
height: 30px;
|
border-radius: 2px;
|
margin-right: 12px;
|
background: $nav-stateColor4 !important;
|
}
|
|
.bg_list_item_top_left_x {
|
width: 8px;
|
height: 30px;
|
background: $nav-color;
|
border-radius: 2px;
|
margin-right: 12px;
|
}
|
|
span {
|
font-size: 32px;
|
font-weight: 500;
|
color: #222222;
|
display: flex;
|
align-items: center;
|
}
|
}
|
|
.bg_list_item_top_right {
|
display: flex;
|
align-items: center;
|
|
img {
|
width: 28px;
|
height: 28px;
|
margin-right: 12px;
|
}
|
|
span {
|
font-size: 28px;
|
font-weight: 400;
|
color: $nav-color;
|
}
|
}
|
}
|
|
.bg_list_item_h {
|
width: 100%;
|
padding: 0 30px;
|
box-sizing: border-box;
|
background: white;
|
|
.bg_list_item_num {
|
width: 100%;
|
min-height: 98px;
|
background: white;
|
display: flex;
|
justify-content: center;
|
align-items: center;
|
border-bottom: 1PX solid #E5E5E5;
|
|
&:last-child {
|
border: none !important;
|
}
|
|
.kong {
|
text-align: center;
|
font-size: 25px;
|
padding: 30px 0;
|
background: #ffffff;
|
}
|
|
.bg_list_item_num_item {
|
width: 100%;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
// height: 118px;
|
padding: 15px 0;
|
box-sizing: border-box;
|
justify-content: space-between;
|
border-bottom: 1px solid #E5E5E5;
|
|
&:last-child {
|
border: none;
|
}
|
|
.bg_list_item_num_item_list {
|
display: flex;
|
align-items: center;
|
|
.active {
|
background: #305ED5 !important;
|
color: #FFFFFF !important;
|
}
|
|
.bg_list_item_num_item_list_item {
|
width: 116px;
|
height: 62px;
|
line-height: 62px;
|
text-align: center;
|
background: #F2F2F2;
|
border-radius: 8px;
|
font-size: 26px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #333333;
|
margin-right: 20px;
|
|
&:last-child {
|
margin: 0 !important;
|
}
|
}
|
}
|
|
.bg_list_item_num_item_wl {
|
flex-shrink: 0;
|
display: flex;
|
flex-direction: column;
|
|
span {
|
font-size: 34px;
|
color: #222222;
|
}
|
|
.bg_list_item_num_item_wl_lx {
|
margin-top: 10px;
|
|
span {
|
color: #222222;
|
font-size: 28px;
|
}
|
}
|
}
|
|
.warning {
|
color: $nav-stateColor5 !important;
|
}
|
|
.err {
|
color: $nav-stateColor4 !important;
|
}
|
|
img {
|
width: 12px;
|
height: 24px;
|
margin-left: 20px;
|
}
|
|
span {
|
flex-shrink: 0;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
white-space: nowrap;
|
|
b {
|
font-size: 30px;
|
color: red;
|
margin-right: 5px;
|
}
|
|
.warning {
|
color: $nav-stateColor5 !important;
|
margin-right: 5px;
|
}
|
|
.err {
|
color: $nav-stateColor4 !important;
|
margin-right: 5px;
|
}
|
|
&:nth-child(1) {
|
font-size: 30px;
|
font-weight: 400;
|
color: #222222;
|
}
|
|
&:nth-child(2) {
|
font-size: 28px;
|
font-weight: 400;
|
color: #333333;
|
flex-shrink: 0;
|
}
|
}
|
|
.bg_list_item_num_item_sr {
|
flex: 1;
|
display: flex;
|
align-items: center;
|
justify-content: flex-end;
|
|
.color1 {
|
font-size: 28px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #333333;
|
}
|
|
input::-webkit-input-placeholder {
|
font-size: 28px;
|
}
|
|
input {
|
text-align: right;
|
width: 180px;
|
height: 60px;
|
border-radius: 8px;
|
border: 1PX solid #E5E5E5;
|
margin-right: 20px;
|
font-size: 28px;
|
font-weight: 400;
|
color: #333333;
|
padding: 0 30px
|
}
|
|
.wulll {
|
width: 400px;
|
text-align: right;
|
overflow: hidden;
|
white-space: nowrap;
|
text-overflow: ellipsis;
|
}
|
|
span {
|
font-size: 28px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #999999;
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
|
.details_dj {
|
display: flex;
|
flex-direction: column;
|
|
.details_dj_title {
|
width: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
padding: 0 30px 30px 30px;
|
box-sizing: border-box;
|
|
.details_dj_title_left {
|
display: flex;
|
align-items: center;
|
|
.details_x {
|
width: 8px;
|
height: 30px;
|
background: $nav-color;
|
border-radius: 2px;
|
margin-right: 12px;
|
}
|
|
span {
|
font-size: 32px;
|
font-weight: 500;
|
color: #222222;
|
}
|
}
|
|
.details_dj_title_right {
|
display: flex;
|
align-items: center;
|
|
img {
|
width: 28px;
|
height: 28px;
|
margin-right: 12px;
|
}
|
|
span {
|
font-size: 28px;
|
font-weight: 400;
|
color: $nav-color;
|
}
|
}
|
}
|
|
.details_dj_list {
|
width: 100%;
|
/*padding: 30px;*/
|
box-sizing: border-box;
|
background: #ffffff;
|
display: flex;
|
flex-direction: column;
|
|
.details_dj_list_item {
|
display: flex;
|
flex-direction: column;
|
border-bottom: 1px solid #E5E5E5;
|
padding: 30px;
|
|
/*margin: 30px;*/
|
/*padding-bottom: 30px;*/
|
/*margin-bottom: 30px !important;*/
|
span {
|
&:nth-child(1) {
|
font-size: 28px;
|
font-weight: 400;
|
color: #222222;
|
}
|
|
&:nth-child(2) {
|
font-size: 24px;
|
font-weight: 400;
|
color: #999999;
|
margin-top: 24px;
|
}
|
}
|
}
|
}
|
}
|
|
.bh_zw {
|
height: 160px;
|
}
|
|
.bg_footer {
|
position: fixed;
|
bottom: 0;
|
left: 0;
|
width: 100%;
|
padding: 0 30px 60px 30px;
|
box-sizing: border-box;
|
|
.bg_footer_submit1 {
|
width: 690px;
|
height: 76px;
|
background: #FFFFFF;
|
border-radius: 36px;
|
border: 1px solid #E5E5E5;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
|
img {
|
width: 28px;
|
height: 28px;
|
margin-right: 12px;
|
}
|
|
span {
|
font-size: 26px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #305ED5;
|
}
|
}
|
|
.bg_footer_submit {
|
width: 690px;
|
height: 88px;
|
background: $nav-color;
|
box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.08);
|
border-radius: 8px;
|
font-size: 30px;
|
font-weight: 500;
|
color: #FFFFFF;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
}
|
}
|
|
.tg {
|
width: 100%;
|
height: 800px;
|
padding: 30px;
|
box-sizing: border-box;
|
|
.tg_header {
|
width: 100%;
|
height: 45px;
|
text-align: center;
|
line-height: 45px;
|
font-size: 30px;
|
font-weight: 500;
|
color: #222222;
|
}
|
|
.tg_table {
|
width: 100%;
|
margin-top: 40px;
|
|
.tg_table_header {
|
width: 100%;
|
height: 72px;
|
background: #EFF2FC;
|
display: flex;
|
align-items: center;
|
|
.tg_table_header_item {
|
flex: 1;
|
font-size: 26px;
|
font-weight: 500;
|
color: #333333;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
}
|
}
|
}
|
|
.nr {
|
width: 100%;
|
max-height: calc(100% - 133px);
|
overflow-x: scroll;
|
|
.tg_table_nr {
|
width: 100%;
|
padding: 24px 10px;
|
box-sizing: border-box;
|
display: flex;
|
align-items: center;
|
background: white;
|
box-shadow: inset 0px -2px 0px 0px #E5E5E5;
|
|
.tg_table_nr_item {
|
flex: 1;
|
font-size: 26px;
|
font-weight: 500;
|
color: #333333;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
}
|
|
.tg_table_nr_item1 {
|
flex: 1;
|
font-size: 26px;
|
font-weight: 500;
|
color: #333333;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
}
|
}
|
}
|
}
|
|
.tg_footer {
|
width: calc(100% - 60px);
|
position: fixed;
|
bottom: 0;
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
box-sizing: border-box;
|
padding-bottom: 40px;
|
|
.tg_footer_fh {
|
width: 100%;
|
height: 88px;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
background: rgba(66, 117, 252, 0.05);
|
border-radius: 8px;
|
border: 1PX solid #4275FC;
|
font-size: 32px;
|
font-weight: 500;
|
color: $nav-color;
|
}
|
|
.tg_footer_qr {
|
width: 100%;
|
height: 88px;
|
border: none;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
background: $nav-color;
|
border-radius: 8px;
|
font-size: 32px;
|
font-weight: 500;
|
color: #FFFFFF;
|
}
|
}
|
|
.bl {
|
width: 100%;
|
height: 800px;
|
padding: 30px;
|
box-sizing: border-box;
|
display: flex;
|
flex-direction: column;
|
|
.bl_head {
|
width: 100%;
|
height: 50px;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
|
span {
|
font-size: 28px;
|
color: #222222;
|
|
&:nth-child(2) {
|
font-size: 32px !important;
|
}
|
}
|
|
img {
|
width: 28px;
|
height: 28px;
|
}
|
}
|
|
.bl_footer {
|
width: 100%;
|
height: 88px;
|
line-height: 88px;
|
text-align: center;
|
background: #305ED5;
|
border-radius: 8px;
|
font-size: 32px;
|
font-family: PingFangSC-Medium, PingFang SC;
|
font-weight: 500;
|
color: #FFFFFF;
|
margin-top: 30px;
|
}
|
|
.bl_list {
|
width: 100%;
|
height: calc(100% - 168px);
|
overflow-y: scroll;
|
margin-top: 30px;
|
|
.bl_list_item {
|
width: 100%;
|
height: 96px;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
border-bottom: 1PX solid #E5E5E5;
|
|
&:last-child {
|
border: none !important;
|
}
|
|
.bl_list_item_left {
|
flex: 1;
|
display: flex;
|
align-items: center;
|
|
input {
|
width: 30px;
|
height: 30px;
|
border: 1PX solid #CCCCCC;
|
margin: 0 !important;
|
}
|
|
span {
|
font-size: 30px;
|
color: #222222;
|
margin-left: 10px;
|
}
|
}
|
|
.bl_list_item_right {
|
flex: 1;
|
height: 50px;
|
text-align: right;
|
|
input {
|
padding-left: 5px;
|
width: 160px;
|
height: 100%;
|
padding: 0 30px;
|
box-sizing: border-box;
|
text-align: right;
|
font-size: 28px;
|
color: #333333;
|
border-radius: 10px;
|
border: 1PX solid #CCCCCC;
|
|
&::-webkit-input-placeholder {
|
font-size: 28px;
|
font-family: PingFangSC-Regular, PingFang SC;
|
font-weight: 400;
|
color: #999999;
|
}
|
}
|
}
|
}
|
}
|
}
|
}</style>
|