| | |
| | | <template> |
| | | <div class="bg"> |
| | | <!-- 投料明细/合格产出明细/不良产出明细 --> |
| | | <div class="bg_plan" @click="selectPlan"> |
| | | <div class="bg_plan_label" v-if="!from.processPlan"> |
| | | <span><b>*</b>工序生产计划</span> |
| | | </div> |
| | | <div class="bg_plan_nr" v-else> |
| | | <span>{{ from.processPlan.materialName }} | {{ from.processPlan.materialCode }} | {{ from.processPlan.produceName }}</span> |
| | | <span>{{ from.processPlan.batch }}{{ from.processPlan.salesOrder ? ` / ${from.processPlan.salesOrder}` : '' }}</span> |
| | | <span>计划时间:{{ from.processPlan.workPlanStartDate }} ~ {{ from.processPlan.workPlanEndDate }}</span> |
| | | <span>计划进度:{{from.processPlan.num}}/{{from.processPlan.workorderDistributNum}}{{ from.processPlan.unitName }}</span> |
| | | </div> |
| | | <div class="bg_plan_label_val"> |
| | | <span v-if="!from.processPlan">请选择</span> |
| | | <img src="@/assets/icon/ic_ar@2x.png" alt="" /> |
| | | </div> |
| | | </div> |
| | | <div class="bg_list"> |
| | | <div class="bg_list_item"> |
| | | <div class="bg_list_item_top"> |
| | | <div class="bg_list_item_top_left"> |
| | | <div class="bg_list_item_top_left_x"></div> |
| | | <span>投料明细</span> |
| | | <!-- <span class="blue left">{{tlTotal()}}</span> --> |
| | | </div> |
| | | <div class="bg_list_item_top_right" @click="jumpTL" v-if="proxy.$auth('h5:workorderinput:create') && (info.bomType !== 1 || info.bomType == 0 || !info.bomType)"> |
| | | <img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" /> |
| | | <span>手动录入</span> |
| | | <span>生产信息</span> |
| | | </div> |
| | | </div> |
| | | <template v-if="feedingData && feedingData.length > 0"> |
| | | <van-swipe-cell v-for="(item, index) in feedingData" :key="index"> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <!-- <span>{{item.code}}</span> --> |
| | | <div class="bg_list_item_num_item_wl"> |
| | | <span> {{ item.materialName }}{{ item.procedureName ? ` | ${item.procedureName}` : '' }}</span> |
| | | <div class="bg_list_item_num_item_wl_lx"> |
| | | <span class="green" v-if="item.qualityType == 0">合格 / </span> |
| | | <span class="yellow" v-if="item.qualityType == 1">不良 / </span> |
| | | <span class="red" v-if="item.qualityType == 2">报废 / </span> |
| | | <span>{{ item.locationName }}</span> |
| | | <span>{{ item.batch ? ` / ${item.batch}` : '' }}</span> |
| | | <div class="bg_list_item_h"> |
| | | <div class="bg_list_item_num" @click="openDev"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>生产设备</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <span :style="{color: from.deviceName ? '#333' : ''}">{{from.deviceName ? from.deviceName : '请选择'}}</span> |
| | | <img src="@/assets/icon/ic_ar@2x.png" alt="" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="bg_list_item_num" @click="userShow = true"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>生产人员</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <span :style="{color: from.userName ? '#333' : ''}">{{from.userName ? from.userName : '请选择'}}</span> |
| | | <img src="@/assets/icon/ic_ar@2x.png" alt="" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="bg_list_item"> |
| | | <div class="bg_list_item_top"> |
| | | <div class="bg_list_item_top_left"> |
| | | <div class="bg_list_item_top_left_x"></div> |
| | | <span>生产信息</span> |
| | | </div> |
| | | <div class="bg_list_item_top_right" @click="openMaterial" v-if="(hasBom == 1 && bomType != 1) || hasBom == 0"> |
| | | <img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" /> |
| | | <span>新增投料</span> |
| | | </div> |
| | | </div> |
| | | <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"> |
| | | <div class="bg_list_item_num_item"> |
| | | <div class="bg_list_item_num_item_wl"> |
| | | <span>{{ item.materialName }}{{ item.procedureName ? ` | ${item.procedureName}` : '' }}</span> |
| | | <div class="bg_list_item_num_item_wl_lx"> |
| | | <span class="green" v-if="item.qualityType == 0">合格 / </span> |
| | | <span class="yellow" v-if="item.qualityType == 1">不良 / </span> |
| | | <span class="red" v-if="item.qualityType == 2">报废 / </span> |
| | | <span>{{ item.locationName }} / </span> |
| | | <span>{{ item.batch }}</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 type="number" v-model="item.num" @input="inputwl(index)" /> |
| | | <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 #right> |
| | | <van-button style="height: 100%;" @click="deleItem(index)" square text="删除" type="danger" /> |
| | | </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> |
| | | </template> |
| | | <div class="kong" v-if="hasBom == 1 && bomType == 1"> |
| | | <span>当前工序无需投料</span> |
| | | </div> |
| | | </div> |
| | | <div class="bg_list_item"> |
| | | <div class="bg_list_item bottomval"> |
| | | <div class="bg_list_item_top"> |
| | | <div class="bg_list_item_top_left"> |
| | | <div class="bg_list_item_top_left_x"></div> |
| | | <span>产出明细</span> |
| | | </div> |
| | | </div> |
| | | <!-- <template v-if="produceData && produceData.length > 0"> --> |
| | | <!-- v-for="(item, index) in produceData" :key="index" --> |
| | | <van-swipe-cell> |
| | | <div class="bg_list_item_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> |
| | | <div class="bg_list_item_h"> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span><b>*</b>良品数</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <input type="number" v-model="from.qualified" @input="changeNum(1)" placeholder="请输入" /> |
| | | <span v-if="from.processPlan">{{from.processPlan.unitName}}</span> |
| | | </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> |
| | | </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> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </van-swipe-cell> --> |
| | | <!-- </template> |
| | | <template v-else> |
| | | <div class="kong"> |
| | | <span>暂无数据</span> |
| | | </div> |
| | | </template> --> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>不良数</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <input type="number" v-model="from.undesirable" @input="changeNum(2)" placeholder="请输入" /> |
| | | <span v-if="from.processPlan">{{from.processPlan.unitName}}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="bg_list_item_num" v-if="from.undesirable > 0"> |
| | | <div class="bg_list_item_num_item" @click="openBL"> |
| | | <span><b>*</b>不良项</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> |
| | | </div> |
| | | <!-- <div class="bg_list_item"> |
| | | <div class="bg_plan" @click="TimeShow = true"> |
| | | <div class="bg_plan_label"> |
| | | <span>报工时长</span> |
| | | </div> |
| | | <div class="bg_plan_label_val"> |
| | | <span :style="{color: from.durationName ? '#333' : ''}">{{from.durationName ? from.durationName : '请选择'}}</span> |
| | | <img src="@/assets/icon/ic_ar@2x.png" alt="" /> |
| | | </div> |
| | | </div> |
| | | <div class="bg_list_item" v-if="arrType && arrType.length > 0"> |
| | | <div class="bg_list_item_top"> |
| | | <div class="bg_list_item_top_left"> |
| | | <div class="bg_list_item_top_left_x"></div> |
| | | <span>合格产出明细</span> |
| | | <span class="blue left">{{ccTotal()}}</span> |
| | | </div> |
| | | <div class="bg_list_item_top_right" @click="jumpCC" v-if="proxy.$auth('h5:workorderoutput:create')"> |
| | | <img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" /> |
| | | <span>手动录入</span> |
| | | <span>工资绩效</span> |
| | | </div> |
| | | </div> |
| | | <template v-if="produceData && produceData.length > 0"> |
| | | <van-swipe-cell v-for="(item, index) in produceData" :key="index"> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>{{item.code}}</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <input v-model="item.num" :disabled="!proxy.$auth('h5:workorderoutput:update')" @blur="change(item.id, item.num, 'C', item.maxNum, item)" type="number" /> |
| | | <span>{{item.company}}</span> |
| | | </div> |
| | | <div class="bg_list_item_h"> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>计件方式</span> |
| | | <div class="bg_list_item_num_item_list"> |
| | | <div :class="item.active ? 'bg_list_item_num_item_list_item active' : 'bg_list_item_num_item_list_item'" v-for="(item, index) in arrType" :key="index" @click="clickPerformanceType(index)">{{ item.name }}</div> |
| | | <!-- <div class="bg_list_item_num_item_list_item active" v-if="infoBox.type == 0">计件</div> |
| | | <div class="bg_list_item_num_item_list_item active" v-if="infoBox.type == 1">计时</div> --> |
| | | </div> |
| | | </div> |
| | | <template #right v-if="proxy.$auth('h5:workorderoutput:delete')"> |
| | | <van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'C')" type="danger" /> |
| | | </template> |
| | | </van-swipe-cell> |
| | | </template> |
| | | <template v-else> |
| | | <div class="kong"> |
| | | <span>暂无数据</span> |
| | | </div> |
| | | </template> |
| | | </div> |
| | | |
| | | <div class="bg_list_item"> |
| | | <div class="bg_list_item_top"> |
| | | <div class="bg_list_item_top_left"> |
| | | <div class="warning"></div> |
| | | <span>不良产出明细</span> |
| | | <span class="yellow left">{{blTotal()}}</span> |
| | | </div> |
| | | </div> |
| | | <template v-if="undesirable && undesirable.length > 0"> |
| | | <van-swipe-cell v-for="(item, index) in undesirable" :key="index"> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>{{item.code}}</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <input v-model="item.num" :disabled="!proxy.$auth('h5:workorderoutput:update')" @blur="change(item.id, item.num, 'C', item.maxNum, item)" type="number" /> |
| | | <span>{{item.company}}</span> |
| | | </div> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>工资单价</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <span class="color1">{{(arrType[from.index].salary / 10 / 10).toFixed(2)}}元/{{arrType[from.index].type == 0 ? '件' : '时'}}</span> |
| | | <!-- <span class="color1">{{(infoBox.salary / 10 / 10).toFixed(2)}}元/{{infoBox.type == 0 ? '件' : '时'}}</span> --> |
| | | </div> |
| | | </div> |
| | | <template #right v-if="proxy.$auth('h5:workorderoutput:delete')"> |
| | | <van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'C')" type="danger" /> |
| | | </template> |
| | | </van-swipe-cell> |
| | | </template> |
| | | <template v-else> |
| | | <div class="kong"> |
| | | <span>暂无数据</span> |
| | | </div> |
| | | </template> |
| | | </div> |
| | | |
| | | <div class="bg_list_item"> |
| | | <div class="bg_list_item_top"> |
| | | <div class="bg_list_item_top_left"> |
| | | <div class="error"></div> |
| | | <span>报废产出明细</span> |
| | | <span class="red left">{{bfTotal()}}</span> |
| | | </div> |
| | | </div> |
| | | <template v-if="scrap && scrap.length > 0"> |
| | | <van-swipe-cell v-for="(item, index) in scrap" :key="index"> |
| | | <div class="bg_list_item_num"> |
| | | <div class="bg_list_item_num_item"> |
| | | <span>{{item.code}}</span> |
| | | <div class="bg_list_item_num_item_sr"> |
| | | <input v-model="item.num" :disabled="!proxy.$auth('h5:workorderoutput:update')" @blur="change(item.id, item.num, 'C', item.maxNum, item)" type="number" /> |
| | | <span>{{item.company}}</span> |
| | | </div> |
| | | <div 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> |
| | | <template #right v-if="proxy.$auth('h5:workorderoutput:delete')"> |
| | | <van-button style="height: 100%;" square text="删除" @click="deleItem(item.id, 'C')" type="danger" /> |
| | | </template> |
| | | </van-swipe-cell> |
| | | </template> |
| | | <template v-else> |
| | | <div class="kong"> |
| | | <span>暂无数据</span> |
| | | </div> |
| | | </template> |
| | | </div> --> |
| | | </div> |
| | | <div class="details_dj"> |
| | | <div class="details_dj_title"> |
| | | <div class="details_dj_title_left"> |
| | | <div class="details_x"></div> |
| | | <span>生产点检</span> |
| | | </div> |
| | | <div class="details_dj_title_right" @click="jumpdj" v-if="proxy.$auth('h5:workorder:processRecord')"> |
| | | <img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" /> |
| | | <span>手动录入</span> |
| | | </div> |
| | | </div> |
| | | <div class="details_dj_list"> |
| | | <van-list |
| | | v-model:loading="loading" |
| | | :finished="finished" |
| | | finished-text="没有更多了~" |
| | | @load="pageDJs"> |
| | | <van-swipe-cell v-for="(item, index) in djData" :key="index"> |
| | | <div class="details_dj_list_item"> |
| | | <span>{{item.attrName}}:{{item.val}}</span> |
| | | <span>{{item.userName}} {{item.createTime}}</span> |
| | | <div 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> |
| | | <template #right> |
| | | <van-button square type="danger" style="height: 100%;" @click="dele(item.id)" text="删除" /> |
| | | </template> |
| | | </van-swipe-cell> |
| | | </van-list> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 报工按钮 --> |
| | | <template v-if="info.status === 2 || info.procedureNeedcheck === 1"> |
| | | <div class="bh_zw"></div> |
| | | <div class="bg_footer"> |
| | | <div class="bg_footer_submit" @click="submit">确认报工</div> |
| | | </div> |
| | | </template> |
| | | <!-- 扫码组件 --> |
| | | <v-ScanCode |
| | | :openCode="openCode" |
| | | :infos="['请扫描工装码']" |
| | | @closePopup="closePopup" |
| | | @onDecode="onDecode" /> |
| | | <!-- 报工统计数据 --> |
| | | <van-popup v-model:show="statistics" round :closeable="true" position="bottom" :style="{ height: '53%' }"> |
| | | <div class="tg"> |
| | | <div class="tg_header">请确认报工信息</div> |
| | | <div class="tg_table"> |
| | | <div class="tg_table_header"> |
| | | <div class="tg_table_header_item">类型</div> |
| | | <div class="tg_table_header_item">物料名称</div> |
| | | <!-- <div class="tg_table_header_item">工装数量</div> --> |
| | | <div class="tg_table_header_item">物料数量</div> |
| | | </div> |
| | | <div class="nr" v-if="statisticsData.length > 0"> |
| | | <div class="tg_table_nr" v-for="(item, index) in statisticsData" :key="index"> |
| | | <div class="tg_table_nr_item">{{item.name}}</div> |
| | | <div class="tg_table_nr_item">{{item.materialName}}</div> |
| | | <!-- <div class="tg_table_nr_item">{{item.gznum}}</div> --> |
| | | <div class="tg_table_nr_item" :style="item.name === '工单未投料' ? 'color: #DE5243' : ''">{{item.num}}</div> |
| | | </div> |
| | | </div> |
| | | <div class="nr" v-else> |
| | | <div class="tg_table_nr"> |
| | | <div class="tg_table_nr_item1">暂无数据</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="tg_footer"> |
| | | <button class="tg_footer_qr" @click="submitBG" v-if="proxy.$auth('h5:workorderoutput:confirm') && isSubmit">确认报工</button> |
| | | <div class="tg_footer_fh" @click="gofh" v-else-if="!isSubmit">返回修改</div> |
| | | </div> |
| | | </div> |
| | | </van-popup> |
| | | <div class="bh_zw"></div> |
| | | <div class="bg_footer"> |
| | | <div class="bg_footer_submit1" @click="continueSubmit">继续报工</div> |
| | | <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"> |
| | | <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> |
| | | <!-- 入库物料 --> |
| | | <MaterialY :show="show1" :plansId="String(plansId)" :ids="ids" :deviceId="String(deviceId)" @close="close" @value="getValue" /> |
| | | <!-- 设备 --> |
| | | <van-popup v-model:show="deviceShow" round position="bottom" :style="{ height: '50%' }"> |
| | | <van-picker |
| | | :columns="deviceList" |
| | | @confirm="onConfirm" |
| | | @cancel="onCancel" |
| | | :columns-field-names="customFieldName" |
| | | /> |
| | | </van-popup> |
| | | <!-- 人员 --> |
| | | <user :show="userShow" @close="onCancel1" @value="onConfirm1" /> |
| | | <!-- 时间 --> |
| | | <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> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { getCurrentInstance, nextTick, onMounted, ref, reactive } from 'vue' |
| | | import { useRouter, useRoute } from "vue-router" |
| | | import { Dialog, Toast } from 'vant' |
| | | import { REGULAR } from '@/utils/utils' |
| | | import { |
| | | getBarcodeContent, |
| | | queryById, |
| | | getOrocessRecord, |
| | | deleteCT, |
| | | updateById, |
| | | comfirmDone, |
| | | comfirmDoneStandard, |
| | | getListByCondition, |
| | | allForStandard, |
| | | pageDJ, |
| | | deletedj, |
| | | dealWorkorderRecordStandard, |
| | | getWorkorderRecordListStandard |
| | | } from '@/apis/WorkOrderAPI' |
| | | import { QRCodeType } from '@/enum' |
| | | const { proxy }: any = getCurrentInstance() |
| | | import VWorkOrderInfo from '@/components/common/WorkOrderInfo.vue' |
| | | import { onMounted, ref, reactive, getCurrentInstance, computed } from 'vue' |
| | | import { useRouter } from 'vue-router' |
| | | import { useStore } from 'vuex' |
| | | import { getDeviceByCondition, getFindAll, queryOne, queryList, autoWorkReport, getIdPlansExt, categoryExtList } from '@/apis/PlanningAPI' |
| | | import MaterialY from '@/components/newCom/MaterialY.vue' |
| | | import user from '@/components/newCom/user.vue' |
| | | import { Toast } from 'vant' |
| | | |
| | | const {$Bus} = getCurrentInstance().appContext.config.globalProperties |
| | | const router = useRouter() |
| | | const route = useRoute() |
| | | |
| | | const loading = ref(false); |
| | | const finished = ref(false); |
| | | const store = useStore() |
| | | let show = ref(false) |
| | | // 点检数据 |
| | | let djData: any = ref([]) |
| | | // 分页查询数据 |
| | | let page = reactive({ |
| | | capacity: 10, |
| | | page: 0 |
| | | let show1 = ref(false) |
| | | let TimeShow = ref(false) |
| | | let deviceId = ref('') |
| | | let plansId = ref('') |
| | | let ids = ref('') |
| | | let total: any = ref('') // 可投数量 |
| | | |
| | | let from: any = reactive({ |
| | | processPlan: null, |
| | | deviceId: '', |
| | | deviceName: '', |
| | | userId: store.state.userInfo.id, |
| | | userName: store.state.userInfo.companyUser.name, |
| | | qualified: '', // 良品数 |
| | | undesirable: '', // 不良数 |
| | | duration: '', |
| | | durationName: '0小时0分钟', |
| | | time: '', |
| | | defective: [], |
| | | defectiveName: '', |
| | | type: '', // 绩效类型 |
| | | index: 0 |
| | | }) |
| | | |
| | | // 产出合格/不良 |
| | | let produceFrom = reactive({ |
| | | qualifiedId: '', |
| | | qualified: '', // 合格 |
| | | undesirableId: '', |
| | | undesirable: '' // 不良 |
| | | }) |
| | | // { name: '计件', active: false, id: 0 }, { name: '计时', active: false, id: 1 } |
| | | let arrType: any = ref([]) |
| | | |
| | | // 详情数据 |
| | | const info: any = ref({}) |
| | | let infoBox: any = ref(null) // 工资绩效 |
| | | |
| | | // 判断是否能提交 |
| | | let isSubmit: any = ref<boolean>(false) |
| | | let bomType: any = ref('') |
| | | let hasBom: any = ref('') |
| | | let deviceShow = ref(false) |
| | | let deviceList = ref([]) |
| | | let cateList:any = ref([]) |
| | | const customFieldName = { |
| | | text: 'name' |
| | | }; |
| | | let userShow = ref(false) |
| | | let wuList = ref<Array<any>>([]) |
| | | |
| | | // 不良明细 |
| | | let undesirable: any = ref([]) |
| | | |
| | | // 报废明细 |
| | | let scrap: any = ref([]) |
| | | |
| | | // 扫码类型 |
| | | let type: any = ref('') |
| | | |
| | | // 统计数据 |
| | | let statisticsData: any = ref([ |
| | | // { |
| | | // name: '工单投料', |
| | | // materialName: '黄沙', |
| | | // num: 0 |
| | | // }, |
| | | // { |
| | | // name: '工单合格产出', |
| | | // materialName: '黄沙', |
| | | // num: 0 |
| | | // }, |
| | | // { |
| | | // name: '工单不良产出', |
| | | // materialName: '黄沙', |
| | | // num: 0 |
| | | // }, |
| | | // { |
| | | // name: '工单未投料', |
| | | // materialName: '黄沙', |
| | | // num: 0 |
| | | // } |
| | | ]) |
| | | |
| | | // 投料数据 |
| | | const feedingData: any = ref([]) |
| | | |
| | | // 产出数据 |
| | | const produceData: any = ref([]) |
| | | |
| | | // 控制扫码显示隐藏 |
| | | const openCode = ref<boolean>(false) |
| | | |
| | | // 控制报工统计 |
| | | const statistics = ref<boolean>(false) |
| | | |
| | | // 投料统计 |
| | | const tlTotal = (): string => { |
| | | if (feedingData.value.length > 0) { |
| | | let total: number = 0 |
| | | feedingData.value.forEach((element: any) => { |
| | | total = total + element.num |
| | | }) |
| | | return `${total}` |
| | | } |
| | | return '' |
| | | const openBL = () => { |
| | | cateList.value.forEach((item: any) => { |
| | | if (!item.active) { |
| | | item.num = '' |
| | | } |
| | | if (item.active && item.num <= 0) { |
| | | item.active = false |
| | | } |
| | | }) |
| | | show.value = true |
| | | } |
| | | |
| | | // 修改产出 |
| | | 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 }) |
| | | // 切换绩效类型 |
| | | const clickPerformanceType = (i: number) => { |
| | | from.index = i |
| | | arrType.value.forEach((item: any, index: number) => { |
| | | if (i === index) { |
| | | from.type = item.id |
| | | } |
| | | item.active = index === i |
| | | }) |
| | | } |
| | | |
| | | // 产出数量验证 |
| | | const changeNum = (type: number) => { |
| | | let num = total.value - (Number(from.qualified) + Number(from.undesirable)) |
| | | if (type == 2) { |
| | | from.defective = [] |
| | | from.defectiveName = '' |
| | | } |
| | | if (num >= 0) { |
| | | dealWorkorderRecordStandard({ |
| | | downType, num, recordId, workorderId: route.query.id |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | getOrocessRecordCC() |
| | | } |
| | | }) |
| | | } else { |
| | | if (downType == 0) { |
| | | produceFrom.qualified = 0 |
| | | if (num < 0) { |
| | | Toast('产出数量不能大于可产出数量!') |
| | | if (type == 1) { |
| | | from.qualified = '' |
| | | } else { |
| | | produceFrom.undesirable = 0 |
| | | from.undesirable = '' |
| | | } |
| | | Toast.fail({ message: '产出数量不能小于0', duration: 2000 }) |
| | | } |
| | | } |
| | | |
| | | // 跳转点检 |
| | | const jumpdj = () => { |
| | | router.push({ name: 'spotCheck', query: { id: route.query.id } }) |
| | | } |
| | | |
| | | // 删除点检 |
| | | const dele = (id: string | number): void => { |
| | | deletedj(id) |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | djData.value = [] |
| | | finished.value = false |
| | | page.page = 0 |
| | | pageDJs() |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 点检数据 |
| | | const pageDJs = () => { |
| | | if (!finished.value) { |
| | | page.page = page.page + 1 |
| | | loading.value = true |
| | | pageDJ({ |
| | | capacity: page.capacity, |
| | | page: page.page, |
| | | model: { |
| | | workorderId: route.query.id |
| | | } |
| | | }).then(res => { |
| | | if (res.code === 200 && res.data && res.data.records.length !== 0) { |
| | | djData.value.push(...res.data.records) |
| | | } else { |
| | | finished.value = true |
| | | } |
| | | loading.value = false |
| | | }).catch(err => { |
| | | loading.value = false |
| | | finished.value = true |
| | | }) |
| | | // 验证物料数量 |
| | | const inputwl = (i: number) => { |
| | | if (wuList.value[i].num > wuList.value[i].total) { |
| | | wuList.value[i].num = '' |
| | | Toast('投料数量不能大于库存数量') |
| | | } |
| | | } |
| | | |
| | | // 统计 |
| | | const ccTotal = (): string => { |
| | | if (produceData.value.length > 0) { |
| | | let total: number = 0 |
| | | produceData.value.forEach((element: any) => { |
| | | total = total + element.num |
| | | }) |
| | | return `${total}${produceData.value[0].company}` |
| | | } |
| | | return '' |
| | | const changeChecked = (i: number) => { |
| | | cateList.value[i].active = !cateList.value[i].active |
| | | } |
| | | |
| | | // 统计 |
| | | const blTotal = (): string => { |
| | | if (undesirable.value.length > 0) { |
| | | let total: number = 0 |
| | | undesirable.value.forEach((element: any) => { |
| | | total = total + element.num |
| | | }) |
| | | return `${total}${undesirable.value[0].company}` |
| | | } |
| | | return '' |
| | | } |
| | | |
| | | // 统计 |
| | | const bfTotal = (): string => { |
| | | if (scrap.value.length > 0) { |
| | | let total: number = 0 |
| | | scrap.value.forEach((element: any) => { |
| | | total = total + element.num |
| | | }) |
| | | return `${total}${scrap.value[0].company}` |
| | | } |
| | | return '' |
| | | } |
| | | |
| | | // 删除产出/投料 |
| | | const deleItem = (id: any, type: string) => { |
| | | Dialog.confirm({ |
| | | title: '提示', |
| | | message: '确定删除此条记录吗?', |
| | | }).then(() => { |
| | | deleteCT(id) |
| | | .then(res => { |
| | | if (res.code === 200 && type === 'C') { |
| | | getOrocessRecordCC() |
| | | } else if (res.code === 200 && type === 'T') { |
| | | getOrocessRecords() |
| | | } |
| | | }) |
| | | }).catch(() => { |
| | | // on cancel |
| | | const 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 = '' |
| | | for (let i = 0; i < cateList.value.length; i++) { |
| | | if (cateList.value[i].active) { |
| | | if (cateList.value[i].num <= 0) { |
| | | return Toast('不良数量必须大于0') |
| | | } |
| | | total = total += cateList.value[i].num |
| | | arr.push(cateList.value[i]) |
| | | name += cateList.value[i].name + cateList.value[i].num + ';' |
| | | } |
| | | } |
| | | // 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 !== from.undesirable) return Toast('不良数必须等于产出不良数') |
| | | from.defective = arr |
| | | from.defectiveName = name |
| | | show.value = false |
| | | } |
| | | |
| | | // 跳转手动产出 |
| | | const jumpCC = () => { |
| | | router.push({ name: 'manualOutput', query: { id: route.query.id, num: produceData.value.length > 0 ? produceData.value[0].num : '' } }) |
| | | } |
| | | |
| | | // 跳转手动投料 |
| | | const jumpTL = () => { |
| | | router.push({ name: 'manualFeeding', query: { id: route.query.id } }) |
| | | } |
| | | |
| | | // 关闭扫码组件 |
| | | const closePopup = (): void => { |
| | | openCode.value = false |
| | | } |
| | | |
| | | // 获取扫码值 |
| | | const onDecode = (data: string[]): void => { |
| | | getBarcodeContent({ |
| | | barcode: data[0] |
| | | const continueSubmit = () => { |
| | | if (!from.processPlan) return Toast('计划不能为空') |
| | | if (!from.deviceId) return Toast('设备不能为空') |
| | | if (!from.userId) return Toast('生产人员不能为空') |
| | | if (hasBom.value == 1 && bomType.value == 1) { |
| | | console.log('不需要投料') |
| | | } else { |
| | | if (!wuList.value.length === 0) return Toast('投料不能为空') |
| | | } |
| | | if (!from.qualified && !from.undesirable) { |
| | | return Toast('良品数与不良数不能同时为空') |
| | | } |
| | | if (from.qualified && from.qualified <= 0) { |
| | | return Toast('良品数必须大于0') |
| | | } |
| | | if (from.undesirable && from.undesirable <= 0) { |
| | | return Toast('不良品数必须大于0') |
| | | } |
| | | // if (!from.qualified) return Toast('良品数不能为空') |
| | | // 有不良数 |
| | | if (from.undesirable > 0) { |
| | | if (from.defective.length === 0) return Toast('不良项不能为空') |
| | | } |
| | | // if (!from.duration) return Toast('报工时长不能为空') |
| | | let type = '' |
| | | arrType.value.forEach((item: any) => { |
| | | if (item.active) { |
| | | type = item.id |
| | | } |
| | | }) |
| | | autoWorkReport({ |
| | | createWorkorderRecordDTO: { |
| | | type, |
| | | duration: from.duration, |
| | | qualifiedNum: from.qualified ? from.qualified : 0, |
| | | unQualifiedNum: from.undesirable ? from.undesirable : 0 |
| | | }, |
| | | plansId: from.processPlan.id, |
| | | proGroupId: deviceId.value, |
| | | proUserList: [from.userId], |
| | | recordList: wuList.value.map((item: any) => { |
| | | return { |
| | | wstockId: item.id, |
| | | num: item.num |
| | | } |
| | | }), |
| | | createUnqualifiedDTOList: from.defective.map((item: any) => { |
| | | return { |
| | | categoryId: item.id, |
| | | unQualifiedNum: item.num |
| | | } |
| | | }) |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | if (res.data.barcodeType === QRCodeType.GZ) { |
| | | if (type.value === 'tl') { // 投料操作 |
| | | getListByCondition({ id: res.data.id }) |
| | | .then(gz => { |
| | | if (gz.code === 200) { |
| | | if (gz.data[0].status !== 1) { |
| | | router.push({ name: 'codeScanningFeeding', query: { id: route.query.id, gzId: res.data.id } }) |
| | | } else { |
| | | Toast.fail({ message: '扫描的工装状态不能为空', duration: 2000 }) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | if (type.value === 'cc') { // 产出操作 |
| | | router.push({ name: 'codeScanningOutput', query: { id: route.query.id, gzId: res.data.id } }) |
| | | } |
| | | } else { |
| | | Toast({ message: '请扫描正确的篮筐码', duration: 2000 }) |
| | | } |
| | | } |
| | | }) |
| | | nextTick(() => { |
| | | openCode.value = false |
| | | }) |
| | | } |
| | | |
| | | // 跳转手动投料 |
| | | const jump = () => { |
| | | router.push({ name: 'manualFeeding', query: { id: route.query.id } }) |
| | | } |
| | | |
| | | // 跳转扫码投料 |
| | | const jump1 = (types: string) => { |
| | | type.value = types |
| | | openCode.value = true |
| | | } |
| | | |
| | | // 查询工单详情 |
| | | const queryByIds = () => { |
| | | queryById(route.query.id).then(res => { |
| | | if (res.code === 200) { |
| | | info.value = res.data |
| | | Toast.success({message: '报工成功!'}) |
| | | from.processPlan = null |
| | | from.deviceId = '' |
| | | from.deviceName = '' |
| | | from.userId = '' |
| | | from.userName = '' |
| | | from.qualified = '' |
| | | from.undesirable = '' |
| | | from.duration = '' |
| | | from.durationName = '0小时0分钟' |
| | | from.time = '' |
| | | from.defective = [] |
| | | from.defectiveName = '' |
| | | wuList.value = [] |
| | | deviceId.value = '' |
| | | plansId.value = '' |
| | | ids.value = '' |
| | | total.value = '' |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 查询工单生产记录---投料 |
| | | const getOrocessRecords = () => { |
| | | feedingData.value = [] |
| | | allForStandard({ |
| | | workorderId: route.query.id, |
| | | type: 0 |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | feedingData.value = res.data |
| | | // res.data.forEach((item: any) => { |
| | | // feedingData.value.push({ id: item.id, company: item.umodel.name, gz: item.amodel.code, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num }) |
| | | // }) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 查询工单生产记录---产出 |
| | | const getOrocessRecordCC = () => { |
| | | produceData.value = [] |
| | | undesirable.value = [] |
| | | scrap.value = [] |
| | | getWorkorderRecordListStandard({ |
| | | workorderId: route.query.id |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | if (res.data.length > 0) { |
| | | res.data.forEach((item: any) => { |
| | | if (item.doneType === 1) { |
| | | produceFrom.undesirable = item.num |
| | | produceFrom.undesirableId = item.id |
| | | } else { |
| | | produceFrom.qualified = item.num |
| | | produceFrom.qualifiedId = item.id |
| | | } |
| | | }) |
| | | } |
| | | // res.data.forEach((item: any) => { |
| | | // if (item.doneType === 0 || !item.doneType) { // 合格 | 混合 |
| | | |
| | | // produceData.value.push({ id: item.id, company: item.umodel.name, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num }) |
| | | // } else if (item.doneType === 1) { // 不良 |
| | | // undesirable.value.push({ id: item.id, company: item.umodel.name, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num }) |
| | | // } else if (item.doneType === 2) { // 报废 |
| | | // scrap.value.push({ id: item.id, company: item.umodel.name, name: item.mmodel.name, code: item.amodel.code + ' - ' + item.mmodel.name, num: item.num, ynum: item.num, maxNum: item.amodel.num }) |
| | | // } |
| | | // }) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 编辑投料/产出 |
| | | const change = (id: any, num: any, type: any, maxNum: number, item: object, unitAttribute: number): void => { |
| | | let obj: any = item |
| | | if (type === 'T') { |
| | | if (unitAttribute == 0 && num != '') { |
| | | if(!REGULAR.positiveInteger.test(num)){ |
| | | obj.num = obj.ynum |
| | | Toast({ message: '只能输入正整数' }) |
| | | return |
| | | } |
| | | } |
| | | if (unitAttribute == 1 && num != '') { |
| | | if(!REGULAR.number.test(num)){ |
| | | Toast({ message: '只能输入正整数或小数(最多四位)' }) |
| | | obj.num = obj.ynum |
| | | return |
| | | } |
| | | } |
| | | if (num > maxNum) { |
| | | obj.num = obj.ynum |
| | | Toast.fail({ message: '超出工装总数' }) |
| | | return |
| | | } |
| | | } else if (type === 'C' && num > info.value.planNum) { |
| | | obj.num = obj.ynum |
| | | Toast.fail({ message: '产出数量不能超过计划数量' }) |
| | | return |
| | | } |
| | | updateById({ id: id, num: num }).then(res => { |
| | | if (res.code === 200 && type === 'T') { |
| | | getOrocessRecords() |
| | | } else if (res.code === 200 && type === 'C') { |
| | | getOrocessRecordCC() |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 确认报工 |
| | | const submit = () => { |
| | | if (info.value.bomType === 1) { // 拉式 |
| | | console.log('拉式') |
| | | statisticsData.value = [] |
| | | if (info.value.hasBom === 0) { |
| | | console.log('无bom') |
| | | // let data: any = [ |
| | | // { name: '工单投料', gznum: feedingData.value.length, wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 }, |
| | | // { name: '工单合格产出', gznum: produceData.value.length, wlmc: produceData.value.length > 0 ? produceData.value[0].name : '', wlnum: 0 }, |
| | | // { name: '工单不良产出', gznum: 0, wlmc: '', wlnum: 0 }, |
| | | // { name: '工单未投料', gznum: '', wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 } |
| | | // ] |
| | | // if (undesirable.value.length > 0) { // 判断有没有不良 |
| | | // data[2].wlmc = undesirable.value[0].name |
| | | // data[2].gznum = data[2].gznum + undesirable.value.length |
| | | // } |
| | | // if (scrap.value.length > 0) { // 判断有没有不良 |
| | | // data[2].wlmc = scrap.value[0].name |
| | | // data[2].gznum = data[2].gznum + scrap.value.length |
| | | // } |
| | | // let tl: number = 0 |
| | | // let cc: number = 0 |
| | | // let bl: number = 0 |
| | | // undesirable.value.forEach((item: any) => { // 不良 |
| | | // bl = bl + item.num |
| | | // }) |
| | | // scrap.value.forEach((item: any) => { // 报废 |
| | | // bl = bl + item.num |
| | | // }) |
| | | // if (produceData.value.length > 0) { // 判断有没有合格产出 |
| | | // produceData.value.forEach((item: any) => { // 产出 |
| | | // cc = cc + item.num |
| | | // }) |
| | | // } |
| | | // feedingData.value.forEach((item: any) => { // 投料 |
| | | // tl = tl + item.num |
| | | // }) |
| | | // data[0].wlnum = tl.toString() + info.value.umodel.name |
| | | // if (produceData.value.length > 0) { |
| | | // data[1].wlnum = cc.toString() + info.value.umodel.name |
| | | // } |
| | | // data[2].wlnum = bl.toString() + info.value.umodel.name |
| | | // let total: number = info.value.planNum - (Number(cc) + Number(bl)) |
| | | // data[data.length - 1].wlnum = (info.value.planNum - Number(cc) - Number(bl)).toString() + info.value.umodel.name |
| | | // if (total === 0) { |
| | | // isSubmit.value = true |
| | | // } else { |
| | | // isSubmit.value = false |
| | | // } |
| | | |
| | | let arr: any = [] |
| | | let tl = 0 |
| | | let res = getGroupNum(feedingData.value) |
| | | for (let i in res) { |
| | | let num = 0 |
| | | res[i].forEach((item: any) => { |
| | | num += item.num |
| | | }) |
| | | arr.push({ name: '工单投料', materialName: i + res[i][0].procedureName, num: num }) |
| | | } |
| | | feedingData.value.forEach((item: any) => { |
| | | tl += item.num |
| | | }) |
| | | statisticsData.value = [...statisticsData.value, ...arr] |
| | | statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified }) |
| | | statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable }) |
| | | statisticsData.value.push({ name: '工单未投料', materialName: '', num: info.value.planNum - Number(produceFrom.qualified) - Number(produceFrom.undesirable) }) |
| | | let total: number = info.value.planNum - (Number(produceFrom.qualified) + Number(produceFrom.undesirable)) |
| | | if (total === 0) { |
| | | isSubmit.value = true |
| | | } else { |
| | | isSubmit.value = false |
| | | } |
| | | // if (Number(tl) <= info.value.planNum) { |
| | | // let total: number = Number(tl) - Number(cc) - Number(bl) // 是否有余 |
| | | // data[data.length - 1].wlnum = (Number(tl) - Number(cc) - Number(bl)).toString() + info.value.umodel.name |
| | | // if (total === 0) { |
| | | // isSubmit.value = true |
| | | // } else { |
| | | // isSubmit.value = false |
| | | // } |
| | | // } else { |
| | | // isSubmit.value = false |
| | | // } |
| | | // statisticsData.value = data |
| | | } else if (info.value.hasBom === 1) { // 有bom情况 |
| | | console.log('有bom') |
| | | // let cc: number = 0 |
| | | // let bl: number = 0 |
| | | // let newData: any = {} |
| | | // if (feedingData.value.length > 0) { // 投料 |
| | | // feedingData.value.forEach((e: any) => { |
| | | // if (Object.keys(newData).indexOf('' + e.name) === -1) { |
| | | // newData[e.name] = [] |
| | | // } |
| | | // newData[e.name].push(e) |
| | | // }) |
| | | // for (let key in newData) { |
| | | // let obj = { name: '工单投料', gznum: newData[key].length, wlmc: key, wlnum: 0, num: 0 } |
| | | // newData[key].forEach((item: any) => { |
| | | // obj.wlnum = obj.wlnum + item.num |
| | | // obj.num = item.num |
| | | // }) |
| | | // obj.wlnum = obj.wlnum.toString() + newData[key][0].company as never |
| | | // statisticsData.value.push(obj) |
| | | // } |
| | | // } |
| | | // if (produceData.value.length > 0) { // 产出 |
| | | // produceData.value.forEach((item: any) => { |
| | | // cc = cc + item.num |
| | | // }) |
| | | // statisticsData.value.push({ name: '工单合格产出', gznum: produceData.value.length, wlmc: info.value.mmodel.name, wlnum: cc + info.value.umodel.name, num: cc }) |
| | | // } |
| | | // if (undesirable.value.length > 0 || scrap.value.length > 0) { // 不良/报废 |
| | | // undesirable.value.forEach((item: any) => { |
| | | // bl = bl + item.num |
| | | // }) |
| | | // scrap.value.forEach((item: any) => { |
| | | // bl = bl + item.num |
| | | // }) |
| | | // statisticsData.value.push({ name: '工单不良产出', gznum: undesirable.value.length + scrap.value.length, wlmc: info.value.mmodel.name, wlnum: bl + info.value.umodel.name, num: bl }) |
| | | // } |
| | | // let totaltl: number = 0 |
| | | // let totalcc: number = 0 |
| | | // let totalbl: number = 0 |
| | | // statisticsData.value.forEach((item: any) => { |
| | | // if (item.name === '工单投料') { |
| | | // totaltl = totaltl + item.num |
| | | // } else if (item.name === '工单合格产出') { |
| | | // totalcc = totalcc + item.num |
| | | // } else if (item.name === '工单不良产出') { |
| | | // totalbl = totalbl + item.num |
| | | // } |
| | | // }) |
| | | // isSubmit.value = totalcc + totalbl <= info.value.planNum; |
| | | let arr: any = [] |
| | | let tl = 0 |
| | | let res = getGroupNum(feedingData.value) |
| | | for (let i in res) { |
| | | let num = 0 |
| | | res[i].forEach((item: any) => { |
| | | num += item.num |
| | | }) |
| | | arr.push({ name: '工单投料', materialName: i, num: num }) |
| | | } |
| | | feedingData.value.forEach((item:any) => { |
| | | tl += item.num |
| | | }) |
| | | statisticsData.value = [...statisticsData.value, ...arr] |
| | | statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified }) |
| | | statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable }) |
| | | isSubmit.value = produceFrom.qualified + produceFrom.undesirable <= info.value.planNum; |
| | | } |
| | | if (!from.processPlan) return Toast('计划不能为空') |
| | | if (!from.deviceId) return Toast('设备不能为空') |
| | | if (!from.userId) return Toast('生产人员不能为空') |
| | | if (hasBom.value == 1 && bomType.value == 1) { |
| | | console.log('不需要投料') |
| | | } else { |
| | | console.log('推式') |
| | | if (feedingData.value.length === 0) { |
| | | Toast.fail({ message: '投料明细不能为空' }) |
| | | return |
| | | } |
| | | statisticsData.value = [] |
| | | if (info.value.hasBom === 0) { |
| | | console.log('无bom') |
| | | // let data: any = [ |
| | | // { name: '工单投料', gznum: feedingData.value.length, wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 }, |
| | | // { name: '工单合格产出', gznum: produceData.value.length, wlmc: produceData.value.length > 0 ? produceData.value[0].name : '', wlnum: 0 }, |
| | | // { name: '工单不良产出', gznum: 0, wlmc: '', wlnum: 0 }, |
| | | // { name: '工单未投料', gznum: '', wlmc: feedingData.value.length > 0 ? feedingData.value[0].name : '', wlnum: 0 } |
| | | // ] |
| | | // if (undesirable.value.length > 0) { // 判断有没有不良 |
| | | // data[2].wlmc = undesirable.value[0].name |
| | | // data[2].gznum = data[2].gznum + undesirable.value.length |
| | | // } |
| | | // if (scrap.value.length > 0) { // 判断有没有不良 |
| | | // data[2].wlmc = scrap.value[0].name |
| | | // data[2].gznum = data[2].gznum + scrap.value.length |
| | | // } |
| | | // let tl = 0 |
| | | // let cc = 0 |
| | | // let bl = 0 |
| | | // undesirable.value.forEach((item: any) => { // 不良 |
| | | // bl = bl + item.num |
| | | // }) |
| | | // scrap.value.forEach((item: any) => { // 报废 |
| | | // bl = bl + item.num |
| | | // }) |
| | | // if (produceData.value.length > 0) { // 判断有没有合格产出 |
| | | // produceData.value.forEach((item: any) => { // 产出 |
| | | // cc = cc + item.num |
| | | // }) |
| | | // } |
| | | // feedingData.value.forEach((item: any) => { // 投料 |
| | | // tl = tl + item.num |
| | | // }) |
| | | // data[0].wlnum = tl.toString() + info.value.umodel.name |
| | | // if (produceData.value.length > 0) { |
| | | // data[1].wlnum = cc.toString() + info.value.umodel.name |
| | | // } |
| | | // data[2].wlnum = bl.toString() + info.value.umodel.name |
| | | // if (Number(tl) <= info.value.planNum) { |
| | | // let total: number = Number(tl) - Number(cc) - Number(bl) // 是否有余 |
| | | // data[data.length - 1].wlnum = (Number(tl) - Number(cc) - Number(bl)).toString() + info.value.umodel.name |
| | | // if (total === 0) { |
| | | // isSubmit.value = true |
| | | // } else { |
| | | // isSubmit.value = false |
| | | // } |
| | | // } else { |
| | | // isSubmit.value = false |
| | | // } |
| | | // statisticsData.value = data |
| | | let arr: any = [] |
| | | let tl = 0 |
| | | let res = getGroupNum(feedingData.value) |
| | | for (let i in res) { |
| | | let num = 0 |
| | | res[i].forEach((item: any) => { |
| | | num += item.num |
| | | }) |
| | | arr.push({ name: '工单投料', materialName: i + '-' + res[i][0].procedureName, num: num }) |
| | | } |
| | | feedingData.value.forEach((item:any) => { |
| | | tl += item.num |
| | | }) |
| | | statisticsData.value = [...statisticsData.value, ...arr] |
| | | statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified }) |
| | | statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable }) |
| | | if (Number(tl) <= info.value.planNum) { |
| | | let total: number = Number(tl) - Number(produceFrom.qualified) - Number(produceFrom.undesirable) // 是否有余 |
| | | statisticsData.value.push({ name: '工单未投料', materialName: '', num: (Number(tl) - Number(produceFrom.qualified) - Number(produceFrom.undesirable)).toFixed(2) }) |
| | | if (total === 0) { |
| | | isSubmit.value = true |
| | | } else { |
| | | isSubmit.value = false |
| | | } |
| | | } else { |
| | | isSubmit.value = false |
| | | } |
| | | } else if (info.value.hasBom === 1) { // 有bom情况 |
| | | console.log('有bom') |
| | | let arr: any = [] |
| | | let tl = 0 |
| | | let res = getGroupNum(feedingData.value) |
| | | for (let i in res) { |
| | | let num = 0 |
| | | res[i].forEach((item: any) => { |
| | | num += item.num |
| | | }) |
| | | arr.push({ name: '工单投料', materialName: i, num: num }) |
| | | } |
| | | feedingData.value.forEach((item:any) => { |
| | | tl += item.num |
| | | }) |
| | | statisticsData.value = [...statisticsData.value, ...arr] |
| | | statisticsData.value.push({ name: '工单合格产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.qualified }) |
| | | statisticsData.value.push({ name: '工单不良产出', materialName: info.value.mmodel.name + '-' + info.value.procedureName, num: produceFrom.undesirable }) |
| | | // isSubmit.value = produceFrom.qualified + produceFrom.undesirable <= info.value.planNum; |
| | | isSubmit.value = true |
| | | } |
| | | if (!wuList.value.length === 0) return Toast('投料不能为空') |
| | | } |
| | | statistics.value = true |
| | | } |
| | | |
| | | // 根据某个字段进行分组 |
| | | const getGroupNum = (arr: any) => { |
| | | let newArry: any = {}; |
| | | for (let i = 0; i < arr.length; i++) { |
| | | if (newArry[arr[i].materialName]) { |
| | | newArry[arr[i].materialName].push(arr[i]) |
| | | } else { |
| | | newArry[arr[i].materialName] = [arr[i]] |
| | | } |
| | | if (!from.qualified && !from.undesirable) { |
| | | return Toast('良品数与不良数不能同时为空') |
| | | } |
| | | return newArry; |
| | | } |
| | | |
| | | // 返回修改 |
| | | const gofh = () => { |
| | | statistics.value = false |
| | | } |
| | | |
| | | // 确认报工 |
| | | const submitBG = () => { |
| | | comfirmDoneStandard({ |
| | | id: route.query.id |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | Toast.success({ message: '报工成功', forbidClick: true, duration: 2000 }) |
| | | setTimeout(() => { |
| | | router.go(-2) |
| | | }, 2000) |
| | | // if (!from.qualified) return Toast('良品数不能为空') |
| | | // 有不良数 |
| | | if (from.undesirable > 0) { |
| | | if (from.defective.length === 0) return Toast('不良项不能为空') |
| | | } |
| | | // if (!from.duration) return Toast('报工时长不能为空') |
| | | let type = '' |
| | | arrType.value.forEach((item: any) => { |
| | | if (item.active) { |
| | | type = item.id |
| | | } |
| | | }) |
| | | autoWorkReport({ |
| | | createWorkorderRecordDTO: { |
| | | type, |
| | | duration: from.duration, |
| | | qualifiedNum: from.qualified ? from.qualified : 0, |
| | | unQualifiedNum: from.undesirable ? from.undesirable : 0 |
| | | }, |
| | | plansId: from.processPlan.id, |
| | | proGroupId: deviceId.value, |
| | | proUserList: [from.userId], |
| | | recordList: wuList.value.map((item: any) => { |
| | | return { |
| | | wstockId: item.id, |
| | | num: item.num |
| | | } |
| | | }), |
| | | createUnqualifiedDTOList: from.defective.map((item: any) => { |
| | | return { |
| | | categoryId: item.id, |
| | | unQualifiedNum: item.num |
| | | } |
| | | }) |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | Toast.success({message: '报工成功!'}) |
| | | setTimeout(() => { |
| | | router.go(-1) |
| | | }, 2000); |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // 预计工资 |
| | | const expectedSalary = computed(() => { |
| | | if (arrType.value.length === 0) return 0; |
| | | if (arrType.value[from.index].type == 0) { |
| | | if (!from.qualified) return 0 |
| | | if (arrType.value[from.index].unqualified == 1) { // 是否计入不良品 |
| | | let total = Number(from.qualified) + Number(from.undesirable) |
| | | return (total * (arrType.value[from.index].salary / 10 / 10)).toFixed(2) |
| | | } else { |
| | | return (Number(from.qualified) * (arrType.value[from.index].salary / 10 / 10)).toFixed(2) |
| | | } |
| | | } else { |
| | | if (!from.duration) return 0; |
| | | let h = (from.duration / 60 / 60).toFixed(2) |
| | | return (Number(h) * (arrType.value[from.index].salary / 10 / 10)).toFixed(2) |
| | | } |
| | | // if (!infoBox.value) return 0; |
| | | // 按件计算 |
| | | // if (infoBox.value.type == 0) { |
| | | // if (!from.qualified) return 0 |
| | | // if (infoBox.value.unqualified == 1) { // 是否计入不良品 |
| | | // let total = Number(from.qualified) + Number(from.undesirable) |
| | | // return (total * (infoBox.value.salary / 10 / 10)).toFixed(2) |
| | | // } else { |
| | | // return (Number(from.qualified) * (infoBox.value.salary / 10 / 10)).toFixed(2) |
| | | // } |
| | | // } else { |
| | | // if (!from.duration) return 0; |
| | | // let h = (from.duration / 60 / 60).toFixed(2) |
| | | // return (Number(h) * (infoBox.value.salary / 10 / 10)).toFixed(2) |
| | | // } |
| | | }) |
| | | |
| | | // 达标率 |
| | | const complianceRate = computed(() => { |
| | | if (arrType.value.length === 0) return 0; |
| | | if (!from.qualified && !from.undesirable) return 0; |
| | | if (!from.duration) return 0; |
| | | if (!arrType.value[from.index].num) return 0; |
| | | // 按件计算 |
| | | // if (infoBox.value.type == 0) { |
| | | if (arrType.value[from.index].unqualified == 1) { // 是否计入不良品 |
| | | let a = ((Number(from.qualified) + Number(from.undesirable)) / (from.duration / 3600)).toFixed(2) |
| | | let b = (arrType.value[from.index].num / (arrType.value[from.index].times / 3600)).toFixed(2) |
| | | console.log(a) |
| | | console.log(b) |
| | | return ((Number(a) / Number(b)) * 100).toFixed(2) |
| | | // let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / ) |
| | | // return total * infoBox.value.salary; |
| | | } else { |
| | | let a = (from.qualified / (from.duration / 3600)).toFixed(2) |
| | | let b = (arrType.value[from.index].num / (arrType.value[from.index].times / 3600)).toFixed(2) |
| | | console.log(a) |
| | | console.log(b) |
| | | return ((Number(a) / Number(b)) * 100).toFixed(2) |
| | | // return Number(from.qualified) * infoBox.value.salary; |
| | | } |
| | | |
| | | // if (!infoBox.value) return 0; |
| | | // if (!from.qualified && !from.undesirable) return 0; |
| | | // if (!from.duration) return 0; |
| | | // if (!infoBox.value.num) return 0; |
| | | // // 按件计算 |
| | | // // if (infoBox.value.type == 0) { |
| | | // if (infoBox.value.unqualified == 1) { // 是否计入不良品 |
| | | // let a = ((Number(from.qualified) + Number(from.undesirable)) / (from.duration / 3600)).toFixed(2) |
| | | // let b = (infoBox.value.num / (infoBox.value.times / 3600)).toFixed(2) |
| | | // console.log(a) |
| | | // console.log(b) |
| | | // return ((Number(a) / Number(b)) * 100).toFixed(2) |
| | | // // let total = (Number(from.qualified) + Number(from.undesirable)) / ((from.duration * 60 * 60) * infoBox.value.num / ) |
| | | // // return total * infoBox.value.salary; |
| | | // } else { |
| | | // let a = (from.qualified / (from.duration / 3600)).toFixed(2) |
| | | // let b = (infoBox.value.num / (infoBox.value.times / 3600)).toFixed(2) |
| | | // console.log(a) |
| | | // console.log(b) |
| | | // return ((Number(a) / Number(b)) * 100).toFixed(2) |
| | | // // return Number(from.qualified) * infoBox.value.salary; |
| | | // } |
| | | // } else { |
| | | // console.log('按时长') |
| | | // } |
| | | }) |
| | | |
| | | const deleItem = (index: number) => { |
| | | if (wuList.value.length === 1) return Toast('至少保留一项内容') |
| | | wuList.value.splice(index, 1) |
| | | } |
| | | const openDev = () => { |
| | | if (!from.processPlan) return Toast('请先选择工序生产计划') |
| | | deviceShow.value = true |
| | | } |
| | | const openMaterial = () => { |
| | | if (!plansId.value) return Toast('请先选择工序生产计划') |
| | | if (!deviceId.value) return Toast('请先选择生产设备') |
| | | show1.value = true |
| | | } |
| | | const onConfirm1 = (e: any) => { |
| | | from.userId = e.userId |
| | | from.userName = e.name |
| | | userShow.value = false |
| | | } |
| | | 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 onCancel1 = () => { |
| | | userShow.value = false |
| | | } |
| | | const onCancel2 = () => { |
| | | TimeShow.value = false |
| | | } |
| | | const onConfirm = (e: any) => { |
| | | from.deviceId = e.id |
| | | from.deviceName = e.name |
| | | deviceId.value = e.id |
| | | from.userId = '' |
| | | from.userName = '' |
| | | // getFindAll({ |
| | | // deviceId: e.id, |
| | | // planId: from.processPlan.id |
| | | // }).then(res => { |
| | | // if (res.code === 200) { |
| | | // res.data.forEach((item: any) => { |
| | | // item.name = item.umodel.name + '-' + item.tmodel.name |
| | | // }) |
| | | // userList.value = res.data |
| | | // } |
| | | // }) |
| | | deviceShow.value = false |
| | | } |
| | | const onCancel = () => { |
| | | deviceShow.value = false |
| | | } |
| | | |
| | | const selectPlan = () => { |
| | | router.push({ name: 'processPlans' }) |
| | | } |
| | | |
| | | const close = () => { |
| | | show1.value = false |
| | | } |
| | | 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 getValue = (val: any) => { |
| | | let obj = JSON.parse(JSON.stringify(val)) |
| | | obj.total = val.num |
| | | wuList.value.unshift(obj) |
| | | let arr = wuList.value.map((item: any) => item.id) |
| | | ids.value = arr.join(',') |
| | | show1.value = false |
| | | } |
| | | |
| | | onMounted(() => { |
| | | pageDJs() |
| | | queryByIds() |
| | | getOrocessRecords() |
| | | getOrocessRecordCC() |
| | | getData() |
| | | $Bus.on('callback', (res: any)=>{ |
| | | from.processPlan = res |
| | | plansId.value = res.id |
| | | from.deviceId = '' |
| | | from.deviceName = '' |
| | | deviceId.value = '' |
| | | // from.userId = '' |
| | | // from.userName = '' |
| | | total.value = res.num - res.workorderDistributNum |
| | | // 获取设备 |
| | | getDeviceByCondition({ procedureId: res.procedureId }) |
| | | .then(res1 => { |
| | | if (res1.code === 200) { |
| | | if (res1.data && res1.data.length > 0) |
| | | deviceId.value = res1.data[0].id |
| | | from.deviceId = res1.data[0].id |
| | | from.deviceName = res1.data[0].name |
| | | deviceList.value = res1.data |
| | | } |
| | | }) |
| | | // 获取类型 |
| | | getIdPlansExt(res.id) |
| | | .then(res2 => { |
| | | if (res2.code === 200) { |
| | | bomType.value = res2.data.bomType |
| | | hasBom.value = res2.data.hasBom |
| | | } |
| | | }) |
| | | // 获取工资绩效数据 |
| | | queryList({ |
| | | deleted: 0, |
| | | departId: res.factoryId, |
| | | materialId: res.materialId, |
| | | procedureId: res.procedureId |
| | | }).then(result => { |
| | | if (result.code === 200) { |
| | | if (result.data && result.data.length > 0) { |
| | | result.data.forEach((item: any, index: number) => { |
| | | item.name = item.type == 0 ? '计件' : '计时' |
| | | item.id = item.type |
| | | item.active = index == 0 |
| | | }) |
| | | arrType.value = result.data |
| | | } else { |
| | | arrType.value = [] |
| | | } |
| | | // infoBox.value = result.data |
| | | } |
| | | }) |
| | | }) |
| | | }) |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .bg { |
| | | width: 100%; |
| | | /*height: 100%;*/ |
| | | position: absolute; |
| | | background: #F7F7F7; |
| | | .details_cz { |
| | | .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; |
| | | .details_cz_sdtl { |
| | | width: 330px; |
| | | height: 76px; |
| | | background: #FFFFFF; |
| | | border-radius: 36px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | img { |
| | | width: 28px; |
| | | height: 28px; |
| | | margin-right: 14px; |
| | | } |
| | | span { |
| | | font-size: 26px; |
| | | font-weight: 400; |
| | | color: #222222; |
| | | span { |
| | | font-size: 30px; |
| | | font-family: PingFangSC-Regular, PingFang SC; |
| | | font-weight: 400; |
| | | color: #222222; |
| | | b { |
| | | color: red; |
| | | } |
| | | } |
| | | .details_cz_smtl { |
| | | /*width: 330px;*/ |
| | | flex: 1; |
| | | height: 76px; |
| | | background: $nav-color; |
| | | border-radius: 36px; |
| | | .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; |
| | | justify-content: center; |
| | | img { |
| | | width: 28px; |
| | | height: 28px; |
| | | margin-right: 14px; |
| | | } |
| | | span { |
| | | font-size: 26px; |
| | | font-size: 28px; |
| | | font-family: PingFangSC-Regular, PingFang SC; |
| | | font-weight: 400; |
| | | color: #ffffff; |
| | | color: #999999; |
| | | } |
| | | img { |
| | | width: 12px; |
| | | height: 24px; |
| | | margin-left: 20px; |
| | | } |
| | | } |
| | | } |
| | |
| | | width: 100%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | margin-top: 30px; |
| | | .bottomval { |
| | | margin-bottom: 20px !important; |
| | | } |
| | | .bg_list_item { |
| | | display: flex; |
| | | flex-direction: column; |
| | |
| | | } |
| | | } |
| | | } |
| | | .bg_list_item_num { |
| | | .top { |
| | | margin-top: 20px !important; |
| | | } |
| | | .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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .details_dj { |
| | | display: flex; |
| | | flex-direction: column; |
| | | .details_dj_title { |
| | | width: 100%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | padding: 0 30px 30px 30px; |
| | | box-sizing: border-box; |
| | | .details_dj_title_left { |
| | | display: flex; |
| | | align-items: center; |
| | | .details_x { |
| | | width: 8px; |
| | | height: 30px; |
| | | background: $nav-color; |
| | | border-radius: 2px; |
| | | margin-right: 12px; |
| | | } |
| | | span { |
| | | font-size: 32px; |
| | | font-weight: 500; |
| | | color: #222222; |
| | | } |
| | | } |
| | | .details_dj_title_right { |
| | | display: flex; |
| | | align-items: center; |
| | | img { |
| | | width: 28px; |
| | | height: 28px; |
| | | margin-right: 12px; |
| | | } |
| | | span { |
| | | font-size: 28px; |
| | | font-weight: 400; |
| | | color: $nav-color; |
| | | } |
| | | } |
| | | } |
| | | .details_dj_list { |
| | | width: 100%; |
| | | /*padding: 30px;*/ |
| | | box-sizing: border-box; |
| | | background: #ffffff; |
| | | display: flex; |
| | | flex-direction: column; |
| | | .details_dj_list_item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | border-bottom: 1px solid #E5E5E5; |
| | | padding: 30px; |
| | | /*margin: 30px;*/ |
| | | /*padding-bottom: 30px;*/ |
| | | /*margin-bottom: 30px !important;*/ |
| | | span { |
| | | &:nth-child(1) { |
| | | font-size: 28px; |
| | | font-weight: 400; |
| | | color: #222222; |
| | | } |
| | | &:nth-child(2) { |
| | | font-size: 24px; |
| | | font-weight: 400; |
| | | color: #999999; |
| | | margin-top: 24px; |
| | | .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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | bottom: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | z-index: 9; |
| | | padding: 0 30px 60px 30px; |
| | | box-sizing: border-box; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | .bg_footer_submit1 { |
| | | width: 334px; |
| | | height: 88px; |
| | | line-height: 88px; |
| | | text-align: center; |
| | | background: #FFFFFF; |
| | | box-shadow: 0px 0px 12px 0px rgba(0,0,0,0.08); |
| | | border-radius: 8px; |
| | | font-size: 30px; |
| | | font-family: PingFangSC-Medium, PingFang SC; |
| | | font-weight: 500; |
| | | color: #305ED5; |
| | | } |
| | | .bg_footer_submit { |
| | | width: 690px; |
| | | width: 334px; |
| | | height: 88px; |
| | | background: $nav-color; |
| | | box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.08); |
| | |
| | | justify-content: center; |
| | | } |
| | | } |
| | | .tg { |
| | | width: 100%; |
| | | height: 100%; |
| | | padding: 30px; |
| | | box-sizing: border-box; |
| | | .tg_header { |
| | | width: 100%; |
| | | height: 45px; |
| | | text-align: center; |
| | | line-height: 45px; |
| | | font-size: 30px; |
| | | font-weight: 500; |
| | | color: #222222; |
| | | } |
| | | .tg_table { |
| | | width: 100%; |
| | | margin-top: 40px; |
| | | .tg_table_header { |
| | | width: 100%; |
| | | height: 72px; |
| | | background: #EFF2FC; |
| | | display: flex; |
| | | align-items: center; |
| | | .tg_table_header_item { |
| | | flex: 1; |
| | | font-size: 26px; |
| | | font-weight: 500; |
| | | color: #333333; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | } |
| | | } |
| | | .nr { |
| | | max-height: 400px; |
| | | overflow-x: scroll; |
| | | .tg_table_nr { |
| | | width: 100%; |
| | | padding: 24px 10px; |
| | | box-sizing: border-box; |
| | | display: flex; |
| | | align-items: center; |
| | | background: white; |
| | | box-shadow: inset 0px -2px 0px 0px #E5E5E5; |
| | | .tg_table_nr_item { |
| | | flex: 1; |
| | | font-size: 26px; |
| | | font-weight: 500; |
| | | color: #333333; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | .tg_table_nr_item1 { |
| | | flex: 1; |
| | | font-size: 26px; |
| | | font-weight: 500; |
| | | color: #333333; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .tg_footer { |
| | | width: calc(100% - 60px); |
| | | position: fixed; |
| | | bottom: 0; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | box-sizing: border-box; |
| | | padding-bottom: 40px; |
| | | .tg_footer_fh { |
| | | width: 100%; |
| | | height: 88px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background: rgba(66, 117, 252, 0.05); |
| | | border-radius: 8px; |
| | | border: 1PX solid #4275FC; |
| | | font-size: 32px; |
| | | font-weight: 500; |
| | | color: $nav-color; |
| | | } |
| | | .tg_footer_qr { |
| | | width: 100%; |
| | | height: 88px; |
| | | border: none; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background: $nav-color; |
| | | border-radius: 8px; |
| | | font-size: 32px; |
| | | font-weight: 500; |
| | | color: #FFFFFF; |
| | | } |
| | | } |
| | | .bl { |
| | | width: 100%; |
| | | height: 800px; |
| | | padding: 30px; |
| | | box-sizing: border-box; |
| | | display: flex; |
| | | flex-direction: column; |
| | | .bl_head { |
| | | width: 100%; |
| | | height: 50px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | |
| | | 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; |
| | |
| | | input { |
| | | width: 30px; |
| | | height: 30px; |
| | | border: 1PX solid #CCCCCC; |
| | | margin: 0 !important; |
| | | } |
| | | span { |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | } |