h5_standard/src/components/common/Warehouse.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/components/newCom/quality.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/views/LogInAgain.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/views/needToBeDealtWith/addWarehousing.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/views/needToBeDealtWith/outbound.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/views/workOrder/processPlan.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/views/workOrder/reportingForWork.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/views/workOrder/workOrderReporting.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
h5_standard/src/views/wxLogin.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
web_standard/.env.development | ●●●●● 补丁 | 查看 | 原始文档 | 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 { } 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,6 +30,7 @@ </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> --> @@ -49,6 +50,8 @@ </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,9 +73,10 @@ <!-- <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>良品数</span> <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)" --> @@ -81,12 +85,14 @@ </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>不良数</span> <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)" --> @@ -95,23 +101,79 @@ </div> </div> </div> </div> </van-swipe-cell> <!-- <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>设置 ></span> <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> </van-swipe-cell> --> </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><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,11 +1414,22 @@ } } } .bg_list_item_num { .bg_list_item_h { width: 100%; background: white; 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; @@ -1137,6 +1437,8 @@ background: #ffffff; } .bg_list_item_num_item { width: 100%; height: 100%; display: flex; align-items: center; // height: 118px; @@ -1146,6 +1448,30 @@ 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; @@ -1169,11 +1495,21 @@ .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; @@ -1199,6 +1535,12 @@ 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; } @@ -1214,10 +1556,19 @@ 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: #666666; 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/'