Browse Source

feat:组合商品库存添加解除详情

snow 1 year ago
parent
commit
e75e96f50f

+ 11 - 0
src/apis/components/details.js

@@ -0,0 +1,11 @@
+// 物业管理员
+import http from '@/apis/axios'
+
+const api = 'admin/'
+export default {
+  stockinfo: (data, params) => http(api + 'wareinfo', data, 'post', params),
+  productinfo: (data, params) => http(api + 'goodupinfo', data, 'post', params),
+  area: (data, params) => http(api + 'area', data, 'post', params),
+  city: (data, params) => http(api + 'city', data, 'post', params),
+  province: (data, params) => http(api + 'province', data, 'post', params)
+}

+ 0 - 0
src/components/details/index.js


+ 249 - 0
src/components/details/src/columns.js

@@ -0,0 +1,249 @@
+export const productColumns = [
+  {
+    prop: "cat_info",
+    label: "商品分类",
+    span: 8,
+    _slot_: "cat_info",
+  },
+  {
+    prop: "good_img",
+    label: "商品主图",
+    _slot_: "good_img",
+    span: 8,
+  },
+  {
+    prop: "good_info_img",
+    _slot_: "good_info_img",
+    label: "详情图片",
+    span: 8,
+  },
+  {
+    prop: "good_name",
+    label: "商品名称",
+    _slot_: "good_name",
+    span: 24,
+  },
+  {
+    prop: "company",
+    label: "业务公司",
+    span: 12,
+  },
+  {
+    prop: "supplierName",
+    label: "供应商",
+    span: 12,
+  },
+  {
+    prop: "brand_name",
+    label: "商品品牌",
+    span: 6,
+  },
+  {
+    prop: "is_auth",
+    label: "销售权限",
+    _slot_: "is_auth",
+    span: 6,
+  },
+  {
+    prop: "unit",
+    label: "单位",
+    span: 6,
+  },
+  {
+    prop: "tax",
+    label: "税点",
+    _slot_: "tax",
+    span: 6,
+  },
+  {
+    prop: "is_exclusive",
+    label: "专属类型",
+    _slot_: "is_exclusive",
+    span: 6,
+  },
+  {
+    prop: "weight",
+    label: "商品总重量",
+    _slot_: "weight",
+    span: 6,
+  },
+  {
+    prop: "is_stock",
+    label: "是否库存品",
+    _slot_: "is_stock",
+    span: 6,
+  },
+  {
+    prop: "is_combind",
+    label: "组合类型",
+    _slot_: "is_combind",
+    span: 6,
+  },
+  {
+    prop: "noble",
+    _slot_: "noble",
+    label: "贵金属信息",
+    span: 24,
+  },
+  {
+    prop: "after_sales",
+    label: "售后说明",
+    span: 24,
+  },
+  {
+    prop: "good_remark",
+    label: "商品备注",
+    span: 24,
+  },
+  {
+    prop: "craft_desc",
+    label: "工艺说明",
+    span: 24,
+  },
+  {
+    prop: "packing_way",
+    label: "包装方式",
+    span: 6,
+  },
+  {
+    prop: "packing_spec",
+    label: "装箱规格",
+    span: 6,
+  },
+  {
+    prop: "packing_weight",
+    label: "装箱重量",
+    _slot_: "packing_weight",
+    span: 6,
+  },
+  {
+    prop: "packing_size",
+    label: "装箱尺寸",
+    span: 6,
+  },
+  {
+    prop: "good_size",
+    label: "装箱尺寸",
+    span: 6,
+  },
+  {
+    prop: "good_bar",
+    label: "商品条形码",
+    span: 6,
+  },
+  {
+    prop: "packing_list",
+    label: "商品清单",
+    span: 12,
+  },
+  {
+    prop: "packing_spec",
+    label: "供货区域",
+    span: 6,
+    _slot_: "packing_spec",
+  },
+  {
+    prop: "delivery_day",
+    label: "物流天数",
+    _slot_: "delivery_day",
+    span: 6,
+  },
+  {
+    prop: "lead_time",
+    label: "供货周期",
+    _slot_: "lead_time",
+    span: 6,
+  },
+  {
+    prop: "sample_day",
+    label: "调样周期",
+    _slot_: "sample_day",
+    span: 6,
+  },
+  {
+    prop: "delivery_place",
+    label: "发货地",
+    span: 12,
+    _slot_: "delivery_place",
+  },
+  {
+    prop: "origin_place",
+    label: "产地",
+    span: 12,
+    _slot_: "origin_place",
+  },
+];
+
+export const stockColumns = [
+  {
+    title:"仓库信息"
+  },
+  {
+    label: "仓库名称",
+    prop: "name",
+    span: "12",
+  },
+  {
+    label: "仓库负责人",
+    prop: "contactor_name",
+    span: "6",
+  },
+  {
+    label: "负责人电话",
+    prop: "mobile",
+    span: "6",
+  },
+  {
+    label: "所在业务公司",
+    prop: "companyName",
+    span: "12",
+  },
+  {
+    label: "所在供应商公司",
+    prop: "supplierName",
+    span: "12",
+  },
+  {
+    label: "仓库所在省市区",
+    prop: "source",
+    span: 12,
+  },
+  {
+    label: "仓库所在详细地址",
+    prop: "addr",
+    span: 6,
+  },
+  {
+    label: "仓库类型",
+    prop: "type_name",
+    span: 6,
+  },
+  {
+    title:"收发货信息"
+  },
+  {
+    label: "收发货联系人",
+    prop: "wsm_name",
+    span: 6,
+  },
+  {
+    label: "联系人职位",
+    prop: "position",
+    span: 6,
+  },
+  {
+    label: "联系人电话",
+    prop: "wsm_mobile",
+    span: 12,
+  },
+  {
+    label: "省市区",
+    prop: "target",
+    span: 12,
+  },
+  {
+    label: "详细地址",
+    prop: "wsm_addr",
+    span: 12,
+  },
+];

