| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714 |
- <template>
- <div class="ele-body">
- <el-card shadow="never">
- <div class="page-title">
- <PageHeader title="出库单详情"> </PageHeader>
- </div>
- <div class="stepsStatus">
- <el-steps :active="active" align-center>
- <el-step title="创建"></el-step>
- <el-step title="待审核"></el-step>
- <el-step :title="stepsTitle" :status="stepsStatus"></el-step>
- </el-steps>
- </div>
- <div>
- <div class="content-detail">
- <header-title title="基本信息" size="16px"></header-title>
- <div class="mt20">
- <el-form label-width="120px">
- <el-col :span="8">
- <el-form-item label="出库单号:">
- <span>{{ infoData.bizNo }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="出库物品类型:">
- <span>{{ handleAssetType(extInfo.assetType) }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="出库场景:">
- <span>{{ getSceneState(infoData.bizType) }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="关联订单:">
- <span>{{ extInfo.documentSource }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8" >
- <el-form-item label="客户名称:">
- <span>{{ infoData.clientName }}</span>
- </el-form-item>
- <!-- </el-col>
- <el-col :span="8" v-if="infoData.bizType == 3">
- <el-form-item label="客户联系人:">
- <span>{{ infoData.clientUser }}</span>
- </el-form-item> </el-col><el-col :span="8" v-if="infoData.bizType == 3">
- <el-form-item label="客户电话:">
- <span>{{ infoData.clientPhone }}</span>
- </el-form-item> -->
- </el-col>
- <el-col :span="8">
- <el-form-item :label="infoData.bizType == 4 ? '领料单:' : '来源单据:'">
- <span>{{ infoData.sourceBizNo }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="领料人联系方式:">
- <span>{{ infoData.fromUserPhone }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="出库登记人:">
- <span>{{ extInfo?.createUserName }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="权属部门:">
- <span>{{ extInfo?.deptName }}</span>
- </el-form-item>
- </el-col>
- <!-- <el-col :span="8">
- <el-form-item label="创建时间">
- <span>{{ infoData.createTime }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="出库时间">
- <span>{{ infoData.createTime }}</span>
- </el-form-item>
- </el-col> -->
- <el-col :span="8">
- <el-form-item label="状态:">
- <span>{{ stepsTitle }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="领料人部门:">
- <span>{{ extInfo.verifyDeptName }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="8">
- <el-form-item label="领料人:">
- <span>{{ infoData.fromUser }}</span>
- </el-form-item>
- </el-col>
- <el-col :span="16">
- <el-form-item label="备注:">
- <span>{{ infoData.remark }}</span>
- </el-form-item>
- </el-col>
- </el-form>
- </div>
- </div>
- <div class="content-detail mt20">
- <header-title title="产品信息" size="16px"></header-title>
- <el-table ref="productListTable" :data="productList" border tooltip-effect="dark" :max-height="300"
- :header-cell-style="rowClass">
- <el-table-column label="序号" type="index" width="50">
- </el-table-column>
- <el-table-column label="编码" prop="categoryCode" align="center"
- :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="名称" align="center" prop="categoryName"
- :show-overflow-tooltip="true"></el-table-column>
- <el-table-column v-if="clientEnvironmentId == 4" label="级别" prop="level" align="center">
- </el-table-column>
- <el-table-column label="型号" align="center" prop="categoryModel"
- :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="规格" align="center" prop="specification"
- :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="牌号" align="center" prop="brandNum" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column v-for="(item, index) in newColumns" :label="item.label" :align="item.align"
- :prop="item.prop" :show-overflow-tooltip="item.showOverflowTooltip"></el-table-column>
- <el-table-column label="批次号" prop="batchNo" align="center" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="包装数量" prop="packingQuantity" align="center">
- </el-table-column>
- <el-table-column label="包装单位" align="center" width="120" prop="packingUnit">
- </el-table-column>
- <el-table-column label="计量数量" prop="measureQuantity" width="100" align="center">
- </el-table-column>
- <el-table-column label="计量单位" prop="measureUnit" align="center">
- </el-table-column>
- <el-table-column label="重量" prop="weight" align="center" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="重量单位" prop="weightUnit" align="center" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="单价" prop="price" align="center">
- <template slot-scope="{ row }">
- <template>
- {{ row.price ? row.price : '-' + '元' }}/{{ row.measureUnit }}
- </template>
- </template>
- </el-table-column>
- <el-table-column label="金额" align="center" prop="contentImage" :show-overflow-tooltip="true">
- <template slot-scope="{ row, $index }">
- {{ row.totalMoney ? row.totalMoney : 0 }}
- </template>
- </el-table-column>
- <el-table-column v-if="clientEnvironmentId == 4" label="采购原因" align="center" prop="purpose"
- :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="仓库" prop="warehouseName" :show-overflow-tooltip="true">
- </el-table-column>
- </el-table>
- </div>
- <div class="mt20">
- <header-title :title="`包装明细`" size="16px"></header-title>
- <el-table ref="showPackingListTable" :data="showPackingList" tooltip-effect="dark" :max-height="300" border
- :row-class-name="tableRowClassName" :header-cell-style="rowClass"
- v-el-table-infinite-scroll="pickingHandleScroll">
- <el-table-column label="序号" type="index" width="50">
- </el-table-column>
- <el-table-column label="编码" prop="categoryCode" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="名称" prop="categoryName" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="批次号" prop="batchNo" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="发货条码" prop="barcodes" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="包装编码" prop="packageNo" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="包装数量" prop="packingQuantity" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="包装单位" prop="packingUnit" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="计量数量" prop="measureQuantity" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="计量单位" prop="measureUnit" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="物料代号" prop="materielDesignation" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="客户代号" prop="clientCode" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="刻码" prop="engrave" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="重量" prop="weight" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="重量单位" prop="weightUnit" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="质检结果" prop="result" :show-overflow-tooltip="true">
- <template slot-scope="{ row }">
- <span>{{ qualityResults[row.result] }}</span>
- </template>
- </el-table-column>
- <el-table-column label="质检状态" prop="status" :show-overflow-tooltip="true">
- <template slot-scope="{ row }">
- <span>{{ qualityStatus[row.status] }}</span>
- </template>
- </el-table-column>
- <el-table-column label="生产日期" prop="productionDate" :show-overflow-tooltip="true">
- </el-table-column>
- <el-table-column label="采购日期" prop="purchaseDate" :show-overflow-tooltip="true">
- </el-table-column>
- </el-table>
- </div>
- <div class="mt20">
- <header-title :title="`物料明细`" size="16px"> </header-title>
- <el-table ref="multipleTable" :data="showMaterialList" tooltip-effect="dark" :max-height="300"
- :row-class-name="tableRowClassName" :header-cell-style="rowClass" border style="width: 100%" stripe
- height="300px" v-el-table-infinite-scroll="materielHandleScroll">
- <el-table-column label="序号" type="index" width="50">
- </el-table-column>
- <el-table-column label="编码" prop="categoryCode" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="名称" prop="categoryName" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="批次号" prop="batchNo"></el-table-column>
- <el-table-column label="物料编码" prop="materialCode" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="发货条码" prop="barcodes" :show-overflow-tooltip="true"></el-table-column>
- <el-table-column label="计量数量" prop="measureQuantity"></el-table-column>
- <el-table-column label="计量单位" prop="measureUnit"></el-table-column>
- <el-table-column label="物料代号" prop="materielDesignation">
- </el-table-column>
- <el-table-column label="客户代号" prop="clientCode">
- </el-table-column>
- <el-table-column label="刻码" prop="engrave"> </el-table-column>
- <el-table-column width="100" label="重量" prop="weight">
- </el-table-column>
- <el-table-column label="重量单位" prop="weightUnit">
- </el-table-column>
- <el-table-column label="质检结果" prop="result" width="120">
- <template slot-scope="{ row }">
- <span>{{ qualityResults[row.result] }}</span>
- </template>
- </el-table-column>
- <el-table-column label="质检状态" prop="status" width="120">
- <template slot-scope="{ row }">
- <span>{{ qualityStatus[row.status] }}</span>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </div>
- </el-card>
- </div>
- </template>
- <script>
- import elTableInfiniteScroll from 'el-table-infinite-scroll';
- import { getFile } from '@/api/system/file/index.js';
- import PageHeader from '@/components/PageHeader';
- import storageApi from '@/api/warehouseManagement';
- import { allCategoryLevel } from '@/api/classifyManage';
- import { useDictLabel, outputSceneState, qualityStatus, qualityResults } from '@/utils/dict/index';
- import { mapGetters, mapActions } from 'vuex';
- export default {
- components: { PageHeader },
- directives: {
- 'el-table-infinite-scroll': elTableInfiniteScroll
- },
- data() {
- return {
- newColumns: [], // 动态表头
- // qualityStatus: {
- // 0: '未质检',
- // 1: '已质检'
- // }, // 质检状态 0未检 1已检
- // qualityResults: {
- // 1: '合格',
- // 2: '不合格'
- // }, // 质检结果 1合格 2不合格
- qualityStatus,
- qualityResults,
- productList: [], // 产品列表
- showPackingList: [], // 展示的包装列表
- packingList: [], // 包装列表
- showMaterialList: [], // 展示物料列表
- materialList: [], // 物料列表
- extInfo: {}, // 扩展信息
- pageSize: 20,
- pickingPageNum: 1,
- materielPageNum: 1,
- codeList: [],
- infoData: {},
- stepsTitle: '已完成',
- stepsStatus: 'success',
- active: 0
- };
- },
- watch: {
- 'infoData.verifyStatus': {
- immediate: true,
- handler(val) {
- if (val == 0) {
- this.active = 1;
- this.stepsTitle = '未审核';
- this.stepsStatus = 'wait';
- } else if (val == 1) {
- this.active = 2;
- this.stepsTitle = '审核中';
- this.stepsStatus = 'process';
- } else if (val == 2) {
- this.active = 2;
- this.stepsTitle = '审核通过';
- this.stepsStatus = 'success';
- } else if (val == 3) {
- this.active = 2;
- this.stepsTitle = '驳回';
- this.stepsStatus = 'error';
- }
- }
- },
- packingList: {
- handler(newVal) {
- console.log('包装列表', newVal);
- console.log('当前包装列表加载页数', this.pickingPageNum);
- this.showPackingList = newVal.slice(
- 0,
- this.pageSize * (this.pickingPageNum > 0 ? this.pickingPageNum : 1)
- );
- },
- deep: true
- },
- materialList: {
- handler(newVal) {
- console.log('物料列表', newVal);
- console.log('当前物料列表加载页数', this.materielPageNum);
- this.showMaterialList = newVal.slice(
- 0,
- this.pageSize *
- (this.materielPageNum > 0 ? this.materielPageNum : 1)
- );
- },
- deep: true
- }
- },
- computed: {
- ...mapGetters(['getDictValue']),
- clientEnvironmentId() {
- return this.$store.state.user.info.clientEnvironmentId;
- }
- },
- created() {
- this.getFieldModel();
- this.requestDict('类型用途');
- this.getAllCategoryType();
- this._getInfo();
- },
- methods: {
- // 获取动态表头
- getFieldModel() {
- storageApi.fieldModel({ fieldModel: 't_main_category' }).then((res) => {
- let newRes = res.map((m) => {
- return {
- prop: 'extField.' + m.prop,
- label: m.label,
- align: 'center',
- showOverflowTooltip: true
- };
- });
- this.newColumns = [...newRes];
- });
- },
- pickingHandleScroll() {
- console.log('---------pickingHandleScroll------------');
- if (this.showPackingList.length < this.packingList.length) {
- if (this.packingList.length > this.pageSize) {
- this.pickingPageNum += 1;
- }
- this.pickingFetchData();
- }
- },
- pickingFetchData() {
- const start = (this.pickingPageNum - 1) * this.pageSize;
- const end = start + this.pageSize;
- this.showPackingList = this.showPackingList.concat(
- this.packingList.slice(start, end)
- );
- },
- materielHandleScroll() {
- console.log('---------materielHandleScroll------------');
- if (this.showMaterialList.length < this.materialList.length) {
- if (this.materialList.length > this.pageSize) {
- this.materielPageNum += 1;
- }
- this.materielFetchData();
- }
- },
- materielFetchData() {
- const start = (this.materielPageNum - 1) * this.pageSize;
- const end = start + this.pageSize;
- this.showMaterialList = this.showMaterialList.concat(
- this.materialList.slice(start, end)
- );
- console.log(this.showMaterialList);
- },
- ...mapActions('dict', ['requestDict']),
- getSceneState: useDictLabel(outputSceneState),
- handleAssetType(r) {
- const code = this.codeList.find((item) => item.dictCode == r);
- return code?.dictValue;
- },
- tableRowClassName({ row, rowIndex }) {
- console.log(row);
- if (row.result == 2) {
- return 'warning-row';
- } else {
- return '';
- }
- },
- rowClass({ row, column, rowIndex, columnIndex }) {
- if (rowIndex === 1) {
- return {
- display: 'none',
- background: '#EEEEEE'
- };
- }
- return { background: '#0000' };
- },
- async getAllCategoryType() {
- const { data } = await allCategoryLevel();
- this.codeList = data.map((item) => {
- return { dictCode: item.id, dictValue: item.name };
- });
- },
- getDeptName() {
- if (this.extInfo.createUserId) {
- storageApi.getGroupById(this.extInfo.createUserId).then((res) => {
- this.extInfo.deptName = res?.groupName
- });
- }
- },
- async _getInfo() {
- let res = null;
- if (this.$route.query.id) {
- res = await storageApi.getInboundDetailsById(this.$route.query.id);
- } else {
- res = await storageApi.getInboundDetailsByBizNo(
- this.$route.query.bizNo
- );
- }
- this.infoData = res;
- this.extInfo = res.extInfo;
- this.getDeptName()
- this.productList = res.outInDetailList.map(
- (productItem, productIndex) => {
- return {
- ...productItem,
- outInDetailRecordRequestList:
- productItem.outInDetailRecordRequestList.map((packingItem) => {
- return {
- ...packingItem,
- categoryName: productItem.categoryName,
- categoryCode: productItem.categoryCode,
- materialDetailList: packingItem.materialDetailList.map(
- (materialItem) => {
- return {
- ...materialItem,
- categoryName: productItem.categoryName,
- categoryCode: productItem.categoryCode
- };
- }
- )
- };
- })
- };
- }
- );
- // 获取包装维度数据
- const arr = [];
- for (const key in this.productList) {
- for (const k in this.productList[key].outInDetailRecordRequestList) {
- arr.push({
- ...this.productList[key].outInDetailRecordRequestList[k]
- });
- }
- }
- this.packingList = arr;
- // 获取物料维度数据
- let iArr = [];
- arr.forEach((item) => {
- item.materialDetailList.forEach((ele) => {
- iArr.push({ ...ele });
- });
- });
- this.materialList = iArr;
- console.log(this.packingList);
- console.log(this.materialList);
- this.pickingFetchData();
- this.materielFetchData();
- },
- download(row) {
- if (row.storePath) {
- getFile({ objectName: row.storePath }, row.name);
- }
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- .stepsStatus {
- width: 40%;
- margin: 0 auto;
- }
- .p20 {
- padding: 20px;
- }
- .flex {
- display: flex;
- }
- .title {
- justify-content: space-between;
- border-bottom: 1px solid #ccc;
- padding-bottom: 5px;
- span {
- font-size: 16px;
- }
- .col {
- padding-left: 40px;
- font-size: 14px;
- color: #aaaaaa;
- }
- }
- .degree {
- margin-right: 10px;
- padding: 0px 15px;
- color: #fff;
- font-size: 13px;
- line-height: 23px;
- border-radius: 23px;
- display: flex;
- align-items: center;
- justify-content: space-between;
- span {
- width: 5px;
- height: 5px;
- border-radius: 100%;
- margin-right: 6px;
- background-color: #fff;
- }
- }
- .red {
- background-color: rgb(163, 0, 20);
- }
- .blue {
- background-color: #1989fa;
- }
- .createdInfo {
- justify-content: space-around;
- margin-top: 10px;
- font-size: 14px;
- .col {
- color: #6e6e6e;
- padding-right: 10px;
- }
- }
- .mt40 {
- margin-top: 40px;
- }
- .custSteps {
- margin-top: 20px;
- margin-left: 70px;
- .box {
- width: 158px;
- border: 1px solid #ccc;
- padding: 10px;
- flex-direction: row;
- flex-wrap: wrap;
- // justify-content: space-between;
- font-size: 12px;
- color: #9e9e9e;
- .x {
- width: 20px;
- height: 15px;
- margin-right: 5px;
- }
- .q {
- background-color: #d0e4d5;
- }
- .b {
- background-color: #1989fa;
- }
- .g {
- background-color: #157a2c;
- }
- .r {
- background-color: #a30014;
- }
- .a {
- align-items: center;
- margin-bottom: 10px;
- }
- .mr10 {
- margin-right: 10px;
- }
- .mb0 {
- margin-bottom: 0;
- }
- }
- .stepsInfo {
- // flex: 1;
- width: 483px;
- }
- }
- .mt20 {
- margin-top: 20px;
- }
- .content-detail {
- overflow: hidden;
- }
- .executor {
- font-size: 14px;
- .col {
- color: #6e6e6e;
- padding-right: 10px;
- }
- }
- .result {
- justify-content: space-around;
- }
- .mr20 {
- margin-right: 20px;
- }
- .details {
- font-size: 14px;
- margin-bottom: 10px;
- }
- .customSteps {
- margin-top: 40px;
- font-size: 14px;
- margin-left: 80px;
- .time {
- font-size: 12px;
- color: #6e6e6e;
- margin-right: 20px;
- position: relative;
- &::after {
- content: '';
- width: 1px;
- height: 100%;
- background-color: #157a2c;
- position: absolute;
- right: -26px;
- }
- }
- .flex:last-child {
- .time {
- &::after {
- display: none;
- }
- }
- }
- .round {
- margin-right: 20px;
- width: 10px;
- height: 10px;
- border-radius: 100%;
- background-color: #157a2c;
- position: relative;
- span {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 4px;
- height: 4px;
- background-color: #fff;
- border-radius: 100%;
- transform: translate(-2px, -2px);
- }
- }
- .text {
- .info {
- margin-top: 10px;
- width: 955px;
- background-color: #f0f3f3;
- overflow: hidden;
- padding: 10px;
- margin-bottom: 10px;
- }
- }
- }
- </style>
|