|
@@ -1,1635 +1,1775 @@
|
|
|
-<template>
|
|
|
- <j-modal
|
|
|
- :title="title"
|
|
|
- :width="width"
|
|
|
- :visible="visible"
|
|
|
- :confirmLoading="confirmLoading"
|
|
|
- v-bind:prefixNo="prefixNo"
|
|
|
- fullscreen
|
|
|
- switchHelp
|
|
|
- switchFullscreen
|
|
|
- @cancel="handleCancel"
|
|
|
- :id="prefixNo"
|
|
|
- :style="modalStyle"
|
|
|
- >
|
|
|
- <template slot="footer">
|
|
|
- <a-button key="back" @click="handleCancel">取消</a-button>
|
|
|
- <a-button type="primary" v-if="showOkFlag" :loading="confirmLoading" @click="handleOk">保存(Ctrl+S)</a-button>
|
|
|
- </template>
|
|
|
- <a-spin :spinning="confirmLoading">
|
|
|
- <a-form :form="form">
|
|
|
- <a-tabs default-active-key="1" size="small">
|
|
|
- <a-tab-pane key="1" tab="基本信息" id="materialHeadModal" forceRender>
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="名称"
|
|
|
- data-step="1"
|
|
|
- data-title="名称"
|
|
|
- data-intro="名称必填,可以重复"
|
|
|
- >
|
|
|
- <a-input
|
|
|
- placeholder="请输入名称"
|
|
|
- v-decorator.trim="['name', validatorRules.name]"
|
|
|
- @change="handleNameChange"
|
|
|
- />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="规格"
|
|
|
- data-step="2"
|
|
|
- data-title="规格"
|
|
|
- data-intro="规格不必填,比如:10克"
|
|
|
- >
|
|
|
- <a-input placeholder="请输入规格" v-decorator.trim="['standard', validatorRules.standard]" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="型号"
|
|
|
- data-step="3"
|
|
|
- data-title="型号"
|
|
|
- data-intro="型号是比规格更小的属性,比如:RX-01"
|
|
|
- >
|
|
|
- <a-input placeholder="请输入型号" v-decorator.trim="['model', validatorRules.model]" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="单位"
|
|
|
- data-step="4"
|
|
|
- data-title="单位"
|
|
|
- data-intro="此处支持单个单位和多单位,勾选多单位就可以切换到多单位的下拉框,多单位需要先在【多单位】页面进行录入。
|
|
|
- 比如牛奶有瓶和箱两种单位,12瓶=1箱,这就构成了多单位,多单位中有个换算比例"
|
|
|
- >
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :lg="15" :md="15" :sm="24" style="padding: 0px 0px 0px 12px">
|
|
|
- <a-input
|
|
|
- placeholder="输入单位"
|
|
|
- v-if="!unitChecked"
|
|
|
- v-decorator.trim="['unit', validatorRules.unit]"
|
|
|
- @change="onlyUnitOnChange"
|
|
|
- />
|
|
|
- <a-select
|
|
|
- :value="unitList"
|
|
|
- placeholder="选择多单位"
|
|
|
- v-decorator="['unitId', validatorRules.unitId]"
|
|
|
- @change="manyUnitOnChange"
|
|
|
- showSearch
|
|
|
- optionFilterProp="children"
|
|
|
- v-if="unitChecked"
|
|
|
- :dropdownMatchSelectWidth="false"
|
|
|
- >
|
|
|
- <div slot="dropdownRender" slot-scope="menu">
|
|
|
- <v-nodes :vnodes="menu" />
|
|
|
- <a-divider style="margin: 4px 0" />
|
|
|
- <div
|
|
|
- style="padding: 4px 8px; cursor: pointer"
|
|
|
- @mousedown="(e) => e.preventDefault()"
|
|
|
- @click="addUnit"
|
|
|
- >
|
|
|
- <a-icon type="plus" /> 新增多单位
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <a-select-option v-for="(item, index) in unitList" :key="index" :value="item.id">
|
|
|
- {{ item.name }}
|
|
|
- </a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-col>
|
|
|
- <a-col :lg="9" :md="9" :sm="24" style="padding: 0px; text-align: center">
|
|
|
- <a-checkbox :checked="unitChecked" @change="unitOnChange">多单位</a-checkbox>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="颜色"
|
|
|
- data-step="5"
|
|
|
- data-title="颜色"
|
|
|
- data-intro="请填写商品的颜色,如果是多属性商品可以不填(下面有多属性开关)"
|
|
|
- >
|
|
|
- <a-input placeholder="请输入颜色" v-decorator.trim="['color']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="品牌"
|
|
|
- data-step="6"
|
|
|
- data-title="品牌"
|
|
|
- data-intro="请填写商品的品牌,方便区别不同品牌的商品"
|
|
|
- >
|
|
|
- <a-input placeholder="请输入品牌" v-decorator.trim="['brand']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="助记码"
|
|
|
- data-step="7"
|
|
|
- data-title="助记码"
|
|
|
- data-intro="助记码自动生成,助记码是商品名称的首字母缩写"
|
|
|
- >
|
|
|
- <a-input placeholder="" v-decorator.trim="['mnemonic']" :readOnly="true" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="类别"
|
|
|
- data-step="8"
|
|
|
- data-title="类别"
|
|
|
- data-intro="类别需要在【商品类别】页面进行录入,录入之后在此处进行调用"
|
|
|
- >
|
|
|
- <a-tree-select
|
|
|
- style="width: 100%"
|
|
|
- :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }"
|
|
|
- allow-clear
|
|
|
- :treeData="categoryTree"
|
|
|
- v-decorator="['categoryId']"
|
|
|
- placeholder="请选择类别"
|
|
|
- >
|
|
|
- </a-tree-select>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="基础重量"
|
|
|
- data-step="9"
|
|
|
- data-title="基础重量"
|
|
|
- data-intro="请填写基本单位对应的重量,用于计算按重量分摊费用时单据中各行商品分摊的费用成本"
|
|
|
- >
|
|
|
- <a-input-number style="width: 100%" placeholder="请输入基础重量(kg)" v-decorator.trim="['weight']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="保质期"
|
|
|
- data-step="10"
|
|
|
- data-title="保质期"
|
|
|
- data-intro="保质期指的是商品的保质期(天),主要针对带生产日期的,此类商品一般有批号"
|
|
|
- >
|
|
|
- <a-input-number style="width: 100%" placeholder="请输入保质期(天)" v-decorator.trim="['expiryNum']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="仓位货架"
|
|
|
- data-step="11"
|
|
|
- data-title="仓位货架"
|
|
|
- data-intro="仓位货架指的是仓库中的仓位和货架号,主要适用于仓库较大的场景,方便查找商品的准确位置"
|
|
|
- >
|
|
|
- <a-input style="width: 100%" placeholder="请输入仓位货架" v-decorator.trim="['position']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="制造商"
|
|
|
- data-step="12"
|
|
|
- data-title="制造商"
|
|
|
- data-intro="请填写商品的制造商,一般适用于制造行业"
|
|
|
- >
|
|
|
- <a-input placeholder="请输入制造商" v-decorator.trim="['mfrs']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="序列号"
|
|
|
- data-step="13"
|
|
|
- data-title="序列号"
|
|
|
- data-intro="此处是商品的序列号开关,如果选择了有,则在采购入库单据需要录入该商品的序列号,在销售出库单据需要选择该商品的序列号进行出库"
|
|
|
- >
|
|
|
- <a-tooltip title="如果选择为有,则在采购入库单需要录入该商品的序列号">
|
|
|
- <a-select placeholder="有无序列号" v-decorator="['enableSerialNumber']">
|
|
|
- <a-select-option value="1">有</a-select-option>
|
|
|
- <a-select-option value="0">无</a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-tooltip>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="批号"
|
|
|
- data-step="14"
|
|
|
- data-title="批号"
|
|
|
- data-intro="此处是商品的批号开关,如果选择了有,则在采购入库单据需要录入该商品的批号和有效期,在销售出库单据需要选择该商品的批号进行出库"
|
|
|
- >
|
|
|
- <a-tooltip title="如果选择为有,则在采购入库单需要录入该商品的批号和有效期">
|
|
|
- <a-select placeholder="有无批号" v-decorator="['enableBatchNumber']">
|
|
|
- <a-select-option value="1">有</a-select-option>
|
|
|
- <a-select-option value="0">无</a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-tooltip>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="6" :sm="24" v-if="!model.id">
|
|
|
- <a-form-item
|
|
|
- :labelCol="labelCol"
|
|
|
- :wrapperCol="wrapperCol"
|
|
|
- label="多属性"
|
|
|
- data-step="15"
|
|
|
- data-title="多属性"
|
|
|
- data-intro="多属性是针对的sku商品(比如服装、鞋帽行业),此处开关如果启用就可以在下方进行多sku的配置,配置具体的颜色、尺码之类的组合"
|
|
|
- >
|
|
|
- <a-tooltip title="多属性针对服装、鞋帽等行业,需要先录入单位才能激活此处输入框">
|
|
|
- <a-tag class="tag-info" v-if="!manySkuStatus">需要先录入单位才能激活</a-tag>
|
|
|
- <a-select
|
|
|
- mode="multiple"
|
|
|
- v-decorator="['manySku']"
|
|
|
- showSearch
|
|
|
- optionFilterProp="children"
|
|
|
- placeholder="请选择多属性(可多选)"
|
|
|
- @change="onManySkuChange"
|
|
|
- v-show="manySkuStatus"
|
|
|
- >
|
|
|
- <a-select-option
|
|
|
- v-for="(item, index) in materialAttributeList"
|
|
|
- :key="index"
|
|
|
- :value="item.value"
|
|
|
- :disabled="item.disabled"
|
|
|
- >
|
|
|
- {{ item.name }}
|
|
|
- </a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-tooltip>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :md="12" :sm="24" v-if="manySkuSelected >= 1">
|
|
|
- <a-form-item
|
|
|
- :labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
|
|
|
- :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
- :label="skuOneTitle"
|
|
|
- >
|
|
|
- <a-select
|
|
|
- mode="multiple"
|
|
|
- v-decorator="['skuOne']"
|
|
|
- showSearch
|
|
|
- optionFilterProp="children"
|
|
|
- placeholder="请选择(可多选)"
|
|
|
- @select="onSkuChange"
|
|
|
- @deselect="onSkuOneDeSelect"
|
|
|
- >
|
|
|
- <a-select-option v-for="(item, index) in skuOneList" :key="index" :value="item.value">
|
|
|
- {{ item.name }}
|
|
|
- </a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="12" :sm="24" v-if="manySkuSelected >= 2">
|
|
|
- <a-form-item
|
|
|
- :labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
|
|
|
- :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
- :label="skuTwoTitle"
|
|
|
- >
|
|
|
- <a-select
|
|
|
- mode="multiple"
|
|
|
- v-decorator="['skuTwo']"
|
|
|
- showSearch
|
|
|
- optionFilterProp="children"
|
|
|
- placeholder="请选择(可多选)"
|
|
|
- @select="onSkuChange"
|
|
|
- @deselect="onSkuTwoDeSelect"
|
|
|
- >
|
|
|
- <a-select-option v-for="(item, index) in skuTwoList" :key="index" :value="item.value">
|
|
|
- {{ item.name }}
|
|
|
- </a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :md="12" :sm="24" v-if="manySkuSelected >= 3">
|
|
|
- <a-form-item
|
|
|
- :labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
|
|
|
- :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
- :label="skuThreeTitle"
|
|
|
- >
|
|
|
- <a-select
|
|
|
- mode="multiple"
|
|
|
- v-decorator="['skuThree']"
|
|
|
- showSearch
|
|
|
- optionFilterProp="children"
|
|
|
- placeholder="请选择(可多选)"
|
|
|
- @select="onSkuChange"
|
|
|
- @deselect="onSkuThreeDeSelect"
|
|
|
- >
|
|
|
- <a-select-option v-for="(item, index) in skuThreeList" :key="index" :value="item.value">
|
|
|
- {{ item.name }}
|
|
|
- </a-select-option>
|
|
|
- </a-select>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <div style="margin-top: 8px" id="materialDetailModal">
|
|
|
- <j-editable-table
|
|
|
- ref="editableMeTable"
|
|
|
- :loading="meTable.loading"
|
|
|
- :columns="meTable.columns"
|
|
|
- :dataSource="meTable.dataSource"
|
|
|
- :height="300"
|
|
|
- :minWidth="1000"
|
|
|
- :maxHeight="300"
|
|
|
- :rowNumber="false"
|
|
|
- :rowSelection="true"
|
|
|
- :actionButton="true"
|
|
|
- @valueChange="onValueChange"
|
|
|
- @added="onAdded"
|
|
|
- @deleted="onDeleted"
|
|
|
- >
|
|
|
- <template #buttonAfter>
|
|
|
- <a-button @click="batchSetPrice('purchase')">采购价-批量</a-button>
|
|
|
- <a-button style="margin-left: 8px" @click="batchSetPrice('commodity')">零售价-批量</a-button>
|
|
|
- <a-button style="margin-left: 8px" @click="batchSetPrice('wholesale')">销售价-批量</a-button>
|
|
|
- <a-button style="margin-left: 8px" @click="batchSetPrice('low')">最低售价-批量</a-button>
|
|
|
- </template>
|
|
|
- </j-editable-table>
|
|
|
- <!-- 表单区域 -->
|
|
|
- <batch-set-price-modal ref="priceModalForm" @ok="batchSetPriceModalFormOk"></batch-set-price-modal>
|
|
|
- </div>
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :lg="24" :md="24" :sm="24">
|
|
|
- <a-form-item :labelCol="labelCol" :wrapperCol="{ xs: { span: 24 }, sm: { span: 24 } }" label="">
|
|
|
- <a-textarea :rows="1" placeholder="请输入备注" v-decorator="['remark']" style="margin-top: 8px" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="2" tab="扩展信息" forceRender>
|
|
|
- <a-row v-if="mpShort.otherField1.enabled" class="form-row" :gutter="24">
|
|
|
- <a-col :lg="6" :md="6" :sm="6">
|
|
|
- <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="mpShort.otherField1.name">
|
|
|
- <a-input v-decorator.trim="['otherField1']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row v-if="mpShort.otherField2.enabled" class="form-row" :gutter="24">
|
|
|
- <a-col :lg="6" :md="6" :sm="6">
|
|
|
- <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="mpShort.otherField2.name">
|
|
|
- <a-input v-decorator.trim="['otherField2']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- <a-row v-if="mpShort.otherField3.enabled" class="form-row" :gutter="24">
|
|
|
- <a-col :lg="6" :md="6" :sm="6">
|
|
|
- <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="mpShort.otherField3.name">
|
|
|
- <a-input v-decorator.trim="['otherField3']" />
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- </a-row>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="3" tab="库存数量" forceRender>
|
|
|
- <j-editable-table
|
|
|
- ref="editableDepotTable"
|
|
|
- :loading="depotTable.loading"
|
|
|
- :columns="depotTable.columns"
|
|
|
- :dataSource="depotTable.dataSource"
|
|
|
- :minWidth="1000"
|
|
|
- :maxHeight="300"
|
|
|
- :rowNumber="true"
|
|
|
- :rowSelection="false"
|
|
|
- :actionButton="false"
|
|
|
- >
|
|
|
- <template #buttonAfter>
|
|
|
- <a-button style="margin: 0px 0px 8px 0px" @click="batchSetStock('initStock')">期初库存-批量</a-button>
|
|
|
- <a-button style="margin-left: 8px" @click="batchSetStock('lowSafeStock')">最低安全库存-批量</a-button>
|
|
|
- <a-button style="margin-left: 8px" @click="batchSetStock('highSafeStock')">最高安全库存-批量</a-button>
|
|
|
- </template>
|
|
|
- </j-editable-table>
|
|
|
- <!-- 表单区域 -->
|
|
|
- <batch-set-stock-modal ref="stockModalForm" @ok="batchSetStockModalFormOk"></batch-set-stock-modal>
|
|
|
- </a-tab-pane>
|
|
|
- <a-tab-pane key="4" tab="图片信息" forceRender>
|
|
|
- <a-row class="form-row" :gutter="24" style="padding-top: 20px">
|
|
|
- <a-col :lg="18" :md="18" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="{ xs: { span: 24 }, sm: { span: 3 } }"
|
|
|
- :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
- label="图片信息"
|
|
|
- >
|
|
|
- <j-image-upload v-model="fileList" bizPath="material" text="上传" isMultiple></j-image-upload>
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :lg="6" :md="6" :sm="24"></a-col>
|
|
|
- </a-row>
|
|
|
- <a-row class="form-row" :gutter="24">
|
|
|
- <a-col :lg="18" :md="18" :sm="24">
|
|
|
- <a-form-item
|
|
|
- :labelCol="{ xs: { span: 24 }, sm: { span: 3 } }"
|
|
|
- :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
- label="上传提示"
|
|
|
- >
|
|
|
- 图片最多4张,且单张大小不超过1M
|
|
|
- </a-form-item>
|
|
|
- </a-col>
|
|
|
- <a-col :lg="6" :md="6" :sm="24"></a-col>
|
|
|
- </a-row>
|
|
|
- </a-tab-pane>
|
|
|
- </a-tabs>
|
|
|
- </a-form>
|
|
|
- </a-spin>
|
|
|
- <unit-modal ref="unitModalForm" @ok="unitModalFormOk"></unit-modal>
|
|
|
- </j-modal>
|
|
|
-</template>
|
|
|
-<script>
|
|
|
-import pick from 'lodash.pick'
|
|
|
-import BatchSetPriceModal from './BatchSetPriceModal'
|
|
|
-import BatchSetStockModal from './BatchSetStockModal'
|
|
|
-import UnitModal from '../../system/modules/UnitModal'
|
|
|
-import JEditableTable from '@/components/jeecg/JEditableTable'
|
|
|
-import { FormTypes, getRefPromise, VALIDATE_NO_PASSED, validateFormAndTables } from '@/utils/JEditableTableUtil'
|
|
|
-import {
|
|
|
- checkMaterial,
|
|
|
- checkMaterialBarCode,
|
|
|
- getMaterialAttributeNameList,
|
|
|
- getMaterialAttributeValueListById,
|
|
|
- getMaxBarCode,
|
|
|
- queryMaterialCategoryTreeList,
|
|
|
- changeNameToPinYin,
|
|
|
-} from '@/api/api'
|
|
|
-import { removeByVal, autoJumpNextInput, handleIntroJs } from '@/utils/util'
|
|
|
-import { getAction, httpAction } from '@/api/manage'
|
|
|
-import JImageUpload from '@/components/jeecg/JImageUpload'
|
|
|
-import JDate from '@/components/jeecg/JDate'
|
|
|
-import Vue from 'vue'
|
|
|
-
|
|
|
-export default {
|
|
|
- name: 'MaterialModal',
|
|
|
- components: {
|
|
|
- BatchSetPriceModal,
|
|
|
- BatchSetStockModal,
|
|
|
- UnitModal,
|
|
|
- JImageUpload,
|
|
|
- JDate,
|
|
|
- JEditableTable,
|
|
|
- VNodes: {
|
|
|
- functional: true,
|
|
|
- render: (h, ctx) => ctx.props.vnodes,
|
|
|
- },
|
|
|
- },
|
|
|
- data() {
|
|
|
- return {
|
|
|
- title: '操作',
|
|
|
- width: '1300px',
|
|
|
- visible: false,
|
|
|
- modalStyle: '',
|
|
|
- categoryTree: [],
|
|
|
- unitList: [],
|
|
|
- depotList: [],
|
|
|
- fileList: [],
|
|
|
- unitStatus: false,
|
|
|
- manyUnitStatus: true,
|
|
|
- unitChecked: false,
|
|
|
- manySkuStatus: false,
|
|
|
- switchDisabled: false, //开关的启用状态
|
|
|
- barCodeSwitch: false, //生成条码开关
|
|
|
- maxBarCodeInfo: '', //最大条码
|
|
|
- meDeleteIdList: [], //删除条码信息的id数组
|
|
|
- prefixNo: 'material',
|
|
|
- materialAttributeList: [],
|
|
|
- skuOneTitle: '属性1',
|
|
|
- skuTwoTitle: '属性2',
|
|
|
- skuThreeTitle: '属性3',
|
|
|
- skuOneList: [],
|
|
|
- skuTwoList: [],
|
|
|
- skuThreeList: [],
|
|
|
- manySkuSelected: 0,
|
|
|
- model: {},
|
|
|
- showOkFlag: true,
|
|
|
- setTimeFlag: null,
|
|
|
- labelCol: {
|
|
|
- xs: { span: 24 },
|
|
|
- sm: { span: 8 },
|
|
|
- },
|
|
|
- wrapperCol: {
|
|
|
- xs: { span: 24 },
|
|
|
- sm: { span: 16 },
|
|
|
- },
|
|
|
- mpShort: {
|
|
|
- mfrs: {},
|
|
|
- otherField1: {},
|
|
|
- otherField2: {},
|
|
|
- otherField3: {},
|
|
|
- },
|
|
|
- meTable: {
|
|
|
- loading: false,
|
|
|
- dataSource: [],
|
|
|
- columns: [
|
|
|
- {
|
|
|
- title: '条码',
|
|
|
- key: 'barCode',
|
|
|
- width: '15%',
|
|
|
- type: FormTypes.input,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- validateRules: [
|
|
|
- { required: true, message: '${title}不能为空' },
|
|
|
- { pattern: /^.{4,40}$/, message: '长度为4到40位' },
|
|
|
- { handler: this.validateBarCode },
|
|
|
- ],
|
|
|
- },
|
|
|
- {
|
|
|
- title: '单位',
|
|
|
- key: 'commodityUnit',
|
|
|
- width: '8%',
|
|
|
- type: FormTypes.input,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- validateRules: [{ required: true, message: '${title}不能为空' }],
|
|
|
- },
|
|
|
- {
|
|
|
- title: '多属性',
|
|
|
- key: 'sku',
|
|
|
- width: '25%',
|
|
|
- type: FormTypes.input,
|
|
|
- defaultValue: '',
|
|
|
- readonly: true,
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '采购价',
|
|
|
- key: 'purchaseDecimal',
|
|
|
- width: '9%',
|
|
|
- type: FormTypes.inputNumber,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '零售价',
|
|
|
- key: 'commodityDecimal',
|
|
|
- width: '9%',
|
|
|
- type: FormTypes.inputNumber,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '销售价',
|
|
|
- key: 'wholesaleDecimal',
|
|
|
- width: '9%',
|
|
|
- type: FormTypes.inputNumber,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '最低售价',
|
|
|
- key: 'lowDecimal',
|
|
|
- width: '9%',
|
|
|
- type: FormTypes.inputNumber,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- depotTable: {
|
|
|
- loading: false,
|
|
|
- dataSource: [],
|
|
|
- columns: [
|
|
|
- {
|
|
|
- title: '仓库',
|
|
|
- key: 'name',
|
|
|
- width: '15%',
|
|
|
- type: FormTypes.normal,
|
|
|
- },
|
|
|
- {
|
|
|
- title: '期初库存数量',
|
|
|
- key: 'initStock',
|
|
|
- width: '15%',
|
|
|
- type: FormTypes.inputNumber,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '最低安全库存数量',
|
|
|
- key: 'lowSafeStock',
|
|
|
- width: '15%',
|
|
|
- type: FormTypes.inputNumber,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- {
|
|
|
- title: '最高安全库存数量',
|
|
|
- key: 'highSafeStock',
|
|
|
- width: '15%',
|
|
|
- type: FormTypes.inputNumber,
|
|
|
- defaultValue: '',
|
|
|
- placeholder: '请输入${title}',
|
|
|
- },
|
|
|
- ],
|
|
|
- },
|
|
|
- confirmLoading: false,
|
|
|
- form: this.$form.createForm(this),
|
|
|
- validatorRules: {
|
|
|
- name: {
|
|
|
- rules: [
|
|
|
- { required: true, message: '请输入名称!' },
|
|
|
- { max: 100, message: '长度请小于100个字符', trigger: 'blur' },
|
|
|
- ],
|
|
|
- },
|
|
|
- standard: {
|
|
|
- rules: [{ max: 100, message: '长度请小于100个字符', trigger: 'blur' }],
|
|
|
- },
|
|
|
- model: {
|
|
|
- rules: [{ max: 100, message: '长度请小于100个字符', trigger: 'blur' }],
|
|
|
- },
|
|
|
- unit: {
|
|
|
- rules: [{ required: true, message: '请输入单位!' }],
|
|
|
- },
|
|
|
- unitId: {
|
|
|
- rules: [{ required: true, message: '请选择多单位!' }],
|
|
|
- },
|
|
|
- },
|
|
|
- url: {
|
|
|
- add: '/material/add',
|
|
|
- edit: '/material/update',
|
|
|
- materialsExtendList: '/materialsExtend/getDetailList',
|
|
|
- depotWithStock: '/depot/getAllListWithStock',
|
|
|
- },
|
|
|
- }
|
|
|
- },
|
|
|
- created() {
|
|
|
- this.loadParseMaterialProperty()
|
|
|
- let realScreenWidth = window.screen.width
|
|
|
- this.width = realScreenWidth < 1500 ? '1200px' : '1400px'
|
|
|
- },
|
|
|
- mounted() {
|
|
|
- document.getElementById(this.prefixNo).addEventListener('keydown', this.handleOkKey)
|
|
|
- },
|
|
|
- beforeDestroy() {
|
|
|
- document.getElementById(this.prefixNo).removeEventListener('keydown', this.handleOkKey)
|
|
|
- },
|
|
|
- methods: {
|
|
|
- // 快捷键
|
|
|
- handleOkKey(e) {
|
|
|
- const key = window.event.keyCode ? window.event.keyCode : window.event.which
|
|
|
- if (key === 83 && e.ctrlKey) {
|
|
|
- //保存 CTRL+S
|
|
|
- this.handleOk()
|
|
|
- e.preventDefault()
|
|
|
- }
|
|
|
- },
|
|
|
- // 获取所有的editableTable实例
|
|
|
- getAllTable() {
|
|
|
- return Promise.all([getRefPromise(this, 'editableMeTable'), getRefPromise(this, 'editableDepotTable')])
|
|
|
- },
|
|
|
- add() {
|
|
|
- //隐藏多属性
|
|
|
- this.meTable.columns[2].type = FormTypes.hidden
|
|
|
- // 默认新增一条数据
|
|
|
- this.getAllTable().then((editableTables) => {
|
|
|
- editableTables[0].add()
|
|
|
- })
|
|
|
- this.edit({})
|
|
|
- this.$nextTick(() => {
|
|
|
- handleIntroJs('material', 11)
|
|
|
- })
|
|
|
- },
|
|
|
- edit(record) {
|
|
|
- this.form.resetFields()
|
|
|
- this.model = Object.assign({}, record)
|
|
|
- this.activeKey = '1'
|
|
|
- this.manySkuSelected = 0
|
|
|
- this.barCodeSwitch = false
|
|
|
- this.manySkuStatus = false
|
|
|
- this.maxBarCodeInfo = ''
|
|
|
- this.visible = true
|
|
|
- this.meDeleteIdList = []
|
|
|
- this.modalStyle = 'top:20px;height: 95%;'
|
|
|
- if (JSON.stringify(record) === '{}') {
|
|
|
- this.fileList = []
|
|
|
- } else {
|
|
|
- setTimeout(() => {
|
|
|
- this.fileList = record.imgName
|
|
|
- }, 5)
|
|
|
- }
|
|
|
- this.$nextTick(() => {
|
|
|
- this.form.setFieldsValue(
|
|
|
- pick(
|
|
|
- this.model,
|
|
|
- 'name',
|
|
|
- 'standard',
|
|
|
- 'unit',
|
|
|
- 'unitId',
|
|
|
- 'model',
|
|
|
- 'color',
|
|
|
- 'brand',
|
|
|
- 'mnemonic',
|
|
|
- 'categoryId',
|
|
|
- 'enableSerialNumber',
|
|
|
- 'enableBatchNumber',
|
|
|
- 'position',
|
|
|
- 'expiryNum',
|
|
|
- 'weight',
|
|
|
- 'remark',
|
|
|
- 'mfrs',
|
|
|
- 'otherField1',
|
|
|
- 'otherField2',
|
|
|
- 'otherField3'
|
|
|
- )
|
|
|
- )
|
|
|
- autoJumpNextInput('materialHeadModal')
|
|
|
- autoJumpNextInput('materialDetailModal')
|
|
|
- })
|
|
|
- this.initMaterialAttribute()
|
|
|
- this.loadTreeData()
|
|
|
- this.loadUnitListData()
|
|
|
- // 加载子表数据
|
|
|
- if (this.model.id) {
|
|
|
- //禁用多属性开关
|
|
|
- this.switchDisabled = true
|
|
|
- // 判断是否是多单位
|
|
|
- if (this.model.unit) {
|
|
|
- this.unitChecked = false
|
|
|
- this.unitStatus = false
|
|
|
- this.manyUnitStatus = true
|
|
|
- } else {
|
|
|
- this.unitChecked = true
|
|
|
- this.unitStatus = true
|
|
|
- this.manyUnitStatus = false
|
|
|
- }
|
|
|
- let params = { materialId: this.model.id }
|
|
|
- //编辑商品的时候多属性字段可以修改
|
|
|
- this.meTable.columns[2].readonly = false
|
|
|
- this.requestMeTableData(this.url.materialsExtendList, params, this.meTable)
|
|
|
- this.requestDepotTableData(this.url.depotWithStock, { mId: this.model.id }, this.depotTable)
|
|
|
- } else {
|
|
|
- this.switchDisabled = false
|
|
|
- this.meTable.columns[2].readonly = true
|
|
|
- this.requestDepotTableData(this.url.depotWithStock, { mId: 0 }, this.depotTable)
|
|
|
- }
|
|
|
- },
|
|
|
- /** 查询条码tab的数据 */
|
|
|
- requestMeTableData(url, params, tab) {
|
|
|
- tab.loading = true
|
|
|
- getAction(url, params)
|
|
|
- .then((res) => {
|
|
|
- for (let i = 0; i < res.data.rows.length; i++) {
|
|
|
- if (res.data.rows[i].sku) {
|
|
|
- this.meTable.columns[2].type = FormTypes.input
|
|
|
- } else {
|
|
|
- this.meTable.columns[2].type = FormTypes.hidden
|
|
|
- }
|
|
|
- }
|
|
|
- tab.dataSource = res.data.rows || []
|
|
|
- })
|
|
|
- .finally(() => {
|
|
|
- tab.loading = false
|
|
|
- })
|
|
|
- },
|
|
|
- /** 查询仓库tab的数据 */
|
|
|
- requestDepotTableData(url, params, tab) {
|
|
|
- tab.loading = true
|
|
|
- getAction(url, params)
|
|
|
- .then((res) => {
|
|
|
- tab.dataSource = res.data || []
|
|
|
- })
|
|
|
- .finally(() => {
|
|
|
- tab.loading = false
|
|
|
- })
|
|
|
- },
|
|
|
- close() {
|
|
|
- this.$emit('close')
|
|
|
- this.visible = false
|
|
|
- this.modalStyle = ''
|
|
|
- this.unitStatus = false
|
|
|
- this.manyUnitStatus = true
|
|
|
- this.unitChecked = false
|
|
|
- this.getAllTable().then((editableTables) => {
|
|
|
- editableTables[0].initialize()
|
|
|
- editableTables[1].initialize()
|
|
|
- })
|
|
|
- },
|
|
|
- handleOk() {
|
|
|
- this.validateFields()
|
|
|
- },
|
|
|
- handleCancel() {
|
|
|
- this.close()
|
|
|
- },
|
|
|
- /** 触发表单验证 */
|
|
|
- validateFields() {
|
|
|
- this.getAllTable()
|
|
|
- .then((tables) => {
|
|
|
- /** 一次性验证主表和所有的次表 */
|
|
|
- return validateFormAndTables(this.form, tables)
|
|
|
- })
|
|
|
- .then((allValues) => {
|
|
|
- let formData = this.classifyIntoFormData(allValues)
|
|
|
- formData.sortList = []
|
|
|
- if (formData.unit === undefined) {
|
|
|
- formData.unit = ''
|
|
|
- }
|
|
|
- if (formData.unitId === undefined) {
|
|
|
- formData.unitId = ''
|
|
|
- }
|
|
|
- if (this.unitChecked) {
|
|
|
- formData.unit = ''
|
|
|
- } else {
|
|
|
- formData.unitId = ''
|
|
|
- }
|
|
|
- // 发起请求
|
|
|
- return this.requestAddOrEdit(formData)
|
|
|
- })
|
|
|
- .catch((e) => {
|
|
|
- if (e.error === VALIDATE_NO_PASSED) {
|
|
|
- // 如果有未通过表单验证的子表,就自动跳转到它所在的tab
|
|
|
- this.activeKey = e.index == null ? this.activeKey : (e.index + 1).toString()
|
|
|
- } else {
|
|
|
- console.error(e)
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- /** 整理成formData */
|
|
|
- classifyIntoFormData(allValues) {
|
|
|
- let materialMain = Object.assign(this.model, allValues.formValue)
|
|
|
- return {
|
|
|
- ...materialMain, // 展开
|
|
|
- meList: allValues.tablesValue[0].values,
|
|
|
- stock: allValues.tablesValue[1].values,
|
|
|
- }
|
|
|
- },
|
|
|
- /** 发起新增或修改的请求 */
|
|
|
- requestAddOrEdit(formData) {
|
|
|
- if (formData.meList.length === 0) {
|
|
|
- this.$message.warning('抱歉,请输入条码信息!')
|
|
|
- return
|
|
|
- }
|
|
|
- if (formData.enableSerialNumber === '1' && formData.enableBatchNumber === '1') {
|
|
|
- this.$message.warning('抱歉,序列号和批号只能选择一项!')
|
|
|
- return
|
|
|
- }
|
|
|
- //校验商品是否存在,通过校验商品的名称、型号、规格、颜色、单位、制造商等
|
|
|
- let param = {
|
|
|
- id: this.model.id ? this.model.id : 0,
|
|
|
- name: this.model.name,
|
|
|
- model: this.parseParam(this.model.model),
|
|
|
- color: this.parseParam(this.model.color),
|
|
|
- standard: this.parseParam(this.model.standard),
|
|
|
- mfrs: this.parseParam(this.model.mfrs),
|
|
|
- otherField1: this.parseParam(this.model.otherField1),
|
|
|
- otherField2: this.parseParam(this.model.otherField2),
|
|
|
- otherField3: this.parseParam(this.model.otherField3),
|
|
|
- unit: this.parseParam(this.model.unit),
|
|
|
- unitId: this.parseParam(this.model.unitId),
|
|
|
- }
|
|
|
- checkMaterial(param).then((res) => {
|
|
|
- if (res && res.code === 200) {
|
|
|
- if (res.data.status) {
|
|
|
- this.$message.warning('抱歉,该商品已存在!')
|
|
|
- return
|
|
|
- } else {
|
|
|
- //进一步校验单位
|
|
|
- let basicUnit = '',
|
|
|
- otherUnit = '',
|
|
|
- otherUnitTwo = '',
|
|
|
- otherUnitThree = ''
|
|
|
- if (formData.unitId) {
|
|
|
- let unitArr = this.unitList
|
|
|
- for (let i = 0; i < unitArr.length; i++) {
|
|
|
- if (unitArr[i].id == formData.unitId) {
|
|
|
- basicUnit = unitArr[i].basicUnit
|
|
|
- otherUnit = unitArr[i].otherUnit
|
|
|
- if (unitArr[i].otherUnitTwo) {
|
|
|
- otherUnitTwo = unitArr[i].otherUnitTwo
|
|
|
- }
|
|
|
- if (unitArr[i].otherUnitThree) {
|
|
|
- otherUnitThree = unitArr[i].otherUnitThree
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (!formData.unit) {
|
|
|
- //此时为多单位
|
|
|
- if (formData.meList.length < 2) {
|
|
|
- this.$message.warning('多单位的商品条码行数至少要有两行,请再新增一行条码信息!')
|
|
|
- return
|
|
|
- }
|
|
|
- if (formData.meList[0].commodityUnit != basicUnit) {
|
|
|
- this.$message.warning(
|
|
|
- '条码之后的单位填写有误,单位【' +
|
|
|
- formData.meList[0].commodityUnit +
|
|
|
- '】请修改为【' +
|
|
|
- basicUnit +
|
|
|
- '】!'
|
|
|
- )
|
|
|
- return
|
|
|
- }
|
|
|
- if (formData.meList[1].commodityUnit != otherUnit) {
|
|
|
- this.$message.warning(
|
|
|
- '条码之后的单位填写有误,单位【' +
|
|
|
- formData.meList[1].commodityUnit +
|
|
|
- '】请修改为【' +
|
|
|
- otherUnit +
|
|
|
- '】!'
|
|
|
- )
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- let skuCount = 0
|
|
|
- for (let i = 0; i < formData.meList.length; i++) {
|
|
|
- let commodityUnit = formData.meList[i].commodityUnit
|
|
|
- if (formData.unit) {
|
|
|
- if (commodityUnit != formData.unit) {
|
|
|
- this.$message.warning(
|
|
|
- '条码之后的单位填写有误,单位【' + commodityUnit + '】请修改为【' + formData.unit + '】!'
|
|
|
- )
|
|
|
- return
|
|
|
- }
|
|
|
- } else if (formData.unitId) {
|
|
|
- if (
|
|
|
- commodityUnit != basicUnit &&
|
|
|
- commodityUnit != otherUnit &&
|
|
|
- commodityUnit != otherUnitTwo &&
|
|
|
- commodityUnit != otherUnitThree
|
|
|
- ) {
|
|
|
- let warnInfo =
|
|
|
- '条码之后的单位填写有误,单位【' +
|
|
|
- commodityUnit +
|
|
|
- '】请修改为【' +
|
|
|
- basicUnit +
|
|
|
- '】或【' +
|
|
|
- otherUnit +
|
|
|
- '】'
|
|
|
- if (otherUnitTwo) {
|
|
|
- warnInfo += '或【' + otherUnitTwo + '】'
|
|
|
- }
|
|
|
- if (otherUnitThree) {
|
|
|
- warnInfo += '或【' + otherUnitThree + '】'
|
|
|
- }
|
|
|
- warnInfo += '!'
|
|
|
- this.$message.warning(warnInfo)
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- if (formData.sku) {
|
|
|
- skuCount++
|
|
|
- }
|
|
|
- }
|
|
|
- //对最低和最高安全库存进行校验
|
|
|
- for (let i = 0; i < formData.stock.length; i++) {
|
|
|
- let depotStockObj = formData.stock[i]
|
|
|
- if (skuCount && depotStockObj.initStock && depotStockObj.initStock - 0) {
|
|
|
- this.$message.warning('抱歉,多属性商品不能录入期初库存,建议进行盘点录入!')
|
|
|
- return
|
|
|
- }
|
|
|
- if (formData.enableSerialNumber === '1' && depotStockObj.initStock && depotStockObj.initStock - 0) {
|
|
|
- this.$message.warning('抱歉,序列号商品不能录入期初库存,建议进行入库单据录入!')
|
|
|
- return
|
|
|
- }
|
|
|
- if (formData.enableBatchNumber === '1' && depotStockObj.initStock && depotStockObj.initStock - 0) {
|
|
|
- this.$message.warning('抱歉,批号商品不能录入期初库存,建议进行入库单据录入!')
|
|
|
- return
|
|
|
- }
|
|
|
- if (depotStockObj.lowSafeStock && depotStockObj.highSafeStock) {
|
|
|
- if (depotStockObj.lowSafeStock - 0 > depotStockObj.highSafeStock - 0) {
|
|
|
- this.$message.warning('抱歉,' + depotStockObj.name + '的最低安全库存大于最高安全库存!')
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //图片校验
|
|
|
- if (this.fileList && this.fileList.length > 0) {
|
|
|
- formData.imgName = this.fileList
|
|
|
- let fileArr = this.fileList.split(',')
|
|
|
- if (fileArr.length > 4) {
|
|
|
- this.$message.warning('抱歉,商品图片不能超过4张!')
|
|
|
- return
|
|
|
- }
|
|
|
- } else {
|
|
|
- formData.imgName = ''
|
|
|
- }
|
|
|
- formData.meDeleteIdList = this.meDeleteIdList
|
|
|
- //接口调用
|
|
|
- let url = this.url.add,
|
|
|
- method = 'post'
|
|
|
- if (this.model.id) {
|
|
|
- url = this.url.edit
|
|
|
- method = 'put'
|
|
|
- }
|
|
|
- const that = this
|
|
|
- this.confirmLoading = true
|
|
|
- httpAction(url, formData, method)
|
|
|
- .then((res) => {
|
|
|
- if (res.code === 200) {
|
|
|
- that.$emit('ok')
|
|
|
- that.confirmLoading = false
|
|
|
- that.close()
|
|
|
- } else {
|
|
|
- that.$message.warning(res.data.message)
|
|
|
- that.confirmLoading = false
|
|
|
- }
|
|
|
- })
|
|
|
- .finally(() => {})
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- parseParam(param) {
|
|
|
- return param ? param : ''
|
|
|
- },
|
|
|
- validateBarCode(type, value, row, column, callback, target) {
|
|
|
- let params = {
|
|
|
- barCode: value,
|
|
|
- id: row.id.length >= 20 ? 0 : row.id,
|
|
|
- }
|
|
|
- checkMaterialBarCode(params).then((res) => {
|
|
|
- if (res && res.code === 200) {
|
|
|
- if (!res.data.status) {
|
|
|
- callback(true)
|
|
|
- } else {
|
|
|
- callback(false, '该条码已经存在')
|
|
|
- }
|
|
|
- } else {
|
|
|
- callback(false, res.data)
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- loadTreeData() {
|
|
|
- let that = this
|
|
|
- let params = {}
|
|
|
- params.id = ''
|
|
|
- queryMaterialCategoryTreeList(params).then((res) => {
|
|
|
- if (res) {
|
|
|
- that.categoryTree = []
|
|
|
- for (let i = 0; i < res.length; i++) {
|
|
|
- let temp = res[i]
|
|
|
- that.categoryTree.push(temp)
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- loadUnitListData() {
|
|
|
- let that = this
|
|
|
- let params = {}
|
|
|
- params.currentPage = 1
|
|
|
- params.pageSize = 100
|
|
|
- getAction('/unit/getAllList', params).then((res) => {
|
|
|
- if (res) {
|
|
|
- that.unitList = res.data
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- onManySkuChange(value) {
|
|
|
- this.manySkuSelected = value.length
|
|
|
- //控制多属性下拉框中选择项的状态
|
|
|
- if (value.length < 3) {
|
|
|
- this.materialAttributeList.forEach((item, index, array) => {
|
|
|
- array.indexOf(item.value) === -1 ? Vue.set(array[index], 'disabled', false) : ''
|
|
|
- })
|
|
|
- } else {
|
|
|
- this.materialAttributeList.forEach((item, index, array) => {
|
|
|
- value.indexOf(item.value) === -1 ? Vue.set(array[index], 'disabled', true) : ''
|
|
|
- })
|
|
|
- }
|
|
|
- //更新属性1和属性2和属性3的下拉框
|
|
|
- if (value.length <= 3) {
|
|
|
- let skuOneId = value[0]
|
|
|
- let skuTwoId = value[1]
|
|
|
- let skuThreeId = value[2]
|
|
|
- this.materialAttributeList.forEach((item) => {
|
|
|
- if (item.value === skuOneId) {
|
|
|
- this.skuOneTitle = item.name
|
|
|
- }
|
|
|
- if (item.value === skuTwoId) {
|
|
|
- this.skuTwoTitle = item.name
|
|
|
- }
|
|
|
- if (item.value === skuThreeId) {
|
|
|
- this.skuThreeTitle = item.name
|
|
|
- }
|
|
|
- })
|
|
|
- if (skuOneId) {
|
|
|
- getMaterialAttributeValueListById({ id: skuOneId }).then((res) => {
|
|
|
- this.skuOneList = res ? res : []
|
|
|
- })
|
|
|
- }
|
|
|
- if (skuTwoId) {
|
|
|
- getMaterialAttributeValueListById({ id: skuTwoId }).then((res) => {
|
|
|
- this.skuTwoList = res ? res : []
|
|
|
- })
|
|
|
- }
|
|
|
- if (skuThreeId) {
|
|
|
- getMaterialAttributeValueListById({ id: skuThreeId }).then((res) => {
|
|
|
- this.skuThreeList = res ? res : []
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- //控制条码列表中的多属性列
|
|
|
- if (value.length > 0) {
|
|
|
- this.meTable.columns[2].type = FormTypes.input
|
|
|
- } else {
|
|
|
- this.meTable.columns[2].type = FormTypes.hidden
|
|
|
- }
|
|
|
- this.barCodeSwitch = false
|
|
|
- this.meTable.dataSource = []
|
|
|
- },
|
|
|
- onSkuChange() {
|
|
|
- let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
- let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
- let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
- this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
- },
|
|
|
- onSkuOneDeSelect(value) {
|
|
|
- let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
- let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
- let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
- removeByVal(skuOneData, value)
|
|
|
- this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
- },
|
|
|
- onSkuTwoDeSelect(value) {
|
|
|
- let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
- let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
- let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
- removeByVal(skuTwoData, value)
|
|
|
- this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
- },
|
|
|
- onSkuThreeDeSelect(value) {
|
|
|
- let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
- let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
- let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
- removeByVal(skuThreeData, value)
|
|
|
- this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
- },
|
|
|
- autoSkuList(skuOneData, skuTwoData, skuThreeData) {
|
|
|
- let unit = this.form.getFieldValue('unit')
|
|
|
- if (unit) {
|
|
|
- //计算多属性已经选择了几个
|
|
|
- let skuArr = []
|
|
|
- if (this.getNumByField('skuOne')) {
|
|
|
- skuArr.push(skuOneData)
|
|
|
- }
|
|
|
- if (this.getNumByField('skuTwo')) {
|
|
|
- skuArr.push(skuTwoData)
|
|
|
- }
|
|
|
- if (this.getNumByField('skuThree')) {
|
|
|
- skuArr.push(skuThreeData)
|
|
|
- }
|
|
|
- let skuArrOne = skuArr[0]
|
|
|
- let skuArrTwo = skuArr[1]
|
|
|
- let skuArrThree = skuArr[2]
|
|
|
- let count = this.getNumByField('skuOne') + this.getNumByField('skuTwo') + this.getNumByField('skuThree')
|
|
|
- let barCodeSku = []
|
|
|
- if (count === 1) {
|
|
|
- let skuArrOnly = []
|
|
|
- if (this.getNumByField('skuOne')) {
|
|
|
- skuArrOnly = skuOneData
|
|
|
- } else if (this.getNumByField('skuTwo')) {
|
|
|
- skuArrOnly = skuTwoData
|
|
|
- } else if (this.getNumByField('skuThree')) {
|
|
|
- skuArrOnly = skuThreeData
|
|
|
- }
|
|
|
- for (let i = 0; i < skuArrOnly.length; i++) {
|
|
|
- barCodeSku.push(skuArrOnly[i])
|
|
|
- }
|
|
|
- } else if (count === 2) {
|
|
|
- for (let i = 0; i < skuArrOne.length; i++) {
|
|
|
- for (let j = 0; j < skuArrTwo.length; j++) {
|
|
|
- barCodeSku.push(skuArrOne[i] + '/' + skuArrTwo[j])
|
|
|
- }
|
|
|
- }
|
|
|
- } else if (count === 3) {
|
|
|
- for (let i = 0; i < skuArrOne.length; i++) {
|
|
|
- for (let j = 0; j < skuArrTwo.length; j++) {
|
|
|
- for (let k = 0; k < skuArrThree.length; k++) {
|
|
|
- barCodeSku.push(skuArrOne[i] + '/' + skuArrTwo[j] + '/' + skuArrThree[k])
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- let meTableData = []
|
|
|
- getMaxBarCode({}).then((res) => {
|
|
|
- if (res && res.code === 200) {
|
|
|
- let maxBarCode = res.data.barCode - 0
|
|
|
- for (let i = 0; i < barCodeSku.length; i++) {
|
|
|
- let currentBarCode = maxBarCode + i + 1
|
|
|
- meTableData.push({ barCode: currentBarCode, commodityUnit: unit, sku: barCodeSku[i] })
|
|
|
- }
|
|
|
- this.meTable.dataSource = meTableData
|
|
|
- }
|
|
|
- })
|
|
|
- } else {
|
|
|
- this.$message.warning('请填写单位(注意不要勾选多单位)')
|
|
|
- this.barCodeSwitch = false
|
|
|
- }
|
|
|
- },
|
|
|
- getNumByField(field) {
|
|
|
- let num = 0
|
|
|
- if (this.form.getFieldValue(field)) {
|
|
|
- if (this.form.getFieldValue(field).length > 0) {
|
|
|
- num = 1
|
|
|
- }
|
|
|
- }
|
|
|
- return num
|
|
|
- },
|
|
|
- onAdded(event) {
|
|
|
- const { row, target } = event
|
|
|
- let unit = ''
|
|
|
- if (this.unitStatus == false) {
|
|
|
- unit = this.form.getFieldValue('unit')
|
|
|
- }
|
|
|
- if (this.maxBarCodeInfo === '') {
|
|
|
- getMaxBarCode({}).then((res) => {
|
|
|
- if (res && res.code === 200) {
|
|
|
- this.maxBarCodeInfo = res.data.barCode - 0
|
|
|
- this.maxBarCodeInfo = this.maxBarCodeInfo + 1
|
|
|
- target.setValues([
|
|
|
- { rowKey: row.id, values: { barCode: this.maxBarCodeInfo, commodityUnit: unit ? unit : '' } },
|
|
|
- ])
|
|
|
- }
|
|
|
- })
|
|
|
- } else {
|
|
|
- this.maxBarCodeInfo = this.maxBarCodeInfo + 1
|
|
|
- target.setValues([
|
|
|
- { rowKey: row.id, values: { barCode: this.maxBarCodeInfo, commodityUnit: unit ? unit : '' } },
|
|
|
- ])
|
|
|
- }
|
|
|
- },
|
|
|
- onDeleted(value) {
|
|
|
- this.meDeleteIdList = value
|
|
|
- },
|
|
|
- //单元值改变一个字符就触发一次
|
|
|
- onValueChange(event) {
|
|
|
- const { type, row, column, value, target } = event
|
|
|
- switch (column.key) {
|
|
|
- case 'purchaseDecimal':
|
|
|
- case 'commodityDecimal':
|
|
|
- case 'wholesaleDecimal':
|
|
|
- case 'lowDecimal':
|
|
|
- this.changeDecimalByValue(row)
|
|
|
- break
|
|
|
- }
|
|
|
- },
|
|
|
- //修改商品明细中的价格触发计算
|
|
|
- changeDecimalByValue(row) {
|
|
|
- let unitArr = this.unitList
|
|
|
- let basicUnit = '',
|
|
|
- otherUnit = '',
|
|
|
- ratio = 1,
|
|
|
- otherUnitTwo = '',
|
|
|
- ratioTwo = 1,
|
|
|
- otherUnitThree = '',
|
|
|
- ratioThree = 1
|
|
|
- for (let i = 0; i < unitArr.length; i++) {
|
|
|
- if (unitArr[i].id === this.form.getFieldValue('unitId')) {
|
|
|
- basicUnit = unitArr[i].basicUnit
|
|
|
- otherUnit = unitArr[i].otherUnit
|
|
|
- ratio = unitArr[i].ratio
|
|
|
- if (unitArr[i].otherUnitTwo) {
|
|
|
- otherUnitTwo = unitArr[i].otherUnitTwo
|
|
|
- ratioTwo = unitArr[i].ratioTwo
|
|
|
- }
|
|
|
- if (unitArr[i].otherUnitThree) {
|
|
|
- otherUnitThree = unitArr[i].otherUnitThree
|
|
|
- ratioThree = unitArr[i].ratioThree
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (row.commodityUnit === basicUnit) {
|
|
|
- this.$refs.editableMeTable.getValues((error, values) => {
|
|
|
- let mArr = values,
|
|
|
- basicPurchaseDecimal = '',
|
|
|
- basicCommodityDecimal = '',
|
|
|
- basicWholesaleDecimal = '',
|
|
|
- basicLowDecimal = ''
|
|
|
- for (let i = 0; i < mArr.length; i++) {
|
|
|
- let mInfo = mArr[i]
|
|
|
- if (i === 0) {
|
|
|
- basicPurchaseDecimal = mInfo.purchaseDecimal
|
|
|
- basicCommodityDecimal = mInfo.commodityDecimal
|
|
|
- basicWholesaleDecimal = mInfo.wholesaleDecimal
|
|
|
- basicLowDecimal = mInfo.lowDecimal
|
|
|
- } else {
|
|
|
- //副单位进行换算
|
|
|
- if (basicPurchaseDecimal) {
|
|
|
- mInfo.purchaseDecimal = (basicPurchaseDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (basicCommodityDecimal) {
|
|
|
- mInfo.commodityDecimal = (basicCommodityDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (basicWholesaleDecimal) {
|
|
|
- mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (basicLowDecimal) {
|
|
|
- mInfo.lowDecimal = (basicLowDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (otherUnitTwo && i === 2) {
|
|
|
- if (basicPurchaseDecimal) {
|
|
|
- mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- if (basicCommodityDecimal) {
|
|
|
- mInfo.commodityDecimal = (basicCommodityDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- if (basicWholesaleDecimal) {
|
|
|
- mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- if (basicLowDecimal) {
|
|
|
- mInfo.lowDecimal = (basicLowDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- }
|
|
|
- if (otherUnitThree && i === 3) {
|
|
|
- if (basicPurchaseDecimal) {
|
|
|
- mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- if (basicCommodityDecimal) {
|
|
|
- mInfo.commodityDecimal = (basicCommodityDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- if (basicWholesaleDecimal) {
|
|
|
- mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- if (basicLowDecimal) {
|
|
|
- mInfo.lowDecimal = (basicLowDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- this.meTable.dataSource = mArr
|
|
|
- })
|
|
|
- }
|
|
|
- },
|
|
|
- batchSetPrice(type) {
|
|
|
- if (this.manySkuSelected > 0 || this.model.id) {
|
|
|
- this.$refs.priceModalForm.add(type)
|
|
|
- this.$refs.priceModalForm.disableSubmit = false
|
|
|
- } else {
|
|
|
- this.$message.warning('抱歉,只有开启多属性才能进行批量操作!')
|
|
|
- }
|
|
|
- },
|
|
|
- batchSetStock(type) {
|
|
|
- this.$refs.stockModalForm.add(type)
|
|
|
- this.$refs.stockModalForm.disableSubmit = false
|
|
|
- },
|
|
|
- batchSetPriceModalFormOk(price, batchType) {
|
|
|
- let arr = this.meTable.dataSource
|
|
|
- if (arr.length === 0) {
|
|
|
- this.$message.warning('请先录入条码、单位等信息!')
|
|
|
- } else {
|
|
|
- let meTableData = []
|
|
|
- for (let i = 0; i < arr.length; i++) {
|
|
|
- let meInfo = {
|
|
|
- barCode: arr[i].barCode,
|
|
|
- commodityUnit: arr[i].commodityUnit,
|
|
|
- sku: arr[i].sku,
|
|
|
- purchaseDecimal: arr[i].purchaseDecimal,
|
|
|
- commodityDecimal: arr[i].commodityDecimal,
|
|
|
- wholesaleDecimal: arr[i].wholesaleDecimal,
|
|
|
- lowDecimal: arr[i].lowDecimal,
|
|
|
- }
|
|
|
- if (batchType === 'purchase') {
|
|
|
- meInfo.purchaseDecimal = price - 0
|
|
|
- } else if (batchType === 'commodity') {
|
|
|
- meInfo.commodityDecimal = price - 0
|
|
|
- } else if (batchType === 'wholesale') {
|
|
|
- meInfo.wholesaleDecimal = price - 0
|
|
|
- } else if (batchType === 'low') {
|
|
|
- meInfo.lowDecimal = price - 0
|
|
|
- }
|
|
|
- if (arr[i].id) {
|
|
|
- meInfo.id = arr[i].id
|
|
|
- }
|
|
|
- meTableData.push(meInfo)
|
|
|
- }
|
|
|
- this.meTable.dataSource = meTableData
|
|
|
- }
|
|
|
- },
|
|
|
- batchSetStockModalFormOk(stock, batchType) {
|
|
|
- let arr = this.depotTable.dataSource
|
|
|
- let depotTableData = []
|
|
|
- for (let i = 0; i < arr.length; i++) {
|
|
|
- let depotInfo = {
|
|
|
- name: arr[i].name,
|
|
|
- initStock: arr[i].initStock,
|
|
|
- lowSafeStock: arr[i].lowSafeStock,
|
|
|
- highSafeStock: arr[i].highSafeStock,
|
|
|
- }
|
|
|
- if (batchType === 'initStock') {
|
|
|
- depotInfo.initStock = stock - 0
|
|
|
- } else if (batchType === 'lowSafeStock') {
|
|
|
- depotInfo.lowSafeStock = stock - 0
|
|
|
- } else if (batchType === 'highSafeStock') {
|
|
|
- depotInfo.highSafeStock = stock - 0
|
|
|
- }
|
|
|
- if (arr[i].id) {
|
|
|
- depotInfo.id = arr[i].id
|
|
|
- }
|
|
|
- depotTableData.push(depotInfo)
|
|
|
- }
|
|
|
- this.depotTable.dataSource = depotTableData
|
|
|
- },
|
|
|
- initMaterialAttribute() {
|
|
|
- getMaterialAttributeNameList().then((res) => {
|
|
|
- if (res) {
|
|
|
- this.materialAttributeList = res
|
|
|
- }
|
|
|
- })
|
|
|
- },
|
|
|
- loadParseMaterialProperty() {
|
|
|
- let mpList = Vue.ls.get('materialPropertyList')
|
|
|
- for (let i = 0; i < mpList.length; i++) {
|
|
|
- if (mpList[i].nativeName === '制造商') {
|
|
|
- this.mpShort.mfrs.name = mpList[i].anotherName
|
|
|
- this.mpShort.mfrs.enabled = mpList[i].enabled
|
|
|
- }
|
|
|
- if (mpList[i].nativeName === '自定义1') {
|
|
|
- this.mpShort.otherField1.name = mpList[i].anotherName
|
|
|
- this.mpShort.otherField1.enabled = mpList[i].enabled
|
|
|
- }
|
|
|
- if (mpList[i].nativeName === '自定义2') {
|
|
|
- this.mpShort.otherField2.name = mpList[i].anotherName
|
|
|
- this.mpShort.otherField2.enabled = mpList[i].enabled
|
|
|
- }
|
|
|
- if (mpList[i].nativeName === '自定义3') {
|
|
|
- this.mpShort.otherField3.name = mpList[i].anotherName
|
|
|
- this.mpShort.otherField3.enabled = mpList[i].enabled
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- handleNameChange(e) {
|
|
|
- let that = this
|
|
|
- if (e.target.value) {
|
|
|
- if (this.setTimeFlag != null) {
|
|
|
- clearTimeout(this.setTimeFlag)
|
|
|
- }
|
|
|
- this.setTimeFlag = setTimeout(() => {
|
|
|
- changeNameToPinYin({ name: e.target.value }).then((res) => {
|
|
|
- if (res && res.code === 200) {
|
|
|
- that.form.setFieldsValue({ mnemonic: res.data })
|
|
|
- } else {
|
|
|
- that.$message.warning(res.data)
|
|
|
- }
|
|
|
- })
|
|
|
- }, 500)
|
|
|
- } else {
|
|
|
- that.form.setFieldsValue({ mnemonic: '' })
|
|
|
- }
|
|
|
- },
|
|
|
- onlyUnitOnChange(e) {
|
|
|
- if (e.target.value) {
|
|
|
- //单位有填写了之后则显示多属性的文本框
|
|
|
- this.manySkuStatus = true
|
|
|
- } else {
|
|
|
- this.manySkuStatus = false
|
|
|
- }
|
|
|
- this.$refs.editableMeTable.getValues((error, values) => {
|
|
|
- let mArr = values
|
|
|
- for (let i = 0; i < mArr.length; i++) {
|
|
|
- let mInfo = mArr[i]
|
|
|
- mInfo.commodityUnit = e.target.value
|
|
|
- }
|
|
|
- this.meTable.dataSource = mArr
|
|
|
- })
|
|
|
- },
|
|
|
- manyUnitOnChange(value) {
|
|
|
- let unitArr = this.unitList
|
|
|
- let basicUnit = '',
|
|
|
- otherUnit = '',
|
|
|
- ratio = 1,
|
|
|
- otherUnitTwo = '',
|
|
|
- ratioTwo = 1,
|
|
|
- otherUnitThree = '',
|
|
|
- ratioThree = 1
|
|
|
- for (let i = 0; i < unitArr.length; i++) {
|
|
|
- if (unitArr[i].id === value) {
|
|
|
- basicUnit = unitArr[i].basicUnit
|
|
|
- otherUnit = unitArr[i].otherUnit
|
|
|
- ratio = unitArr[i].ratio
|
|
|
- if (unitArr[i].otherUnitTwo) {
|
|
|
- otherUnitTwo = unitArr[i].otherUnitTwo
|
|
|
- ratioTwo = unitArr[i].ratioTwo
|
|
|
- }
|
|
|
- if (unitArr[i].otherUnitThree) {
|
|
|
- otherUnitThree = unitArr[i].otherUnitThree
|
|
|
- ratioThree = unitArr[i].ratioThree
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- this.$refs.editableMeTable.getValues((error, values) => {
|
|
|
- let mArr = values,
|
|
|
- basicPurchaseDecimal = '',
|
|
|
- basicCommodityDecimal = '',
|
|
|
- basicWholesaleDecimal = '',
|
|
|
- basicLowDecimal = ''
|
|
|
- for (let i = 0; i < mArr.length; i++) {
|
|
|
- let mInfo = mArr[i]
|
|
|
- if (i === 0) {
|
|
|
- mInfo.commodityUnit = basicUnit
|
|
|
- basicPurchaseDecimal = mInfo.purchaseDecimal
|
|
|
- basicCommodityDecimal = mInfo.commodityDecimal
|
|
|
- basicWholesaleDecimal = mInfo.wholesaleDecimal
|
|
|
- basicLowDecimal = mInfo.lowDecimal
|
|
|
- } else {
|
|
|
- //副单位进行换算
|
|
|
- mInfo.commodityUnit = otherUnit
|
|
|
- if (basicPurchaseDecimal) {
|
|
|
- mInfo.purchaseDecimal = (basicPurchaseDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (basicCommodityDecimal) {
|
|
|
- mInfo.commodityDecimal = (basicCommodityDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (basicWholesaleDecimal) {
|
|
|
- mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (basicLowDecimal) {
|
|
|
- mInfo.lowDecimal = (basicLowDecimal * ratio).toFixed(2)
|
|
|
- }
|
|
|
- if (otherUnitTwo && i === 2) {
|
|
|
- mInfo.commodityUnit = otherUnitTwo
|
|
|
- if (basicPurchaseDecimal) {
|
|
|
- mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- if (basicCommodityDecimal) {
|
|
|
- mInfo.commodityDecimal = (basicCommodityDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- if (basicWholesaleDecimal) {
|
|
|
- mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- if (basicLowDecimal) {
|
|
|
- mInfo.lowDecimal = (basicLowDecimal * ratioTwo).toFixed(2)
|
|
|
- }
|
|
|
- }
|
|
|
- if (otherUnitThree && i === 3) {
|
|
|
- mInfo.commodityUnit = otherUnitThree
|
|
|
- if (basicPurchaseDecimal) {
|
|
|
- mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- if (basicCommodityDecimal) {
|
|
|
- mInfo.commodityDecimal = (basicCommodityDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- if (basicWholesaleDecimal) {
|
|
|
- mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- if (basicLowDecimal) {
|
|
|
- mInfo.lowDecimal = (basicLowDecimal * ratioThree).toFixed(2)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- this.meTable.dataSource = mArr
|
|
|
- })
|
|
|
- },
|
|
|
- unitOnChange(e) {
|
|
|
- let isChecked = e.target.checked
|
|
|
- if (isChecked) {
|
|
|
- this.unitStatus = true
|
|
|
- this.manyUnitStatus = false
|
|
|
- this.unitChecked = true
|
|
|
- } else {
|
|
|
- this.unitStatus = false
|
|
|
- this.manyUnitStatus = true
|
|
|
- this.unitChecked = false
|
|
|
- }
|
|
|
- },
|
|
|
- addUnit() {
|
|
|
- this.$refs.unitModalForm.add()
|
|
|
- this.$refs.unitModalForm.title = '新增多单位'
|
|
|
- this.$refs.unitModalForm.disableSubmit = false
|
|
|
- },
|
|
|
- unitModalFormOk() {
|
|
|
- this.loadUnitListData()
|
|
|
- },
|
|
|
- },
|
|
|
-}
|
|
|
-</script>
|
|
|
-<style scoped>
|
|
|
-.input-table {
|
|
|
- max-width: 100%;
|
|
|
- min-width: 1200px;
|
|
|
-}
|
|
|
-.tag-info {
|
|
|
- font-size: 14px;
|
|
|
- height: 32px;
|
|
|
- line-height: 32px;
|
|
|
- width: 100%;
|
|
|
- padding: 0px 11px;
|
|
|
- color: #bbb;
|
|
|
- background-color: #ffffff;
|
|
|
-}
|
|
|
-</style>
|
|
|
+<template>
|
|
|
+ <j-modal
|
|
|
+ :title="title"
|
|
|
+ :width="width"
|
|
|
+ :visible="visible"
|
|
|
+ :confirmLoading="confirmLoading"
|
|
|
+ v-bind:prefixNo="prefixNo"
|
|
|
+ fullscreen
|
|
|
+ switchHelp
|
|
|
+ switchFullscreen
|
|
|
+ @cancel="handleCancel"
|
|
|
+ :id="prefixNo"
|
|
|
+ :style="modalStyle"
|
|
|
+ >
|
|
|
+ <template slot="footer">
|
|
|
+ <a-button key="back" @click="handleCancel">取消</a-button>
|
|
|
+ <a-button type="primary" v-if="showOkFlag" :loading="confirmLoading" @click="handleOk">保存(Ctrl+S)</a-button>
|
|
|
+ </template>
|
|
|
+ <a-spin :spinning="confirmLoading">
|
|
|
+ <a-form :form="form">
|
|
|
+ <a-tabs default-active-key="1" size="small">
|
|
|
+ <a-tab-pane key="1" tab="基本信息" id="materialHeadModal" forceRender>
|
|
|
+ <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="名称"
|
|
|
+ data-step="1"
|
|
|
+ data-title="名称"
|
|
|
+ data-intro="名称必填,可以重复"
|
|
|
+ >
|
|
|
+ <a-input
|
|
|
+ placeholder="请输入名称"
|
|
|
+ v-decorator.trim="['name', validatorRules.name]"
|
|
|
+ @change="handleNameChange"
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="规格"
|
|
|
+ data-step="2"
|
|
|
+ data-title="规格"
|
|
|
+ data-intro="规格不必填,比如:10克"
|
|
|
+ >
|
|
|
+ <a-input placeholder="请输入规格" v-decorator.trim="['standard', validatorRules.standard]" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="型号"
|
|
|
+ data-step="3"
|
|
|
+ data-title="型号"
|
|
|
+ data-intro="型号是比规格更小的属性,比如:RX-01"
|
|
|
+ >
|
|
|
+ <a-input placeholder="请输入型号" v-decorator.trim="['model', validatorRules.model]" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="单位"
|
|
|
+ data-step="4"
|
|
|
+ data-title="单位"
|
|
|
+ data-intro="此处支持单个单位和多单位,勾选多单位就可以切换到多单位的下拉框,多单位需要先在【多单位】页面进行录入。
|
|
|
+ 比如牛奶有瓶和箱两种单位,12瓶=1箱,这就构成了多单位,多单位中有个换算比例"
|
|
|
+ >
|
|
|
+ <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :lg="15" :md="15" :sm="24" style="padding: 0px 0px 0px 12px">
|
|
|
+ <a-input
|
|
|
+ placeholder="输入单位"
|
|
|
+ v-if="!unitChecked"
|
|
|
+ v-decorator.trim="['unit', validatorRules.unit]"
|
|
|
+ @change="onlyUnitOnChange"
|
|
|
+ />
|
|
|
+ <a-select
|
|
|
+ :value="unitList"
|
|
|
+ placeholder="选择多单位"
|
|
|
+ v-decorator="['unitId', validatorRules.unitId]"
|
|
|
+ @change="manyUnitOnChange"
|
|
|
+ showSearch
|
|
|
+ optionFilterProp="children"
|
|
|
+ v-if="unitChecked"
|
|
|
+ :dropdownMatchSelectWidth="false"
|
|
|
+ >
|
|
|
+ <div slot="dropdownRender" slot-scope="menu">
|
|
|
+ <v-nodes :vnodes="menu" />
|
|
|
+ <a-divider style="margin: 4px 0" />
|
|
|
+ <div
|
|
|
+ style="padding: 4px 8px; cursor: pointer"
|
|
|
+ @mousedown="(e) => e.preventDefault()"
|
|
|
+ @click="addUnit"
|
|
|
+ >
|
|
|
+ <a-icon type="plus" /> 新增多单位
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <a-select-option v-for="(item, index) in unitList" :key="index" :value="item.id">
|
|
|
+ {{ item.name }}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="9" :md="9" :sm="24" style="padding: 0px; text-align: center">
|
|
|
+ <a-checkbox :checked="unitChecked" @change="unitOnChange">多单位</a-checkbox>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="颜色"
|
|
|
+ data-step="5"
|
|
|
+ data-title="颜色"
|
|
|
+ data-intro="请填写商品的颜色,如果是多属性商品可以不填(下面有多属性开关)"
|
|
|
+ >
|
|
|
+ <a-input placeholder="请输入颜色" v-decorator.trim="['color']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="品牌"
|
|
|
+ data-step="6"
|
|
|
+ data-title="品牌"
|
|
|
+ data-intro="请填写商品的品牌,方便区别不同品牌的商品"
|
|
|
+ >
|
|
|
+ <a-input placeholder="请输入品牌" v-decorator.trim="['brand']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="助记码"
|
|
|
+ data-step="7"
|
|
|
+ data-title="助记码"
|
|
|
+ data-intro="助记码自动生成,助记码是商品名称的首字母缩写"
|
|
|
+ >
|
|
|
+ <a-input placeholder="" v-decorator.trim="['mnemonic']" :readOnly="true" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="类别"
|
|
|
+ data-step="8"
|
|
|
+ data-title="类别"
|
|
|
+ data-intro="类别需要在【商品类别】页面进行录入,录入之后在此处进行调用"
|
|
|
+ >
|
|
|
+ <a-tree-select
|
|
|
+ style="width: 100%"
|
|
|
+ :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }"
|
|
|
+ allow-clear
|
|
|
+ :treeData="categoryTree"
|
|
|
+ v-decorator="['categoryId', validatorRules.categoryId]"
|
|
|
+ placeholder="请选择类别"
|
|
|
+ >
|
|
|
+ </a-tree-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="基础重量"
|
|
|
+ data-step="9"
|
|
|
+ data-title="基础重量"
|
|
|
+ data-intro="请填写基本单位对应的重量,用于计算按重量分摊费用时单据中各行商品分摊的费用成本"
|
|
|
+ >
|
|
|
+ <a-input-number style="width: 100%" placeholder="请输入基础重量(kg)" v-decorator.trim="['weight']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="序列号"
|
|
|
+ data-step="10"
|
|
|
+ data-title="序列号"
|
|
|
+ data-intro="此处是商品的序列号开关,如果选择了有,则在采购入库单据需要录入该商品的序列号,在销售出库单据需要选择该商品的序列号进行出库"
|
|
|
+ >
|
|
|
+ <a-tooltip title="如果选择为有,则在采购入库单需要录入该商品的序列号">
|
|
|
+ <a-select placeholder="有无序列号" v-decorator="['enableSerialNumber']">
|
|
|
+ <a-select-option value="1">有</a-select-option>
|
|
|
+ <a-select-option value="0">无</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-tooltip>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="系统SKU"
|
|
|
+ data-step="11"
|
|
|
+ data-title="系统SKU"
|
|
|
+ data-intro="系统SKU"
|
|
|
+ >
|
|
|
+ <a-input placeholder="提交后自动生成" disabled v-decorator="['systemSku']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="无动销提醒周期"
|
|
|
+ data-step="12"
|
|
|
+ data-title="无动销提醒周期"
|
|
|
+ data-intro="无动销提醒周期"
|
|
|
+ >
|
|
|
+ <a-tooltip title="无动销提醒周期">
|
|
|
+ <a-select placeholder="无动销提醒周期" v-decorator="['movingPinReminderCycle']">
|
|
|
+ <a-select-option value="一周">一周</a-select-option>
|
|
|
+ <a-select-option value="两周">两周</a-select-option>
|
|
|
+ <a-select-option value="一个月">一个月</a-select-option>
|
|
|
+ <a-select-option value="一季度">一季度</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-tooltip>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <!-- <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="保质期"
|
|
|
+ data-step="10"
|
|
|
+ data-title="保质期"
|
|
|
+ data-intro="保质期指的是商品的保质期(天),主要针对带生产日期的,此类商品一般有批号"
|
|
|
+ >
|
|
|
+ <a-input-number style="width: 100%" placeholder="请输入保质期(天)" v-decorator.trim="['expiryNum']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="仓位货架"
|
|
|
+ data-step="11"
|
|
|
+ data-title="仓位货架"
|
|
|
+ data-intro="仓位货架指的是仓库中的仓位和货架号,主要适用于仓库较大的场景,方便查找商品的准确位置"
|
|
|
+ >
|
|
|
+ <a-input style="width: 100%" placeholder="请输入仓位货架" v-decorator.trim="['position']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="制造商"
|
|
|
+ data-step="12"
|
|
|
+ data-title="制造商"
|
|
|
+ data-intro="请填写商品的制造商,一般适用于制造行业"
|
|
|
+ >
|
|
|
+ <a-input placeholder="请输入制造商" v-decorator.trim="['mfrs']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col> -->
|
|
|
+ </a-row>
|
|
|
+ <!-- <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :md="6" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="批号"
|
|
|
+ data-step="14"
|
|
|
+ data-title="批号"
|
|
|
+ data-intro="此处是商品的批号开关,如果选择了有,则在采购入库单据需要录入该商品的批号和有效期,在销售出库单据需要选择该商品的批号进行出库"
|
|
|
+ >
|
|
|
+ <a-tooltip title="如果选择为有,则在采购入库单需要录入该商品的批号和有效期">
|
|
|
+ <a-select placeholder="有无批号" v-decorator="['enableBatchNumber']">
|
|
|
+ <a-select-option value="1">有</a-select-option>
|
|
|
+ <a-select-option value="0">无</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-tooltip>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="6" :sm="24" v-if="!model.id">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="labelCol"
|
|
|
+ :wrapperCol="wrapperCol"
|
|
|
+ label="多属性"
|
|
|
+ data-step="13"
|
|
|
+ data-title="多属性"
|
|
|
+ data-intro="多属性是针对的sku商品(比如服装、鞋帽行业),此处开关如果启用就可以在下方进行多sku的配置,配置具体的颜色、尺码之类的组合"
|
|
|
+ >
|
|
|
+ <a-tooltip title="多属性针对服装、鞋帽等行业,需要先录入单位才能激活此处输入框">
|
|
|
+ <a-tag class="tag-info" v-if="!manySkuStatus">需要先录入单位才能激活</a-tag>
|
|
|
+ <a-select
|
|
|
+ mode="multiple"
|
|
|
+ v-decorator="['manySku']"
|
|
|
+ showSearch
|
|
|
+ optionFilterProp="children"
|
|
|
+ placeholder="请选择多属性(可多选)"
|
|
|
+ @change="onManySkuChange"
|
|
|
+ v-show="manySkuStatus"
|
|
|
+ >
|
|
|
+ <a-select-option
|
|
|
+ v-for="(item, index) in materialAttributeList"
|
|
|
+ :key="index"
|
|
|
+ :value="item.value"
|
|
|
+ :disabled="item.disabled"
|
|
|
+ >
|
|
|
+ {{ item.name }}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-tooltip>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row> -->
|
|
|
+ <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :md="12" :sm="24" v-if="manySkuSelected >= 1">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
|
|
|
+ :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
+ :label="skuOneTitle"
|
|
|
+ >
|
|
|
+ <a-select
|
|
|
+ mode="multiple"
|
|
|
+ v-decorator="['skuOne']"
|
|
|
+ showSearch
|
|
|
+ optionFilterProp="children"
|
|
|
+ placeholder="请选择(可多选)"
|
|
|
+ @select="onSkuChange"
|
|
|
+ @deselect="onSkuOneDeSelect"
|
|
|
+ >
|
|
|
+ <a-select-option v-for="(item, index) in skuOneList" :key="index" :value="item.value">
|
|
|
+ {{ item.name }}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="12" :sm="24" v-if="manySkuSelected >= 2">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
|
|
|
+ :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
+ :label="skuTwoTitle"
|
|
|
+ >
|
|
|
+ <a-select
|
|
|
+ mode="multiple"
|
|
|
+ v-decorator="['skuTwo']"
|
|
|
+ showSearch
|
|
|
+ optionFilterProp="children"
|
|
|
+ placeholder="请选择(可多选)"
|
|
|
+ @select="onSkuChange"
|
|
|
+ @deselect="onSkuTwoDeSelect"
|
|
|
+ >
|
|
|
+ <a-select-option v-for="(item, index) in skuTwoList" :key="index" :value="item.value">
|
|
|
+ {{ item.name }}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :md="12" :sm="24" v-if="manySkuSelected >= 3">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
|
|
|
+ :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
+ :label="skuThreeTitle"
|
|
|
+ >
|
|
|
+ <a-select
|
|
|
+ mode="multiple"
|
|
|
+ v-decorator="['skuThree']"
|
|
|
+ showSearch
|
|
|
+ optionFilterProp="children"
|
|
|
+ placeholder="请选择(可多选)"
|
|
|
+ @select="onSkuChange"
|
|
|
+ @deselect="onSkuThreeDeSelect"
|
|
|
+ >
|
|
|
+ <a-select-option v-for="(item, index) in skuThreeList" :key="index" :value="item.value">
|
|
|
+ {{ item.name }}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <div style="margin-top: 8px" id="materialDetailModal">
|
|
|
+ <j-editable-table
|
|
|
+ ref="editableMeTable"
|
|
|
+ :loading="meTable.loading"
|
|
|
+ :columns="meTable.columns"
|
|
|
+ :dataSource="meTable.dataSource"
|
|
|
+ :height="300"
|
|
|
+ :minWidth="1000"
|
|
|
+ :maxHeight="300"
|
|
|
+ :rowNumber="false"
|
|
|
+ :rowSelection="true"
|
|
|
+ :actionButton="true"
|
|
|
+ @valueChange="onValueChange"
|
|
|
+ @added="onAdded"
|
|
|
+ @deleted="onDeleted"
|
|
|
+ >
|
|
|
+ <template #supplierId="{ handleChange, value }">
|
|
|
+ <a-select
|
|
|
+ placeholder="请选择供应商"
|
|
|
+ v-decorator="['supplierId']"
|
|
|
+ :dropdownMatchSelectWidth="false"
|
|
|
+ showSearch
|
|
|
+ optionFilterProp="children"
|
|
|
+ :value="typeof value === 'string' ? Number(value) : ''"
|
|
|
+ @change="($event) => handleChange($event)"
|
|
|
+ >
|
|
|
+ <div slot="dropdownRender" slot-scope="menu">
|
|
|
+ <v-nodes :vnodes="menu" />
|
|
|
+ <a-divider style="margin: 4px 0" />
|
|
|
+ <div
|
|
|
+ style="padding: 4px 8px; cursor: pointer"
|
|
|
+ @mousedown="(e) => e.preventDefault()"
|
|
|
+ @click="addVendor"
|
|
|
+ >
|
|
|
+ <a-icon type="plus" /> 新增供应商
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <a-select-option v-for="(item, index) in supList" :key="index" :value="item.id">
|
|
|
+ {{ item.supplier }}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+ <template #depotId="{ handleChange, value }">
|
|
|
+ <a-select
|
|
|
+ placeholder="请选择仓库名称"
|
|
|
+ v-decorator="['depotId']"
|
|
|
+ :dropdownMatchSelectWidth="false"
|
|
|
+ showSearch
|
|
|
+ optionFilterProp="children"
|
|
|
+ :value="value"
|
|
|
+ @change="($event) => handleChange($event)"
|
|
|
+ >
|
|
|
+ <div slot="dropdownRender" slot-scope="menu">
|
|
|
+ <v-nodes :vnodes="menu" />
|
|
|
+ <a-divider style="margin: 4px 0" />
|
|
|
+ <div
|
|
|
+ style="padding: 4px 8px; cursor: pointer"
|
|
|
+ @mousedown="(e) => e.preventDefault()"
|
|
|
+ @click="addDepot"
|
|
|
+ >
|
|
|
+ <a-icon type="plus" /> 新增仓库
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <a-select-option v-for="(item, index) in depotList" :key="index" :value="item.value">
|
|
|
+ {{ item.text }}
|
|
|
+ </a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+ <template #buttonAfter>
|
|
|
+ <a-button @click="batchSetPrice('purchase')">采购价-批量</a-button>
|
|
|
+ <a-button style="margin-left: 8px" @click="batchSetPrice('commodity')">零售价-批量</a-button>
|
|
|
+ <a-button style="margin-left: 8px" @click="batchSetPrice('wholesale')">销售价-批量</a-button>
|
|
|
+ <a-button style="margin-left: 8px" @click="batchSetPrice('low')">最低售价-批量</a-button>
|
|
|
+ </template>
|
|
|
+ </j-editable-table>
|
|
|
+ <!-- 表单区域 -->
|
|
|
+ <batch-set-price-modal ref="priceModalForm" @ok="batchSetPriceModalFormOk"></batch-set-price-modal>
|
|
|
+ </div>
|
|
|
+ <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :lg="24" :md="24" :sm="24">
|
|
|
+ <a-form-item :labelCol="labelCol" :wrapperCol="{ xs: { span: 24 }, sm: { span: 24 } }" label="">
|
|
|
+ <a-textarea :rows="1" placeholder="请输入备注" v-decorator="['remark']" style="margin-top: 8px" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="2" tab="扩展信息" forceRender>
|
|
|
+ <a-row v-if="mpShort.otherField1.enabled" class="form-row" :gutter="24">
|
|
|
+ <a-col :lg="6" :md="6" :sm="6">
|
|
|
+ <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="mpShort.otherField1.name">
|
|
|
+ <a-input v-decorator.trim="['otherField1']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row v-if="mpShort.otherField2.enabled" class="form-row" :gutter="24">
|
|
|
+ <a-col :lg="6" :md="6" :sm="6">
|
|
|
+ <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="mpShort.otherField2.name">
|
|
|
+ <a-input v-decorator.trim="['otherField2']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row v-if="mpShort.otherField3.enabled" class="form-row" :gutter="24">
|
|
|
+ <a-col :lg="6" :md="6" :sm="6">
|
|
|
+ <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" :label="mpShort.otherField3.name">
|
|
|
+ <a-input v-decorator.trim="['otherField3']" />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="3" tab="库存数量" forceRender>
|
|
|
+ <j-editable-table
|
|
|
+ ref="editableDepotTable"
|
|
|
+ :loading="depotTable.loading"
|
|
|
+ :columns="depotTable.columns"
|
|
|
+ :dataSource="depotTable.dataSource"
|
|
|
+ :minWidth="1000"
|
|
|
+ :maxHeight="300"
|
|
|
+ :rowNumber="true"
|
|
|
+ :rowSelection="false"
|
|
|
+ :actionButton="false"
|
|
|
+ >
|
|
|
+ <template #buttonAfter>
|
|
|
+ <a-button style="margin: 0px 0px 8px 0px" @click="batchSetStock('initStock')">期初库存-批量</a-button>
|
|
|
+ <a-button style="margin-left: 8px" @click="batchSetStock('lowSafeStock')">最低安全库存-批量</a-button>
|
|
|
+ <a-button style="margin-left: 8px" @click="batchSetStock('highSafeStock')">最高安全库存-批量</a-button>
|
|
|
+ </template>
|
|
|
+ </j-editable-table>
|
|
|
+ <!-- 表单区域 -->
|
|
|
+ <batch-set-stock-modal ref="stockModalForm" @ok="batchSetStockModalFormOk"></batch-set-stock-modal>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane key="4" tab="图片信息" forceRender>
|
|
|
+ <a-row class="form-row" :gutter="24" style="padding-top: 20px">
|
|
|
+ <a-col :lg="18" :md="18" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="{ xs: { span: 24 }, sm: { span: 3 } }"
|
|
|
+ :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
+ label="图片信息"
|
|
|
+ >
|
|
|
+ <j-image-upload v-model="fileList" bizPath="material" text="上传" isMultiple></j-image-upload>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="6" :md="6" :sm="24"></a-col>
|
|
|
+ </a-row>
|
|
|
+ <a-row class="form-row" :gutter="24">
|
|
|
+ <a-col :lg="18" :md="18" :sm="24">
|
|
|
+ <a-form-item
|
|
|
+ :labelCol="{ xs: { span: 24 }, sm: { span: 3 } }"
|
|
|
+ :wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
|
|
|
+ label="上传提示"
|
|
|
+ >
|
|
|
+ 图片最多4张,且单张大小不超过1M
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :lg="6" :md="6" :sm="24"></a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-tab-pane>
|
|
|
+ </a-tabs>
|
|
|
+ </a-form>
|
|
|
+ </a-spin>
|
|
|
+ <!-- 供应商modal -->
|
|
|
+ <vendor-modal ref="vendorModalForm" @ok="vendorModalFormOk"></vendor-modal>
|
|
|
+ <!-- 仓库modal -->
|
|
|
+ <depot-modal ref="depotModalForm" @ok="depotModalFormOk"></depot-modal>
|
|
|
+ <unit-modal ref="unitModalForm" @ok="unitModalFormOk"></unit-modal>
|
|
|
+ </j-modal>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+import pick from 'lodash.pick'
|
|
|
+import BatchSetPriceModal from './BatchSetPriceModal'
|
|
|
+import BatchSetStockModal from './BatchSetStockModal'
|
|
|
+import UnitModal from '../../system/modules/UnitModal'
|
|
|
+import VendorModal from '@/views//system/modules/VendorModal'
|
|
|
+import DepotModal from '@/views//system/modules/DepotModal'
|
|
|
+import JEditableTable from '@/components/jeecg/JEditableTable'
|
|
|
+import { FormTypes, getRefPromise, VALIDATE_NO_PASSED, validateFormAndTables } from '@/utils/JEditableTableUtil'
|
|
|
+import {
|
|
|
+ checkMaterial,
|
|
|
+ checkMaterialBarCode,
|
|
|
+ getMaterialAttributeNameList,
|
|
|
+ getMaterialAttributeValueListById,
|
|
|
+ getMaxBarCode,
|
|
|
+ queryMaterialCategoryTreeList,
|
|
|
+ changeNameToPinYin,
|
|
|
+} from '@/api/api'
|
|
|
+import { removeByVal, autoJumpNextInput, handleIntroJs } from '@/utils/util'
|
|
|
+import { getAction, httpAction } from '@/api/manage'
|
|
|
+import JImageUpload from '@/components/jeecg/JImageUpload'
|
|
|
+import JDate from '@/components/jeecg/JDate'
|
|
|
+import Vue from 'vue'
|
|
|
+import { MaterialModalMixins } from '../mixins/MaterialModalMixins'
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: 'MaterialModal',
|
|
|
+ mixins: [MaterialModalMixins],
|
|
|
+ components: {
|
|
|
+ BatchSetPriceModal,
|
|
|
+ BatchSetStockModal,
|
|
|
+ UnitModal,
|
|
|
+ VendorModal,
|
|
|
+ DepotModal,
|
|
|
+ JImageUpload,
|
|
|
+ JDate,
|
|
|
+ JEditableTable,
|
|
|
+ VNodes: {
|
|
|
+ functional: true,
|
|
|
+ render: (h, ctx) => ctx.props.vnodes,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ title: '操作',
|
|
|
+ width: '1300px',
|
|
|
+ visible: false,
|
|
|
+ modalStyle: '',
|
|
|
+ categoryTree: [],
|
|
|
+ unitList: [],
|
|
|
+ depotList: [],
|
|
|
+ fileList: [],
|
|
|
+ unitStatus: false,
|
|
|
+ manyUnitStatus: true,
|
|
|
+ unitChecked: false,
|
|
|
+ manySkuStatus: false,
|
|
|
+ switchDisabled: false, //开关的启用状态
|
|
|
+ barCodeSwitch: false, //生成条码开关
|
|
|
+ maxBarCodeInfo: '', //最大条码
|
|
|
+ meDeleteIdList: [], //删除条码信息的id数组
|
|
|
+ prefixNo: 'material',
|
|
|
+ materialAttributeList: [],
|
|
|
+ skuOneTitle: '属性1',
|
|
|
+ skuTwoTitle: '属性2',
|
|
|
+ skuThreeTitle: '属性3',
|
|
|
+ skuOneList: [],
|
|
|
+ skuTwoList: [],
|
|
|
+ skuThreeList: [],
|
|
|
+ manySkuSelected: 0,
|
|
|
+ model: {},
|
|
|
+ showOkFlag: true,
|
|
|
+ setTimeFlag: null,
|
|
|
+ labelCol: {
|
|
|
+ xs: { span: 24 },
|
|
|
+ sm: { span: 8 },
|
|
|
+ },
|
|
|
+ wrapperCol: {
|
|
|
+ xs: { span: 24 },
|
|
|
+ sm: { span: 16 },
|
|
|
+ },
|
|
|
+ mpShort: {
|
|
|
+ mfrs: {},
|
|
|
+ otherField1: {},
|
|
|
+ otherField2: {},
|
|
|
+ otherField3: {},
|
|
|
+ },
|
|
|
+ meTable: {
|
|
|
+ loading: false,
|
|
|
+ dataSource: [],
|
|
|
+ columns: [
|
|
|
+ {
|
|
|
+ title: '批次号',
|
|
|
+ // key: 'barCode',
|
|
|
+ key: 'batchNumber',
|
|
|
+ width: '15%',
|
|
|
+ type: FormTypes.input,
|
|
|
+ disabled: true,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '自动生成',
|
|
|
+ // validateRules: [
|
|
|
+ // { required: true, message: '${title}不能为空' },
|
|
|
+ // { pattern: /^.{4,40}$/, message: '长度为4到40位' },
|
|
|
+ // { handler: this.validateBarCode },
|
|
|
+ // ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '单位',
|
|
|
+ key: 'commodityUnit',
|
|
|
+ width: '8%',
|
|
|
+ type: FormTypes.input,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ validateRules: [{ required: true, message: '${title}不能为空' }],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '多属性',
|
|
|
+ key: 'sku',
|
|
|
+ width: '25%',
|
|
|
+ type: FormTypes.input,
|
|
|
+ defaultValue: '',
|
|
|
+ readonly: true,
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '采购价',
|
|
|
+ key: 'purchaseDecimal',
|
|
|
+ width: '9%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '零售价',
|
|
|
+ key: 'commodityDecimal',
|
|
|
+ width: '9%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '销售价',
|
|
|
+ key: 'wholesaleDecimal',
|
|
|
+ width: '9%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '最低售价',
|
|
|
+ key: 'lowDecimal',
|
|
|
+ width: '9%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '生产日期',
|
|
|
+ key: 'productionDate',
|
|
|
+ width: '12%',
|
|
|
+ type: FormTypes.date,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请选择${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '保质期(天)',
|
|
|
+ key: 'expiryNum',
|
|
|
+ width: '9%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '供应商',
|
|
|
+ key: 'supplierId',
|
|
|
+ width: '12%',
|
|
|
+ type: FormTypes.slot,
|
|
|
+ slotName: 'supplierId',
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请选择${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '商品条码',
|
|
|
+ key: 'barCode',
|
|
|
+ width: '12%',
|
|
|
+ type: FormTypes.input,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '库存(最小单位)',
|
|
|
+ key: 'inventory',
|
|
|
+ width: '9%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '仓库名称',
|
|
|
+ key: 'depotId',
|
|
|
+ width: '10%',
|
|
|
+ type: FormTypes.slot,
|
|
|
+ slotName: 'depotId',
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请选择${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '仓位货架',
|
|
|
+ key: 'position',
|
|
|
+ width: '9%',
|
|
|
+ type: FormTypes.input,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ depotTable: {
|
|
|
+ loading: false,
|
|
|
+ dataSource: [],
|
|
|
+ columns: [
|
|
|
+ {
|
|
|
+ title: '仓库',
|
|
|
+ key: 'name',
|
|
|
+ width: '15%',
|
|
|
+ type: FormTypes.normal,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '期初库存数量',
|
|
|
+ key: 'initStock',
|
|
|
+ width: '15%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '最低安全库存数量',
|
|
|
+ key: 'lowSafeStock',
|
|
|
+ width: '15%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '最高安全库存数量',
|
|
|
+ key: 'highSafeStock',
|
|
|
+ width: '15%',
|
|
|
+ type: FormTypes.inputNumber,
|
|
|
+ defaultValue: '',
|
|
|
+ placeholder: '请输入${title}',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ confirmLoading: false,
|
|
|
+ form: this.$form.createForm(this),
|
|
|
+ validatorRules: {
|
|
|
+ name: {
|
|
|
+ rules: [
|
|
|
+ { required: true, message: '请输入名称!' },
|
|
|
+ { max: 100, message: '长度请小于100个字符', trigger: 'blur' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ standard: {
|
|
|
+ rules: [{ max: 100, message: '长度请小于100个字符', trigger: 'blur' }],
|
|
|
+ },
|
|
|
+ categoryId: {
|
|
|
+ rules: [{ required: true, message: '请选择类别!' }],
|
|
|
+ },
|
|
|
+ model: {
|
|
|
+ rules: [{ max: 100, message: '长度请小于100个字符', trigger: 'blur' }],
|
|
|
+ },
|
|
|
+ unit: {
|
|
|
+ rules: [{ required: true, message: '请输入单位!' }],
|
|
|
+ },
|
|
|
+ unitId: {
|
|
|
+ rules: [{ required: true, message: '请选择多单位!' }],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ url: {
|
|
|
+ add: '/material/add',
|
|
|
+ edit: '/material/update',
|
|
|
+ materialsExtendList: '/materialsExtend/getDetailList',
|
|
|
+ depotWithStock: '/depot/getAllListWithStock',
|
|
|
+ },
|
|
|
+ }
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.loadParseMaterialProperty()
|
|
|
+ let realScreenWidth = window.screen.width
|
|
|
+ this.width = realScreenWidth < 1500 ? '1200px' : '1400px'
|
|
|
+ this.initSelectOpts()
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ document.getElementById(this.prefixNo).addEventListener('keydown', this.handleOkKey)
|
|
|
+ },
|
|
|
+ beforeDestroy() {
|
|
|
+ document.getElementById(this.prefixNo).removeEventListener('keydown', this.handleOkKey)
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ // 快捷键
|
|
|
+ handleOkKey(e) {
|
|
|
+ const key = window.event.keyCode ? window.event.keyCode : window.event.which
|
|
|
+ if (key === 83 && e.ctrlKey) {
|
|
|
+ //保存 CTRL+S
|
|
|
+ this.handleOk()
|
|
|
+ e.preventDefault()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 获取所有的editableTable实例
|
|
|
+ getAllTable() {
|
|
|
+ return Promise.all([getRefPromise(this, 'editableMeTable'), getRefPromise(this, 'editableDepotTable')])
|
|
|
+ },
|
|
|
+ add() {
|
|
|
+ //隐藏多属性
|
|
|
+ this.meTable.columns[2].type = FormTypes.hidden
|
|
|
+ // 默认新增一条数据
|
|
|
+ this.getAllTable().then((editableTables) => {
|
|
|
+ editableTables[0].add()
|
|
|
+ })
|
|
|
+ this.edit({})
|
|
|
+ this.$nextTick(() => {
|
|
|
+ handleIntroJs('material', 11)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ edit(record) {
|
|
|
+ this.form.resetFields()
|
|
|
+ this.model = Object.assign({}, record)
|
|
|
+ this.activeKey = '1'
|
|
|
+ this.manySkuSelected = 0
|
|
|
+ this.barCodeSwitch = false
|
|
|
+ this.manySkuStatus = false
|
|
|
+ this.maxBarCodeInfo = ''
|
|
|
+ this.visible = true
|
|
|
+ this.meDeleteIdList = []
|
|
|
+ this.modalStyle = 'top:20px;height: 95%;'
|
|
|
+ if (JSON.stringify(record) === '{}') {
|
|
|
+ this.fileList = []
|
|
|
+ } else {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.fileList = record.imgName
|
|
|
+ }, 5)
|
|
|
+ }
|
|
|
+ console.log('this.model--------', this.model)
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.form.setFieldsValue(
|
|
|
+ pick(
|
|
|
+ this.model,
|
|
|
+ 'name',
|
|
|
+ 'standard',
|
|
|
+ 'unit',
|
|
|
+ 'unitId',
|
|
|
+ 'model',
|
|
|
+ 'color',
|
|
|
+ 'brand',
|
|
|
+ 'mnemonic',
|
|
|
+ 'categoryId',
|
|
|
+ 'enableSerialNumber',
|
|
|
+ 'movingPinReminderCycle',
|
|
|
+ 'systemSku',
|
|
|
+ 'weight',
|
|
|
+ 'remark',
|
|
|
+ 'otherField1',
|
|
|
+ 'otherField2',
|
|
|
+ 'otherField3'
|
|
|
+ )
|
|
|
+ )
|
|
|
+ autoJumpNextInput('materialHeadModal')
|
|
|
+ autoJumpNextInput('materialDetailModal')
|
|
|
+ })
|
|
|
+ this.initMaterialAttribute()
|
|
|
+ this.loadTreeData()
|
|
|
+ this.loadUnitListData()
|
|
|
+ // 加载子表数据
|
|
|
+ if (this.model.id) {
|
|
|
+ //禁用多属性开关
|
|
|
+ this.switchDisabled = true
|
|
|
+ // 判断是否是多单位
|
|
|
+ if (this.model.unit) {
|
|
|
+ this.unitChecked = false
|
|
|
+ this.unitStatus = false
|
|
|
+ this.manyUnitStatus = true
|
|
|
+ } else {
|
|
|
+ this.unitChecked = true
|
|
|
+ this.unitStatus = true
|
|
|
+ this.manyUnitStatus = false
|
|
|
+ }
|
|
|
+ let params = { materialId: this.model.id }
|
|
|
+ //编辑商品的时候多属性字段可以修改
|
|
|
+ this.meTable.columns[2].readonly = false
|
|
|
+ this.requestMeTableData(this.url.materialsExtendList, params, this.meTable)
|
|
|
+ this.requestDepotTableData(this.url.depotWithStock, { mId: this.model.id }, this.depotTable)
|
|
|
+ } else {
|
|
|
+ this.switchDisabled = false
|
|
|
+ this.meTable.columns[2].readonly = true
|
|
|
+ this.requestDepotTableData(this.url.depotWithStock, { mId: 0 }, this.depotTable)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /** 查询条码tab的数据 */
|
|
|
+ requestMeTableData(url, params, tab) {
|
|
|
+ tab.loading = true
|
|
|
+ getAction(url, params)
|
|
|
+ .then((res) => {
|
|
|
+ for (let i = 0; i < res.data.rows.length; i++) {
|
|
|
+ if (res.data.rows[i].sku) {
|
|
|
+ this.meTable.columns[2].type = FormTypes.input
|
|
|
+ } else {
|
|
|
+ this.meTable.columns[2].type = FormTypes.hidden
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tab.dataSource = res.data.rows || []
|
|
|
+ console.log('tab.dataSource-----', tab.dataSource)
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ tab.loading = false
|
|
|
+ })
|
|
|
+ },
|
|
|
+ /** 查询仓库tab的数据 */
|
|
|
+ requestDepotTableData(url, params, tab) {
|
|
|
+ tab.loading = true
|
|
|
+ getAction(url, params)
|
|
|
+ .then((res) => {
|
|
|
+ tab.dataSource = res.data || []
|
|
|
+ })
|
|
|
+ .finally(() => {
|
|
|
+ tab.loading = false
|
|
|
+ })
|
|
|
+ },
|
|
|
+ close() {
|
|
|
+ this.$emit('close')
|
|
|
+ this.visible = false
|
|
|
+ this.modalStyle = ''
|
|
|
+ this.unitStatus = false
|
|
|
+ this.manyUnitStatus = true
|
|
|
+ this.unitChecked = false
|
|
|
+ this.getAllTable().then((editableTables) => {
|
|
|
+ editableTables[0].initialize()
|
|
|
+ editableTables[1].initialize()
|
|
|
+ })
|
|
|
+ },
|
|
|
+ handleOk() {
|
|
|
+ this.validateFields()
|
|
|
+ },
|
|
|
+ handleCancel() {
|
|
|
+ this.close()
|
|
|
+ },
|
|
|
+ /** 触发表单验证 */
|
|
|
+ validateFields() {
|
|
|
+ this.getAllTable()
|
|
|
+ .then((tables) => {
|
|
|
+ /** 一次性验证主表和所有的次表 */
|
|
|
+ return validateFormAndTables(this.form, tables)
|
|
|
+ })
|
|
|
+ .then((allValues) => {
|
|
|
+ let formData = this.classifyIntoFormData(allValues)
|
|
|
+ formData.sortList = []
|
|
|
+ if (formData.unit === undefined) {
|
|
|
+ formData.unit = ''
|
|
|
+ }
|
|
|
+ if (formData.unitId === undefined) {
|
|
|
+ formData.unitId = ''
|
|
|
+ }
|
|
|
+ if (this.unitChecked) {
|
|
|
+ formData.unit = ''
|
|
|
+ } else {
|
|
|
+ formData.unitId = ''
|
|
|
+ }
|
|
|
+ // 发起请求
|
|
|
+ return this.requestAddOrEdit(formData)
|
|
|
+ })
|
|
|
+ .catch((e) => {
|
|
|
+ if (e.error === VALIDATE_NO_PASSED) {
|
|
|
+ // 如果有未通过表单验证的子表,就自动跳转到它所在的tab
|
|
|
+ this.activeKey = e.index == null ? this.activeKey : (e.index + 1).toString()
|
|
|
+ } else {
|
|
|
+ console.error(e)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ /** 整理成formData */
|
|
|
+ classifyIntoFormData(allValues) {
|
|
|
+ let materialMain = Object.assign(this.model, allValues.formValue)
|
|
|
+ return {
|
|
|
+ ...materialMain, // 展开
|
|
|
+ meList: allValues.tablesValue[0].values,
|
|
|
+ stock: allValues.tablesValue[1].values,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /** 发起新增或修改的请求 */
|
|
|
+ requestAddOrEdit(formData) {
|
|
|
+ console.log('formData------------', formData)
|
|
|
+ if (formData.meList.length === 0) {
|
|
|
+ this.$message.warning('抱歉,请输入条码信息!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (formData.enableSerialNumber === '1' && formData.enableBatchNumber === '1') {
|
|
|
+ this.$message.warning('抱歉,序列号和批号只能选择一项!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //校验商品是否存在,通过校验商品的名称、型号、规格、颜色、单位、制造商等
|
|
|
+ let param = {
|
|
|
+ id: this.model.id ? this.model.id : 0,
|
|
|
+ name: this.model.name,
|
|
|
+ model: this.parseParam(this.model.model),
|
|
|
+ color: this.parseParam(this.model.color),
|
|
|
+ standard: this.parseParam(this.model.standard),
|
|
|
+ mfrs: this.parseParam(this.model.mfrs),
|
|
|
+ otherField1: this.parseParam(this.model.otherField1),
|
|
|
+ otherField2: this.parseParam(this.model.otherField2),
|
|
|
+ otherField3: this.parseParam(this.model.otherField3),
|
|
|
+ unit: this.parseParam(this.model.unit),
|
|
|
+ unitId: this.parseParam(this.model.unitId),
|
|
|
+ }
|
|
|
+ checkMaterial(param).then((res) => {
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ if (res.data.status) {
|
|
|
+ this.$message.warning('抱歉,该商品已存在!')
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ //进一步校验单位
|
|
|
+ let basicUnit = '',
|
|
|
+ otherUnit = '',
|
|
|
+ otherUnitTwo = '',
|
|
|
+ otherUnitThree = ''
|
|
|
+ if (formData.unitId) {
|
|
|
+ let unitArr = this.unitList
|
|
|
+ for (let i = 0; i < unitArr.length; i++) {
|
|
|
+ if (unitArr[i].id == formData.unitId) {
|
|
|
+ basicUnit = unitArr[i].basicUnit
|
|
|
+ otherUnit = unitArr[i].otherUnit
|
|
|
+ if (unitArr[i].otherUnitTwo) {
|
|
|
+ otherUnitTwo = unitArr[i].otherUnitTwo
|
|
|
+ }
|
|
|
+ if (unitArr[i].otherUnitThree) {
|
|
|
+ otherUnitThree = unitArr[i].otherUnitThree
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!formData.unit) {
|
|
|
+ //此时为多单位
|
|
|
+ if (formData.meList.length < 2) {
|
|
|
+ this.$message.warning('多单位的商品条码行数至少要有两行,请再新增一行条码信息!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (formData.meList[0].commodityUnit != basicUnit) {
|
|
|
+ this.$message.warning(
|
|
|
+ '条码之后的单位填写有误,单位【' +
|
|
|
+ formData.meList[0].commodityUnit +
|
|
|
+ '】请修改为【' +
|
|
|
+ basicUnit +
|
|
|
+ '】!'
|
|
|
+ )
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (formData.meList[1].commodityUnit != otherUnit) {
|
|
|
+ this.$message.warning(
|
|
|
+ '条码之后的单位填写有误,单位【' +
|
|
|
+ formData.meList[1].commodityUnit +
|
|
|
+ '】请修改为【' +
|
|
|
+ otherUnit +
|
|
|
+ '】!'
|
|
|
+ )
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let skuCount = 0
|
|
|
+ for (let i = 0; i < formData.meList.length; i++) {
|
|
|
+ let commodityUnit = formData.meList[i].commodityUnit
|
|
|
+ if (formData.unit) {
|
|
|
+ if (commodityUnit != formData.unit) {
|
|
|
+ this.$message.warning(
|
|
|
+ '条码之后的单位填写有误,单位【' + commodityUnit + '】请修改为【' + formData.unit + '】!'
|
|
|
+ )
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else if (formData.unitId) {
|
|
|
+ if (
|
|
|
+ commodityUnit != basicUnit &&
|
|
|
+ commodityUnit != otherUnit &&
|
|
|
+ commodityUnit != otherUnitTwo &&
|
|
|
+ commodityUnit != otherUnitThree
|
|
|
+ ) {
|
|
|
+ let warnInfo =
|
|
|
+ '条码之后的单位填写有误,单位【' +
|
|
|
+ commodityUnit +
|
|
|
+ '】请修改为【' +
|
|
|
+ basicUnit +
|
|
|
+ '】或【' +
|
|
|
+ otherUnit +
|
|
|
+ '】'
|
|
|
+ if (otherUnitTwo) {
|
|
|
+ warnInfo += '或【' + otherUnitTwo + '】'
|
|
|
+ }
|
|
|
+ if (otherUnitThree) {
|
|
|
+ warnInfo += '或【' + otherUnitThree + '】'
|
|
|
+ }
|
|
|
+ warnInfo += '!'
|
|
|
+ this.$message.warning(warnInfo)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (formData.sku) {
|
|
|
+ skuCount++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //对最低和最高安全库存进行校验
|
|
|
+ for (let i = 0; i < formData.stock.length; i++) {
|
|
|
+ let depotStockObj = formData.stock[i]
|
|
|
+ if (skuCount && depotStockObj.initStock && depotStockObj.initStock - 0) {
|
|
|
+ this.$message.warning('抱歉,多属性商品不能录入期初库存,建议进行盘点录入!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (formData.enableSerialNumber === '1' && depotStockObj.initStock && depotStockObj.initStock - 0) {
|
|
|
+ this.$message.warning('抱歉,序列号商品不能录入期初库存,建议进行入库单据录入!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (formData.enableBatchNumber === '1' && depotStockObj.initStock && depotStockObj.initStock - 0) {
|
|
|
+ this.$message.warning('抱歉,批号商品不能录入期初库存,建议进行入库单据录入!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (depotStockObj.lowSafeStock && depotStockObj.highSafeStock) {
|
|
|
+ if (depotStockObj.lowSafeStock - 0 > depotStockObj.highSafeStock - 0) {
|
|
|
+ this.$message.warning('抱歉,' + depotStockObj.name + '的最低安全库存大于最高安全库存!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //图片校验
|
|
|
+ if (this.fileList && this.fileList.length > 0) {
|
|
|
+ formData.imgName = this.fileList
|
|
|
+ let fileArr = this.fileList.split(',')
|
|
|
+ if (fileArr.length > 4) {
|
|
|
+ this.$message.warning('抱歉,商品图片不能超过4张!')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ formData.imgName = ''
|
|
|
+ }
|
|
|
+ formData.meDeleteIdList = this.meDeleteIdList
|
|
|
+ //接口调用
|
|
|
+ let url = this.url.add,
|
|
|
+ method = 'post'
|
|
|
+ if (this.model.id) {
|
|
|
+ url = this.url.edit
|
|
|
+ method = 'put'
|
|
|
+ }
|
|
|
+ const that = this
|
|
|
+ this.confirmLoading = true
|
|
|
+ httpAction(url, formData, method)
|
|
|
+ .then((res) => {
|
|
|
+ if (res.code === 200) {
|
|
|
+ that.$emit('ok')
|
|
|
+ that.confirmLoading = false
|
|
|
+ that.close()
|
|
|
+ } else {
|
|
|
+ that.$message.warning(res.data.message)
|
|
|
+ that.confirmLoading = false
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .finally(() => {})
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ parseParam(param) {
|
|
|
+ return param ? param : ''
|
|
|
+ },
|
|
|
+ validateBarCode(type, value, row, column, callback, target) {
|
|
|
+ let params = {
|
|
|
+ barCode: value,
|
|
|
+ id: row.id.length >= 20 ? 0 : row.id,
|
|
|
+ }
|
|
|
+ checkMaterialBarCode(params).then((res) => {
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ if (!res.data.status) {
|
|
|
+ callback(true)
|
|
|
+ } else {
|
|
|
+ callback(false, '该条码已经存在')
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback(false, res.data)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ loadTreeData() {
|
|
|
+ let that = this
|
|
|
+ let params = {}
|
|
|
+ params.id = ''
|
|
|
+ queryMaterialCategoryTreeList(params).then((res) => {
|
|
|
+ if (res) {
|
|
|
+ that.categoryTree = []
|
|
|
+ for (let i = 0; i < res.length; i++) {
|
|
|
+ let temp = res[i]
|
|
|
+ that.categoryTree.push(temp)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ loadUnitListData() {
|
|
|
+ let that = this
|
|
|
+ let params = {}
|
|
|
+ params.currentPage = 1
|
|
|
+ params.pageSize = 100
|
|
|
+ getAction('/unit/getAllList', params).then((res) => {
|
|
|
+ if (res) {
|
|
|
+ that.unitList = res.data
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ onManySkuChange(value) {
|
|
|
+ this.manySkuSelected = value.length
|
|
|
+ //控制多属性下拉框中选择项的状态
|
|
|
+ if (value.length < 3) {
|
|
|
+ this.materialAttributeList.forEach((item, index, array) => {
|
|
|
+ array.indexOf(item.value) === -1 ? Vue.set(array[index], 'disabled', false) : ''
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.materialAttributeList.forEach((item, index, array) => {
|
|
|
+ value.indexOf(item.value) === -1 ? Vue.set(array[index], 'disabled', true) : ''
|
|
|
+ })
|
|
|
+ }
|
|
|
+ //更新属性1和属性2和属性3的下拉框
|
|
|
+ if (value.length <= 3) {
|
|
|
+ let skuOneId = value[0]
|
|
|
+ let skuTwoId = value[1]
|
|
|
+ let skuThreeId = value[2]
|
|
|
+ this.materialAttributeList.forEach((item) => {
|
|
|
+ if (item.value === skuOneId) {
|
|
|
+ this.skuOneTitle = item.name
|
|
|
+ }
|
|
|
+ if (item.value === skuTwoId) {
|
|
|
+ this.skuTwoTitle = item.name
|
|
|
+ }
|
|
|
+ if (item.value === skuThreeId) {
|
|
|
+ this.skuThreeTitle = item.name
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if (skuOneId) {
|
|
|
+ getMaterialAttributeValueListById({ id: skuOneId }).then((res) => {
|
|
|
+ this.skuOneList = res ? res : []
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (skuTwoId) {
|
|
|
+ getMaterialAttributeValueListById({ id: skuTwoId }).then((res) => {
|
|
|
+ this.skuTwoList = res ? res : []
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (skuThreeId) {
|
|
|
+ getMaterialAttributeValueListById({ id: skuThreeId }).then((res) => {
|
|
|
+ this.skuThreeList = res ? res : []
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //控制条码列表中的多属性列
|
|
|
+ if (value.length > 0) {
|
|
|
+ this.meTable.columns[2].type = FormTypes.input
|
|
|
+ } else {
|
|
|
+ this.meTable.columns[2].type = FormTypes.hidden
|
|
|
+ }
|
|
|
+ this.barCodeSwitch = false
|
|
|
+ this.meTable.dataSource = []
|
|
|
+ },
|
|
|
+ onSkuChange() {
|
|
|
+ let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
+ let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
+ let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
+ this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
+ },
|
|
|
+ onSkuOneDeSelect(value) {
|
|
|
+ let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
+ let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
+ let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
+ removeByVal(skuOneData, value)
|
|
|
+ this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
+ },
|
|
|
+ onSkuTwoDeSelect(value) {
|
|
|
+ let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
+ let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
+ let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
+ removeByVal(skuTwoData, value)
|
|
|
+ this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
+ },
|
|
|
+ onSkuThreeDeSelect(value) {
|
|
|
+ let skuOneData = this.form.getFieldValue('skuOne')
|
|
|
+ let skuTwoData = this.form.getFieldValue('skuTwo')
|
|
|
+ let skuThreeData = this.form.getFieldValue('skuThree')
|
|
|
+ removeByVal(skuThreeData, value)
|
|
|
+ this.autoSkuList(skuOneData, skuTwoData, skuThreeData)
|
|
|
+ },
|
|
|
+ autoSkuList(skuOneData, skuTwoData, skuThreeData) {
|
|
|
+ let unit = this.form.getFieldValue('unit')
|
|
|
+ if (unit) {
|
|
|
+ //计算多属性已经选择了几个
|
|
|
+ let skuArr = []
|
|
|
+ if (this.getNumByField('skuOne')) {
|
|
|
+ skuArr.push(skuOneData)
|
|
|
+ }
|
|
|
+ if (this.getNumByField('skuTwo')) {
|
|
|
+ skuArr.push(skuTwoData)
|
|
|
+ }
|
|
|
+ if (this.getNumByField('skuThree')) {
|
|
|
+ skuArr.push(skuThreeData)
|
|
|
+ }
|
|
|
+ let skuArrOne = skuArr[0]
|
|
|
+ let skuArrTwo = skuArr[1]
|
|
|
+ let skuArrThree = skuArr[2]
|
|
|
+ let count = this.getNumByField('skuOne') + this.getNumByField('skuTwo') + this.getNumByField('skuThree')
|
|
|
+ let barCodeSku = []
|
|
|
+ if (count === 1) {
|
|
|
+ let skuArrOnly = []
|
|
|
+ if (this.getNumByField('skuOne')) {
|
|
|
+ skuArrOnly = skuOneData
|
|
|
+ } else if (this.getNumByField('skuTwo')) {
|
|
|
+ skuArrOnly = skuTwoData
|
|
|
+ } else if (this.getNumByField('skuThree')) {
|
|
|
+ skuArrOnly = skuThreeData
|
|
|
+ }
|
|
|
+ for (let i = 0; i < skuArrOnly.length; i++) {
|
|
|
+ barCodeSku.push(skuArrOnly[i])
|
|
|
+ }
|
|
|
+ } else if (count === 2) {
|
|
|
+ for (let i = 0; i < skuArrOne.length; i++) {
|
|
|
+ for (let j = 0; j < skuArrTwo.length; j++) {
|
|
|
+ barCodeSku.push(skuArrOne[i] + '/' + skuArrTwo[j])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (count === 3) {
|
|
|
+ for (let i = 0; i < skuArrOne.length; i++) {
|
|
|
+ for (let j = 0; j < skuArrTwo.length; j++) {
|
|
|
+ for (let k = 0; k < skuArrThree.length; k++) {
|
|
|
+ barCodeSku.push(skuArrOne[i] + '/' + skuArrTwo[j] + '/' + skuArrThree[k])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let meTableData = []
|
|
|
+ getMaxBarCode({}).then((res) => {
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ let maxBarCode = res.data.barCode - 0
|
|
|
+ for (let i = 0; i < barCodeSku.length; i++) {
|
|
|
+ let currentBarCode = maxBarCode + i + 1
|
|
|
+ meTableData.push({ barCode: currentBarCode, commodityUnit: unit, sku: barCodeSku[i] })
|
|
|
+ }
|
|
|
+ this.meTable.dataSource = meTableData
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.$message.warning('请填写单位(注意不要勾选多单位)')
|
|
|
+ this.barCodeSwitch = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getNumByField(field) {
|
|
|
+ let num = 0
|
|
|
+ if (this.form.getFieldValue(field)) {
|
|
|
+ if (this.form.getFieldValue(field).length > 0) {
|
|
|
+ num = 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return num
|
|
|
+ },
|
|
|
+ onAdded(event) {
|
|
|
+ const { row, target } = event
|
|
|
+ target.setValues([{ rowKey: row.id, values: { barCode: '', commodityUnit: '' } }])
|
|
|
+ },
|
|
|
+ onDeleted(value) {
|
|
|
+ this.meDeleteIdList = value
|
|
|
+ },
|
|
|
+ //单元值改变一个字符就触发一次
|
|
|
+ onValueChange(event) {
|
|
|
+ console.log('onValueChange--------table-change', event)
|
|
|
+ const { type, row, column, value, target } = event
|
|
|
+ switch (column.key) {
|
|
|
+ case 'purchaseDecimal':
|
|
|
+ case 'commodityDecimal':
|
|
|
+ case 'wholesaleDecimal':
|
|
|
+ case 'lowDecimal':
|
|
|
+ this.changeDecimalByValue(row)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //修改商品明细中的价格触发计算
|
|
|
+ changeDecimalByValue(row) {
|
|
|
+ let unitArr = this.unitList
|
|
|
+ let basicUnit = '',
|
|
|
+ otherUnit = '',
|
|
|
+ ratio = 1,
|
|
|
+ otherUnitTwo = '',
|
|
|
+ ratioTwo = 1,
|
|
|
+ otherUnitThree = '',
|
|
|
+ ratioThree = 1
|
|
|
+ for (let i = 0; i < unitArr.length; i++) {
|
|
|
+ if (unitArr[i].id === this.form.getFieldValue('unitId')) {
|
|
|
+ basicUnit = unitArr[i].basicUnit
|
|
|
+ otherUnit = unitArr[i].otherUnit
|
|
|
+ ratio = unitArr[i].ratio
|
|
|
+ if (unitArr[i].otherUnitTwo) {
|
|
|
+ otherUnitTwo = unitArr[i].otherUnitTwo
|
|
|
+ ratioTwo = unitArr[i].ratioTwo
|
|
|
+ }
|
|
|
+ if (unitArr[i].otherUnitThree) {
|
|
|
+ otherUnitThree = unitArr[i].otherUnitThree
|
|
|
+ ratioThree = unitArr[i].ratioThree
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (row.commodityUnit === basicUnit) {
|
|
|
+ this.$refs.editableMeTable.getValues((error, values) => {
|
|
|
+ let mArr = values,
|
|
|
+ basicPurchaseDecimal = '',
|
|
|
+ basicCommodityDecimal = '',
|
|
|
+ basicWholesaleDecimal = '',
|
|
|
+ basicLowDecimal = ''
|
|
|
+ for (let i = 0; i < mArr.length; i++) {
|
|
|
+ let mInfo = mArr[i]
|
|
|
+ if (i === 0) {
|
|
|
+ basicPurchaseDecimal = mInfo.purchaseDecimal
|
|
|
+ basicCommodityDecimal = mInfo.commodityDecimal
|
|
|
+ basicWholesaleDecimal = mInfo.wholesaleDecimal
|
|
|
+ basicLowDecimal = mInfo.lowDecimal
|
|
|
+ } else {
|
|
|
+ //副单位进行换算
|
|
|
+ if (basicPurchaseDecimal) {
|
|
|
+ mInfo.purchaseDecimal = (basicPurchaseDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicCommodityDecimal) {
|
|
|
+ mInfo.commodityDecimal = (basicCommodityDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicWholesaleDecimal) {
|
|
|
+ mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicLowDecimal) {
|
|
|
+ mInfo.lowDecimal = (basicLowDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (otherUnitTwo && i === 2) {
|
|
|
+ if (basicPurchaseDecimal) {
|
|
|
+ mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicCommodityDecimal) {
|
|
|
+ mInfo.commodityDecimal = (basicCommodityDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicWholesaleDecimal) {
|
|
|
+ mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicLowDecimal) {
|
|
|
+ mInfo.lowDecimal = (basicLowDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (otherUnitThree && i === 3) {
|
|
|
+ if (basicPurchaseDecimal) {
|
|
|
+ mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicCommodityDecimal) {
|
|
|
+ mInfo.commodityDecimal = (basicCommodityDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicWholesaleDecimal) {
|
|
|
+ mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicLowDecimal) {
|
|
|
+ mInfo.lowDecimal = (basicLowDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.meTable.dataSource = mArr
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ batchSetPrice(type) {
|
|
|
+ if (this.manySkuSelected > 0 || this.model.id) {
|
|
|
+ this.$refs.priceModalForm.add(type)
|
|
|
+ this.$refs.priceModalForm.disableSubmit = false
|
|
|
+ } else {
|
|
|
+ this.$message.warning('抱歉,只有开启多属性才能进行批量操作!')
|
|
|
+ }
|
|
|
+ },
|
|
|
+ batchSetStock(type) {
|
|
|
+ this.$refs.stockModalForm.add(type)
|
|
|
+ this.$refs.stockModalForm.disableSubmit = false
|
|
|
+ },
|
|
|
+ batchSetPriceModalFormOk(price, batchType) {
|
|
|
+ let arr = this.meTable.dataSource
|
|
|
+ if (arr.length === 0) {
|
|
|
+ this.$message.warning('请先录入条码、单位等信息!')
|
|
|
+ } else {
|
|
|
+ let meTableData = []
|
|
|
+ for (let i = 0; i < arr.length; i++) {
|
|
|
+ let meInfo = {
|
|
|
+ barCode: arr[i].barCode,
|
|
|
+ commodityUnit: arr[i].commodityUnit,
|
|
|
+ sku: arr[i].sku,
|
|
|
+ purchaseDecimal: arr[i].purchaseDecimal,
|
|
|
+ commodityDecimal: arr[i].commodityDecimal,
|
|
|
+ wholesaleDecimal: arr[i].wholesaleDecimal,
|
|
|
+ lowDecimal: arr[i].lowDecimal,
|
|
|
+ }
|
|
|
+ if (batchType === 'purchase') {
|
|
|
+ meInfo.purchaseDecimal = price - 0
|
|
|
+ } else if (batchType === 'commodity') {
|
|
|
+ meInfo.commodityDecimal = price - 0
|
|
|
+ } else if (batchType === 'wholesale') {
|
|
|
+ meInfo.wholesaleDecimal = price - 0
|
|
|
+ } else if (batchType === 'low') {
|
|
|
+ meInfo.lowDecimal = price - 0
|
|
|
+ }
|
|
|
+ if (arr[i].id) {
|
|
|
+ meInfo.id = arr[i].id
|
|
|
+ }
|
|
|
+ meTableData.push(meInfo)
|
|
|
+ }
|
|
|
+ this.meTable.dataSource = meTableData
|
|
|
+ }
|
|
|
+ },
|
|
|
+ batchSetStockModalFormOk(stock, batchType) {
|
|
|
+ let arr = this.depotTable.dataSource
|
|
|
+ let depotTableData = []
|
|
|
+ for (let i = 0; i < arr.length; i++) {
|
|
|
+ let depotInfo = {
|
|
|
+ name: arr[i].name,
|
|
|
+ initStock: arr[i].initStock,
|
|
|
+ lowSafeStock: arr[i].lowSafeStock,
|
|
|
+ highSafeStock: arr[i].highSafeStock,
|
|
|
+ }
|
|
|
+ if (batchType === 'initStock') {
|
|
|
+ depotInfo.initStock = stock - 0
|
|
|
+ } else if (batchType === 'lowSafeStock') {
|
|
|
+ depotInfo.lowSafeStock = stock - 0
|
|
|
+ } else if (batchType === 'highSafeStock') {
|
|
|
+ depotInfo.highSafeStock = stock - 0
|
|
|
+ }
|
|
|
+ if (arr[i].id) {
|
|
|
+ depotInfo.id = arr[i].id
|
|
|
+ }
|
|
|
+ depotTableData.push(depotInfo)
|
|
|
+ }
|
|
|
+ this.depotTable.dataSource = depotTableData
|
|
|
+ },
|
|
|
+ initMaterialAttribute() {
|
|
|
+ getMaterialAttributeNameList().then((res) => {
|
|
|
+ if (res) {
|
|
|
+ this.materialAttributeList = res
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ loadParseMaterialProperty() {
|
|
|
+ let mpList = Vue.ls.get('materialPropertyList')
|
|
|
+ for (let i = 0; i < mpList.length; i++) {
|
|
|
+ if (mpList[i].nativeName === '制造商') {
|
|
|
+ this.mpShort.mfrs.name = mpList[i].anotherName
|
|
|
+ this.mpShort.mfrs.enabled = mpList[i].enabled
|
|
|
+ }
|
|
|
+ if (mpList[i].nativeName === '自定义1') {
|
|
|
+ this.mpShort.otherField1.name = mpList[i].anotherName
|
|
|
+ this.mpShort.otherField1.enabled = mpList[i].enabled
|
|
|
+ }
|
|
|
+ if (mpList[i].nativeName === '自定义2') {
|
|
|
+ this.mpShort.otherField2.name = mpList[i].anotherName
|
|
|
+ this.mpShort.otherField2.enabled = mpList[i].enabled
|
|
|
+ }
|
|
|
+ if (mpList[i].nativeName === '自定义3') {
|
|
|
+ this.mpShort.otherField3.name = mpList[i].anotherName
|
|
|
+ this.mpShort.otherField3.enabled = mpList[i].enabled
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handleNameChange(e) {
|
|
|
+ let that = this
|
|
|
+ if (e.target.value) {
|
|
|
+ if (this.setTimeFlag != null) {
|
|
|
+ clearTimeout(this.setTimeFlag)
|
|
|
+ }
|
|
|
+ this.setTimeFlag = setTimeout(() => {
|
|
|
+ changeNameToPinYin({ name: e.target.value }).then((res) => {
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ that.form.setFieldsValue({ mnemonic: res.data })
|
|
|
+ } else {
|
|
|
+ that.$message.warning(res.data)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }, 500)
|
|
|
+ } else {
|
|
|
+ that.form.setFieldsValue({ mnemonic: '' })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onlyUnitOnChange(e) {
|
|
|
+ if (e.target.value) {
|
|
|
+ //单位有填写了之后则显示多属性的文本框
|
|
|
+ this.manySkuStatus = true
|
|
|
+ } else {
|
|
|
+ this.manySkuStatus = false
|
|
|
+ }
|
|
|
+ this.$refs.editableMeTable.getValues((error, values) => {
|
|
|
+ let mArr = values
|
|
|
+ for (let i = 0; i < mArr.length; i++) {
|
|
|
+ let mInfo = mArr[i]
|
|
|
+ mInfo.commodityUnit = e.target.value
|
|
|
+ }
|
|
|
+ this.meTable.dataSource = mArr
|
|
|
+ })
|
|
|
+ },
|
|
|
+ manyUnitOnChange(value) {
|
|
|
+ let unitArr = this.unitList
|
|
|
+ let basicUnit = '',
|
|
|
+ otherUnit = '',
|
|
|
+ ratio = 1,
|
|
|
+ otherUnitTwo = '',
|
|
|
+ ratioTwo = 1,
|
|
|
+ otherUnitThree = '',
|
|
|
+ ratioThree = 1
|
|
|
+ for (let i = 0; i < unitArr.length; i++) {
|
|
|
+ if (unitArr[i].id === value) {
|
|
|
+ basicUnit = unitArr[i].basicUnit
|
|
|
+ otherUnit = unitArr[i].otherUnit
|
|
|
+ ratio = unitArr[i].ratio
|
|
|
+ if (unitArr[i].otherUnitTwo) {
|
|
|
+ otherUnitTwo = unitArr[i].otherUnitTwo
|
|
|
+ ratioTwo = unitArr[i].ratioTwo
|
|
|
+ }
|
|
|
+ if (unitArr[i].otherUnitThree) {
|
|
|
+ otherUnitThree = unitArr[i].otherUnitThree
|
|
|
+ ratioThree = unitArr[i].ratioThree
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.$refs.editableMeTable.getValues((error, values) => {
|
|
|
+ let mArr = values,
|
|
|
+ basicPurchaseDecimal = '',
|
|
|
+ basicCommodityDecimal = '',
|
|
|
+ basicWholesaleDecimal = '',
|
|
|
+ basicLowDecimal = ''
|
|
|
+ for (let i = 0; i < mArr.length; i++) {
|
|
|
+ let mInfo = mArr[i]
|
|
|
+ if (i === 0) {
|
|
|
+ mInfo.commodityUnit = basicUnit
|
|
|
+ basicPurchaseDecimal = mInfo.purchaseDecimal
|
|
|
+ basicCommodityDecimal = mInfo.commodityDecimal
|
|
|
+ basicWholesaleDecimal = mInfo.wholesaleDecimal
|
|
|
+ basicLowDecimal = mInfo.lowDecimal
|
|
|
+ } else {
|
|
|
+ //副单位进行换算
|
|
|
+ mInfo.commodityUnit = otherUnit
|
|
|
+ if (basicPurchaseDecimal) {
|
|
|
+ mInfo.purchaseDecimal = (basicPurchaseDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicCommodityDecimal) {
|
|
|
+ mInfo.commodityDecimal = (basicCommodityDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicWholesaleDecimal) {
|
|
|
+ mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicLowDecimal) {
|
|
|
+ mInfo.lowDecimal = (basicLowDecimal * ratio).toFixed(2)
|
|
|
+ }
|
|
|
+ if (otherUnitTwo && i === 2) {
|
|
|
+ mInfo.commodityUnit = otherUnitTwo
|
|
|
+ if (basicPurchaseDecimal) {
|
|
|
+ mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicCommodityDecimal) {
|
|
|
+ mInfo.commodityDecimal = (basicCommodityDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicWholesaleDecimal) {
|
|
|
+ mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicLowDecimal) {
|
|
|
+ mInfo.lowDecimal = (basicLowDecimal * ratioTwo).toFixed(2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (otherUnitThree && i === 3) {
|
|
|
+ mInfo.commodityUnit = otherUnitThree
|
|
|
+ if (basicPurchaseDecimal) {
|
|
|
+ mInfo.purchaseDecimal = (basicPurchaseDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicCommodityDecimal) {
|
|
|
+ mInfo.commodityDecimal = (basicCommodityDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicWholesaleDecimal) {
|
|
|
+ mInfo.wholesaleDecimal = (basicWholesaleDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ if (basicLowDecimal) {
|
|
|
+ mInfo.lowDecimal = (basicLowDecimal * ratioThree).toFixed(2)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.meTable.dataSource = mArr
|
|
|
+ })
|
|
|
+ },
|
|
|
+ unitOnChange(e) {
|
|
|
+ let isChecked = e.target.checked
|
|
|
+ if (isChecked) {
|
|
|
+ this.unitStatus = true
|
|
|
+ this.manyUnitStatus = false
|
|
|
+ this.unitChecked = true
|
|
|
+ } else {
|
|
|
+ this.unitStatus = false
|
|
|
+ this.manyUnitStatus = true
|
|
|
+ this.unitChecked = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ addUnit() {
|
|
|
+ this.$refs.unitModalForm.add()
|
|
|
+ this.$refs.unitModalForm.title = '新增多单位'
|
|
|
+ this.$refs.unitModalForm.disableSubmit = false
|
|
|
+ },
|
|
|
+ unitModalFormOk() {
|
|
|
+ this.loadUnitListData()
|
|
|
+ },
|
|
|
+ },
|
|
|
+}
|
|
|
+</script>
|
|
|
+<style scoped>
|
|
|
+.input-table {
|
|
|
+ max-width: 100%;
|
|
|
+ min-width: 1200px;
|
|
|
+}
|
|
|
+.tag-info {
|
|
|
+ font-size: 14px;
|
|
|
+ height: 32px;
|
|
|
+ line-height: 32px;
|
|
|
+ width: 100%;
|
|
|
+ padding: 0px 11px;
|
|
|
+ color: #bbb;
|
|
|
+ background-color: #ffffff;
|
|
|
+}
|
|
|
+</style>
|