+ 176 - 0
src/components/details/src/product.vue

@@ -0,0 +1,176 @@
+<template>
+  <show-data-table border :columns="productColumns" :sitem="productinfo" v-loading="loading">
+    <template slot="packing_spec">
+      <el-tag
+        v-if="productinfo"
+        size="mini"
+      >{{ ( options6.find(({id}) => id === productinfo.supply_area) || {}).name || '--' }}</el-tag>
+    </template>
+
+    <template slot="is_auth">
+      <el-tag
+        v-if="productinfo"
+        size="mini"
+      >{{ ( options3.find(({id}) => id === productinfo.is_auth) || {}).name || '--' }}</el-tag>
+    </template>
+
+    <template slot="good_info_img">
+      <div style="max-height: 24px; overflow: hidden" v-if="productinfo">
+        <el-image
+          style="height: 24px; width: 24px"
+          :src="productinfo.good_info_img"
+          :preview-src-list="[productinfo.good_info_img]"
+        />
+      </div>
+    </template>
+
+    <template slot="cat_info">
+      <span v-if="productinfo">
+        {{
+        productinfo.cat_info
+        ? productinfo.cat_info.map(({ name }) => name).join("_")
+        : "--"
+        }}
+      </span>
+    </template>
+
+    <template slot="is_combind">
+      <span v-if="productinfo">
+        {{
+        String(productinfo.is_combind) === '1' ? '组合商品' : '非组合商品'
+        }}
+      </span>
+    </template>
+
+    <template slot="good_name">
+      <img
+        v-if="productinfo.good_thumb_img"
+        v-viewer
+        style="width: 23px; height: 23px; margin: 0 5px 0 0"
+        class="fl"
+        :src="productinfo.good_thumb_img"
+        alt
+      />
+      <span>{{ productinfo.good_name }}</span>
+      <span v-for="(si, i) in productinfo.speclist" :key="si.spec_id + i">
+        <span v-if="i !== 0">-</span>
+        <span v-else>_</span>
+        <span>{{ si.spec_name }}[{{ si.spec_value }}]</span>
+      </span>
+      <el-popover placement="top" width="300" trigger="hover">
+        <ul>
+          <li v-if="newTime !== '' && isDisplayPrivateField('1')">
+            <span>商品成本编号:</span>
+            <span>{{ productinfo.spuCode }}</span>
+          </li>
+        </ul>
+        <i slot="reference" class="el-icon-warning-outline fr" />
+      </el-popover>
+    </template>
+
+    <template slot="noble">
+      <span v-if="productinfo.noble_metal">
+        {{ productinfo.noble_weight ? productinfo.noble_weight : "0" }}g-{{
+        productinfo.noble_name
+        }}-{{ productinfo.gold_price ? productinfo.gold_price : "0" }}元/g-{{
+        productinfo.is_gold_price + "" === "0" ? "不" : ""
+        }}启用实时金价-{{ productinfo.is_diff + "" === "1" ? "有" : "无" }}工差-{{
+        productinfo.config
+        }}-{{ productinfo.other_config }}
+      </span>
+    </template>
+
+    <template slot="weight">{{ productinfo.weight }}g</template>
+    <template slot="tax">{{ productinfo.tax }}%</template>
+    <template slot="is_stock">{{ String(productinfo.is_stock) === "0" ? "非库存品" : "库存品" }}</template>
+    <template slot="is_exclusive">{{ String(productinfo.is_exclusive) === "0" ? "非泰康" : "泰康" }}</template>
+    <template slot="noble_weight">{{ productinfo.noble_weight }}g</template>
+    <template slot="is_gold_price">
+      {{
+      String(productinfo.is_gold_price) === "1" ? "是" : "否"
+      }}
+    </template>
+    <template slot="is_diff">
+      {{
+      String(productinfo.is_diff) === "1" ? "有公差" : "无工差"
+      }}
+    </template>
+
+    <template slot="packing_weight">{{ productinfo.packing_weight }}g</template>
+
+    <template slot="delivery_day">{{ productinfo.delivery_day }}天</template>
+    <template slot="lead_time">{{ productinfo.lead_time }}天</template>
+    <template slot="sample_day">{{ productinfo.sample_day }}天</template>
+    <template slot="delivery_place">{{ delivery_place }}</template>
+    <template slot="origin_place">{{ origin_place }}</template>
+  </show-data-table>
+</template>
+
+
+<script>
+import { productColumns } from "./columns";
+import asyncRequest from "@/apis/components/details";
+import privateField from "@/mixins/privateField";
+
+export default {
+  name: "Product",
+  props: ["spuCode"],
+  mixins: [privateField],
+  data() {
+    return {
+      productColumns,
+      productinfo: {},
+      loading: false,
+      options6: [
+        { id: "1", name: "全国" },
+        { id: "2", name: "全国除偏远" }
+      ],
+      options3: [
+        { id: "0", name: "无销售权限" },
+        { id: "1", name: "有销售权限" }
+      ]
+    };
+  },
+  watch: {
+    spuCode: {
+      handler(spuCode) {
+        this.initData(spuCode);
+      },
+      immediate: true
+    }
+  },
+  methods: {
+    async getArea(prop = "delivery_place") {
+      const chunks = this.productinfo[prop].split(",");
+      let { data: province } = await asyncRequest.province();
+      province = province.find(
+        ({ province_code }) => province_code === chunks[0]
+      );
+      let { data: city } = await asyncRequest.city({ code: chunks[0] });
+      city = city.find(({ city_code }) => city_code === chunks[1]);
+      let { data: area } = await asyncRequest.area({ code: chunks[1] });
+      area = area.find(({ area_code }) => area_code === chunks[2]) || {};
+      return [province, city, area].map(({ name }) => name).join("");
+    },
+    async initData(spuCode) {
+      this.loading = true;
+      const { code, data } = await asyncRequest.productinfo({ spuCode });
+      this.loading = false;
+      if (code !== 0) return;
+      this.productinfo = data;
+
+      (data.combind_list || []).forEach(item => {
+        this.ruleForm.usable_stock = add_sum(
+          this.ruleForm.usable_stock || 0,
+          item.usable_stock || 0
+        );
+      });
+
+      this.ruleForm.spuCode = spuCode;
+      this.delivery_place = await this.getArea("delivery_place");
+      this.origin_place = await this.getArea("origin_place");
+      this.loading.product = false;
+    }
+  }
+};
+</script>

