Sfoglia il codice sorgente

Merge branch 'moss_dev' into pengyouhao_dev

pengyh 1 anno fa
parent
commit
f319254d31

+ 54 - 0
src/api/order.js

@@ -154,6 +154,24 @@ export function goodsDeliver(data) {
   })
 }
 
+// 发货2
+export function orderDeliver(data) {
+  return request({
+    url: '/orderDelivery/goods/deliverV2',
+    method: 'post',
+    data
+  })
+}
+
+// 发货单列表
+export function getDeliverList(data) {
+  return request({
+    url: '/orderDelivery/list',
+    method: 'post',
+    data
+  })
+}
+
 // 获取维权订单列表
 export function getRefundList(params) {
   return request({
@@ -433,4 +451,40 @@ export function getAttrList(data) {
     method: 'post',
     data
   })
+}
+
+// 获取销售发货单列表
+export function getSalesDeliverOrderList(data) {
+  return request({
+    url: `/orderDelivery/list?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+// 销售发货单详情
+export function getSalesDeliverOrderDetail(params) {
+  return request({
+    url: '/orderDelivery/detail',
+    method: 'post',
+    params
+  })
+}
+
+// 导出销售发货单列表
+export function salesDeliverOrderListExport(data, name) {
+  return postBlob({
+    url: '/orderDelivery/list/export',
+    data,
+    name
+  })
+}
+
+// 销售发货单退货
+export function salesDeliverOrderRefund(params) {
+  return request({
+    url: '/orderDelivery/refundBatch',
+    method: 'post',
+    params
+  })
 }

+ 9 - 0
src/api/storage.js

@@ -61,3 +61,12 @@ export function getStorageDetail(params) {
     params
   })
 }
+
+// 获取网点列表
+export function getWebsitList(params) {
+  return request({
+    url: '/admin/websit/list',
+    method: 'get',
+    params
+  })
+}

+ 26 - 7
src/views/mallManagement/goods/goods_add/index.vue

@@ -176,7 +176,11 @@
 
       <el-form ref="step2Form" :model="step2Form" :rules="step2FormRules" label-width="110px">
         <el-form-item label="规格类型:" label-width="90px">
-          <div class="addBtn"><el-button type="primary" size="small" @click="addSpec">添加规格</el-button></div>
+          <div class="addBtn">
+            <el-button type="primary" size="small" @click="addSpec">添加规格</el-button>
+            <el-button size="small" @click="toMaterial">去商品物料</el-button>
+            <span>注:仓库管理方式为【不管理】,无需填写规格型号,不控制库存</span>
+          </div>
         </el-form-item>
 
         <el-form-item label-width="0">
@@ -238,9 +242,10 @@
                 <el-input size="small" v-model="scope.row.specValue" :disabled="scope.row.goodsCode != ''"></el-input>
               </template>
             </el-table-column>
-            <el-table-column align="center" label="规格型号" prop="goodsCode" min-width="180">
+            <el-table-column align="center" label="*规格型号" prop="goodsCode" min-width="180">
               <template slot-scope="scope">
                 <el-select
+                  :disabled="joinCode == 'NO'"
                   size="small"
                   v-model="scope.row.goodsCode"
                   filterable
@@ -286,14 +291,14 @@
                 <el-input size="small" v-model="scope.row.innerShareAmount"></el-input>
               </template>
             </el-table-column>
-            <el-table-column align="center" label="*商品库存" prop="stockNum" min-width="120">
+            <el-table-column align="center" label="*上架库存" prop="stockNum" min-width="120">
               <template slot-scope="scope">
                 <el-input size="small" v-model="scope.row.stockNum"></el-input>
               </template>
             </el-table-column>
-            <el-table-column align="center" label="仓库库存" prop="stockQty" min-width="120">
+            <el-table-column align="center" label="总库存数量" prop="stockQty" min-width="120">
               <template slot-scope="scope">
-                {{scope.row.stockQty || 0}}
+                {{scope.row.stockQty}}
               </template>
             </el-table-column>
             <el-table-column align="center" label="*规格图片" prop="imgUrl" min-width="120">
@@ -574,8 +579,10 @@ export default {
       tagList: [], // 标签列表
 
       showImageListUpload2: false,
-	  type: 'add',
-	  isSelectShop: false //选择商品库
+      type: 'add',
+      isSelectShop: false, //选择商品库
+
+      joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode,
     }
   },
 
@@ -880,6 +887,7 @@ export default {
                 if(!this.specList[i].mainId)  return this.$errorMsg('请选择大类')
                 if(!this.specList[i].smallId)  return this.$errorMsg('请选择小类')
                 if(!this.specList[i].specValue)  return this.$errorMsg('请填写规格名称')
+                if(!this.specList[i].goodsCode)  return this.$errorMsg('请选择规格型号')
                 if(!this.specList[i].price)  return this.$errorMsg('请填写销售价格')
                 if(!this.specList[i].orgPrice)  return this.$errorMsg('请填写划线价格')
                 if(!this.specList[i].shareAmount)  return this.$errorMsg('请填写佣金')
@@ -1189,6 +1197,13 @@ export default {
       this.specList[this.editSpecImageIdx].imgUrl = res.data.url;
     },
 
+    toMaterial() {
+      this.$router.push({
+        name: "commercialMaterial",
+        query: {}
+      })
+    }
+
   }
 
 }
@@ -1240,6 +1255,10 @@ export default {
   .addBtn {
     padding: 10px 0;
     margin-top: -10px;
+    span {
+      margin-left: 10px;
+      color: #f66460;
+    }
   }
 }
 

+ 2 - 1
src/views/mallManagement/order/offline_order_list/index.vue

@@ -161,7 +161,7 @@
         <div v-show="formTabs == 'a'">
           <div style="margin-top: 30px;">
             <el-button type="primary" size="small" @click="addGoods(1)" :disabled="formData.isOld == 'YES' && goodsList.length > 0">添加商品</el-button>
-            <el-button type="primary" size="small" @click="addGoods(2)" :disabled="formData.isOld == 'YES' && goodsList.length > 0">添加物料</el-button>
+            <el-button type="primary" size="small" @click="addGoods(2)" :disabled="formData.isOld == 'YES' && goodsList.length > 0" v-if="joinCode != 'NO'">添加物料</el-button>
           </div>
           <el-table
             class="specTable"
@@ -756,6 +756,7 @@ export default {
       categoryList: [],
       specList: [],
       attrList: [],
+      joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode,
 
     }
   },

+ 100 - 18
src/views/mallManagement/order/order_detail/index.vue

@@ -40,7 +40,7 @@
                       <el-button slot="reference" size="small" type="danger">取消订单</el-button>
                     </el-popconfirm>
                   </template>
-                  <el-button type="primary" size="small" @click="returnOrder()" v-if="(orderDetail.orderStatus === 'YFH' || orderDetail.orderStatus === 'OVER')">发起退货</el-button>
+                  <!-- <el-button type="primary" size="small" @click="returnOrder()" v-if="(orderDetail.orderStatus === 'YFH' || orderDetail.orderStatus === 'OVER')">发起退货</el-button> -->
                   <template v-if="orderDetail.orderStatus === 'YFH' || orderDetail.orderStatus === 'OVER'">
                     <el-button size="small" @click="showDialog('query')">查看物流</el-button>
                   </template>
@@ -176,7 +176,7 @@
     </div>
 
     <h3>商品信息</h3>
-    <div class="order-detail">
+    <div class="order-detail" style="margin-bottom: 30px;">
       <!-- 订单表格 -->
       <el-table :data="orderDetail.orderDetails" style="width: 100%" border>
         <el-table-column label="商品信息" min-width="200">
@@ -195,9 +195,14 @@
             </el-row>
           </template>
         </el-table-column>
-        <el-table-column prop="goodsSpecValue" label="规格" align="center"></el-table-column>
+        <el-table-column prop="goodsSpecValue" label="规格" align="center">
+          <template slot-scope="scope">
+            {{scope.row.goodsSpecName}}{{scope.row.goodsSpecValue}}
+          </template>
+        </el-table-column>
         <el-table-column prop="price" label="单价" align="center"></el-table-column>
         <el-table-column prop="num" label="数量" align="center"></el-table-column>
+        <el-table-column prop="sendStockNum" label="已发货数量" min-width="100" align="center"></el-table-column>
         <el-table-column prop="shareAmount" label="分销金额" align="center">
           <template slot-scope="scope">
             {{ orderDetail.workerId || orderDetail.promotionGroupUserId ? scope.row.shareAmount : '0' }}
@@ -229,8 +234,50 @@
           </template>
         </el-table-column>
       </el-table>
+    </div>
 
+    <div v-if="deliverList.length > 0" style="margin-bottom: 30px;">
+      <h3>发货记录</h3>
+      <div class="order-detail">
+        <!-- 发货记录 -->
+        <el-table :data="deliverList" style="width: 100%;" size="small" border>
+          <el-table-column prop="deliveryId" align="center" label="发货单号" width="160"></el-table-column>
+          <el-table-column prop="brandName" align="center" label="品牌"></el-table-column>
+          <el-table-column prop="mainName" align="center" label="大类名称"></el-table-column>
+          <el-table-column prop="smallName" align="center" label="小类名称"></el-table-column>
+          <el-table-column prop="goodsName" align="center" label="商品名称" width="140"></el-table-column>
+          <el-table-column prop="goodsSpecName" align="center" label="规格型号" width="140"></el-table-column>
+          <el-table-column prop="goodsMaterialUnit" align="center" label="单位">
+            <template slot-scope="scope">
+              {{scope.row.goodsMaterialUnit == 'C' ? '整套' : scope.row.goodsMaterialUnit == 'I' ? '单个' : ''}}
+            </template>
+          </el-table-column>
+          <el-table-column prop="sendNum" align="center" label="发货数量"></el-table-column>
+          <el-table-column prop="insideCodeQty" align="center" label="内机数量"></el-table-column>
+          <el-table-column prop="outCodeQty" align="center" label="外机数量"></el-table-column>
+          <el-table-column prop="partsCodeQty" align="center" label="配件数量"></el-table-column>
+          <el-table-column prop="storageStockName" align="center" label="发货仓库" width="100"></el-table-column>
+          <el-table-column prop="pickType" align="center" label="发货方式">
+            <template slot-scope="scope">
+              {{scope.row.pickType == 'YES' ? '自提' : '快递物流'}}
+            </template>
+          </el-table-column>
+          <el-table-column prop="logisticsNo" align="center" label="快递单号" width="100"></el-table-column>
+          <el-table-column prop="companyName" align="center" label="物流公司" width="100"></el-table-column>
+          <el-table-column prop="pickName" align="center" label="提货人"></el-table-column>
+          <el-table-column prop="pickPhone" align="center" label="提货人电话" width="110"></el-table-column>
+          <el-table-column prop="createBy" align="center" label="操作人" width="140"></el-table-column>
+          <el-table-column prop="createTime" align="center" label="操作时间" width="160"></el-table-column>
+          <el-table-column align="center" label="操作" fixed="right">
+            <template slot-scope="scope">
+              <el-button type="text" size="small" @click="returnOrder(scope.row.deliveryId)">发起退货</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
 
+    <div class="order-detail">
       <div class="order-amount-info">
         <el-row>
           <el-col :span="19">
@@ -364,8 +411,9 @@
 						<div class="table">
 							<!-- 发货数量 -->
 							<el-form v-show="typeIndex == 1" ref="formData1" :model="formData1" label-width="0" size="small" label-position="left">
-								<el-table :data="formData1.list" element-loading-text="Loading" border fit highlight-current-row stripe>
-									<el-table-column prop="brandName" align="center" label="品牌"></el-table-column>
+								<el-table :data="formData1.list" element-loading-text="Loading" border fit highlight-current-row stripe @selection-change="deliverSelectionChange">
+									<el-table-column type="selection" width="40"></el-table-column>
+                  <el-table-column prop="brandName" align="center" label="品牌"></el-table-column>
 									<el-table-column prop="mainName" align="center" label="大类"></el-table-column>
 									<el-table-column prop="smallName" align="center" label="小类"></el-table-column>
 									<el-table-column prop="goodsName" align="center" label="商品名称"></el-table-column>
@@ -376,7 +424,11 @@
 											{{scope.row.goodsMaterialUnit == 'C'?'整套':scope.row.goodsMaterialUnit == 'I'?"单个":''}}
 										</template>
 									</el-table-column>
-									<el-table-column prop="num" align="center" label="数量"></el-table-column>
+									<el-table-column prop="num" align="center" label="数量">
+                    <template slot-scope="scope">
+                      <el-input v-model="scope.row.num" placeholder="请输入" type="number"></el-input>
+                    </template>
+                  </el-table-column>
 									<el-table-column prop="insideNum" align="center" label="内机数量"></el-table-column>
 									<el-table-column prop="outNum" align="center" label="外机数量"></el-table-column>
 									<el-table-column prop="partNum" align="center" label="配件数量"></el-table-column>
@@ -563,9 +615,9 @@ import {
   changePrice,
   changeReceiveInfo,
   confirmOrder,
-  getOrderDetail, goodsDeliver,
+  getOrderDetail, orderDeliver,
   saveRemark, orderRefund, orderCompensate, getCompensateList,
-  changeShow, getCodeDetail, getMaterialList, listImport, saveCode, delCode, getPrintList
+  changeShow, getCodeDetail, getMaterialList, listImport, saveCode, delCode, getPrintList, getDeliverList
 } from "@/api/order";
 import { getExpress, getCompanyList } from "@/api/common";
 import { commonTemplateDownload } from '@/api/common.js'
@@ -720,6 +772,9 @@ export default {
 	  orderDetailId: '',
 
     printList: [],
+    deliverList: [],
+
+    deliverSelection: [],
     }
   },
   created() {
@@ -729,6 +784,7 @@ export default {
     this.getCompanyList();
     this.getCompensateList();
     this.getPrintList();
+    this.getDeliverList();
   },
   methods: {
     getDetail() {
@@ -747,6 +803,16 @@ export default {
       })
     },
 
+    getDeliverList() {
+      getDeliverList({
+        pageNum: 1,
+        pageSize: -1,
+        params: [{param: 'a.order_id', compare: '=', value: this.orderId}]
+      }).then(res => {
+        this.deliverList = res.data.records;
+      })
+    },
+
     getPrintList() {
       getPrintList({ orderId: this.orderId }).then(res => {
         this.printList = res.data || [];
@@ -837,7 +903,7 @@ export default {
         params.workOrder = this.orderForm.workOrder
         this.$refs.orderForm.validate((valid) => {
           if (valid) {
-            goodsDeliver(params).then(() => {
+            orderDeliver(params).then(() => {
               this.cancelForm();
               this.getDetail();
               this.$successMsg('保存成功');
@@ -859,11 +925,11 @@ export default {
       })
     },
     // 发起退货
-    returnOrder() {
+    returnOrder(deliveryId) {
       this.$router.push({
         name: "sales_return_order_list",
         query: {
-          orderId: this.orderId
+          deliverId: deliveryId
         }
       })
     },
@@ -884,7 +950,7 @@ export default {
     },
 
     getStorageList() {
-      Storage.getList({ pageNum: 1, pageSize: 100 }).then(res => {
+      Storage.getList({ pageNum: 1, pageSize: -1, type: '商品' }).then(res => {
         this.storageList = res.data.records
       })
     },
@@ -1111,18 +1177,34 @@ export default {
 			}
 		})
 	},
+
+  deliverSelectionChange(val) {
+    this.deliverSelection = val;
+  },
+
 	deliverGoods(){
 		this.$refs.orderForm.validate((valid) => {
 		  if (valid) {
-		    goodsDeliver({
+        if(this.deliverSelection.length < 1) return this.$errorMsg('请选择一个发货信息');
+
+		    orderDeliver({
 		      orderId: this.orderId,
-		      logisticsNo: this.orderForm.logisticsNo,
+		      logisticsNo: this.orderForm.pickType == 'NO' ? this.orderForm.logisticsNo : '',
 		      storageId: this.orderForm.storageId,
-		      companyCode: this.orderForm.companyCode,
+		      companyCode: this.orderForm.pickType == 'NO' ? this.orderForm.companyCode : '',
 		      workOrder: this.orderForm.workOrder,
-		    				pickName: this.orderForm.pickName,
-		    				pickPhone: this.orderForm.pickPhone,
-		    				pickType: this.orderForm.pickType,
+          pickName: this.orderForm.pickType == 'YES' ? this.orderForm.pickName : '',
+          pickPhone: this.orderForm.pickType == 'YES' ? this.orderForm.pickPhone : '',
+          pickType: this.orderForm.pickType,
+          orderDeliveryDetailList: this.deliverSelection.map(item => {
+            return {
+              orderDetailId: item.orderDetailId,
+              sendNum: item.num,
+              sendInsideCodeQty: item.insideCodeQty,
+              sendOutCodeQty: item.outCodeQty,
+              sendPartsCodeQty: item.partsCodeQty,
+            }
+          }),
 		    }).then(() => {
 		      this.cancelForm();
 		      this.getDetail();

+ 133 - 51
src/views/mallManagement/order/order_list/index.vue

@@ -253,7 +253,7 @@
                           v-if="(order.orderStatus === 'NOPAY' || order.orderStatus === 'DQR') && $restrict('cancelOrder')">
                           <el-button slot="reference" type="text" size="small">取消订单</el-button>
                         </el-popconfirm>
-                        <el-button type="text" size="small" @click="returnOrder(order.orderId)" v-if="(order.orderStatus === 'YFH' || order.orderStatus === 'OVER') && $restrict('returnOrder')">发起退货</el-button>
+                        <!-- <el-button type="text" size="small" @click="returnOrder(order.orderId)" v-if="(order.orderStatus === 'YFH' || order.orderStatus === 'OVER') && $restrict('returnOrder')">发起退货</el-button> -->
                         <el-button type="text" size="small" v-if="order.orderStatus === 'DFH' && $restrict('deliver')"
                           @click="showLogistics(order, 'add')">发货</el-button>
                         <el-button type="text" size="small" v-if="order.orderStatus === 'DFH' && $restrict('changeShippingaddress')"
@@ -364,7 +364,7 @@
 						</el-col>
 						<el-col :span="6">
 							<el-form-item label="仓储" prop="storageId" v-if="logisticsType != 'edit'"
-							  :rules="[{ required: true, message: '请选择仓储', trigger: 'change' }]">
+							  :rules="joinCode == 'NO' ? [] : [{ required: true, message: '请选择仓储', trigger: 'change' }]">
 							  <el-input v-if="logisticsType == 'detail'" v-model="logisticsForm.storageName" :disabled="true" placeholder="请输入提货人"></el-input>
 							  <el-select v-else v-model="logisticsForm.storageId" placeholder="请选择仓储" style="width: 100%;">
 							    <el-option :label="item.storageName" :value="item.storageId" v-for="(item, index) in storageList"
@@ -392,27 +392,34 @@
 							<el-card class="box-card">
 								<el-tabs v-model="typeIndex" @tab-click="changeType">
 								    <el-tab-pane label="发货数量" name="1"></el-tab-pane>
-								    <el-tab-pane v-if="joinCode" label="发货条码" name="2"></el-tab-pane>
+								    <el-tab-pane v-if="joinCode == 'CODE'" label="发货条码" name="2"></el-tab-pane>
+								    <el-tab-pane label="发货记录" name="3"></el-tab-pane>
 								</el-tabs>
 								<br/>
-								<el-button size="small" v-show="typeIndex == 2 && logisticsType == 'add' && joinCode" type="primary" @click="addCode()">新增</el-button>
-								<el-button size="small" v-show="typeIndex == 1 && logisticsType == 'add' && joinCode" type="primary" @click="handleDownload('导入条码模板')">导入条码模板下载</el-button>
+								<el-button size="small" v-show="typeIndex == 2 && logisticsType == 'add' && joinCode == 'CODE'" type="primary" @click="addCode()">新增</el-button>
+								<el-button size="small" v-show="typeIndex == 1 && logisticsType == 'add' && joinCode == 'CODE'" type="primary" @click="handleDownload('导入条码模板')">导入条码模板下载</el-button>
 								<div class="table">
 									<!-- 发货数量 -->
 									<el-form v-show="typeIndex == 1" ref="formData1" :model="formData1" label-width="0" size="small" label-position="left">
-										<el-table :data="formData1.list" element-loading-text="Loading" border fit highlight-current-row stripe>
+										<el-table :data="formData1.list" element-loading-text="Loading" border fit highlight-current-row stripe @selection-change="deliverSelectionChange">
+                      <el-table-column type="selection" width="40"></el-table-column>
 											<el-table-column prop="brandName" align="center" label="品牌"></el-table-column>
 											<el-table-column prop="mainName" align="center" label="大类"></el-table-column>
 											<el-table-column prop="smallName" align="center" label="小类"></el-table-column>
-											<el-table-column prop="goodsName" align="center" label="商品名称"></el-table-column>
-											<el-table-column prop="goodsMaterialName" align="center" label="物料名称"></el-table-column>
-											<el-table-column prop="goodsMaterialSpecsName" align="center" label="规格型号"></el-table-column>
+											<el-table-column prop="goodsName" align="center" label="商品名称" width="140"></el-table-column>
+											<el-table-column prop="goodsMaterialName" align="center" label="物料名称" width="140"></el-table-column>
+											<el-table-column prop="goodsMaterialSpecsName" align="center" label="规格型号" width="140"></el-table-column>
 											<el-table-column prop="goodsMaterialUnit" align="center" label="单位">
 												<template slot-scope="scope">
-													{{scope.row.goodsMaterialUnit == 'C'?'整套':scope.row.goodsMaterialUnit == 'I'?"单个":''}}
+													{{scope.row.goodsMaterialUnit == 'C' ? '整套' : scope.row.goodsMaterialUnit == 'I' ? '单个' : ''}}
 												</template>
 											</el-table-column>
-											<el-table-column prop="num" align="center" label="数量"></el-table-column>
+											<el-table-column prop="num" align="center" label="数量">
+                        <template slot-scope="scope">
+                          <el-input v-model="scope.row.num" placeholder="请输入" type="number"></el-input>
+                        </template>
+                      </el-table-column>
+											<el-table-column prop="stockNum" align="center" label="库存数量"></el-table-column>
 											<el-table-column prop="insideNum" align="center" label="内机数量"></el-table-column>
 											<el-table-column prop="outNum" align="center" label="外机数量"></el-table-column>
 											<el-table-column prop="partNum" align="center" label="配件数量"></el-table-column>
@@ -420,7 +427,7 @@
 											<el-table-column prop="outCodeQty" align="center" label="导入外机条码数量" width="140"></el-table-column>
 											<el-table-column prop="partsCodeQty" align="center" label="导入配件条码数量" width="140"></el-table-column>
 											<el-table-column label="操作" align="center" width="140" fixed="right">
-												<template slot-scope="scope" v-if="formType != 2 && joinCode && logisticsType == 'add'">
+												<template slot-scope="scope" v-if="formType != 2 && joinCode == 'CODE' && logisticsType == 'add'">
 													<el-upload
 													  action='_'
 													  :show-file-list='false'
@@ -456,14 +463,14 @@
 													</el-form-item>
 												</template>
 											</el-table-column>
-											<el-table-column prop="" align="center" label="商品名称">
+											<el-table-column prop="" align="center" label="商品名称" width="140">
 												<template slot-scope="scope">
 													<el-form-item>
 														<el-input type="text" v-model="scope.row.goodsMaterialName" :disabled="true" placeholder="请输入"></el-input>
 													</el-form-item>
 												</template>
 											</el-table-column>
-											<el-table-column label="规格型号" align="center">
+											<el-table-column label="规格型号" align="center" width="140">
 												<template slot-scope="scope">
 													<el-form-item :prop="'list.' + scope.$index + '.specs'" :rules="[{ required: true, message: `请选择规格型号`, trigger: 'blur' }]">
 														<el-select v-model="scope.row.specs" @change="(e)=>{changeSpecs(e,scope.row)}" value-key="orderDetailId" :disabled="isEdit2 != scope.$index || formType == 2 || logisticsType == 'detail'" placeholder="请选择" style="width: 100%;">
@@ -547,6 +554,45 @@
 											</el-table-column>
 										</el-table>
 									</el-form>
+
+                  <!-- 发货记录 -->
+                  <el-form v-show="typeIndex == 3" ref="formData3" :model="formData3" label-width="0" size="small" label-position="left">
+										<el-table :data="formData3.list" element-loading-text="Loading" border fit highlight-current-row stripe>
+											<el-table-column prop="deliveryId" align="center" label="发货单号" width="160"></el-table-column>
+											<el-table-column prop="brandName" align="center" label="品牌"></el-table-column>
+											<el-table-column prop="mainName" align="center" label="大类名称"></el-table-column>
+											<el-table-column prop="smallName" align="center" label="小类名称"></el-table-column>
+											<el-table-column prop="goodsName" align="center" label="商品名称" width="140"></el-table-column>
+											<el-table-column prop="goodsSpecName" align="center" label="规格型号" width="140"></el-table-column>
+											<el-table-column prop="goodsMaterialUnit" align="center" label="单位">
+                        <template slot-scope="scope">
+													{{scope.row.goodsMaterialUnit == 'C' ? '整套' : scope.row.goodsMaterialUnit == 'I' ? '单个' : ''}}
+												</template>
+                      </el-table-column>
+											<el-table-column prop="sendNum" align="center" label="发货数量"></el-table-column>
+											<el-table-column prop="insideCodeQty" align="center" label="内机数量"></el-table-column>
+											<el-table-column prop="outCodeQty" align="center" label="外机数量"></el-table-column>
+											<el-table-column prop="partsCodeQty" align="center" label="配件数量"></el-table-column>
+											<el-table-column prop="storageStockName" align="center" label="发货仓库" width="100"></el-table-column>
+											<el-table-column prop="pickType" align="center" label="发货方式">
+                        <template slot-scope="scope">
+													{{scope.row.pickType == 'YES' ? '自提' : '快递物流'}}
+												</template>
+                      </el-table-column>
+											<el-table-column prop="logisticsNo" align="center" label="快递单号" width="100"></el-table-column>
+											<el-table-column prop="companyName" align="center" label="物流公司" width="100"></el-table-column>
+											<el-table-column prop="pickName" align="center" label="提货人"></el-table-column>
+											<el-table-column prop="pickPhone" align="center" label="提货人电话" width="110"></el-table-column>
+											<el-table-column prop="createBy" align="center" label="操作人" width="140"></el-table-column>
+											<el-table-column prop="createTime" align="center" label="操作时间" width="160"></el-table-column>
+                      <el-table-column align="center" label="操作">
+                        <template slot-scope="scope">
+													<el-button type="text" size="small" @click="returnOrder(scope.row.deliveryId)" v-if="$restrict('returnOrder')">发起退货</el-button>
+												</template>
+                      </el-table-column>
+                    </el-table>
+                  </el-form>
+
 								</div>
 							</el-card>
 						</el-col>
@@ -647,7 +693,7 @@
 
 <script>
 import { getToken } from '@/utils/auth'
-import { cancelOrder, confirm2Order, getList, goodsDeliver, saveRemark, batchShipment, batchRemark, getWebsiteList, editLogistics, getRegion, editAddress, getOrderDetail, getCodeDetail, getMaterialList, listImport, saveCode, delCode } from "@/api/order";
+import { cancelOrder, confirm2Order, getList, orderDeliver, saveRemark, batchShipment, batchRemark, getWebsiteList, editLogistics, getRegion, editAddress, getOrderDetail, getCodeDetail, getMaterialList, listImport, saveCode, delCode, getDeliverList } from "@/api/order";
 import { getExpress, getCompanyList } from "@/api/common";
 import { downloadFiles, handleImport } from '@/utils/util'
 import { commonTemplateDownload } from '@/api/common.js'
@@ -709,13 +755,13 @@ export default {
         pickPhone: '',
         logisticsNo: '',
         storageId: '',
-		storageName: '',
+		    storageName: '',
         companyCode: '',
         workOrder: true,
         exchange: false,
-		pickType: 'YES',
-		pickName: '',
-		pickPhone: ''
+        pickType: 'YES',
+        pickName: '',
+        pickPhone: ''
       },
       logisticsTab: 'first',
       storageList: [],
@@ -750,23 +796,28 @@ export default {
       cityList: [],
       areaList: [],
       streetList: [],
-		formType: 'add',
-		formVisible: false,
-		typeIndex: '1',
-		formData1: {
-			list: [],
-		},
-		formData2: {
-			list: [],
-		},
-		isEdit1: 0,
-		isEdit2: 0,
-		joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode === "CODE",
-		orderDetailId: '',
+      formType: 'add',
+      formVisible: false,
+      typeIndex: '1',
+      formData1: {
+        list: [],
+      },
+      formData2: {
+        list: [],
+      },
+      formData3: {
+        list: [],
+      },
+      isEdit1: 0,
+      isEdit2: 0,
+      joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode,
+      orderDetailId: '',
+
+      printOrderId: '',
+      payQrcode: JSON.parse(localStorage.getItem('greemall_user')).payQrcode,
+      billTitle: JSON.parse(localStorage.getItem('greemall_user')).billTitle,//打印名称
 
-    printOrderId: '',
-		payQrcode: JSON.parse(localStorage.getItem('greemall_user')).payQrcode,
-		billTitle: JSON.parse(localStorage.getItem('greemall_user')).billTitle,//打印名称
+      deliverSelection: [],
     }
   },
   computed: {
@@ -855,18 +906,28 @@ export default {
     },
 	getOrderDetail(){
 		getOrderDetail({orderId: this.editOrderId}).then(res => {
-			let arr = []
-			res.data.orderDetails.forEach(item=>{
-				if(item.goodsMaterialId){
-					arr.push(item)
-				}
-			})
-			this.formData1.list = arr
+			// let arr = []
+			// res.data.orderDetails.forEach(item=>{
+			// 	if(item.goodsMaterialId){
+			// 		arr.push(item)
+			// 	}
+			// })
+			this.formData1.list = res.data.orderDetails
 		})
 	},
+  getDeliverList() {
+    getDeliverList({
+      pageNum: 1,
+      pageSize: -1,
+      params: [{param: 'a.order_id', compare: '=', value: this.editOrderId}]
+    }).then(res => {
+      this.formData3.list = res.data.records;
+    })
+  },
 	changeType(){
 		this.getOrderDetail()
 		this.getCodeDetail()
+    this.getDeliverList();
 	},
 	async getCodeDetail(){
 		getCodeDetail({orderId: this.editOrderId}).then(async res => {
@@ -956,6 +1017,7 @@ export default {
 			    this.$message({ type: 'success', message: '删除成功!' })
 			    this.getOrderDetail()
 			    this.getCodeDetail()
+          this.getDeliverList();
 			  } else {
 			    this.$message.error(res.msg);
 			  }
@@ -979,6 +1041,7 @@ export default {
 						that.$message.success('保存成功!')
 						this.getOrderDetail()
 						this.getCodeDetail()
+            this.getDeliverList();
 					}
 				})
 			}
@@ -1102,15 +1165,19 @@ export default {
     },
 
     // 发起退货
-    returnOrder(orderId) {
+    returnOrder(deliveryId) {
       this.$router.push({
         name: "sales_return_order_list",
         query: {
-          orderId
+          deliverId: deliveryId
         }
       })
     },
 
+    deliverSelectionChange(val) {
+      this.deliverSelection = val;
+    },
+
     // 查看物流
     queryLogistics(order) {
       this.logisticsVisible = true
@@ -1125,6 +1192,8 @@ export default {
 			if(type == 'add'){
 				this.getOrderDetail()
 				this.getCodeDetail()
+        this.getDeliverList();
+        this.getStorageList();
 				this.openForm('deliverGoods',item)
 			}else if(type == 'edit'){
 				this.openForm('editExpressage',item)
@@ -1140,6 +1209,7 @@ export default {
 				this.logisticsForm.pickPhone = item.pickPhone
 				this.getOrderDetail()
 				this.getCodeDetail()
+        this.getDeliverList();
 				this.openForm('deliverGoodsDetail',item)
 			}
     },
@@ -1155,16 +1225,28 @@ export default {
         if (valid) {
           // 发货
           if (this.logisticsType === 'add') {
-            goodsDeliver({
+            if(this.deliverSelection.length < 1) return this.$errorMsg('请选择一个发货信息');
+
+            orderDeliver({
               orderId: this.editOrderId,
-              logisticsNo: this.logisticsForm.logisticsNo,
+              logisticsNo: this.logisticsForm.pickType == 'NO' ? this.logisticsForm.logisticsNo : '',
               storageId: this.logisticsForm.storageId,
-              companyCode: this.logisticsForm.companyCode,
+              companyCode: this.logisticsForm.pickType == 'NO' ? this.logisticsForm.companyCode : '',
               workOrder: this.logisticsForm.workOrder,
               exchange: this.logisticsForm.exchange,
-			  pickName: this.logisticsForm.pickName,
-			  pickPhone: this.logisticsForm.pickPhone,
-			  pickType: this.logisticsForm.pickType,
+              pickName: this.logisticsForm.pickType == 'YES' ? this.logisticsForm.pickName : '',
+              pickPhone: this.logisticsForm.pickType == 'YES' ? this.logisticsForm.pickPhone : '',
+              pickType: this.logisticsForm.pickType,
+              orderDeliveryDetailList: this.deliverSelection.map(item => {
+                return {
+                  orderDetailId: item.orderDetailId,
+                  sendNum: item.num,
+                  sendInsideCodeQty: item.insideCodeQty,
+                  sendOutCodeQty: item.outCodeQty,
+                  sendPartsCodeQty: item.partsCodeQty,
+                }
+              }),
+              orderDetailCodes: this.formData2.list,
             }).then(() => {
 				cancel('list')
               this.cancelLogistics();
@@ -1189,7 +1271,7 @@ export default {
       })
     },
     getStorageList() {
-      Storage.getList({ pageNum: 1, pageSize: 100 }).then(res => {
+      Storage.getList({ pageNum: 1, pageSize: -1, type: '商品' }).then(res => {
         this.storageList = res.data.records
       })
     },

+ 330 - 0
src/views/mallManagement/order/sales_deliver_order_list/index.vue

@@ -0,0 +1,330 @@
+<template>
+  <zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: $route.meta.title+'-列表', essential: true }]">
+		<template slot-scope="{activeKey, data}">
+			<template-page v-if="activeKey == 'list'" ref="pageRef" :get-list="getList" :table-attributes="tableAttributes" :table-events="tableEvents"
+			  :options-evens-group="optionsEvensGroup" :moreParameters="moreParameters" :column-parsing="columnParsing"
+			  :operation="operation()" :exportList="exportList">
+        <div slot="moreSearch">
+          <el-radio-group v-model="examineStatus" size="mini" @change="changeType">
+            <el-radio-button label="">全部</el-radio-button>
+            <el-radio-button label="SEND">已发货</el-radio-button>
+            <el-radio-button label="REFUND">已退货</el-radio-button>
+          </el-radio-group>
+          <br><br>
+        </div>
+			</template-page>
+
+      <div v-if="~['detail'].indexOf(activeKey)" style="box-sizing: border-box;padding: 16px;">
+        <div style="font-weight: 500;">单据信息</div>
+        <el-divider></el-divider>
+
+        <el-descriptions border title="" :column="4" :colon="false" labelStyle="width: 8%" contentStyle="width: 17%">
+          <el-descriptions-item label="发货方式">
+            {{ {YES: '自提', NO: '快递物流'}[detailData.pickType] }}
+          </el-descriptions-item>
+          <el-descriptions-item label="提货人" v-if="detailData.pickType == 'YES'">
+            {{detailData.pickName}}
+          </el-descriptions-item>
+          <el-descriptions-item label="提货人电话" v-if="detailData.pickType == 'YES'">
+            {{detailData.pickPhone}}
+          </el-descriptions-item>
+          <el-descriptions-item label="物流公司" v-if="detailData.pickType == 'NO'">
+            {{detailData.companyName}}
+          </el-descriptions-item>
+          <el-descriptions-item label="快递单号" v-if="detailData.pickType == 'NO'">
+            {{detailData.logisticsNo}}
+          </el-descriptions-item>
+          <el-descriptions-item label="仓储">
+            {{detailData.storageStockName}}
+          </el-descriptions-item>
+        </el-descriptions>
+        <!-- <el-descriptions border title="" :column="4" :colon="false" labelStyle="width: 8%" contentStyle="width: 17%" style="margin-top: -1px">
+          <el-descriptions-item label="是否派单">
+            {{detailData.saleName}}
+          </el-descriptions-item>
+          <el-descriptions-item label="是否退还单">
+            {{detailData.saleMobile}}
+          </el-descriptions-item>
+          <el-descriptions-item label=""></el-descriptions-item>
+          <el-descriptions-item label=""></el-descriptions-item>
+        </el-descriptions> -->
+
+        <el-tabs style="margin-top: 20px;" v-model="detailTabs">
+          <el-tab-pane label="发货数量" name="a"></el-tab-pane>
+          <el-tab-pane label="发货条码" name="b" v-if="joinCode"></el-tab-pane>
+        </el-tabs>
+
+        <div style="margin-top: 20px;" v-show="detailTabs == 'a'">
+          <el-table :data="detailData.orderDetailSendList" element-loading-text="Loading" border fit highlight-current-row stripe>
+            <el-table-column prop="brandName" align="center" label="品牌"></el-table-column>
+            <el-table-column prop="mainName" align="center" label="大类"></el-table-column>
+            <el-table-column prop="smallName" align="center" label="小类"></el-table-column>
+            <el-table-column prop="goodsName" align="center" label="商品名称" width="140"></el-table-column>
+            <el-table-column prop="goodsMaterialName" align="center" label="物料名称" width="140"></el-table-column>
+            <el-table-column prop="goodsMaterialSpecsName" align="center" label="规格型号" width="140"></el-table-column>
+            <el-table-column prop="goodsMaterialUnit" align="center" label="单位">
+              <template slot-scope="scope">
+                {{scope.row.goodsMaterialUnit == 'C' ? '整套' : scope.row.goodsMaterialUnit == 'I' ? '单个' : ''}}
+              </template>
+            </el-table-column>
+            <el-table-column prop="num" align="center" label="数量"></el-table-column>
+            <el-table-column prop="insideNum" align="center" label="内机数量"></el-table-column>
+            <el-table-column prop="outNum" align="center" label="外机数量"></el-table-column>
+            <el-table-column prop="partNum" align="center" label="配件数量"></el-table-column>
+            <el-table-column prop="insideCodeQty" align="center" label="导入内机条码数量" width="140"></el-table-column>
+            <el-table-column prop="outCodeQty" align="center" label="导入外机条码数量" width="140"></el-table-column>
+            <el-table-column prop="partsCodeQty" align="center" label="导入配件条码数量" width="140"></el-table-column>
+          </el-table>
+        </div>
+
+        <div v-show="detailTabs == 'b'">
+          
+        </div>
+
+				<div slot="footer" class="dialog-footer" style="margin-top: 20px;">
+				  <el-button size="mini" @click="data.removeTab()">关 闭</el-button>
+				</div>
+      </div>
+
+    </template>
+  </zj-tab-page>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { getToken } from '@/utils/auth'
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import { getSalesDeliverOrderList, salesDeliverOrderListExport, getSalesDeliverOrderDetail, salesDeliverOrderRefund } from "@/api/order";
+import operation_mixin from '@/components/template/operation_mixin.js'
+import geographicalPosi from '@/components/geographicalPosi/index.vue'
+
+export default {
+  components: { TemplatePage, geographicalPosi },
+  mixins: [import_mixin,operation_mixin],
+  filters: {
+    saleTypeFilter(val) {
+      const MAP = {
+        1: '商城销售',
+        2: '线下销售',
+      }
+      return MAP[val];
+    },
+    unitFilter(val) {
+      const MAP = {
+        C: '整套',
+        I: '单个'
+      }
+      return MAP[val];
+    },
+  },
+  data() {
+    return {
+      baseURL: process.env.VUE_APP_BASE_API,
+      myHeaders: { 'x-token': getToken() },
+      // 表格属性
+      tableAttributes: {
+        // 启用勾选列
+        selectColumn: true
+      },
+      // 表格事件
+      tableEvents: {
+        'selection-change': this.selectionChange
+      },
+      // 勾选选中行
+      recordSelected: [],
+
+      examineStatus: '',
+      detailTabs: 'a',
+
+      detailData: {},
+
+      pageType: '',
+
+      joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode === "CODE",
+    }
+  },
+  computed: {
+    ...mapGetters(['name']),
+    // 事件组合
+    optionsEvensGroup() {
+      return [
+        [
+          [
+            this.optionsEvensAuth("batchRefund", {
+              click: () => {
+                if (this.recordSelected.length == 0) {
+                  return this.$message.warning('请至少勾选一条数据!');
+                }
+                this.$confirm('确认要批量退货吗?', '提示', {
+                  confirmButtonText: '确定',
+                  cancelButtonText: '取消',
+                  type: 'warning'
+                }).then(() => {
+                  salesDeliverOrderRefund({
+                    deliveryId: this.recordSelected.map(o => o.deliveryId).join(',')
+                  }).then(res => {
+                    this.$message({ type: 'success', message: `批量退货成功!` })
+                    this.$refs.pageRef.refreshList()
+                  })
+                }).catch(() => {});
+              }
+            })
+          ],
+        ]
+      ]
+    },
+    // 更多参数
+    moreParameters() {
+      return []
+    },
+    formItems() {
+      return []
+    }
+  },
+
+  created() {
+		
+  },
+
+  methods: {
+    // 列表请求函数
+    // getList: getSalesDeliverOrderList,
+    getList(p) {
+      try {
+        var pam = JSON.parse(JSON.stringify(p))
+        if (this.examineStatus) {
+          pam.params.push({ "param": "a.status", "compare": "=", "value": this.examineStatus })
+        }
+        return getSalesDeliverOrderList(pam)
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 列表导出函数
+    exportList: salesDeliverOrderListExport,
+    // 表格列解析渲染数据更改
+    columnParsing(item, defaultData) {
+      return defaultData
+    },
+    // 监听勾选变化
+    selectionChange(data) {
+      this.recordSelected = data
+    },
+    // 切换状态
+    changeType(val) {
+      this.$refs.pageRef.refreshList()
+    },
+    // 表格操作列
+    operation() {
+      return this.operationBtn({
+        refund: {
+          conditions: ({ row, index, column }) => {
+            return row.status == 'SEND'
+          },
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            this.$router.push({
+              name: "sales_return_order_list",
+              query: {
+                deliverId: row.deliveryId
+              }
+            })
+          }
+        },
+        refundDetail: {
+          conditions: ({ row, index, column }) => {
+            return row.status == 'REFUND'
+          },
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            this.$router.push({
+              name: "sales_return_order_list",
+              query: {
+                refundId: row.refundId
+              }
+            })
+          }
+        },
+        detail: {
+          btnType: 'text',
+          click: ({ row, index, column }) => {
+            this.openDetail('detail', row.deliveryId)
+          }
+        },
+      })
+    },
+
+    openDetail(type, id) {
+      this.$refs.tabPage.addTab({
+      	// 对应显示的模块
+      	activeKey: type,
+      	// 唯一标识
+      	key: type,
+      	// 页签名称
+      	label: ({ detail: '详情' })[type],
+      	// 打开时事件
+      	triggerEvent: () => {
+          this.pageType = type;
+      		this.$nextTick(()=>{
+            this.detailTabs = 'a';
+            if (type == 'detail') {
+      				this.formDialogType = 0
+      			} else if(type == 'examine'){
+      				this.formDialogType = 1
+      			}
+            getSalesDeliverOrderDetail({ deliveryId: id }).then(res => {
+              this.detailData = res.data;
+            })
+      		})
+      	},
+      	// 关闭时事件
+      	closeEvent: () => {
+			    this.detailCancel()
+      	}
+      })
+    },
+    detailCancel() {
+      this.formVisible = false
+    },
+    detailConfirm(cancel) {
+      salesDeliverOrderRefund({
+        id: this.detailData.id,
+        examineStatus: 'OK',
+      }).then(res => {
+        this.$message({ type: 'success', message: `审批成功!` })
+        cancel('list')
+        this.$refs.pageRef.refreshList()
+      })
+    },
+
+  }
+}
+</script>
+
+<style lang="scss">
+.specTable .el-table__cell {
+  padding: 0 !important;
+}
+
+// 图片墙
+.el-upload-list--picture-card .el-upload-list__item {
+  width: 100px;
+  height: 100px;
+}
+
+.el-upload--picture-card {
+  width: 100px;
+  height: 100px;
+  line-height: 100px;
+
+  .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 100px;
+    height: 100px;
+    line-height: 100px;
+    text-align: center;
+  }
+}
+</style>

+ 135 - 106
src/views/mallManagement/order/sales_return_order_list/index.vue

@@ -31,9 +31,9 @@
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="销售订单号" prop="orderId">
+              <el-form-item label="发货单号" prop="deliveryId">
                 <div style="display: flex; align-items: center;">
-                  <el-input v-model="formData.orderId" autocomplete="off" placeholder="请选择" disabled></el-input>
+                  <el-input v-model="formData.deliveryId" autocomplete="off" placeholder="请选择" disabled></el-input>
                   <el-button type="primary" size="small" @click="openOrderDialog" style="margin-left: 10px;" :disabled="!!formData.id">选择</el-button>
                 </div>
               </el-form-item>
@@ -48,6 +48,11 @@
             </el-col>
 
             <el-col :span="6">
+              <el-form-item label="销售订单号" prop="orderId">
+                <el-input v-model="formData.orderId" autocomplete="off" placeholder="请输入销售订单号" disabled></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
               <el-form-item label="业务员" prop="saleName">
                 <el-input v-model="formData.saleName" autocomplete="off" placeholder="请输入业务员" disabled></el-input>
               </el-form-item>
@@ -57,27 +62,30 @@
                 <el-input v-model="formData.saleMobile" autocomplete="off" placeholder="请输入业务员电话" disabled></el-input>
               </el-form-item>
             </el-col>
-            <!-- <el-col :span="6">
-              <el-form-item label="工单类型" prop="orderSmallType">
-                <el-select v-model="formData.orderSmallType" placeholder="请选择" disabled>
-                  <el-option
-                    v-for="item in orderTypeList"
-                    :key="item.id"
-                    :label="item.orderSmallTypeText"
-                    :value="item.id">
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col> -->
+
+          </el-row>
+          <el-row :gutter="20">
             <el-col :span="6">
               <el-form-item label="下单时间" prop="createTime">
                 <el-input v-model="formData.createTime" autocomplete="off" placeholder="请输入下单时间" disabled></el-input>
               </el-form-item>
             </el-col>
+            <el-col :span="6">
+              <el-form-item label="出货仓库" prop="deliverStorageName">
+                <el-input v-model="formData.deliverStorageName" :disabled="true" placeholder="请输入出货仓库"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item label="退货仓库" prop="storageStockId">
+                <el-select v-model="formData.storageStockId" placeholder="请选择退货仓库" style="width: 100%;">
+							    <el-option :label="item.storageName" :value="item.storageId" v-for="(item, index) in storageList"
+							      :key="index"></el-option>
+							  </el-select>
+              </el-form-item>
+            </el-col>
 
           </el-row>
           <el-row :gutter="20">
-
             <el-col :span="6">
               <el-form-item label="客户名称" prop="receUserName">
                 <el-input v-model="formData.receUserName" autocomplete="off" placeholder="请输入客户名称" disabled></el-input>
@@ -125,7 +133,6 @@
               </el-form-item>
             </div>
             <el-table
-              class="specTable"
               :data="goodsList"
               element-loading-text="Loading"
               border
@@ -143,12 +150,14 @@
               </el-table-column>
               <el-table-column align="center" label="退货数量" prop="waitRefundNum" min-width="120">
                 <template slot-scope="scope">
-                  <el-input size="small" type="number" v-model="scope.row.waitRefundNum"></el-input>
+                  {{scope.row.waitRefundNum}}
+                  <!-- <el-input size="small" type="number" v-model="scope.row.waitRefundNum"></el-input> -->
                 </template>
               </el-table-column>
               <el-table-column align="center" label="退货单价" prop="waitRefundPrice" min-width="120">
                 <template slot-scope="scope">
-                  <el-input size="small" type="number" v-model="scope.row.waitRefundPrice"></el-input>
+                  {{scope.row.waitRefundPrice}}
+                  <!-- <el-input size="small" type="number" v-model="scope.row.waitRefundPrice"></el-input> -->
                 </template>
               </el-table-column>
               <el-table-column align="center" label="退货金额" prop="amount" min-width="120">
@@ -391,17 +400,18 @@
 
 				<div slot="footer" class="dialog-footer" style="margin-top: 20px;">
 				  <el-button size="mini" @click="data.removeTab()">关 闭</el-button>
-				  <el-button size="mini" @click="detailConfirm(data.removeTab)" type="primary" v-if="activeKey == 'examine'">审核通过</el-button>
+				  <el-button size="mini" @click="detailConfirm(data.removeTab, 'FAIL')" type="danger" v-if="activeKey == 'examine'">审核驳回</el-button>
+				  <el-button size="mini" @click="detailConfirm(data.removeTab, 'OK')" type="primary" v-if="activeKey == 'examine'">审核通过</el-button>
 				</div>
       </div>
 
 
       <el-dialog
-        title="选择销售订单"
+        title="选择发货单"
         :visible.sync="isShowOrderDialog"
         :close-on-click-modal="false"
         :show-close="false"
-        width="800px">
+        width="1200px">
 
         <div class="screen-container">
           <el-form ref="screenForm" :model="screenForm" label-width="90px" size="small" label-position="left">
@@ -412,24 +422,16 @@
                 </el-form-item>
               </el-col>
               <el-col :span="8">
-                <el-form-item label="客户名称" prop="userName">
-                  <el-input v-model="screenForm.userName" placeholder="请输入客户名称"></el-input>
-                </el-form-item>
-              </el-col>
-              <el-col :span="8">
-                <el-form-item label="客户电话" prop="phone">
-                  <el-input v-model="screenForm.phone" placeholder="请输入客户电话"></el-input>
+                <el-form-item label="发货单号" prop="deliveryId">
+                  <el-input v-model="screenForm.deliveryId" placeholder="请输入发货单号"></el-input>
                 </el-form-item>
               </el-col>
               <el-col :span="8">
-                <el-form-item label="商品名称" prop="productName">
-                  <el-input v-model="screenForm.productName" placeholder="请输入商品名称"></el-input>
+                <el-form-item label="商品名称" prop="goodsName">
+                  <el-input v-model="screenForm.goodsName" placeholder="请输入商品名称"></el-input>
                 </el-form-item>
               </el-col>
-              <el-col :span="8">
-                <el-form-item label=""></el-form-item>
-              </el-col>
-              <el-col :span="8" class="tr">
+              <el-col :span="24" class="tr">
                 <el-form-item label="">
                   <el-button size="small" type="primary" @click="submitScreenForm">搜索</el-button>
                   <el-button size="small" @click="resetScreenForm">清空</el-button>
@@ -449,44 +451,28 @@
             max-height="270"
             @selection-change="handleChooseGoods">
             <el-table-column align="center" type="selection" width="45"></el-table-column>
-            <el-table-column align="center" prop="orderId" label="订单号" min-width="180"></el-table-column>
-            <el-table-column align="center" prop="orderStatus" label="状态" min-width="80">
-              <template slot-scope="scope">
-                {{scope.row.orderStatus | ORDER_CURRENT_STATUS_FILTER}}
-              </template>
-            </el-table-column>
-            <!-- <el-table-column align="center" prop="goodsPrice" label="品牌" min-width="80"></el-table-column> -->
-            <!-- <el-table-column align="center" prop="goodsPrice" label="大类" min-width="80"></el-table-column> -->
-            <!-- <el-table-column align="center" prop="goodsPrice" label="小类" min-width="80"></el-table-column> -->
-            <el-table-column align="center" prop="goodsName" label="商品名称" min-width="200">
+            <el-table-column align="center" prop="deliveryId" label="发货单号" min-width="180"></el-table-column>
+            <el-table-column align="center" prop="orderId" label="销售订单号" min-width="180"></el-table-column>
+            <el-table-column align="center" prop="status" label="状态" min-width="80">
               <template slot-scope="scope">
-                <div style="text-align: left;" v-for="(item, index) in scope.row.orderDetails" :key="index"><span v-if="scope.row.orderDetails.length > 1">{{index+1}}. </span>{{item.goodsName}}</div>
+                {{{SEND: '已发货', REFUND: '已退货'}[scope.row.status]}}
               </template>
             </el-table-column>
-            <el-table-column align="center" prop="goodsSpecName" label="规格型号" min-width="200">
+            <el-table-column align="center" prop="brandName" label="品牌" min-width="80"></el-table-column>
+            <el-table-column align="center" prop="mainName" label="大类" min-width="80"></el-table-column>
+            <el-table-column align="center" prop="smallName" label="小类" min-width="80"></el-table-column>
+            <el-table-column align="center" prop="goodsName" label="商品名称" min-width="200"></el-table-column>
+            <el-table-column align="center" prop="goodsSpecValue" label="规格型号" min-width="200"></el-table-column>
+            <el-table-column align="center" prop="sendNum" label="数量" min-width="80"></el-table-column>
+            <el-table-column align="center" prop="saleType" label="发货方式" min-width="80">
               <template slot-scope="scope">
-                <div style="text-align: left;" v-for="(item, index) in scope.row.orderDetails" :key="index"><span v-if="scope.row.orderDetails.length > 1">{{index+1}}. </span>{{item.goodsSpecName}}</div>
+                {{{YES: '自提', NO: '快递物流'}[scope.row.pickType]}}
               </template>
             </el-table-column>
-            <el-table-column align="center" prop="totalAmount" label="金额" min-width="80"></el-table-column>
-            <el-table-column align="center" prop="saleName" label="业务员" min-width="80"></el-table-column>
-            <el-table-column align="center" prop="saleMobile" label="业务员电话" min-width="120"></el-table-column>
-            <el-table-column align="center" prop="receUserName" label="客户名称" min-width="80"></el-table-column>
-            <el-table-column align="center" prop="recePhone" label="客户电话" min-width="120"></el-table-column>
-            <el-table-column align="center" prop="receAddress" label="客户地址" min-width="200" show-overflow-tooltip></el-table-column>
-            <el-table-column align="center" prop="saleType" label="销售类型" min-width="80">
-              <template slot-scope="scope">
-                {{scope.row.saleType | saleTypeFilter}}
-              </template>
-            </el-table-column>
-            <!-- <el-table-column align="center" prop="goodsPrice" label="支付状态" min-width="80"></el-table-column> -->
-            <el-table-column align="center" prop="payType" label="支付方式" min-width="80"></el-table-column>
-            <!-- <el-table-column align="center" prop="goodsPrice" label="支付订单号" min-width="80"></el-table-column> -->
-            <el-table-column align="center" prop="payTime" label="支付时间" min-width="160"></el-table-column>
-            <el-table-column align="center" prop="createBy" label="创建人" min-width="160" show-overflow-tooltip></el-table-column>
-            <el-table-column align="center" prop="createTime" label="创建时间" min-width="160"></el-table-column>
-            <el-table-column align="center" prop="examineBy" label="审批人" min-width="160" show-overflow-tooltip></el-table-column>
-            <el-table-column align="center" prop="examineTime" label="审批时间" min-width="160"></el-table-column>
+            <el-table-column align="center" prop="pickName" label="提货人" min-width="80"></el-table-column>
+            <el-table-column align="center" prop="pickPhone" label="提货人电话" min-width="120"></el-table-column>
+            <el-table-column align="center" prop="companyName" label="快递公司" min-width="120"></el-table-column>
+            <el-table-column align="center" prop="deliverTime" label="发货时间" min-width="160"></el-table-column>
           </el-table>
         </div>
         <div class="pagination clearfix">
@@ -519,9 +505,10 @@ import { mapGetters } from 'vuex'
 import { getToken } from '@/utils/auth'
 import TemplatePage from '@/components/template/template-page-1.vue'
 import import_mixin from '@/components/template/import_mixin.js'
-import { getSalesReturnOrderList, salesReturnOrderListExport, salesReturnOrderSave, getSalesReturnOrderDetail, salesReturnOrderExamine, getOrderTypeList, getList, getOrderCodeList, getOrderDetail } from "@/api/order";
+import { getSalesReturnOrderList, salesReturnOrderListExport, salesReturnOrderSave, getSalesReturnOrderDetail, salesReturnOrderExamine, getOrderTypeList, getSalesDeliverOrderList, getOrderCodeList, getOrderDetail, getSalesDeliverOrderDetail } from "@/api/order";
 import operation_mixin from '@/components/template/operation_mixin.js'
 import geographicalPosi from '@/components/geographicalPosi/index.vue'
+import * as Storage from "@/api/storage";
 
 export default {
   components: { TemplatePage, geographicalPosi },
@@ -595,15 +582,20 @@ export default {
 
         isOld: 'NO',
         isReturnOld: '',
+
+        deliverStorageName: '',
+        storageStockId: '',
       },
       formRules: {
         isReturnOld: [{ required: true, message: '请选择是否退旧机', trigger: 'change' }],
+        storageStockId: [{ required: true, message: '请选择退货仓库', trigger: 'change' }],
       },
       formType: 'add',
       formVisible: false,
 
       examineStatus: '',
       orderTypeList: [],
+      storageList: [],
       goodsList: [],
       codeList: [],
       oldList: [],
@@ -617,9 +609,8 @@ export default {
       isShowOrderDialog: false,
       screenForm: {
         orderId: '',
-        userName: '',
-        phone: '',
-        productName: '',
+        deliveryId: '',
+        goodsName: '',
       },
       currentPage: 1, // 当前页码
       pageSize: 10, // 每页数量
@@ -656,30 +647,42 @@ export default {
   },
 
   created() {
-		if(this.$route.query.orderId) {
+		if(this.$route.query.deliverId) {
       this.$nextTick(() => {
         this.openForm('add');
-        getOrderDetail({ orderId: this.$route.query.orderId }).then((res) => {
-          const data = res.data;
-          this.formData.orderId = data.orderId;
-          this.formData.isOld = data.isOld;
-          this.formData.saleType = data.saleType;
-          this.formData.saleName = data.saleName;
-          this.formData.saleMobile = data.saleMobile;
-          this.formData.createTime = data.createTime;
-          this.formData.receUserName = data.receUserName;
-          this.formData.recePhone = data.recePhone;
-          this.formData.receAddress = data.receAddress;
-          data.orderDetails.forEach(item => {
-            item.waitRefundNum = item.num;
-            item.waitRefundPrice = item.price;
+        getSalesDeliverOrderDetail({ deliveryId: this.$route.query.deliverId }).then(res => {
+          const dData = res.data;
+          this.formData.deliveryId = dData.deliveryId;
+          this.formData.deliverStorageName = dData.storageStockName;
+
+          getOrderDetail({ orderId: dData.orderId }).then((res) => {
+            const oData = res.data;
+            this.formData.orderId = oData.orderId;
+            this.formData.isOld = oData.isOld;
+            this.formData.saleType = oData.saleType;
+            this.formData.saleName = oData.saleName;
+            this.formData.saleMobile = oData.saleMobile;
+            this.formData.createTime = oData.createTime;
+            this.formData.receUserName = oData.receUserName;
+            this.formData.recePhone = oData.recePhone;
+            this.formData.receAddress = oData.receAddress;
+            oData.orderDetails.forEach(item => {
+              item.waitRefundNum = item.sendNum;
+              item.waitRefundPrice = item.price;
+            })
+            this.goodsList = oData.orderDetails;
+            this.oldList = oData.orderOldProductDTOList;
+          })
+          getOrderCodeList({orderId: dData.orderId}).then(res => {
+            this.codeList = res.data;
           })
-          this.goodsList = data.orderDetails;
-          this.oldList = data.orderOldProductDTOList;
-        })
-        getOrderCodeList({orderId: this.$route.query.orderId}).then(res => {
-          this.codeList = res.data;
         })
+        
+      })
+    }
+    if(this.$route.query.refundId) {
+      this.$nextTick(() => {
+        this.openDetail('detail', this.$route.query.refundId);
       })
     }
     
@@ -756,6 +759,7 @@ export default {
       		this.formCancel()
       		this.$nextTick(()=>{
             // this.getOrderTypeList();
+            this.getStorageList();
       			this.formType = type
       			this.formVisible = true
             this.formTabs = 'a';
@@ -767,8 +771,11 @@ export default {
       				getSalesReturnOrderDetail({ id }).then(res => {
                 const data = res.data;
                 this.formData.id = data.id;
+                this.formData.deliveryId = data.deliveryId;
                 this.formData.companyWechatName = data.companyWechatName;
                 this.formData.orderId = data.orderId;
+                this.formData.storageStockId = data.storageStockId;
+                this.formData.storageStockName = data.storageStockName;
                 this.formData.saleType = data.orderInfo.saleType;
                 this.formData.saleName = data.orderInfo.saleName;
                 this.formData.saleMobile = data.orderInfo.saleMobile;
@@ -815,8 +822,11 @@ export default {
     formConfirm(cancel) {
       this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
         if (valid) {
+          if(!this.formData.storageStockId) return this.$errorMsg('请选择退货仓库');
+
           salesReturnOrderSave({
             id: this.formData.id || '',
+            deliveryId: this.formData.deliveryId,
             orderId: this.formData.orderId,
             remark: this.formData.remark,
             fileUrls: this.formData.fileUrl,
@@ -831,6 +841,8 @@ export default {
             orderOfflineItemCodes: this.joinCode ? this.codeList : [],
             isOld: this.formData.isReturnOld,
             ids: this.oldList.map(o => o.id),
+            storageStockId: this.formData.storageStockId,
+            storageStockName: this.storageList.find(o => o.storageId == this.formData.storageStockId).storageName,
           }).then(res => {
             this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })
             cancel('list')
@@ -873,10 +885,10 @@ export default {
     detailCancel() {
       this.formVisible = false
     },
-    detailConfirm(cancel) {
+    detailConfirm(cancel, status) {
       salesReturnOrderExamine({
         id: this.detailData.id,
-        examineStatus: 'OK',
+        examineStatus: status,
       }).then(res => {
         this.$message({ type: 'success', message: `审批成功!` })
         cancel('list')
@@ -909,15 +921,22 @@ export default {
       this.waitChooseOrder = val;
     },
 
+    getStorageList() {
+      Storage.getList({ pageNum: 1, pageSize: -1, type: '商品' }).then(res => {
+        this.storageList = res.data.records;
+      })
+    },
+
     getOrderList() {
-      getList({
-        orderStatus: 'YFH,OVER',
-        orderId: this.screenForm.orderId, // 订单号
-        productName: this.screenForm.productName, // 商品名称
-        userName: this.screenForm.userName, // 会员昵称
-        phone: this.screenForm.phone, // 手机号
+      getSalesDeliverOrderList({
         pageNum: this.currentPage,
-        pageSize: this.pageSize
+        pageSize: this.pageSize,
+        params: [
+          {param: "a.order_id", compare: "like", value: this.screenForm.orderId},
+          {param: "a.delivery_id", compare: "like", value: this.screenForm.deliveryId},
+          {param: "b.goods_name", compare: "like", value: this.screenForm.goodsName},
+          {param: "a.status", compare: "=", value: 'SEND'},
+        ]
       }).then(res => {
         this.orderList = res.data.records;
         this.listTotal = res.data.total;
@@ -952,11 +971,21 @@ export default {
 
     confirmOrderDialog() {
       if(this.waitChooseOrder.length < 1) {
-        return this.$errorMsg('请选择单');
+        return this.$errorMsg('请选择发货单');
       }
       if(this.waitChooseOrder.length > 1) {
-        return this.$errorMsg('最多选择一个单');
+        return this.$errorMsg('最多选择一个发货单');
       }
+      getSalesDeliverOrderDetail({ deliveryId: this.waitChooseOrder[0].deliveryId }).then(res => {
+        const data = res.data;
+        this.formData.deliveryId = data.deliveryId;
+        this.formData.deliverStorageName = data.storageStockName;
+        data.orderDetailSendList.forEach(item => {
+          item.waitRefundNum = item.sendNum;
+          item.waitRefundPrice = item.price;
+        })
+        this.goodsList = data.orderDetailSendList;
+      })
       getOrderDetail({ orderId: this.waitChooseOrder[0].orderId }).then((res) => {
         const data = res.data;
         this.formData.orderId = data.orderId;
@@ -968,11 +997,11 @@ export default {
         this.formData.receUserName = data.receUserName;
         this.formData.recePhone = data.recePhone;
         this.formData.receAddress = data.receAddress;
-        data.orderDetails.forEach(item => {
-          item.waitRefundNum = item.num;
-          item.waitRefundPrice = item.price;
-        })
-        this.goodsList = data.orderDetails;
+        // data.orderDetails.forEach(item => {
+        //   item.waitRefundNum = item.num;
+        //   item.waitRefundPrice = item.price;
+        // })
+        // this.goodsList = data.orderDetails;
         this.oldList = data.orderOldProductDTOList;
 
         getOrderCodeList({orderId: data.orderId}).then(res => {

+ 58 - 3
src/views/mallManagement/storage/index.vue

@@ -24,7 +24,7 @@
 import TemplatePage from '@/components/template/template-page-1.vue'
 import import_mixin from '@/components/template/import_mixin.js'
 import { required, mobileRequired, mobile } from '@/components/template/rules_verify.js'
-import { storageListPageV2, storagePageExport, addStorage, deleteStorage, editStorage, getStorageDetail } from "@/api/storage";
+import { storageListPageV2, storagePageExport, addStorage, deleteStorage, editStorage, getStorageDetail, getWebsitList } from "@/api/storage";
 import operation_mixin from '@/components/template/operation_mixin.js'
 export default {
   components: { TemplatePage },
@@ -50,9 +50,15 @@ export default {
         storageName: '',
         storageMobile: '',
         storageAddress: '',
+        status: true,
+        type: [],
+        websitId: '',
+        websitName: '',
+        isDefault: false,
       },
 			formType: 'add',
 			formVisible: false,
+      websitList: [],
     }
   },
   computed: {
@@ -96,7 +102,7 @@ export default {
           rules: [...mobile]
         }
       }, {
-        md: 6,
+        md: 12,
         isShow: true,
         name: 'el-input',
         attributes: { placeholder: '请输入' },
@@ -105,6 +111,44 @@ export default {
           prop: 'storageAddress',
           rules: []
         }
+      }, {
+        md: 6,
+        isShow: true,
+        name: 'el-checkbox',
+        options: [{value: '商品', label: '商品'}, {value: '辅材', label: '辅材'}, {value: '配件', label: '配件'}],
+        attributes: { disabled: this.formDialogType == 1 },
+        formItemAttributes: {
+          label: '仓储属性',
+          prop: 'type',
+          rules: [...required]
+        },
+      }, {
+        md: 6,
+        isShow: this.formData.type.length > 0 && this.formData.type.indexOf('商品') < 0,
+        name: 'el-select',
+        options: this.websitList,
+        attributes: { filterable: true, placeholder: '请选择', disabled: this.formDialogType == 1 },
+        formItemAttributes: {
+          label: '所属网点',
+          prop: 'websitId',
+          rules: [...required]
+        },
+        events: {
+          change: () => {
+            this.formData.websitName = this.websitList.find(o => o.value == this.formData.websitId).label;
+          }
+        }
+      }, {
+        md: 6,
+        isShow: true,
+        name: 'el-radio',
+        options: [{value: true, label: '启用'}, {value: false, label: '禁用'}],
+        attributes: { disabled: this.formData.isDefault },
+        formItemAttributes: {
+          label: '状态',
+          prop: 'status',
+          rules: [...required]
+        },
       }]
     }
   },
@@ -157,11 +201,22 @@ export default {
     			this.$nextTick(()=>{
     				this.formType = type
     				this.formVisible = true
+            getWebsitList({
+              status: 1,
+              type: 'C'
+            }).then(res => {
+              this.websitList = res.data.map(item => ({
+                label: item.name,
+                value: item.websitId,
+                data: item
+              }))
+            })
     				if (type == 'add') {
     					this.formDialogType = 0
     				} else if(type == 'edit'){
     					this.formDialogType = 1
     					getStorageDetail({ id }).then(res => {
+                res.data.type = res.data.type.split(',');
     					  Object.assign(this.formData, res.data)
     					})
     				}
@@ -181,7 +236,7 @@ export default {
     formConfirm(cancel) {
       this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
         if (valid) {
-          ([addStorage, editStorage][this.formDialogType])(this.formData).then(res => {
+          ([addStorage, editStorage][this.formDialogType])({...this.formData, type: this.formData.type.join(',')}).then(res => {
             this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })
             cancel('list')
             this.$refs.pageRef.refreshList()