فهرست منبع

发货,维权订单退货

pengyh 1 سال پیش
والد
کامیت
539f668764
3فایلهای تغییر یافته به همراه832 افزوده شده و 36 حذف شده
  1. 76 3
      src/api/order.js
  2. 368 14
      src/views/mallManagement/order/order_list/index.vue
  3. 388 19
      src/views/mallManagement/order/order_refund/index.vue

+ 76 - 3
src/api/order.js

@@ -27,6 +27,79 @@ export function getOrderDetail(params) {
   })
 }
 
+//发货条码详情
+export function getCodeDetail(params) {
+  return request({
+    url: '/jx/goods/detail',
+    method: 'post',
+    params
+  })
+}
+
+//退货条码详情
+export function getCodeDetail2(params) {
+  return request({
+    url: '/jx/goods/detailRefund',
+    method: 'post',
+    params
+  })
+}
+
+//保存发货条码
+export function saveCode(data) {
+  return request({
+    url: '/jx/goods/save',
+    method: 'post',
+    data
+  })
+}
+
+//保存退货条码
+export function saveCode2(data) {
+  return request({
+    url: '/jx/goods/saveRefund',
+    method: 'post',
+    data
+  })
+}
+
+//删除发货条码
+export function delCode(data) {
+  return request({
+    url: '/jx/goods/remove',
+    method: 'post',
+    data
+  })
+}
+
+//删除退货条码
+export function delCode2(data) {
+  return request({
+    url: '/jx/goods/removeRefund',
+    method: 'post',
+    data
+  })
+}
+
+//导入发货条码
+export function listImport(data) {
+	return handleImport('/jx/goods/import', data.formdata, data.id || '')
+}
+
+//导入退货条码
+export function listImport2(data) {
+	return handleImport('/jx/goods/importRefund', data.formdata, data.id || '')
+}
+
+//规格型号
+export function getMaterialList(params) {
+  return request({
+    url: '/goods/material/item/list',
+    method: 'post',
+    params
+  })
+}
+
 // 取消订单
 export function cancelOrder(params) {
   return request({
@@ -64,11 +137,11 @@ export function changeReceiveInfo(params) {
 }
 
 // 发货
-export function goodsDeliver(params) {
+export function goodsDeliver(data) {
   return request({
-    url: '/order/goods/deliver',
+    url: '/order/goods/deliverV2',
     method: 'post',
-    params
+    data
   })
 }
 

+ 368 - 14
src/views/mallManagement/order/order_list/index.vue

@@ -308,11 +308,29 @@
 				<el-form :model="logisticsForm" ref="logisticsForm" label-width="100px" label-position="left">
 					<el-row :gutter="20">
 						<el-col :span="6">
+							<el-form-item label="发货方式" prop="pickType" v-if="logisticsType === 'add'">
+							  <el-radio-group v-model="logisticsForm.pickType">
+							    <el-radio label="YES">自提/自送</el-radio>
+							    <el-radio label="NO">快递物流</el-radio>
+							  </el-radio-group>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6" v-if="logisticsForm.pickType == 'YES'">
+							<el-form-item label="提货人" prop="pickName" :rules="[{ required: true, message: '提货人不能为空', trigger: 'blur' }]">
+							  <el-input v-model="logisticsForm.pickName" placeholder="请输入提货人"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6" v-if="logisticsForm.pickType == 'YES'">
+							<el-form-item label="提货人电话" prop="pickPhone" :rules="[{ required: true, message: '提货人电话不能为空', trigger: 'blur' },{ pattern:/^((1[3456789]\d{9}))$/, message: '电话号码格式不正确', trigger: 'blur' }]">
+							  <el-input v-model="logisticsForm.pickPhone" placeholder="请输入提货人电话"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6" v-if="logisticsForm.pickType == 'NO'">
 							<el-form-item label="快递单号" prop="logisticsNo" :rules="[{ required: true, message: '快递单号不能为空', trigger: 'blur' }]">
 							  <el-input v-model="logisticsForm.logisticsNo" placeholder="请输入快递单号"></el-input>
 							</el-form-item>
 						</el-col>
-						<el-col :span="6">
+						<el-col :span="6" v-if="logisticsForm.pickType == 'NO'">
 							<el-form-item label="物流公司" prop="companyCode"
 							  :rules="[{ required: true, message: '请选择物流公司', trigger: 'change' }]">
 							  <el-select v-model="logisticsForm.companyCode" placeholder="请选择物流公司" style="width: 100%;">
@@ -346,10 +364,167 @@
 							  </el-radio-group>
 							</el-form-item>
 						</el-col>
+						<el-col :span="24">
+							<el-card class="box-card">
+								<el-tabs v-model="typeIndex">
+								    <el-tab-pane label="发货数量" name="1"></el-tab-pane>
+								    <el-tab-pane label="发货条码" name="2"></el-tab-pane>
+								</el-tabs>
+								<el-button size="small" v-show="typeIndex == 2" type="primary" @click="addCode()">新增</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-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="goodsMaterialSpecsName" align="center" label="规格型号"></el-table-column>
+											<el-table-column prop="goodsMaterialUnit" align="center" label="单位"></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-column label="操作" align="center" width="140" fixed="right">
+												<template slot-scope="scope" v-if="formType != 2 && joinCode">
+													<el-upload
+													  action='_'
+													  :show-file-list='false'
+													  :http-request="importCode"
+													>
+														<el-button size="mini" type="text">导入条码</el-button>
+													</el-upload>
+													<el-button size="mini" type="text" @click="handleDownload('导入条码')">模板下载</el-button>
+												</template>
+											</el-table-column>
+										</el-table>
+									</el-form>
+									<!-- 发货条码 -->
+									<el-form ref="formData2" :model="formData2">
+										<el-table v-show="typeIndex == 2" :data="formData2.list" element-loading-text="Loading" border fit highlight-current-row stripe>
+											<el-table-column label="品牌" align="center">
+												<template slot-scope="scope">
+													<el-form-item>
+														<el-input type="text" v-model="scope.row.brandName" :disabled="true" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="商品大类" align="center">
+												<template slot-scope="scope">
+													<el-form-item>
+														<el-input type="text" v-model="scope.row.mainName" :disabled="true" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="商品小类" align="center">
+												<template slot-scope="scope">
+													<el-form-item>
+														<el-input type="text" v-model="scope.row.smallName" :disabled="true" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="商品名称">
+												<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">
+												<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="goodsMaterialSpecsName" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请选择" style="width: 100%;">
+														    <el-option
+														      v-for="(item,ind) in formData1.list"
+														      :key="ind"
+														      :label="item.goodsMaterialSpecsName"
+														      :value="item">
+														    </el-option>
+														</el-select>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="物料类型" align="center">
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.goodsMaterialItemType'" :rules="[{ required: true, message: `请选择物料类型`, trigger: 'blur' }]">
+														<el-select v-model="scope.row.goodsMaterialItemType" @change="(e)=>{changeMaterial(e,scope.row)}" 
+															:disabled="isEdit2 != scope.$index || formType == 2" placeholder="请选择" style="width: 100%;">
+														    <el-option
+														      v-for="(item,ind) in [{name: '内机',id: 'INSIDE'},{name: '外机',id: 'OUT'},{name: '配件',id: 'PARTS'}]"
+														      :key="ind"
+														      :label="item.name"
+														      :value="item.id">
+														    </el-option>
+														</el-select>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="物料名称" align="center">
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.material'" :rules="[{ required: true, message: `请选择物料名称`, trigger: 'blur' }]">
+														<el-select v-model="scope.row.material" @focus="(e)=>{
+															if(!scope.row.goodsMaterialItemType){
+																return this.$message.warning('请先选择物料类型!');
+															}
+														}" @change="(e)=>{
+															scope.row.materialName = e.name
+															scope.row.stockQty = e.stockQty
+															scope.row.uniqueCode = e.uniqueCode
+															
+														}" value-key="name" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请选择" style="width: 100%;">
+														    <el-option
+														      v-for="(item,ind) in scope.row.materialList"
+														      :key="ind"
+														      :label="item.name"
+														      :value="item">
+														    </el-option>
+														</el-select>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="是否一物一码" >
+												<template slot-scope="scope">
+													<el-form-item>
+														{{scope.row.uniqueCode=='YES'?'是':scope.row.uniqueCode=='NO'?'否':''}}
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="条码" >
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.materialCode'" :rules="[{ required: true, message: `请输入条码`, trigger: 'blur' }]">
+														<el-input type="number" v-model="scope.row.materialCode" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="数量">
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.stockQty'" :rules="[{ required: true, message: `请输入数量`, trigger: 'blur' }]">
+														<el-input type="number" v-model="scope.row.stockQty" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="操作" align="right" width="140" fixed="right">
+												<template slot-scope="scope" v-if="formType != 2">
+													<el-button size="mini" type="primary" v-if="scope.$index == isEdit2" @click="saveCode(scope.row)">保存</el-button>
+													<el-button size="mini" type="primary" v-if="scope.$index != isEdit2" @click="isEdit2 = scope.$index">编辑</el-button>
+													<el-popconfirm title="确定删除吗?" @confirm="delCode(scope.row.orderDetailCodeId,scope.$index)">
+														<el-button slot="reference" size="mini" type="danger">删除</el-button>
+													</el-popconfirm>
+												</template>
+											</el-table-column>
+										</el-table>
+									</el-form>
+								</div>
+							</el-card>
+						</el-col>
 					</el-row>
 				</el-form>
+				<br/>
 				<div slot="footer" class="dialog-footer">
-				  <el-button type="primary" @click="saveLogistics(data.removeTab)">保 存</el-button>
+				  <el-button type="primary" @click="saveLogistics(data.removeTab)">{{logisticsType === 'add'?'发 货':'保 存'}}</el-button>
 				  <el-button @click="cancelLogistics;data.removeTab()">取 消</el-button>
 				</div>
 			</div>
@@ -437,14 +612,17 @@
 
 <script>
 import { getToken } from '@/utils/auth'
-import { cancelOrder, getList, goodsDeliver, saveRemark, batchShipment, batchRemark, getWebsiteList, editLogistics, getRegion, editAddress } from "@/api/order";
+import { cancelOrder, getList, goodsDeliver, saveRemark, batchShipment, batchRemark, getWebsiteList, editLogistics, getRegion, editAddress, getOrderDetail, getCodeDetail, getMaterialList, listImport, saveCode, delCode } from "@/api/order";
 import { getExpress, getCompanyList } from "@/api/common";
 import { downloadFiles, handleImport } from '@/utils/util'
+import { commonTemplateDownload } from '@/api/common.js'
+import import_mixin from '@/components/template/import_mixin.js'
 import * as Storage from "@/api/storage";
 import '@/styles/order-list.scss'
 
 export default {
   name: "order_list",
+  mixins: [import_mixin],
   data() {
     return {
       baseURL: process.env.VUE_APP_BASE_API,
@@ -490,6 +668,9 @@ export default {
         companyCode: '',
         workOrder: true,
         exchange: false,
+		pickType: 'YES',
+		pickName: '',
+		pickPhone: ''
       },
       storageList: [],
       companyList: [],
@@ -523,8 +704,18 @@ export default {
       cityList: [],
       areaList: [],
       streetList: [],
-			formType: 'add',
-			formVisible: false,
+		formType: 'add',
+		formVisible: false,
+		typeIndex: '1',
+		formData1: {
+			list: [],
+		},
+		formData2: {
+			list: [],
+		},
+		isEdit1: 0,
+		isEdit2: 0,
+		joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode,
     }
   },
   computed: {
@@ -597,6 +788,117 @@ export default {
         // this.listLoading = false;
       })
     },
+	getOrderDetail(){
+		getOrderDetail({orderId: this.editOrderId}).then(res => {
+		  this.formData1.list = res.data.orderDetails
+		})
+	},
+	async getCodeDetail(){
+		getCodeDetail({orderId: this.editOrderId}).then(async res => {
+			for(var item of res.data){
+				item.specs = {goodsMaterialSpecsName: item.specsName}
+				item.material = {name: item.materialName}
+				item.materialList = await this.getMaterialList(item.specsName,item.goodsMaterialItemType)
+			}
+			this.formData2.list = res.data
+		})
+	},
+	async getMaterialList(specsName,type){
+		return new Promise((resolve, reject) => {
+			getMaterialList({
+				pageNum: 1,
+				pageSize: -1,
+				specsName,
+				type
+			}).then(async res => {
+				resolve(res.data.records) 
+			})
+		})
+		
+	},
+	async changeSpecs(e,row){
+		row.brandName = e.brandName
+		row.brandId = e.brandId
+		row.mainName = e.mainName
+		row.mainId = e.mainNumber
+		row.smallName = e.smallName
+		row.smallId = e.smallNumber
+		row.specsName = e.goodsMaterialSpecsName
+		row.goodsMaterialName = e.goodsName
+		row.goodsMaterialId = e.goodsMaterialId
+		row.material = null
+		row.materialName = ''
+		row.stockQty = ''
+		row.uniqueCode = ''
+		row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
+	},
+	async changeMaterial(e,row){
+		row.material = null
+		row.materialName = ''
+		row.stockQty = ''
+		row.uniqueCode = ''
+		row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
+	},
+	//发货新增条码
+	addCode(){
+		this.isEdit2 = 0
+		this.formData2.list.push({
+			brandId: '',
+			brandName: '',
+			mainId: '',
+			mainName: '',
+			stockQty: '',
+			smallId: '',
+			smallName: '',
+			goodsMaterialItemType: '',
+			goodsMaterialName: '',
+			goodsMaterialId: '',
+			materialCode: '',
+			uniqueCode: '',
+			specs: null,
+			specsName: '',
+			materialName: '',
+			material: null,
+			materialList: []
+		})
+	},
+	delCode(orderDetailCodeId,index){
+		if(orderDetailCodeId){
+			delCode({
+			  orderDetailCodeId
+			}).then(res => {
+			  if (res.code == 200) {
+			    this.$message({ type: 'success', message: '删除成功!' })
+			    this.getOrderDetail()
+			    this.getCodeDetail()
+			  } else {
+			    this.$message.error(res.msg);
+			  }
+			})
+		}else{
+			this.formData2.list.splice(index,1)
+		}
+	},
+	saveCode(orderDetailCodes){
+		const that = this
+		let params = [{
+			...orderDetailCodes,
+			orderId: this.editOrderId,
+		}]
+		delete params[0].material;
+		delete params[0].specs;
+		this.$refs.formData2.validate((valid, invalidFields, errLabels) => {
+			if (valid) {
+				saveCode(params).then(res=>{
+					if(res.code == 200){
+						that.$message.success('保存成功!')
+						this.getOrderDetail()
+						this.getCodeDetail()
+					}
+				})
+			}
+		})
+	},
     // 查看详情
     queryDetail(orderId) {
       // let {href} = this.$router.resolve({path: `/order/detail?orderId=${orderId}`});
@@ -708,18 +1010,20 @@ export default {
     queryLogistics(order) {
       this.logisticsVisible = true
       this.logisticsLoading = true
-	  this.openForm('materialDetail',order)
+			this.openForm('materialDetail',order)
     },
     // 显示快递信息填写
     showLogistics(item, type) {
-		this.logisticsType = type;
-		this.logisticsIdVisible = true;
-		this.editOrderId = item.orderId;
-		if(type == 'add'){
-			this.openForm('deliverGoods',item)
-		}else{
-			this.openForm('editExpressage',item)
-		}
+			this.logisticsType = type;
+			this.logisticsIdVisible = true;
+			this.editOrderId = item.orderId;
+			if(type == 'add'){
+				this.getOrderDetail()
+				this.getCodeDetail()
+				this.openForm('deliverGoods',item)
+			}else{
+				this.openForm('editExpressage',item)
+			}
     },
     // 取消快递信息填写
     cancelLogistics() {
@@ -740,6 +1044,9 @@ export default {
               companyCode: this.logisticsForm.companyCode,
               workOrder: this.logisticsForm.workOrder,
               exchange: this.logisticsForm.exchange,
+			  pickName: this.logisticsForm.pickName,
+			  pickPhone: this.logisticsForm.pickPhone,
+			  pickType: this.logisticsForm.pickType,
             }).then(() => {
 				cancel('list')
               this.cancelLogistics();
@@ -1054,6 +1361,53 @@ export default {
       })
 
     },
+	
+	importCode(data){
+		const loading = this.$loading({
+		  lock: true,
+		  text: '正在导入',
+		  spinner: 'el-icon-loading',
+		  background: 'rgba(0, 0, 0, 0.7)'
+		})
+		var formdata = new FormData()
+		formdata.append('file', data.file)
+		let params = {}
+		if (!!params) {
+		  for (const key in params) {
+		    if (Object.hasOwnProperty.call(params, key)) {
+		      formdata.append(key, params[key])
+		    }
+		  }
+		}
+		listImport({ formdata })
+		  .then(res => {
+		    this.$refs.pageRef.refreshList()
+		    loading.close()
+		    this.$message({
+		      type: 'success',
+		      message: '导入成功!'
+		    })
+		  })
+		  .catch(err => {
+		    loading.close()
+		    this.$message({
+		      type: 'error',
+		      message: err.message || '导入失败'
+		    })
+		  })
+	},
+	
+	// 下载导入模版
+	handleDownload(title) {
+		commonTemplateDownload({ name: '导入条码.xlsx' }, title).then(res => {
+			this.$message({
+				message: '下载成功',
+				type: 'success'
+			})
+		}).catch(err => {
+			this.$message.error('下载失败')
+		})
+	},
 
   }
 }

+ 388 - 19
src/views/mallManagement/order/order_refund/index.vue

@@ -193,7 +193,7 @@
 				          <div class="col-item">
 				            <div class="operate" v-if="order.orderStatus === 'DSJCL'">
 				              <div>
-				                <el-button v-if="$restrict('agree')" slot="reference" type="text" size="small" @click="changeExamineStatus(order.orderRefundId,'OK')">同意</el-button>
+				                <el-button v-if="$restrict('agree')" slot="reference" type="text" size="small" @click="changeExamineStatus(order.orderRefundId,'OK',order.refundType,order.orderId)">同意</el-button>
 				              </div>
 				              <div>
 				                <el-button v-if="$restrict('reject')" slot="reference" type="text" size="small" @click="changeExamineStatus(order.orderRefundId,'FAIL')">拒绝</el-button>
@@ -274,12 +274,184 @@
 				  <el-button @click="logisticsVisible = false;data.removeTab()">关 闭</el-button>
 				</div>
 			</div>
+			<!-- 退货确认 -->
+			<div v-if="activeKey == 'REFUND_GOODS'" class="app-container">
+				<el-form :model="returnGoodsForm" :rules="returnGoodsFormRules" ref="returnGoodsForm" label-width="80px" label-position="left">
+					<el-row :gutter="20">
+						<el-col :span="24">
+							<el-form-item label="卖家留言" prop="refundMessage">
+							  <el-input type="textarea" :rows="5" v-model="returnGoodsForm.refundMessage" placeholder="请输入卖家留言"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="24">
+							<el-card class="box-card">
+								<el-tabs v-model="typeIndex">
+								    <el-tab-pane label="发货数量" name="1"></el-tab-pane>
+								    <el-tab-pane label="发货条码" name="2"></el-tab-pane>
+								</el-tabs>
+								<el-button size="small" v-show="typeIndex == 2" type="primary" @click="addCode()">新增</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-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="goodsMaterialSpecsName" align="center" label="规格型号"></el-table-column>
+											<el-table-column prop="goodsMaterialUnit" align="center" label="单位"></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-column label="操作" align="center" width="140" fixed="right">
+												<template slot-scope="scope" v-if="formType != 2 && joinCode">
+													<el-upload
+													  action='_'
+													  :show-file-list='false'
+													  :http-request="importCode"
+													>
+														<el-button size="mini" type="text">导入条码</el-button>
+													</el-upload>
+													<el-button size="mini" type="text" @click="handleDownload('导入条码')">模板下载</el-button>
+												</template>
+											</el-table-column>
+										</el-table>
+									</el-form>
+									<!-- 发货条码 -->
+									<el-form ref="formData2" :model="formData2">
+										<el-table v-show="typeIndex == 2" :data="formData2.list" element-loading-text="Loading" border fit highlight-current-row stripe>
+											<el-table-column label="品牌" align="center">
+												<template slot-scope="scope">
+													<el-form-item>
+														<el-input type="text" v-model="scope.row.brandName" :disabled="true" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="商品大类" align="center">
+												<template slot-scope="scope">
+													<el-form-item>
+														<el-input type="text" v-model="scope.row.mainName" :disabled="true" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="商品小类" align="center">
+												<template slot-scope="scope">
+													<el-form-item>
+														<el-input type="text" v-model="scope.row.smallName" :disabled="true" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="商品名称">
+												<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">
+												<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="goodsMaterialSpecsName" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请选择" style="width: 100%;">
+														    <el-option
+														      v-for="(item,ind) in formData1.list"
+														      :key="ind"
+														      :label="item.goodsMaterialSpecsName"
+														      :value="item">
+														    </el-option>
+														</el-select>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="物料类型" align="center">
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.goodsMaterialItemType'" :rules="[{ required: true, message: `请选择物料类型`, trigger: 'blur' }]">
+														<el-select v-model="scope.row.goodsMaterialItemType" @change="(e)=>{changeMaterial(e,scope.row)}" 
+															:disabled="isEdit2 != scope.$index || formType == 2" placeholder="请选择" style="width: 100%;">
+														    <el-option
+														      v-for="(item,ind) in [{name: '内机',id: 'INSIDE'},{name: '外机',id: 'OUT'},{name: '配件',id: 'PARTS'}]"
+														      :key="ind"
+														      :label="item.name"
+														      :value="item.id">
+														    </el-option>
+														</el-select>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="物料名称" align="center">
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.material'" :rules="[{ required: true, message: `请选择物料名称`, trigger: 'blur' }]">
+														<el-select v-model="scope.row.material" @focus="(e)=>{
+															if(!scope.row.goodsMaterialItemType){
+																return this.$message.warning('请先选择物料类型!');
+															}
+														}" @change="(e)=>{
+															scope.row.materialName = e.name
+															scope.row.stockQty = e.stockQty
+															scope.row.uniqueCode = e.uniqueCode
+															
+														}" value-key="name" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请选择" style="width: 100%;">
+														    <el-option
+														      v-for="(item,ind) in scope.row.materialList"
+														      :key="ind"
+														      :label="item.name"
+														      :value="item">
+														    </el-option>
+														</el-select>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="是否一物一码" >
+												<template slot-scope="scope">
+													<el-form-item>
+														{{scope.row.uniqueCode=='YES'?'是':scope.row.uniqueCode=='NO'?'否':''}}
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="条码" >
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.materialCode'" :rules="[{ required: true, message: `请输入条码`, trigger: 'blur' }]">
+														<el-input type="number" v-model="scope.row.materialCode" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column prop="" align="center" label="数量">
+												<template slot-scope="scope">
+													<el-form-item :prop="'list.' + scope.$index + '.stockQty'" :rules="[{ required: true, message: `请输入数量`, trigger: 'blur' }]">
+														<el-input type="number" v-model="scope.row.stockQty" :disabled="isEdit2 != scope.$index || formType == 2" placeholder="请输入"></el-input>
+													</el-form-item>
+												</template>
+											</el-table-column>
+											<el-table-column label="操作" align="right" width="140" fixed="right">
+												<template slot-scope="scope" v-if="formType != 2">
+													<el-button size="mini" type="primary" v-if="scope.$index == isEdit2" @click="saveCode(scope.row)">保存</el-button>
+													<el-button size="mini" type="primary" v-if="scope.$index != isEdit2" @click="isEdit2 = scope.$index">编辑</el-button>
+													<el-popconfirm title="确定删除吗?" @confirm="delCode(scope.row.orderDetailCodeId,scope.$index)">
+														<el-button slot="reference" size="mini" type="danger">删除</el-button>
+													</el-popconfirm>
+												</template>
+											</el-table-column>
+										</el-table>
+									</el-form>
+								</div>
+							</el-card>
+						</el-col>
+					</el-row>
+				</el-form>
+				<div slot="footer" class="dialog-footer">
+				  <el-button @click="returnGoodsVisible = false;data.removeTab()">关 闭</el-button>
+				  <el-button @click="saveReturnGoods(data.removeTab)">确 定</el-button>
+				</div>
+			</div>
 		</template>
 	</zj-tab-page>
 </template>
 
 <script>
-import {getRefundList, saveRefundRemark, changeExamineStatus, receiveProd, getWebsiteList} from "@/api/order"
+import {getRefundList, saveRefundRemark, changeExamineStatus, receiveProd, getWebsiteList, getOrderDetail, getCodeDetail2, getMaterialList, listImport2, saveCode2,delCode2} from "@/api/order"
 import {getExpress} from "@/api/common"
 import {downloadFiles} from '@/utils/util'
 import '@/styles/order-list.scss'
@@ -298,6 +470,9 @@ export default {
         examineDate: '', // 支付时间
         orderStatus: '',
       },
+		returnGoodsForm: {
+			refundMessage: ''
+		},
       tabCurrent: 'ALL',
       currentPage: 1, // 当前页码
       pageSize: 10, // 每页数量
@@ -310,8 +485,22 @@ export default {
       logistics: [],
       detail: {},
       websiteList: [],
-			formType: 'add',
-			formVisible: false,
+		formType: 'add',
+		formVisible: false,
+		returnGoodsVisible: false,
+		typeIndex: '1',
+		formData1: {
+			list: [],
+		},
+		formData2: {
+			list: [],
+		},
+		isEdit1: 0,
+		isEdit2: 0,
+		joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode,
+		returnGoodsFormRules: {
+			refundMessage: [{ required: true, message: '请填写卖家留言', trigger: 'blur' }],
+		},
     }
   },
   created() {
@@ -366,6 +555,117 @@ export default {
         this.listLoading = false;
       })
     },
+		getOrderDetail(orderId){
+			getOrderDetail({orderId}).then(res => {
+			  this.formData1.list = res.data.orderDetails
+			})
+		},
+		async getCodeDetail2(){
+			getCodeDetail2({orderId: this.editOrderId}).then(async res => {
+				for(var item of res.data){
+					item.specs = {goodsMaterialSpecsName: item.specsName}
+					item.material = {name: item.materialName}
+					item.materialList = await this.getMaterialList(item.specsName,item.goodsMaterialItemType)
+				}
+				this.formData2.list = res.data
+			})
+		},
+		async getMaterialList(specsName,type){
+			return new Promise((resolve, reject) => {
+				getMaterialList({
+					pageNum: 1,
+					pageSize: -1,
+					specsName,
+					type
+				}).then(async res => {
+					resolve(res.data.records) 
+				})
+			})
+			
+		},
+		async changeSpecs(e,row){
+			row.brandName = e.brandName
+			row.brandId = e.brandId
+			row.mainName = e.mainName
+			row.mainId = e.mainNumber
+			row.smallName = e.smallName
+			row.smallId = e.smallNumber
+			row.specsName = e.goodsMaterialSpecsName
+			row.goodsMaterialName = e.goodsName
+			row.goodsMaterialId = e.goodsMaterialId
+			row.material = null
+			row.materialName = ''
+			row.stockQty = ''
+			row.uniqueCode = ''
+			row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
+		},
+		async changeMaterial(e,row){
+			row.material = null
+			row.materialName = ''
+			row.stockQty = ''
+			row.uniqueCode = ''
+			row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
+		},
+		//发货新增条码
+		addCode(){
+			this.isEdit2 = 0
+			this.formData2.list.push({
+				brandId: '',
+				brandName: '',
+				mainId: '',
+				mainName: '',
+				stockQty: '',
+				smallId: '',
+				smallName: '',
+				goodsMaterialItemType: '',
+				goodsMaterialName: '',
+				goodsMaterialId: '',
+				materialCode: '',
+				uniqueCode: '',
+				specs: null,
+				specsName: '',
+				materialName: '',
+				material: null,
+				materialList: []
+			})
+		},
+		delCode(orderDetailCodeId,index){
+			if(orderDetailCodeId){
+				delCode2({
+				  orderDetailCodeId
+				}).then(res => {
+				  if (res.code == 200) {
+				    this.$message({ type: 'success', message: '删除成功!' })
+				    this.getOrderDetail()
+				    this.getCodeDetail2()
+				  } else {
+				    this.$message.error(res.msg);
+				  }
+				})
+			}else{
+				this.formData2.list.splice(index,1)
+			}
+		},
+		saveCode(orderDetailCodes){
+			const that = this
+			let params = [{
+				...orderDetailCodes,
+				orderId: this.editOrderId,
+			}]
+			delete params[0].material;
+			delete params[0].specs;
+			this.$refs.formData2.validate((valid, invalidFields, errLabels) => {
+				if (valid) {
+					saveCode2(params).then(res=>{
+						if(res.code == 200){
+							that.$message.success('保存成功!')
+							this.getOrderDetail()
+							this.getCodeDetail2()
+						}
+					})
+				}
+			})
+		},
 	openForm(type,order){
 		this.$refs.tabPage.addTab({
 			// 对应显示的模块
@@ -373,7 +673,7 @@ export default {
 			// 唯一标识
 			key: type,
 			// 页签名称
-			label: ({ remark: "订单备注", materialDetail: "查看物流" })[type],
+			label: ({ remark: "订单备注", materialDetail: "查看物流", REFUND_GOODS: "退货确认" })[type],
 			// 打开时事件
 			triggerEvent: () => {
 				
@@ -391,6 +691,10 @@ export default {
 							this.logistics = res.data
 						})
 					}
+					if(type == 'REFUND_GOODS'){
+						this.returnGoodsVisible = true
+						this.editOrderId = order.orderRefundId
+					}
 				})
 			},
 			// 关闭时事件
@@ -457,21 +761,39 @@ export default {
         this.$successMsg('保存成功');
       })
     },
