Mr.Shi
2023-08-17 a99b32aee78f130d44f5353b30b001f96c84977a
改bug
已修改10个文件
921 ■■■■ 文件已修改
h5_standard/src/components/common/Warehouse.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/components/newCom/quality.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/LogInAgain.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/needToBeDealtWith/addWarehousing.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/needToBeDealtWith/outbound.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/processPlan.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/reportingForWork.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/workOrder/workOrderReporting.vue 658 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/views/wxLogin.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_standard/.env.development 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_standard/src/components/common/Warehouse.vue
@@ -19,7 +19,13 @@
                    @load="onLoad">
                    <div class="content_list">
                        <div class="content_list_item" v-for="(item, i) in list" :key="i" @click="jump(item)">
                            <div class="content_list_item_name">{{item.name}}</div>
                            <div class="content_list_item_name">
                                <span style="color: #03AF76;" v-if="item.tmodel.label == 'APPLIANCE_ONTEST'">[{{ item.tmodel.code }}]</span>
                                <span style="color: #305ED5;" v-if="item.tmodel.label == 'APPLIANCE_MIX'">[{{ item.tmodel.code }}]</span>
                                <span style="color: #F5A400;" v-if="item.tmodel.label == 'APPLIANCE_OFFTEST'">[{{ item.tmodel.code }}]</span>
                                <span style="color: red;" v-if="item.tmodel.label == 'APPLIANCE_USELESS'">[{{ item.tmodel.code }}]</span>
                                <span>{{item.name}}</span>
                            </div>
                        </div>
                    </div>
                </van-list>
@@ -223,7 +229,15 @@
                    margin-right: 10px;
                }
                .content_list_item_name {
                    font-size: 28px;
                    width: 100%;
                    display: flex;
                    align-items: center;
                    span {
                        font-size: 30px;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
                        color: #222222;
                    }
                }
            }
        }
h5_standard/src/components/newCom/quality.vue
@@ -23,8 +23,7 @@
    let list = ref([
        { name: '合格', id: '0' },
        { name: '不良', id: '1' },
        { name: '报废', id: '2' },
        { name: '混合', id: '3' }
        { name: '报废', id: '2' }
    ])
    // 返回上一页带参数