+ 63 - 0
src/components/details/src/stock.vue

@@ -0,0 +1,63 @@
+<template>
+  <show-data-table border :columns="stockColumns" :sitem="stockinfo" v-loading="loading" />
+</template>
+
+<script>
+import asyncRequest from "@/apis/components/details";
+import { stockColumns } from "./columns";
+export default {
+  name: "StockDetail",
+  data() {
+    return {
+      stockColumns,
+      loading: false,
+      stockinfo: {}
+    };
+  },
+  watch: {
+    wsm_code: {
+      handler() {
+        this.initData();
+      },
+      immediate: true
+    }
+  },
+  methods: {
+    async initData(wsm_code) {
+      this.loading = true;
+      const { code, data } = await asyncRequest.stockinfo({ wsm_code });
+      if (code !== 0) return;
+      const { addr_code, addrs_code } = data;
+
+      const { city_code: sourceCodeL2, area_code: sourceCodeL3 } = addr_code;
+      const { city_code: targetCodeL2, area_code: targetCodeL3 } = addrs_code;
+
+      const { code: _co1, data: _d1 } = await asyncRequest.addrquery({
+        code: sourceCodeL2,
+        level: 3
+      });
+
+      const { code: _co2, data: _d2 } = await asyncRequest.addrquery({
+        code: targetCodeL2,
+        level: 3
+      });
+
+      this.loading = false;
+
+      if (_co1 === 0) {
+        const d1 = _d1.find(item => item.code === sourceCodeL3);
+        const { area: _a1, city: _c1, province: _p1 } = (d1 || {}).info || {};
+        data.source = [_p1, _c1, _a1].map(({ name }) => name).join("");
+      }
+
+      if (_co2 === 0) {
+        const d2 = _d2.find(item => item.code === targetCodeL3);
+        const { area: _a2, city: _c2, province: _p2 } = (d2 || {}).info || {};
+        data.target = [_p2, _c2, _a2].map(({ name }) => name).join("");
+      }
+
+      this.stockinfo = data;
+    }
+  }
+};
+</script>

