Parcourir la source

【新增】零售订单

莫绍宝 il y a 3 ans
Parent
commit
2849d8e03f
2 fichiers modifiés avec 286 ajouts et 48 suppressions
  1. 27 0
      src/api/supply/retail.js
  2. 259 48
      src/views/supply/retail/components/retail_form.vue

+ 27 - 0
src/api/supply/retail.js

@@ -88,4 +88,31 @@ export function getGoodsList(params) {
     method: 'get',
     params
   })
+}
+
+// 获取钱包列表
+export function getWalletList(params) {
+  return request({
+    url: '/wallet/customer/list',
+    method: 'get',
+    params
+  })
+}
+
+// 获取仓库列表
+export function getWarehouseList(params) {
+  return request({
+    url: '/stock/listStock',
+    method: 'get',
+    params
+  })
+}
+
+// 检查库存
+export function checkStock(params) {
+  return request({
+    url: '/stock/manager/stockStatus',
+    method: 'get',
+    params
+  })
 }

+ 259 - 48
src/views/supply/retail/components/retail_form.vue

@@ -6,7 +6,7 @@
       <div class="title">订单信息</div>
     </div>
 
-    <el-form ref="mainForm" :model="mainForm" label-width="70px" size="small" label-position="left">
+    <el-form ref="mainForm" :model="mainForm" :rules="mainFormRules" label-width="80px" size="small" label-position="right">
       <el-row :gutter="20">
         <el-col :xs="24" :sm="12" :lg="8" v-if="listItem">
           <el-form-item label="订单号" prop="id">
@@ -25,8 +25,10 @@
           </el-form-item>
         </el-col>
         <el-col :xs="24" :sm="12" :lg="8">
-          <el-form-item label="品类" prop="type">
-            <el-input v-model="mainForm.type" placeholder="请输入品类"></el-input>
+          <el-form-item label="产品大类" prop="type">
+            <el-select v-model="mainForm.type" placeholder="选择产品大类" style="width: 100%">
+              <el-option v-for="item in typeList" :key="item.dictCode" :label="item.dictValue" :value="item.dictCode"></el-option>
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
@@ -46,38 +48,95 @@
 
     <div class="main-title">
       <div class="title">货品信息</div>
-      <div>
-        <el-select v-model="screenForm.warehouse" placeholder="请选择发货仓库" size="small">
-          <el-option
-            v-for="item in warehouseList"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value">
-          </el-option>
+      <div v-if="!listItem">
+        <el-select v-model="warehouseValue" placeholder="请选择发货仓库" size="small" style="margin-right: 10px">
+          <el-option :label="item.name" :value="item.id" v-for="(item, index) in warehouseList" :key="index"></el-option>
         </el-select>
-        <el-button type="primary" size="small" icon="el-icon-plus" @click="openDialog" v-if="!listItem">添加货品</el-button>
+        <el-button type="primary" size="small" icon="el-icon-search" @click="checkStock">检查库存</el-button>
+        <el-divider direction="vertical"></el-divider>
+        <el-button type="primary" size="small" icon="el-icon-plus" @click="openDialog">添加货品</el-button>
       </div>
     </div>
 
     <div class="table" style="margin-top: 20px">
       <el-table :data="goodsList" element-loading-text="Loading" border fit highlight-current-row stripe max-height="400">
         <el-table-column align="center" label="序号" type="index" width="50"></el-table-column>