h5_standard/src/views/LogInAgain.vue
@@ -84,20 +84,20 @@
      //   uuid: '0000',
      //   code: '0000'
      // })
      // let res = await testLogin({  // 大栓
      //   username: '18019924213',
      //   password: '123456',
      //   companyId: '1',
      //   uuid: '0000',
      //   code: '0000'
      // })
      let res = await testLogin({ // 文武
        username: '18656077929',
      let res = await testLogin({  // 大栓
        username: '18019924213',
        password: '123456',
        companyId: '8',
        uuid: '0000',
        code: '0000'
      })
      // let res = await testLogin({ // 文武
      //   username: '18656077929',
      //   password: '123456',
      //   companyId: '111',
      //   uuid: '0000',
      //   code: '0000'
      // })
      // let res = await testLogin({ // 胡克东
      //   username: '17751132561',
      //   password: '123456',
h5_standard/src/views/needToBeDealtWith/addWarehousing.vue
@@ -139,6 +139,7 @@
        {
            batch: '',
            locationId: '',
            locationIdLabel: '',
            locationName: '',
            materialId: '',
            materialName: '',
@@ -165,6 +166,9 @@
    }
    // 打开选择物料
    const openQ = (index: number) => {
        if (list.value[index].locationIdLabel == 'APPLIANCE_ONTEST' || list.value[index].locationIdLabel == 'APPLIANCE_OFFTEST' || list.value[index].locationIdLabel == 'APPLIANCE_USELESS') {
            return
        }
        i.value = index
        qualityShow.value = true
    }
@@ -180,18 +184,19 @@
        locationShow.value = true
    }
    const addItem = () => {
        // if (!form.warehouseId) return Toast('请选择入库仓库')
        if (!form.warehouseId) return Toast('请选择入库仓库')
        list.value.push({
            batch: '',
            locationId: '',
            locationName: '',
            locationIdLabel: list.value[list.value.length - 1].locationIdLabel,
            materialId: '',
            materialName: '',
            num: '',
            procedureId: '',
            procedureName: '',
            qualityType: '',
            qualityTypeName: '',
            qualityType: list.value[list.value.length - 1].qualityType,
            qualityTypeName: list.value[list.value.length - 1].qualityTypeName,
            unitId: '',
            unitName: ''
        })
@@ -301,6 +306,17 @@
                            item.locationId = res.data[0].id
                            item.locationName = res.data[0].unionName
                        })
                        list.value[i.value].locationIdLabel = res.data[0].label
                        if (res.data[0].label === 'APPLIANCE_ONTEST') {
                            list.value[i.value].qualityType = '0'
                            list.value[i.value].qualityTypeName = '合格'
                        } else if (res.data[0].label === 'APPLIANCE_OFFTEST') {
                            list.value[i.value].qualityType = '1'
                            list.value[i.value].qualityTypeName = '不良'
                        } else if (res.data[0].label === 'APPLIANCE_USELESS') {
                            list.value[i.value].qualityType = '2'
                            list.value[i.value].qualityTypeName = '报废'
                        }
                    } else {
                        location.value = true
                        list.value.forEach(item => {
@@ -340,6 +356,19 @@
    const getValue3 = (item: any): void => {
        list.value[i.value].locationId = item.id
        list.value[i.value].locationName = item.unionName
        list.value[i.value].qualityType = ''
        list.value[i.value].qualityTypeName = ''
        list.value[i.value].locationIdLabel = item.label
        if (item.label === 'APPLIANCE_ONTEST') {
            list.value[i.value].qualityType = '0'
            list.value[i.value].qualityTypeName = '合格'
        } else if (item.label === 'APPLIANCE_OFFTEST') {
            list.value[i.value].qualityType = '1'
            list.value[i.value].qualityTypeName = '不良'
        } else if (item.label === 'APPLIANCE_USELESS') {
            list.value[i.value].qualityType = '2'
            list.value[i.value].qualityTypeName = '报废'
        }
        locationShow.value = false
    }
    // 选择工序
h5_standard/src/views/needToBeDealtWith/outbound.vue
@@ -44,7 +44,7 @@
                        <span>出库货位:{{ item.locationName }}</span>
                        <div class="rework_qd_item_hw_right">
                            <span>数量:</span>
                            <input type="number" v-model="item.num" placeholder="0" />
                            <input type="number" v-model="item.num" @input="changeNum(item)" placeholder="0" />
                            <span>{{ item.unitName }}</span>
                        </div>
                    </div>
@@ -111,7 +111,16 @@
    const onCancel = () => {
        typeShow.value = false
    }
    const changeNum = (obj: any) => {
        if (obj.num < 0) {
            obj.num = ''
            return Toast('出库物料数量必须大于0')
        }
        if (obj.num > obj.total) {
            obj.num = ''
            return Toast('出库物料数量不能大于库存数')
        }
    }
    // 获取当天年月日
    const getDay = () => {
      var date = new Date();
@@ -127,7 +136,7 @@
        if (!form.warehouseId) return Toast('请选择出库仓库')
        if (list.value.length === 0) return Toast('至少选择一条出库物料')
        for (let i = 0; i < list.value.length; i++) {
            if (!list.value[i].num || list.value[i].num == '' || list.value[i].num == 0) {
            if (!list.value[i].num || list.value[i].num == '' || list.value[i].num <= 0) {
                return Toast(`第${i + 1}个出库物料数量必须大于0`)
            }
            if (list.value[i].num > list.value[i].total) {
@@ -352,7 +361,7 @@
                            color: #333333;
                            background: #FFFFFF;
                            border-radius: 8px;
                            border: 1px solid #CCCCCC;
                            border: 1PX solid #CCCCCC;
                            margin: 0 20px;
                            padding: 0 30px;
                            box-sizing: border-box;
h5_standard/src/views/workOrder/processPlan.vue
@@ -1,5 +1,9 @@
<template>
    <div class="content">
        <div :class="{ 'content_top': status }" class="content_search">
            <v-Search @searchInput="searchInput" @submit="submit" :isShow="false" placeholder="搜索物料名称/编码/工序名称">
            </v-Search>
        </div>
        <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
            <van-list
                v-model:loading="loading"
@@ -48,12 +52,15 @@
</template>
<script setup lang="ts">
    import { reactive, ref, onBeforeUnmount, getCurrentInstance } from "vue"
    import { reactive, ref, onBeforeUnmount, getCurrentInstance, onMounted } from "vue"
    import { useRouter, useRoute } from "vue-router"
    import { getList } from "@/apis/PlanningAPI"
    import { judgmentPlatform } from '@/utils/utils'
    const route = useRoute()
    const router = useRouter()
    let status = ref<boolean>(false)    // 根据平台是否需要设置top
    const { $Bus }  = getCurrentInstance().appContext.config.globalProperties 
@@ -61,7 +68,8 @@
    const pageData = reactive({
        capacity: 10,
        page: 0,
        total: 0
        total: 0,
        name: ''
    })
    // 列表数据
@@ -73,6 +81,23 @@
    const clickItem = (obj: any) => {
        $Bus.emit('callback', obj)
        router.go(-1)
    }
    // 搜索提交
    const submit = (): void => {
        pageData.page = 0
        finished.value = false
        listData.value = []
        onLoad()
    }
    // 搜索框
    const searchInput = (data: any) => {
        pageData.name = data
        pageData.page = 0
        finished.value = false
        listData.value = []
        onLoad()
    }
    // 列表
@@ -124,6 +149,10 @@
    onBeforeUnmount(() => {
        $Bus.all.delete("changeOdr")
    })
    onMounted(() => {
        status.value = judgmentPlatform()
    })
</script>
<style lang="scss" scoped>
@@ -132,6 +161,79 @@
        // height: 100%;
        position: absolute;
        background: #F7F7F7;
        .content_top {
            top: 0 !important;
        }
        .content_search {
            padding: 30px;
            background: white;
            box-sizing: border-box;
            position: sticky;
            top: 88px;
            z-index: 9;
            .Search_item {
                margin-bottom: 40px;
                .Search_item_label {
                    font-size: 30px;
                    font-weight: 500;
                    color: #222222;
                }
                .Search_item_content {
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                    margin-top: 30px;
                    .tag {
                        display: flex;
                        flex-wrap: wrap;
                        align-items: center;
                        .tag_active {
                            background: $nav-color !important;
                            color: #ffffff !important;
                        }
                        .tag_item {
                            width: 156px;
                            height: 70px;
                            box-sizing: border-box;
                            background: #F2F2F2;
                            border-radius: 8px;
                            font-size: 26px;
                            font-weight: 400;
                            color: #333333;
                            display: flex;
                            align-items: center;
                            justify-content: center;
                            margin-right: 22px;
                            margin-bottom: 22px;
                            &:nth-child(4n) {
                                margin-right: 0;
                            }
                        }
                    }
                    span {
                        font-size: 26px;
                        font-weight: 400;
                        color: #333333;
                    }
                    .Search_item_content_a {
                        width: 308px;
                        height: 70px;
                        background: #F7F7F7;
                        border-radius: 8px;
                        border: 1px solid #EEEEEE;
                        font-size: 26px;
                        font-weight: 400;
                        color: #B2B2B2;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                    }
                }
            }
            .content_search_x {
                height: 24px;
            }
        }
        .content_list {
            width: 100%;
            height: 100%;
h5_standard/src/views/workOrder/reportingForWork.vue
@@ -55,7 +55,7 @@
                        <span>新增投料</span>
                    </div>
                </div>
                <template v-if="wuList.length > 0">
                <template v-if="wuList.length > 0 && !(hasBom == 1 && bomType == 1)">
                    <van-swipe-cell v-for="(item, index) in wuList" :key="index">
                        <div class="bg_list_item_h">
                            <div class="bg_list_item_num">
@@ -82,7 +82,7 @@
                        </template>
                    </van-swipe-cell>
                </template>
                <template v-else>
                <template v-else-if="wuList.length == 0 && !(hasBom == 1 && bomType == 1)">
                    <div class="kong">
                        <span>暂无数据</span>
                    </div>
@@ -104,7 +104,7 @@
                            <span><b>*</b>良品数</span>
                            <div class="bg_list_item_num_item_sr">
                                <input type="number" v-model="from.qualified" @input="changeNum(1)" placeholder="请输入" />
                                <span>块</span>
                                <span v-if="from.processPlan">{{from.processPlan.unitName}}</span>
                            </div>
                        </div>
                    </div>
@@ -113,7 +113,7 @@
                            <span>不良数</span>
                            <div class="bg_list_item_num_item_sr">
                                <input type="number" v-model="from.undesirable" @input="changeNum(2)" placeholder="请输入" />
                                <span>块</span>
                                <span v-if="from.processPlan">{{from.processPlan.unitName}}</span>
                            </div>
                        </div>
                    </div>
@@ -158,7 +158,7 @@
                        <div class="bg_list_item_num_item">
                            <span>工资单价</span>
                            <div class="bg_list_item_num_item_sr">
                                <span class="color1">{{infoBox.salary}}元/{{infoBox.type == 0 ? '件' : '时'}}</span>
                                <span class="color1">{{(infoBox.salary / 10 / 10).toFixed(2)}}元/{{infoBox.type == 0 ? '件' : '时'}}</span>
                            </div>
                        </div>
                    </div>
@@ -188,7 +188,7 @@
            <div class="bg_footer_submit" @click="submit">提交</div>
        </div>
        <!-- 选择不良项 -->
        <van-popup v-model:show="show" round position="bottom" :style="{ height: '53%' }">
        <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="" />
@@ -280,8 +280,7 @@
        text: 'name'
    };
    let userShow = ref(false)
    let userList = ref([])
    let wuList: any = ref([])
    let wuList = ref<Array<any>>([])
    // 产出数量验证
    const changeNum = (type: number) => {
@@ -348,7 +347,10 @@
        } else {
            if (!wuList.value.length === 0) return Toast('投料不能为空')
        }
        if (!from.qualified) return Toast('良品数不能为空')
        if (!from.qualified && !from.undesirable) {
            return Toast('良品数与不良数不能同时为空')
        }
        // if (!from.qualified) return Toast('良品数不能为空')
        // 有不良数
        if (from.undesirable > 0) {
            if (from.defective.length === 0) return Toast('不良项不能为空')
@@ -357,8 +359,8 @@
        autoWorkReport({
            createWorkorderRecordDTO: {
                duration: from.duration,
                qualifiedNum: from.qualified,
                unQualifiedNum: from.undesirable
                qualifiedNum: from.qualified ? from.qualified : 0,
                unQualifiedNum: from.undesirable ? from.undesirable : 0
            },
            plansId: from.processPlan.id,
            proGroupId: deviceId.value,
@@ -387,43 +389,46 @@
    // 预计工资
    const expectedSalary = computed(() => {
        if (!infoBox.value) return 0
        if (!infoBox.value) return 0;
        // 按件计算
        if (infoBox.value.type == 0) {
            console.log('计件')
            if (!from.qualified) return 0
            if (infoBox.value.unqualified == 1) {   // 是否计入不良品
                let total = Number(from.qualified) + Number(from.undesirable)
                return total * infoBox.value.salary
                return (total * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
            } else {
                return Number(from.qualified) * infoBox.value.salary
                return (Number(from.qualified) * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
            }
        } else {
            console.log('计时')
            if (!from.duration) return 0;
            let h = (from.duration / 60 / 60).toFixed(2)
            return Number(h) * infoBox.value.salary
            return (Number(h) * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
        }
    })
    // 达标率
    const complianceRate = computed(() => {
        if (!infoBox.value) return 0;
        if (!from.qualified) return 0;
        if (!from.qualified && !from.undesirable) return 0;
        if (!from.duration) return 0;
        // 按件计算
        // if (infoBox.value.type == 0) {
            // if (infoBox.value.unqualified == 1) {   // 是否计入不良品
            if (infoBox.value.unqualified == 1) {   // 是否计入不良品
                let a = ((Number(from.qualified) + Number(from.undesirable)) / (from.duration / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return (Number(a) / Number(b)).toFixed(2)
                return ((Number(a) / Number(b)) * 100).toFixed(2) || 0
                // let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / )
                // return total * infoBox.value.salary;
            // } else {
            //     return Number(from.qualified) * infoBox.value.salary;
            // }
            } else {
                let a = (from.qualified / (from.duration / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return ((Number(a) / Number(b)) * 100).toFixed(2) || 0
                // return Number(from.qualified) * infoBox.value.salary;
            }
        // } else {
        //     console.log('按时长')
        // }
@@ -544,7 +549,7 @@
            // 获取类型
            getIdPlansExt(res.id)
                .then(res2 => {
                    if (res.code === 200) {
                    if (res2.code === 200) {
                        bomType.value = res2.data.bomType
                        hasBom.value = res2.data.hasBom
                    }
@@ -843,7 +848,7 @@
                                    font-size: 28px;
                                    font-weight: 400;
                                    color: #333333;
                                    padding: 0 30px
                                    padding: 0 30px;
                                }
                                .wulll {
                                    width: 400px;
@@ -906,12 +911,15 @@
            }
        }
        .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;
@@ -942,7 +950,7 @@
            }
            .bl_list {
                width: 100%;
                height: 550px;
                height: calc(100% - 168px);
                overflow-y: scroll;
                margin-top: 30px;
                .bl_list_item {
h5_standard/src/views/workOrder/workOrderReporting.vue
@@ -30,25 +30,28 @@
                </div>
                <template v-if="feedingData && feedingData.length > 0">
                    <van-swipe-cell v-for="(item, index) in feedingData" :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_wl">
                                    <span> {{ item.materialName }}{{ item.procedureName ? `&nbsp;|&nbsp;${item.procedureName}` : '' }}</span>
                                    <div class="bg_list_item_num_item_wl_lx">
                                        <span class="green" v-if="item.qualityType == 0">合格&nbsp;/&nbsp;</span>
                                        <span class="yellow" v-if="item.qualityType == 1">不良&nbsp;/&nbsp;</span>
                                        <span class="red" v-if="item.qualityType == 2">报废&nbsp;/&nbsp;</span>
                                        <span>{{ item.locationName }}</span>
                                        <span>{{ item.batch ? `&nbsp;/&nbsp;${item.batch}` : '' }}</span>
                        <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 ? `&nbsp;|&nbsp;${item.procedureName}` : '' }}</span>
                                        <div class="bg_list_item_num_item_wl_lx">
                                            <span class="green" v-if="item.qualityType == 0">合格&nbsp;/&nbsp;</span>
                                            <span class="yellow" v-if="item.qualityType == 1">不良&nbsp;/&nbsp;</span>
                                            <span class="red" v-if="item.qualityType == 2">报废&nbsp;/&nbsp;</span>
                                            <span>{{ item.locationName }}</span>
                                            <span>{{ item.batch ? `&nbsp;/&nbsp;${item.batch}` : '' }}</span>
                                        </div>
                                    </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 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>
@@ -70,48 +73,107 @@
                <!-- <template v-if="produceData && produceData.length > 0"> -->
                    <!-- v-for="(item, index) in produceData" :key="index" -->
                    <van-swipe-cell>
                        <div class="bg_list_item_num">
                            <div class="bg_list_item_num_item">
                                <span>良品数</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 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_num">
                            <!-- @blur="change(item.id, item.num, 'C', item.maxNum, item)" -->
                            <div class="bg_list_item_num_item">
                                <span>不良数</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 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>
                        <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>设置 ></span>
                    <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> -->
                    </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><b>*</b>报工时长</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="infoBox">
                <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="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">{{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">
@@ -283,35 +345,48 @@
                </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" :style="{ height: '53%' }">
        <van-popup v-model:show="show" round position="bottom">
            <div class="bl">
                <div class="bl_head">
                    <span @click="show = false">取消</span>
                    <img src="@/assets/icon/ic_close@2x.png" style="opacity: 0;" alt="" />
                    <span>不良项</span>
                    <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 12" :key="i">
                    <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="true" name="" id="" />
                            <span>有划痕</span>
                            <input type="checkbox" :checked="item.active" />
                            <span>{{ item.name }}</span>
                        </div>
                        <div class="bl_list_item_right">
                            <input type="number" placeholder="请输入" />
                            <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 } from 'vue'
    import { getCurrentInstance, nextTick, onMounted, ref, reactive, computed } from 'vue'
    import { useRouter, useRoute } from "vue-router"
    import { Dialog, Toast } from 'vant'
    import { REGULAR } from '@/utils/utils'
    import { categoryExtList, queryOne } from '@/apis/PlanningAPI'
    import {
        getBarcodeContent,
        queryById,
@@ -334,6 +409,61 @@
    const router = useRouter()
    const route = useRoute()
    let TimeShow = ref(false)
    let from: any = reactive({
        time: '',
        defective: [],
        defectiveName: ''
    })
    // 预计工资
    const expectedSalary = computed(() => {
        if (!infoBox.value) return 0;
        // 按件计算
        if (infoBox.value.type == 0) {
            if (!produceFrom.qualified) return 0
            if (infoBox.value.unqualified == 1) {   // 是否计入不良品
                let total = Number(produceFrom.qualified) + Number(produceFrom.undesirable)
                return (total * (infoBox.value.salary / 100)).toFixed(2) || 0
            } else {
                return (Number(produceFrom.qualified) * (infoBox.value.salary / 100)).toFixed(2) || 0
            }
        } else {
            if (!from.duration) return 0;
            let h = (from.duration / 60 / 60).toFixed(2)
            return (Number(h) * (infoBox.value.salary / 10 / 10)).toFixed(2) || 0
        }
    })
    // 达标率
    const complianceRate = computed(() => {
        if (!infoBox.value) return 0;
        if (!produceFrom.qualified && !produceFrom.undesirable) return 0;
        if (!from.duration) return 0;
        // 按件计算
        // if (infoBox.value.type == 0) {
            if (infoBox.value.unqualified == 1) {   // 是否计入不良品
                let a = ((Number(from.qualified) + Number(from.undesirable)) / (from.duration / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return (Number(a) / Number(b)).toFixed(2) || 0
                // 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 / 60 / 60)).toFixed(2)
                let b = (infoBox.value.num / (infoBox.value.times / 60 / 60)).toFixed(2)
                console.log(a)
                console.log(b)
                return (Number(a) / Number(b)).toFixed(2) || 0
                // return Number(from.qualified) * infoBox.value.salary;
            }
        // } else {
        //     console.log('按时长')
        // }
    })
    const loading = ref(false);
    const finished = ref(false);
    let show = ref(false)
@@ -345,13 +475,17 @@
        page: 0
    })
    let infoBox: any = ref(null)     // 工资绩效
    // 产出合格/不良
    let produceFrom = reactive({
    let produceFrom: any = reactive({
        qualifiedId: '',
        qualified: '',  // 合格
        undesirableId: '',
        undesirable: '' // 不良
    })
    let cateList:any = ref([])  // 不良项
    // 详情数据
    const info: any = ref({})
@@ -404,6 +538,70 @@
    // 控制报工统计
    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) {
@@ -419,18 +617,19 @@
    // 修改产出
    const changeCC = (downType: string, num: number, recordId: string) => {
        if (!num) return
        console.log(produceFrom.qualified + produceFrom.undesirable)
        if ((produceFrom.qualified + produceFrom.undesirable) > info.value.planNum) {
            return Toast.fail({ message: '产出数量不能大于计划数量', duration: 2000 })
        }
        if (num >= 0) {
            dealWorkorderRecordStandard({
                downType, num, recordId, workorderId: route.query.id
            }).then(res => {
                if (res.code === 200) {
                    getOrocessRecordCC()
                }
            })
            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
@@ -602,6 +801,17 @@
        queryById(route.query.id).then(res => {
            if (res.code === 200) {
                info.value = res.data
                // 获取工资绩效数据
                queryOne({
                    deleted: 0,
                    departId: res.data.factoryId,
                    materialId: res.data.materialId,
                    procedureId: res.data.procedureId
                }).then((result: any) => {
                    if (result.code === 200) {
                        infoBox.value = result.data
                    }
                })
            }
        })
    }
@@ -688,7 +898,7 @@
            if (res.code === 200 && type === 'T') {
                getOrocessRecords()
            } else if (res.code === 200 && type === 'C') {
                getOrocessRecordCC()
                // getOrocessRecordCC()
            }
        })
    }
@@ -698,6 +908,10 @@
        if (info.value.bomType === 1) {  // 拉式
            console.log('拉式')
            statisticsData.value = []
            if (produceFrom.qualified <= 0) {
                Toast.fail({ message: '产出明细不能为空' })
                return
            }
            if (info.value.hasBom === 0) {
                console.log('无bom')
                // let data: any = [
@@ -853,6 +1067,10 @@
                Toast.fail({ message: '投料明细不能为空' })
                return
            }
            if (produceFrom.qualified <= 0) {
                Toast.fail({ message: '产出明细不能为空' })
                return
            }
            statisticsData.value = []
            if (info.value.hasBom === 0) {
                console.log('无bom')
@@ -976,8 +1194,25 @@
    // 确认报工
    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,
            qualifiedNum: produceFrom.qualified ? produceFrom.qualified : 0,
            unQualifiedNum: produceFrom.undesirable ? produceFrom.undesirable : 0
        }
        // id: route.query.id
        comfirmDoneStandard({
            id: route.query.id
            createUnqualifiedDTOList,
            createWorkorderRecordDTO
        }).then(res => {
            if (res.code === 200) {
                Toast.success({ message: '报工成功', forbidClick: true, duration: 2000 })
@@ -992,7 +1227,8 @@
        pageDJs()
        queryByIds()
        getOrocessRecords()
        getOrocessRecordCC()
        getData()
        // getOrocessRecordCC()
    })
</script>
@@ -1002,6 +1238,59 @@
        /*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;
@@ -1125,99 +1414,161 @@
                        }
                    }
                }
                .bg_list_item_num {
                .bg_list_item_h {
                    width: 100%;
                    background: white;
                    padding: 0 30px;
                    box-sizing: border-box;
                    .kong {
                        text-align: center;
                        font-size: 25px;
                        padding: 30px 0;
                        background: #ffffff;
                    }
                    .bg_list_item_num_item {
                    background: white;
                    .bg_list_item_num {
                        width: 100%;
                        min-height: 98px;
                        background: white;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        // height: 118px;
                        padding: 15px 0;
                        box-sizing: border-box;
                        justify-content: space-between;
                        border-bottom: 1px solid #E5E5E5;
                        border-bottom: 1PX solid #E5E5E5;
                        &:last-child {
                            border: none;
                            border: none !important;
                        }
                        .bg_list_item_num_item_wl {
                            flex-shrink: 0;
                        .kong {
                            text-align: center;
                            font-size: 25px;
                            padding: 30px 0;
                            background: #ffffff;
                        }
                        .bg_list_item_num_item {
                            width: 100%;
                            height: 100%;
                            display: flex;
                            flex-direction: column;
                            span {
                                font-size: 34px;
                                color: #222222;
                            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_wl_lx {
                                margin-top: 10px;
                                span {
                                    color: #222222;
                                    font-size: 28px;
                            .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;
                                    }
                                }
                            }
                        }
                        .warning {
                            color: $nav-stateColor5 !important;
                        }
                        .err {
                            color: $nav-stateColor4 !important;
                        }
                        span {
                            flex-shrink: 0;
                            overflow: hidden;
                            text-overflow: ellipsis;
                            white-space: nowrap;
                            .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;
                                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;
                            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
                            img {
                                width: 12px;
                                height: 24px;
                                margin-left: 20px;
                            }
                            span {
                                font-size: 28px;
                                font-weight: 400;
                                color: #666666;
                                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;
                                }
                            }
                        }
                    }
@@ -1423,12 +1774,15 @@
            }
        }
        .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;
@@ -1439,21 +1793,38 @@
                        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: 580px;
                height: calc(100% - 168px);
                overflow-y: scroll;
                margin-top: 30px;
                .bl_list_item {
                    width: 100%;
                    height: 60px;
                    height: 96px;
                    display: flex;
                    align-items: center;
                    justify-content: space-between;
                    margin-bottom: 20px;
                    border-bottom: 1PX solid #E5E5E5;
                    &:last-child {
                        margin-bottom: 0 !important;
                        border: none !important;
                    }
                    .bl_list_item_left {
                        flex: 1;
@@ -1462,6 +1833,7 @@
                        input {
                            width: 30px;
                            height: 30px;
                            border: 1PX solid #CCCCCC;
                            margin: 0 !important;
                        }
                        span {
@@ -1478,9 +1850,19 @@
                            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: 2px solid #999999
                            border: 1PX solid #CCCCCC;
                            &::-webkit-input-placeholder {
                                font-size: 28px;
                                font-family: PingFangSC-Regular, PingFang SC;
                                font-weight: 400;
                                color: #999999;
                            }
                        }
                    }
                }
h5_standard/src/views/wxLogin.vue
@@ -157,6 +157,7 @@
                    input {
                        flex: 1;
                        height: 100%;
                        padding: 0 !important;
                        font-size: 30px;
                        font-family: PingFangSC-Regular, PingFang SC;
                        font-weight: 400;
web_standard/.env.development
@@ -14,9 +14,12 @@
VUE_APP_API_PREFIX = ''
# 焦松
VUE_APP_BASE_URL = 'http://192.168.0.36:10021/'
# VUE_APP_BASE_URL = 'http://192.168.0.36:10021/'
# VUE_APP_BASE_URL = 'http://192.168.0.134:10021/'
# 任康本地
VUE_APP_BASE_URL = 'http://192.168.0.15:10021/'
# 江萍
# VUE_APP_BASE_URL = 'http://192.168.0.35:10021/'