+ 19 - 16
src/views/sellOut/combinedAdd/detail.vue

@@ -9,7 +9,7 @@
             </el-collapse-item>
 
             <template v-else>
-              <el-collapse-item title="组合商品详情" name="2" v-if="sitem">
+              <el-collapse-item title="库存添加申请详情" name="2" v-if="sitem">
                 <show-data-table :sitem="sitem" :newTime="newTime" :columns="detailColumns">
                   <template #status>
                     <el-tag
@@ -26,6 +26,14 @@
                 </show-data-table>
               </el-collapse-item>
 
+              <el-collapse-item title="组合商品详情" name="5" v-if="sitem">
+                <ProductDetail :spuCode="sitem.spuCode" />
+              </el-collapse-item>
+
+              <!-- <el-collapse-item title="仓库信息" name="6" v-if="sitem">
+                <StockDetail :wsmCode="sitem.wsm_code" />
+              </el-collapse-item>-->
+
               <el-collapse-item title="子商品信息" name="4">
                 <el-table :data="sitem ? sitem.combindgood : []" size="mini" border>
                   <el-table-column label="子商品成本编号" prop="childCode" min-width="160px" />
@@ -52,7 +60,7 @@
               </el-collapse-item>
 
               <el-collapse-item
-                v-if="Number(sitem.status) === 1 && !isSupertube"
+                v-if="sitem && Number(sitem.status) === 1 && !isSupertube"
                 title="待审核"
                 name="3"
               >
@@ -73,8 +81,10 @@
 </template>
 <script>
 import asyncRequest from "@/apis/service/sellOut/combinedAdd";
+import ProductDetail from "@/components/details/src/product.vue";
+import StockDetail from "@/components/details/src/stock.vue";
 import { xs_order_type_options } from "@/assets/js/statusList";
-import { showColumns, detailColumns } from "./columns";
+import { showColumns, detailColumns, productColumns } from "./columns";
 import WaitApproval from "./components/waitApproval";
 import mixinPage from "@/mixins/elPaginationHandle";
 import BaseForm from "./components/baseForm";