-        <el-table-column align="center" label="引用记录" prop="materialNumber" min-width="160" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="销售类型" prop="materialName" min-width="160" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="产品编码" prop="model" min-width="160" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="产品名称" prop="baseUnitId" min-width="160" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="规格型号" prop="qty" min-width="160" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="单位" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="总数量" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="是否使用返利" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="返利使用比例" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="是否直调" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="直调数量" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="已发货数量" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="单价" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="金额" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="返利" prop="qty" min-width="100" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="备注" prop="qty" min-width="160" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="销售类型" prop="saleTypeName" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="产品编码" prop="materialCode" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="产品名称" prop="materialName" min-width="160" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="规格型号" prop="specification" min-width="160" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="单位" prop="unit" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="单价" prop="price" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="数量" prop="qty" min-width="100" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.qty" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="订单金额" min-width="100" show-overflow-tooltip>
+          <template slot-scope="scope">
+            {{scope.row.price * scope.row.qty}}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="返利钱包" prop="walletRebateId" min-width="160" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <el-select v-model="scope.row.walletRebateId" placeholder="选择返利钱包" size="small" @change="changeWallet(scope.$index)">
+              <el-option label="不使用" value=""></el-option>
+              <el-option
+                v-for="item in flWalletList"
+                :key="item.customerWalletId"
+                :label="item.name"
+                :value="item.customerWalletId">
+              </el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="返利金额" min-width="100" show-overflow-tooltip>
+          <template slot-scope="scope">
+            {{scope.row.price * scope.row.qty * scope.row.rebateRate}}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="格力折扣" prop="deductAmount" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="现金钱包" prop="walletRebateId2" min-width="160" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <el-select v-model="scope.row.walletRebateId2" placeholder="选择现金钱包" size="small">
+              <el-option label="不使用" value=""></el-option>
+              <el-option
+                v-for="item in xjWalletList"
+                :key="item.customerWalletId"
+                :label="item.name"
+                :value="item.customerWalletId">
+              </el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="实付金额" prop="qty" min-width="100" show-overflow-tooltip>
+          <template slot-scope="scope">
+            {{(scope.row.price * scope.row.qty) - (scope.row.price * scope.row.qty * scope.row.rebateRate) - scope.row.deductAmount}}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="是否直调" prop="isDirectTransfer" min-width="100">
+          <template slot-scope="scope">
+            <el-checkbox v-model="scope.row.isDirectTransfer"></el-checkbox>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="直调数量" prop="directTransferQty" min-width="100">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.directTransferQty" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="备注" prop="remark" min-width="160">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.remark" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="税率" prop="tax" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="总仓库" prop="status1" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="仓库状态" prop="status2" min-width="100" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="操作" width="100" fixed="right">
+          <template slot-scope="scope">
+            <el-button type="text" @click="deleteItem(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
       </el-table>
     </div>
     
@@ -141,7 +200,7 @@
       <div class="tables">
         <div class="table">
           <el-table :data="leftGoodsList" element-loading-text="Loading" border fit highlight-current-row stripe height="400" @selection-change="leftSelectionChange">
-            <el-table-column align="center" type="selection" width="55"></el-table-column>
+            <el-table-column align="center" type="selection" width="55" :selectable='checkboxSelect'></el-table-column>
             <el-table-column align="center" label="产品编码" prop="number" min-width="100" show-overflow-tooltip></el-table-column>
             <el-table-column align="center" label="产品名称" prop="name" min-width="160" show-overflow-tooltip></el-table-column>
             <el-table-column align="center" label="产品型号" prop="specification" min-width="160" show-overflow-tooltip></el-table-column>
@@ -163,8 +222,8 @@
         <div class="buttons">
           <el-button size="small" type="primary" @click="addAllGoods">全部添加</el-button>
           <el-button size="small" type="primary" @click="addGoods">添加</el-button>
-          <el-button size="small" type="danger">删除</el-button>
-          <el-button size="small" type="danger">全部删除</el-button>
+          <el-button size="small" type="danger" @click="deleteGoods">删除</el-button>
+          <el-button size="small" type="danger" @click="deleteAllGoods">全部删除</el-button>
         </div>
         <div class="table">
           <el-table :data="rightGoodsList" element-loading-text="Loading" border fit highlight-current-row stripe height="400" @selection-change="rightSelectionChange">
@@ -188,8 +247,9 @@
 </template>
 
 <script>
-import { getDetail, addData, editData, getSalesTypeList, getGoodsList } from "@/api/supply/retail";
+import { getDetail, addData, editData, getSalesTypeList, getGoodsList, getWalletList, getWarehouseList, checkStock } from "@/api/supply/retail";
 import { getDictList } from '@/api/common'
