浏览代码

feat:
销售发货单
1. 列表、详情
2. 批量退货
3. 发起退货
4. 退货详情

销售退货单
1. 新增销售退货单时,选择订单改为选择发货单
2. 需要选择退货仓库

Moss 1 年之前
父节点
当前提交
e82b262591

+ 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
+  })
+}

+ 91 - 37
src/views/mallManagement/order/order_list/index.vue

@@ -405,9 +405,9 @@
 											<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' ? '单个' : ''}}
@@ -461,14 +461,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%;">
@@ -556,8 +556,38 @@
                   <!-- 发货记录 -->
                   <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="num" 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>
 
@@ -661,7 +691,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'
@@ -723,13 +753,13 @@ export default {
         pickPhone: '',
         logisticsNo: '',
         storageId: '',
-		storageName: '',
+		    storageName: '',
         companyCode: '',
         workOrder: true,
         exchange: false,
-		pickType: 'YES',
-		pickName: '',
-		pickPhone: ''
+        pickType: 'YES',
+        pickName: '',
+        pickPhone: ''
       },
       logisticsTab: 'first',
       storageList: [],
@@ -764,26 +794,26 @@ export default {
       cityList: [],
       areaList: [],
       streetList: [],
-		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: '',
+      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,//打印名称
     }
   },
   computed: {
@@ -881,9 +911,19 @@ export default {
 			this.formData1.list = arr
 		})
 	},
+  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 => {
@@ -973,6 +1013,7 @@ export default {
 			    this.$message({ type: 'success', message: '删除成功!' })
 			    this.getOrderDetail()
 			    this.getCodeDetail()
+          this.getDeliverList();
 			  } else {
 			    this.$message.error(res.msg);
 			  }
@@ -996,6 +1037,7 @@ export default {
 						that.$message.success('保存成功!')
 						this.getOrderDetail()
 						this.getCodeDetail()
+            this.getDeliverList();
 					}
 				})
 			}
@@ -1119,11 +1161,11 @@ export default {
     },
 
     // 发起退货
-    returnOrder(orderId) {
+    returnOrder(deliveryId) {
       this.$router.push({
         name: "sales_return_order_list",
         query: {
-          orderId
+          deliverId: deliveryId
         }
       })
     },
@@ -1142,6 +1184,7 @@ export default {
 			if(type == 'add'){
 				this.getOrderDetail()
 				this.getCodeDetail()
+        this.getDeliverList();
 				this.openForm('deliverGoods',item)
 			}else if(type == 'edit'){
 				this.openForm('editExpressage',item)
@@ -1157,6 +1200,7 @@ export default {
 				this.logisticsForm.pickPhone = item.pickPhone
 				this.getOrderDetail()
 				this.getCodeDetail()
+        this.getDeliverList();
 				this.openForm('deliverGoodsDetail',item)
 			}
     },
@@ -1172,16 +1216,26 @@ export default {
         if (valid) {
           // 发货
           if (this.logisticsType === 'add') {
-            goodsDeliver({
+            orderDeliver({
               orderId: this.editOrderId,
               logisticsNo: this.logisticsForm.logisticsNo,
               storageId: this.logisticsForm.storageId,
               companyCode: 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.pickName,
+              pickPhone: this.logisticsForm.pickPhone,
+              pickType: this.logisticsForm.pickType,
+              orderDeliveryDetailList: this.formData1.list.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();
@@ -1206,7 +1260,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
       })
     },

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

@@ -0,0 +1,324 @@
+<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="提货人">
+            {{detailData.pickName}}
+          </el-descriptions-item>
+          <el-descriptions-item label="提货人电话">
+            {{detailData.pickPhone}}
+          </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>

+ 109 - 93
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>
@@ -412,24 +420,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 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="phone">
-                  <el-input v-model="screenForm.phone" 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="商品名称" prop="productName">
-                  <el-input v-model="screenForm.productName" 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 +449,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">
-              <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>
-              </template>
-            </el-table-column>
-            <el-table-column align="center" prop="goodsSpecName" 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.goodsSpecName}}</div>
+                {{{SEND: '已发货', REFUND: '已退货'}[scope.row.status]}}
               </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">
+            <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">
-                {{scope.row.saleType | saleTypeFilter}}
+                {{{YES: '自提', NO: '快递物流'}[scope.row.pickType]}}
               </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 +503,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,6 +580,9 @@ export default {
 
         isOld: 'NO',
         isReturnOld: '',
+
+        deliverStorageName: '',
+        storageStockId: '',
       },
       formRules: {
         isReturnOld: [{ required: true, message: '请选择是否退旧机', trigger: 'change' }],
@@ -604,6 +592,7 @@ export default {
 
       examineStatus: '',
       orderTypeList: [],
+      storageList: [],
       goodsList: [],
       codeList: [],
       oldList: [],
@@ -617,9 +606,8 @@ export default {
       isShowOrderDialog: false,
       screenForm: {
         orderId: '',
-        userName: '',
-        phone: '',
-        productName: '',
+        deliveryId: '',
+        goodsName: '',
       },
       currentPage: 1, // 当前页码
       pageSize: 10, // 每页数量
@@ -656,30 +644,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.num;
+              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 +756,7 @@ export default {
       		this.formCancel()
       		this.$nextTick(()=>{
             // this.getOrderTypeList();
+            this.getStorageList();
       			this.formType = type
       			this.formVisible = true
             this.formTabs = 'a';
@@ -815,8 +816,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 +835,7 @@ export default {
             orderOfflineItemCodes: this.joinCode ? this.codeList : [],
             isOld: this.formData.isReturnOld,
             ids: this.oldList.map(o => o.id),
+            storageStockId: this.formData.storageStockId,
           }).then(res => {
             this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })
             cancel('list')
@@ -909,15 +914,21 @@ export default {
       this.waitChooseOrder = val;
     },
 
+    getStorageList() {
+      Storage.getList({ pageNum: 1, pageSize: -1 }).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}
+        ]
       }).then(res => {
         this.orderList = res.data.records;
         this.listTotal = res.data.total;
@@ -952,11 +963,16 @@ 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;
+      })
       getOrderDetail({ orderId: this.waitChooseOrder[0].orderId }).then((res) => {
         const data = res.data;
         this.formData.orderId = data.orderId;

+ 24 - 1
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 },
@@ -52,9 +52,11 @@ export default {
         storageAddress: '',
         status: true,
         type: [],
+        websitId: '',
       },
 			formType: 'add',
 			formVisible: false,
+      websitList: [],
     }
   },
   computed: {
@@ -121,6 +123,17 @@ export default {
       }, {
         md: 6,
         isShow: true,
+        name: 'el-select',
+        options: this.websitList,
+        attributes: { filterable: true, placeholder: '请选择', disabled: this.formDialogType == 2, },
+        formItemAttributes: {
+          label: '所属网点',
+          prop: 'websitId',
+          rules: [...required]
+        }
+      }, {
+        md: 6,
+        isShow: true,
         name: 'el-radio',
         options: [{value: true, label: '启用'}, {value: false, label: '禁用'}],
         attributes: {},
@@ -181,6 +194,16 @@ 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'){