@@ -83,7 +93,7 @@ import { mapGetters } from "vuex";
 export default {
   name: "combinedAddDetail",
   mixins: [mixinPage, resToken],
-  components: { BaseForm, WaitApproval },
+  components: { BaseForm, WaitApproval, ProductDetail, StockDetail },
   computed: {
     ...mapGetters(["isSupertube"]),
     type() {
@@ -103,6 +113,8 @@ export default {
   },
   data() {
     return {
+      productinfo: null,
+      productColumns,
       showModel: false,
       showColumns: showColumns,
       activeTabs: "1",
@@ -125,18 +137,6 @@ export default {
         }
       ],
       wsm_options: [
-        // {
-        //   value: "1",
-        //   label: "系统仓",
-        // },
-        //   {
-        //   value: "2",
-        //   label: "虚拟仓",
-        // },
-        //     {
-        //   value: "3",
-        //   label: "自建仓",
-        // },
         {
           value: "5",
           label: "销售仓"
@@ -156,6 +156,9 @@ export default {
           label: "不接受工差-退回重做"
         }
       ],
+      loading: {
+        product: false
+      },
       sitem: null,
       status: "",
       newTime: "",

+ 5 - 2
src/views/sellOut/combinedRemove/components/baseForm.vue

@@ -49,7 +49,7 @@
       </el-col>
 
       <el-col :span="12">
-        <el-form-item label="可解除库存数" label-width="110px">
+        <el-form-item label="可解除库存数" label-width="110px">
           <digital-input
             :values="ruleForm.usable_stock"
             :placeholder="'可解除库存数'"
@@ -105,7 +105,7 @@ import asyncRequest from "@/apis/service/sellOut/combinedAdd";
 import { stockColumns, productColumns } from "./columnsForm";
 import privateField from "@/mixins/privateField";
 import { detailColumns } from "./../columns";
-import { isnumber } from "@/utils/validate";
+import { isnumber, add_sum } from "@/utils/validate";
 
 const validateNum = (rule, value, callback) => {
   if (value === "") {
@@ -212,6 +212,9 @@ export default {
     async handleProductSelected(id) {
       this.loading.product = true;
       const { code, data } = await asyncRequest.detail({ id });
+      (data.combindgood || []).forEach(({ stock }) => {
+        this.ruleForm.usable_stock = add_sum(stock, this.ruleForm.usable_stock);
+      });
       if (code !== 0) return;
       this.productinfo = data;
       this.ruleForm.spuCode = data.spuCode;

+ 10 - 3
src/views/sellOut/combinedRemove/detail.vue

@@ -9,7 +9,7 @@
             </el-collapse-item>
 
             <template v-else>
-              <el-collapse-item title="组合商品详情" name="2" v-if="sitem">
+              <el-collapse-item title="库存解除申请详情" name="2" v-if="sitem">
                 <show-data-table :sitem="sitem" :newTime="newTime" :columns="detailColumns_j">
                   <template #status>
                     <el-tag
@@ -26,6 +26,10 @@
                 </show-data-table>
               </el-collapse-item>
 
+              <el-collapse-item title="组合商品详情" name="5" v-if="sitem">
+                <ProductDetail :spuCode="sitem.spuCode" />
+              </el-collapse-item>
+
               <el-collapse-item title="子商品信息" name="4">
                 <el-table :data="sitem ? sitem.combindgood : []" size="mini" border>
                   <el-table-column label="子商品成本编号" prop="childCode" min-width="160px" />
@@ -72,6 +76,7 @@
   </div>
 </template>
 <script>
+import ProductDetail from "@/components/details/src/product.vue";
 import asyncRequest from "@/apis/service/sellOut/combinedAdd";
 import { xs_order_type_options } from "@/assets/js/statusList";
 import { showColumns, detailColumns_j } from "./columns";
@@ -83,7 +88,7 @@ import { mapGetters } from "vuex";
 export default {
   name: "combinedRemoveDetail",
   mixins: [mixinPage, resToken],
-  components: { BaseForm, WaitApproval },
+  components: { BaseForm, WaitApproval, ProductDetail },
   computed: {
     ...mapGetters(["isSupertube"]),
     type() {
@@ -91,7 +96,9 @@ export default {
     },
     title() {
       const { query } = this.$route;
-      return query.id === "add" ? "新建组合商品库存申请" : "组合商品库存详情";
+      return query.id === "add"
+        ? "新建组合商品库存解除申请"
+        : "组合商品库存详情";
     },
     powers() {
       const { btnList } = this.$store.getters;