+import { findElem } from '@/utils/util'
 
 export default {
   name: 'RetailForm',
@@ -202,9 +262,18 @@ export default {
         type: '',
         remark: '',
       },
+      mainFormRules: {
+        date: [
+          { required: true, message: '请选择单据日期', trigger: 'change' }
+        ],
+        type: [
+          { required: true, message: '请选择品类', trigger: 'change' }
+        ],
+      },
       goodsList: [],
 
       warehouseList: [],
+      warehouseValue: '',
       isShowDialog: false,
       screenForm: {
         type: '',
@@ -225,6 +294,9 @@ export default {
 
       leftSelection: [],
       rightSelection: [],
+
+      xjWalletList: [],
+      flWalletList: [],
     }
   },
 
@@ -241,6 +313,9 @@ export default {
   },
 
   created() {
+    this.getDictList();
+    this.getWalletList();
+    this.getWarehouseList();
     if(this.listItem) {
       this.getDetail();
     }
@@ -260,6 +335,32 @@ export default {
     },
 
     // 获取仓库列表
+    getWarehouseList() {
+      getWarehouseList({
+        pageNum: 1,
+        pageSize: -1
+      }).then((res) => {
+        this.warehouseList = res.data.records;
+      })
+    },
+
+    // 获取钱包列表
+    getWalletList() {
+      getWalletList({
+        customerId: JSON.parse(localStorage.getItem("supply_user")).customerId,
+        type: 'COMMONLY'
+      }).then(res => {
+        this.xjWalletList = res.data;
+      })
+      getWalletList({
+        customerId: JSON.parse(localStorage.getItem("supply_user")).customerId,
+        type: 'REBATE'
+      }).then(res => {
+        this.flWalletList = res.data;
+      })
+    },
+
+    // 获取销售类型列表
     getSalesTypeList() {
       getSalesTypeList({
         pageNum: 1,
@@ -288,14 +389,49 @@ export default {
         price1: this.screenForm.price1,
         price2: this.screenForm.price2,
       }).then(res => {
+        let oldGoodsList = this.goodsList;
+        let newGoodsList = res.data.records;
+        for(let i = 0; i < oldGoodsList.length; i++) {
+          let oldItem = oldGoodsList[i]
+          for(let j = 0; j < newGoodsList.length; j++) {
+            let newItem = newGoodsList[j]
+            if(newItem.materialId === oldItem.materialId){
+              newGoodsList[j].selected = true;
+              break;
+            }
+          }
+        }
+        res.data.records.forEach(item => {
+          item.materialName = item.name;
+          item.materialCode = item.number;
+          item.saleTypeName = item.saleName;
+          item.unit = item.baseUnit;
+          item.price = item.batchPrice;
+          item.tax = item.taxRate;
+          item.isDirectTransfer = false;
+          item.directTransferQty = '';
+          item.status1 = '';
+          item.status2 = '';
+          item.deductAmount = item.discAmount || 0;
+          item.rebateAmount = '';
+          item.rebateRate = '';
+        });
         this.leftGoodsList = res.data.records;
         this.listTotal = res.data.total;
       })
     },
 
+    // 查询重复值并禁选
+    checkboxSelect (row, rowIndex) {
+      if (row.selected) {
+        return false // 禁用
+      }else{
+        return true // 不禁用
+      }
+    },
+
     // 点击 选择商品
     openDialog() {
-      this.getDictList();
       this.getSalesTypeList();
       this.getGoodsList();
       this.isShowDialog = true;
@@ -330,43 +466,118 @@ export default {
       this.leftSelection = val;
     },
 
-    // 侧列表选择
+    // 侧列表选择
     rightSelectionChange(val) {
       this.rightSelection = val;
     },
 
+    // 数组去重
+    delRepeat(arr1, arr2) {
+      let allArr = arr1.concat(arr2); // 两个数组对象合并
+      let newArr = []; // 存放去重后数据的新数组
+      for(let i=0; i<allArr.length; i++){  // 循环allArr数组对象的内容
+        let flag = true;  // 建立标记,判断数据是否重复,true为不重复
+        for(let j=0; j<newArr.length; j++){  // 循环新数组的内容
+          if(allArr[i].materialId == newArr[j].materialId){ // 让allArr数组对象的内容与新数组的内容作比较,相同的话,改变标记为false
+            flag = false;
+          }
+        }
+        if(flag){ // 判断是否重复
+          newArr.push(allArr[i]); // 不重复的放入新数组。  新数组的内容会继续进行上边的循环。
+        }
+      }
+      return newArr;
+    },
+
     // 全部添加
     addAllGoods() {
-      let leftGoodsList = this.leftGoodsList;
+      this.rightGoodsList = this.delRepeat(this.leftGoodsList, this.rightGoodsList);
+    },
+
+    // 添加
+    addGoods() {
+      this.rightGoodsList = this.delRepeat(this.leftSelection, this.rightGoodsList);
+    },
+
+    // 删除
+    deleteGoods() {
       let rightGoodsList = this.rightGoodsList;
-      let newGoodsList = [];
+      let rightSelection = this.rightSelection;
       for(let i = 0; i < rightGoodsList.length; i++) {
-        let oldItem = rightGoodsList[i];
-        for(let j = 0; j < leftGoodsList.length; j++) {
-          let newItem = leftGoodsList[j]
-          console.log(newItem.id);
-          console.log(oldItem.id);
-          if(newItem.id != oldItem.id){
-            newGoodsList.push(newItem);
+        for(let j = 0; j < rightSelection.length; j++) {
+          if(rightSelection[j].materialId == rightGoodsList[i].materialId){
+            this.rightGoodsList.splice(i, 1);
           }
         }
       }
-      this.rightGoodsList = newGoodsList;
     },
 
-    // 添加
-    addGoods() {
-      
+    // 全部删除
+    deleteAllGoods() {
+      this.rightGoodsList = [];
     },
 
     // 确定 添加产品
     submitAddGoods() {
+      this.goodsList = this.delRepeat(this.rightGoodsList, this.goodsList);
+      this.isShowDialog = false;
+      this.leftGoodsList = [];
+      this.rightGoodsList = [];
+    },
+
+    // 删除产品
+    deleteItem(index) {
+      this.goodsList.splice(index, 1);
+    },
 
+    // 修改返利钱包
+    changeWallet(index) {
+      if(this.goodsList[index].walletRebateId) {
+        let obj = this.flWalletList.find(o => o.customerWalletId == this.goodsList[index].walletRebateId);
+        this.goodsList[index].rebateRate = obj.rebateRate;
+      }else {
+        this.goodsList[index].rebateRate = '';
+      }
+    },
+
+    // 检查库存
+    checkStock() {
+      if(!this.warehouseValue) {
+        return this.$errorMsg('请选择仓库');
+      }
+      let ids = [];
+      this.goodsList.forEach(item => {
+        ids.push(item.materialId);
+      })
+      checkStock({
+        correspondId: this.warehouseValue,
+        materialId: ids.join(',')
+      }).then(res => {
+
+      })
     },
     
     // 保存
     clickSubmitForm() {
-      
+      this.$refs.mainForm.validate((valid) => {
+        if (valid) {
+          let mainName = this.typeList[findElem(this.typeList, 'dictCode', this.mainForm.type)].dictValue;
+          let params = {
+            theTime: this.mainForm.date + ' 00:00:00',
+            mainId: this.mainForm.type,
+            mainName,
+            remark: this.mainForm.remark,
+            type: 1, // 1:普通零售单,2:政策零售单
+            retailOrderItemList: this.goodsList
+          }
+          addData(params).then(res => {
+            this.$successMsg('添加成功');
+            this.goBack();
+            this.$parent.getList();
+          })
+
+        }
+      })
     },
   }
 }