+	saveReturnGoods(cancel){
+		changeExamineStatus({
+		  orderRefundId: this.editOrderId,
+		  examineStatus: 'OK',
+		  refundMessage: this.returnGoodsForm.refundMessage
+		}).then(() => {
+			cancel('list')
+		  this.getList();
+		  this.$successMsg('操作成功');
+		})
+	},
     // 变更维权处理状态
-    changeExamineStatus(orderRefundId, examineStatus) {
-      this.$prompt('请输入卖家留言', examineStatus == 'OK' ? '同意':'拒绝', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-      }).then(({ value }) => {
-        changeExamineStatus({
-          orderRefundId,
-          examineStatus,
-          refundMessage: value
-        }).then(() => {
-          this.getList();
-          this.$successMsg('操作成功');
-        })
-      }).catch(() => {});
+    changeExamineStatus(orderRefundId, examineStatus, refundType, orderId) {
+		if(refundType == 'REFUND_GOODS'){
+			this.getOrderDetail(orderId)
+			this.getCodeDetail2(orderId)
+			this.openForm('REFUND_GOODS',{orderRefundId})
+		}else{
+			this.$prompt('请输入卖家留言', examineStatus == 'OK' ? '同意':'拒绝', {
+			  confirmButtonText: '确定',
+			  cancelButtonText: '取消',
+			}).then(({ value }) => {
+			  changeExamineStatus({
+			    orderRefundId,
+			    examineStatus,
+			    refundMessage: value
+			  }).then(() => {
+			    this.getList();
+			    this.$successMsg('操作成功');
+			  })
+			}).catch(() => {});
+		}
+      
     },
     // 查看物流
     queryLogistics(order) {
@@ -525,6 +847,53 @@ export default {
       };
       downloadFiles('order/refund/downLoadExcel', screenData);
     },
+		
+		importCode(data){
+			const loading = this.$loading({
+			  lock: true,
+			  text: '正在导入',
+			  spinner: 'el-icon-loading',
+			  background: 'rgba(0, 0, 0, 0.7)'
+			})
+			var formdata = new FormData()
+			formdata.append('file', data.file)
+			let params = {}
+			if (!!params) {
+			  for (const key in params) {
+			    if (Object.hasOwnProperty.call(params, key)) {
+			      formdata.append(key, params[key])
+			    }
+			  }
+			}
+			listImport2({ formdata })
+			  .then(res => {
+			    this.$refs.pageRef.refreshList()
+			    loading.close()
+			    this.$message({
+			      type: 'success',
+			      message: '导入成功!'
+			    })
+			  })
+			  .catch(err => {
+			    loading.close()
+			    this.$message({
+			      type: 'error',
+			      message: err.message || '导入失败'
+			    })
+			  })
+		},
+		
+		// 下载导入模版
+		handleDownload(title) {
+			commonTemplateDownload({ name: '导入条码.xlsx' }, title).then(res => {
+				this.$message({
+					message: '下载成功',
+					type: 'success'
+				})
+			}).catch(err => {
+				this.$message.error('下载失败')
+			})
+		},
   }
 }
 </script>