Selaa lähdekoodia

Merge branch 'feature/pyh_进销存' of https://gogs.zfire.top/zfire-front/zfire-newmall-admin into 修改维权订单

# Conflicts:
#	src/layout/components/Navbar.vue
#	src/views/mallManagement/order/order_refund/index.vue
#	src/views/setting/departmentManage/index.vue
linwenxin 1 vuosi sitten
vanhempi
commit
d372ad1233

+ 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(params) {
+  return request({
+    url: '/jx/goods/remove',
+    method: 'post',
+    params
+  })
+}
+
+//删除退货条码
+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
   })
 }
 

+ 19 - 0
src/api/salesPurchasing/goodsCodeMachineAccount.js

@@ -0,0 +1,19 @@
+import request, { postBlob, getBlob, handleImport } from '@/utils/request'
+
+// 获取列表
+export function listPageV2(data) {
+  return request({
+    url: `/jx/goods/list/pageCode?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+//导出
+export function pageExport(data, name) {
+  return postBlob({
+    url: '/jx/goods/list/pageCodeExport',
+    data,
+    name
+  })
+}

+ 19 - 0
src/api/salesPurchasing/goodsInventory.js

@@ -0,0 +1,19 @@
+import request, { postBlob, getBlob, handleImport } from '@/utils/request'
+
+// 获取列表
+export function listPageV2(data) {
+  return request({
+    url: `/jx/goods/list/pageStock?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+//导出
+export function pageExport(data, name) {
+  return postBlob({
+    url: '/jx/goods/list/pageStockExport',
+    data,
+    name
+  })
+}

+ 19 - 0
src/api/salesPurchasing/goodsSaleMachineAccount.js

@@ -0,0 +1,19 @@
+import request, { postBlob, getBlob, handleImport } from '@/utils/request'
+
+// 获取列表
+export function listPageV2(data) {
+  return request({
+    url: `/jx/goods/list/pageSale?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+//导出
+export function pageExport(data, name) {
+  return postBlob({
+    url: '/jx/goods/list/pageSaleExport',
+    data,
+    name
+  })
+}

+ 19 - 0
src/api/salesPurchasing/inventoryIIIMachineAccount.js

@@ -0,0 +1,19 @@
+import request, { postBlob, getBlob, handleImport } from '@/utils/request'
+
+// 获取列表
+export function listPageV2(data) {
+  return request({
+    url: `/goods/material/stock/acc/list?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+//导出
+export function pageExport(data, name) {
+  return postBlob({
+    url: '/goods/material/stock/acc/list/export',
+    data,
+    name
+  })
+}

+ 3 - 3
src/components/Mall/Member/member-browse.vue

@@ -5,7 +5,7 @@
         <el-table-column align="center" label="商品信息" prop="goodsName" min-width="200">
           <template slot-scope="scope">
             <div class="goods-info">
-              <el-image style="width: 40px; height: 40px;" :src="scope.row.imgUrl" :preview-src-list="[scope.row.imgUrl]" fit="cover"></el-image>
+              <el-image style="width: 40px; height: 40px;" :src="scope.row.goodsImg" :preview-src-list="[scope.row.goodsImg]" fit="cover"></el-image>
               <div class="name">{{scope.row.goodsName}}</div>
             </div>
           </template>
@@ -72,12 +72,12 @@ export default {
     handleSizeChange(val) {
       this.pageSize = val
       this.currentPage = 1
-      this.getList()
+      this.getBrowseList()
     },
     // 更改当前页
     handleCurrentChange(val) {
       this.currentPage = val
-      this.getList()
+      this.getBrowseList()
     },
   }
 }

+ 9 - 1
src/components/Mall/Member/member-detail.vue

@@ -63,6 +63,12 @@
           <el-tab-pane label="企微客户" name="customer" v-if="userDetail.type === 'SERVICE'" lazy>
             <member-customer :user="userDetail"/>
           </el-tab-pane>
+			<el-tab-pane label="工单管理" name="worker-order" lazy>
+			  <member-worker-order :user="userDetail"/>
+			</el-tab-pane>
+			<el-tab-pane label="延保订单" name="warranty" lazy>
+			  <member-warranty :user="userDetail"/>
+			</el-tab-pane>
         </el-tabs>
       </el-main>
     </el-container>
@@ -77,6 +83,8 @@ import MemberFavorite from "@/components/Mall/Member/member-favorite";
 import MemberBrowse from "@/components/Mall/Member/member-browse";
 import MemberCoupon from "@/components/Mall/Member/member-coupon";
 import MemberCustomer from "@/components/Mall/Member/member-customer";
+import MemberWorkerOrder from "@/components/Mall/Member/member-worker-order";
+import MemberWarranty from "@/components/Mall/Member/member-warranty";
 import {getMemberDetail, applyWorker, editNickname} from "@/api/member";
 
 export default {
@@ -84,7 +92,7 @@ export default {
   componentName: 'MemberDetail',
   props: ['user'],
   components: {
-    MemberAccount, MemberOrder, MemberAddress, MemberFavorite, MemberBrowse, MemberCoupon, MemberCustomer
+    MemberAccount, MemberOrder, MemberAddress, MemberFavorite, MemberBrowse, MemberCoupon, MemberCustomer, MemberWorkerOrder, MemberWarranty
   },
   data() {
     return {

+ 6 - 6
src/components/Mall/Member/member-order.vue

@@ -90,12 +90,12 @@ export default {
       this.getList()
     },
     goOrderDetail(row) {
-      this.$router.push({
-        path: '/order/detail',
-        query: {
-          orderId: row.orderId
-        }
-      })
+		this.$router.push({
+		  name: "order_detail",
+		  query: {
+		    orderId:row.orderId
+		  }
+		})
     }
   }
 }

+ 105 - 0
src/components/Mall/Member/member-warranty.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="order-list">
+    <div class="table">
+      <el-table
+        ref="orderTable"
+        v-loading="listLoading"
+        :data="dataList"
+        element-loading-text="Loading"
+      >
+        <el-table-column align="center" label="订单编号" prop="id" min-width="180"></el-table-column>
+        <el-table-column align="center" label="服务内容" prop="increContent" min-width="200" show-overflow-tooltip></el-table-column>
+		<el-table-column align="center" label="服务金额" prop="amount" min-width="200" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="支付状态" prop="">
+			<template slot-scope="{row}">
+			  {{row.payStatus == 'REFUND'?'已退款':row.payStatus == 'EXPIRE'?'过期':row.payStatus == 'CANCEL'?'取消':row.payStatus == 'PAID'?'已支付':row.payStatus == 'WAIT'?'待支付':''}}
+			</template>
+		</el-table-column>
+		<el-table-column align="center" label="创建时间" prop="createTime" min-width="160"></el-table-column>
+        <el-table-column align="center" label="操作" fixed="right">
+          <template slot-scope="{row}">
+            <el-button type="primary" @click="goOrderDetail(row)" size="mini">详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="pagination clearfix">
+      <div class="fr">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-sizes="[10, 20, 30, 50]"
+          :page-size="10"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="listTotal">
+        </el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import request from '@/utils/request'
+
+export default {
+  name: 'MemberOrder',
+  componentName: 'MemberOrder',
+  props: ['user'],
+  data() {
+    return {
+      dataList: [], // 数据列表
+      listLoading: true, // 列表加载loading
+      currentPage: 1, // 当前页码
+      pageSize: 10, // 每页数量
+      listTotal: 0 // 列表总数
+    }
+  },
+  created() {
+    this.getOrderList()
+  },
+  methods: {
+    getOrderList() {
+		let data = {
+			pageNum: this.currentPage,
+			pageSize: this.pageSize,
+			params: [{param: "a.user_mobile", compare: "=", value: this.user.mobile}]
+		}
+		request({
+		  url: `/incre/order/settle/list`,
+		  method: 'post',
+		  data
+		}).then(res=>{
+			this.dataList = res.data.records
+			this.listTotal = res.data.total
+			this.listLoading = false
+		})
+    },
+    // 更改每页数量
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.currentPage = 1
+      this.getOrderList()
+    },
+    // 更改当前页
+    handleCurrentChange(val) {
+      this.currentPage = val
+      this.getOrderList()
+    },
+    goOrderDetail(row) {
+		this.$router.push({
+			name: 'orderSettleManag',
+			params: {
+				pageName: row.payNo,
+				pageType: row.orderChannel,
+				pageCode: row.payNo,
+			},
+		})
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 107 - 0
src/components/Mall/Member/member-worker-order.vue

@@ -0,0 +1,107 @@
+<template>
+  <div class="order-list">
+    <div class="table">
+      <el-table
+        ref="orderTable"
+        v-loading="listLoading"
+        :data="dataList"
+        element-loading-text="Loading"
+      >
+        <el-table-column align="center" label="工单编号" prop="id" min-width="180"></el-table-column>
+        <el-table-column align="center" label="工单类型" prop="orderSmallTypeText" min-width="200" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="工单状态" prop="orderStatusText"></el-table-column>
+        <el-table-column align="center" label="预约上门时间" prop="appointmentTime" min-width="160"></el-table-column>
+		<el-table-column align="center" label="创建时间" prop="createTime" min-width="160"></el-table-column>
+        <el-table-column align="center" label="操作" fixed="right">
+          <template slot-scope="{row}">
+            <el-button type="primary" @click="goOrderDetail(row)" size="mini">详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="pagination clearfix">
+      <div class="fr">
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-sizes="[10, 20, 30, 50]"
+          :page-size="10"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="listTotal">
+        </el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import request from '@/utils/request'
+
+export default {
+  name: 'MemberOrder',
+  componentName: 'MemberOrder',
+  props: ['user'],
+  data() {
+    return {
+      dataList: [], // 数据列表
+      listLoading: true, // 列表加载loading
+      currentPage: 1, // 当前页码
+      pageSize: 10, // 每页数量
+      listTotal: 0 // 列表总数
+    }
+  },
+  created() {
+    let timer = setInterval(() => {
+      if(this.user.userId) {
+        this.getOrderList()
+        clearInterval(timer)
+      }
+    }, 100)
+  },
+  methods: {
+    getOrderList() {
+      console.log(this.user);
+		let params = {
+			userId: this.user.userId,
+			pageNum: this.currentPage,
+			pageSize: this.pageSize
+		}
+		request({
+		  url: `/order/base/list/gene`,
+		  method: 'post',
+		  params
+		}).then(res=>{
+			this.dataList = res.data.records
+			this.listTotal = res.data.total
+			this.listLoading = false
+		})
+    },
+    // 更改每页数量
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.currentPage = 1
+      this.getOrderList()
+    },
+    // 更改当前页
+    handleCurrentChange(val) {
+      this.currentPage = val
+      this.getOrderList()
+    },
+    goOrderDetail(row) {
+		this.$router.push({
+			name: 'workOrderPool',
+			params: {
+				pageName: row.id,
+				pageType: 'detail',
+				pageCode: row.id,
+			},
+		})
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 61 - 86
src/layout/components/Navbar.vue

@@ -5,19 +5,11 @@
       <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
       <div class="menu_module">
         <div class="menu_module_view">
-          <v-scroll-view
-            :x="true"
-            :y="false"
-            slidingBgClassName="slidingBgClassName"
-            slidingBlockClassName="slidingBlockClassName"
-          >
+          <v-scroll-view :x="true" :y="false" slidingBgClassName="slidingBgClassName"
+            slidingBlockClassName="slidingBlockClassName">
             <div class="menu_module_fj">
-              <div
-                v-for="(item, index) in routes"
-                :key="index"
-                :class="{ item: true, select: path === item.path }"
-                @click="path = item.path"
-              >
+              <div v-for="(item, index) in routes" :key="index" :class="{ item: true, select: path === item.path }"
+                @click="path = item.path">
                 {{ item.meta.title }}
               </div>
             </div>
@@ -34,13 +26,10 @@
             @select="handleSelect"
           ></el-autocomplete>
         </div> -->
-        <div
-          style="margin-right: 20px; cursor: pointer"
-          @click="
-            getList()
-            isShow = true
-          "
-        >
+        <div style="margin-right: 20px; cursor: pointer" @click="
+          getList()
+        isShow = true
+          ">
           <i class="el-icon-message-solid"></i>
           <el-badge :is-dot="isDot1 || isDot2"></el-badge>
         </div>
@@ -68,34 +57,21 @@
       </div>
     </div>
     <notice-bar />
-    <el-drawer
-      title="系统消息"
-      :visible.sync="isShow"
-      :append-to-body="true"
-      :with-header="false"
-      direction="rtl"
-      size="25%"
-    >
+    <el-drawer title="系统消息" :visible.sync="isShow" :append-to-body="true" :with-header="false" direction="rtl" size="25%">
       <div class="message">
         <div class="head">
           <div class="flex_asb">
             <el-radio-group size="small" v-model="messageType" @change="getList">
               <el-badge :is-dot="isDot1" class="item">
-                <el-radio-button :label="['WBI', 'WBK', 'CRE_ORDER', 'SEND_MALL', 'RP_MALL', 'CR_SALES']"
-                  >系统消息</el-radio-button
-                >
+                <el-radio-button
+                  :label="['WBI', 'WBK', 'CRE_ORDER', 'SEND_MALL', 'RP_MALL', 'CR_SALES']">系统消息</el-radio-button>
               </el-badge>
               <el-badge :is-dot="isDot2" class="item">
                 <el-radio-button :label="['NOTICE']">平台公告</el-radio-button>
               </el-badge>
             </el-radio-group>
-            <el-switch
-              v-model="isOpen"
-              @change="updateIsNotice"
-              inactive-text="消息弹窗"
-              active-color="#13ce66"
-              inactive-color="#ff4949"
-            >
+            <el-switch v-model="isOpen" @change="updateIsNotice" inactive-text="消息弹窗" active-color="#13ce66"
+              inactive-color="#ff4949">
             </el-switch>
           </div>
           <el-radio-group size="mini" v-model="dateType" @change="getList" style="margin: 10px 0">
@@ -122,17 +98,15 @@
           </div>
         </div>
         <el-card class="box-card" v-for="(item, index) in messageData" style="margin-top: 10px">
-          <div
-            @click="
-              isShow = false
-              toDetail(
-                item.adminNoticeType,
-                item.paidType,
-                item.adminNoticeType == 'NOTICE' ? item.noticeId : item.orderId,
-                item.id
-              )
-            "
-          >
+          <div @click="
+            isShow = false
+          toDetail(
+            item.adminNoticeType,
+            item.paidType,
+            item.adminNoticeType == 'NOTICE' ? item.noticeId : item.orderId,
+            item.id
+          )
+            ">
             <div v-if="item.adminNoticeType == 'NOTICE'">
               <div class="flex_asb item">
                 <div>
@@ -201,14 +175,8 @@
         </el-card>
         <el-empty v-if="messageData.length == 0" description="暂无数据"></el-empty>
         <div class="flex_ac bottom">
-          <el-pagination
-            @current-change="handleCurrentChange"
-            :current-page="currentPage"
-            :page-size="pageSize"
-            layout="prev, pager, next"
-            background
-            :total="listTotal"
-          ></el-pagination>
+          <el-pagination @current-change="handleCurrentChange" :current-page="currentPage" :page-size="pageSize"
+            layout="prev, pager, next" background :total="listTotal"></el-pagination>
         </div>
       </div>
     </el-drawer>
@@ -276,28 +244,22 @@ export default {
       if (this.dateType === '') {
         return ['', '']
       } else {
-        var date = new Date()
-        var base = Date.parse(date) // 转换为时间戳
-        var year = date.getFullYear() //获取当前年份
-        var mon = date.getMonth() + 1 //获取当前月份
-        var day = date.getDate() //获取当前日
+        var date = new Date();
+        var base = Date.parse(date); // 转换为时间戳
+        var year = date.getFullYear(); //获取当前年份
+        var mon = date.getMonth() + 1; //获取当前月份
+        var day = date.getDate(); //获取当前日
         var oneDay = 24 * 3600 * 1000
 
         var daytimeArr = []
-        var now = new Date(base - oneDay * this.dateType)
-        var myear = now.getFullYear()
-        var month = now.getMonth() + 1
+        var now = new Date((base - oneDay * this.dateType));
+        var myear = now.getFullYear();
+        var month = now.getMonth() + 1;
         var mday = now.getDate()
         if (this.dateType == 1) {
-          return [
-            `${myear}-${month > 9 ? month : '0' + month}-${mday > 9 ? mday : '0' + mday} 00:00:00`,
-            `${myear}-${month > 9 ? month : '0' + month}-${mday > 9 ? mday : '0' + mday} 23:59:59`
-          ]
+          return [`${myear}-${month > 9 ? month : '0' + month}-${mday > 9 ? mday : '0' + mday} 00:00:00`, `${myear}-${month > 9 ? month : '0' + month}-${mday > 9 ? mday : '0' + mday} 23:59:59`]
         } else {
-          return [
-            `${myear}-${month > 9 ? month : '0' + month}-${mday > 9 ? mday : '0' + mday} 00:00:00`,
-            `${year}-${mon > 9 ? mon : '0' + mon}-${day > 9 ? day : '0' + day} 23:59:59`
-          ]
+          return [`${myear}-${month > 9 ? month : '0' + month}-${mday > 9 ? mday : '0' + mday} 00:00:00`, `${year}-${mon > 9 ? mon : '0' + mon}-${day > 9 ? day : '0' + day} 23:59:59`]
         }
       }
     },
@@ -323,17 +285,8 @@ export default {
           WBK: 'applicationWithoutFee',
           CRE_ORDER: 'workOrderPool',
           SEND_MALL: 'order_detail',
-          RP_MALL: 'order_pr',
-          CR_SALES:
-            paidType == 'M'
-              ? 'auxiliarySalesOrder'
-              : paidType == 'P'
-              ? 'attachmentSalesOrder'
-              : paidType == 'YB'
-              ? 'orderSettleManag'
-              : paidType == 'MALL'
-              ? 'order_list'
-              : ''
+          RP_MALL: 'order_refund_detail',
+          CR_SALES: (paidType == 'M' ? 'auxiliarySalesOrder' : paidType == 'P' ? 'attachmentSalesOrder' : paidType == 'YB' ? 'orderSettleManag' : paidType == 'MALL' ? 'order_detail' : '')
         }
         return MAP[val]
       }
@@ -602,7 +555,7 @@ export default {
         params: {
           noticeIds: id
         }
-      }).then(res => {})
+      }).then(res => { })
     }
   }
 }
@@ -617,21 +570,26 @@ export default {
 ::v-deep .is-fixed {
   right: 10px !important;
 }
+
 ::v-deep .slidingBgClassName {
   background: rgba(0, 0, 0, 0.01) !important;
 }
+
 ::v-deep .slidingBlockClassName {
   background: rgba(0, 0, 0, 0.05) !important;
 }
+
 .flex_asb {
   display: flex;
   justify-content: space-between;
   align-items: center;
 }
+
 .flex_ac {
   display: flex;
   justify-content: center;
 }
+
 .message {
   padding: 20px;
   position: relative;
@@ -639,6 +597,7 @@ export default {
   padding-bottom: 60px;
   padding-top: 150px;
   box-sizing: border-box;
+
   .head {
     width: 25%;
     position: fixed;
@@ -647,6 +606,7 @@ export default {
     background: #ffffff;
     padding: 20px;
   }
+
   .bottom {
     width: 25%;
     position: fixed;
@@ -656,11 +616,13 @@ export default {
     padding: 10px 0;
   }
 }
+
 .box-card {
   .item {
     cursor: pointer;
     margin-bottom: 6px;
   }
+
   .read1 {
     color: #f5680e;
     background: #fff2da;
@@ -668,6 +630,7 @@ export default {
     border-radius: 4px;
     font-size: 14px;
   }
+
   .read2 {
     color: #42b983;
     background: #d7fdde;
@@ -676,6 +639,7 @@ export default {
     font-size: 14px;
   }
 }
+
 .navbar {
   width: 100%;
   height: 50px;
@@ -685,6 +649,7 @@ export default {
   display: flex;
   flex-direction: row;
   align-items: center;
+
   .hamburger-container {
     line-height: 46px;
     height: 100%;
@@ -698,22 +663,26 @@ export default {
       background: rgba(0, 0, 0, 0.025);
     }
   }
+
   .menu_module {
     height: 100%;
     flex: 1;
     position: relative;
+
     .menu_module_view {
       position: absolute;
       top: 0;
       left: 0;
       bottom: 0;
       right: 0;
+
       .menu_module_fj {
         height: 100%;
         width: fit-content;
         white-space: nowrap;
         box-sizing: border-box;
         padding: 0 10px;
+
         .item {
           display: inline-block;
           height: 100%;
@@ -722,16 +691,19 @@ export default {
           padding: 0 10px;
           cursor: pointer;
         }
+
         .select {
           border-bottom: 1px solid #000;
         }
       }
     }
   }
+
   .flex {
     display: flex;
     align-items: center;
   }
+
   .ellipsis {
     display: inline-block;
     width: (16px * 6);
@@ -739,11 +711,12 @@ export default {
     overflow: hidden;
     text-overflow: ellipsis;
   }
+
   .right-menu {
     height: 100%;
     line-height: 50px;
 
-    & > div {
+    &>div {
       float: left;
     }
 
@@ -788,8 +761,9 @@ export default {
         padding-top: 0;
         padding-bottom: 0;
       }
+
       .right-menu-item {
-        .notice-icon > i {
+        .notice-icon>i {
           font-size: 18px;
         }
 
@@ -801,6 +775,7 @@ export default {
     }
   }
 }
+
 ::v-deep .el-badge__content.is-fixed {
   z-index: 99;
 }

+ 19 - 10
src/views/auxiliaryFittings/supplier/index.vue

@@ -68,10 +68,11 @@ export default {
         remark: '',
         status: 'ON',
         venderType: 'M',
-        imageUrl: []
+        imageUrl: [],
+		checkList: []
       },
-			formType: 'add',
-			formVisible: false,
+		formType: 'add',
+		formVisible: false,
     }
   },
   computed: {
@@ -166,11 +167,16 @@ export default {
         render: (h, { props, onInput }) => {
           var { value } = props
           return (
-            <el-radio-group v-model={this.formData.venderType}>
-              <el-radio disabled={this.formDialogType == 2} label="M">辅材</el-radio>
-              <el-radio disabled={this.formDialogType == 2} label="P">配件</el-radio>
-              <el-radio disabled={this.formDialogType == 2} label="A">辅材和配件</el-radio>
-            </el-radio-group>
+            // <el-radio-group v-model={this.formData.venderType}>
+            //   <el-radio disabled={this.formDialogType == 2} label="M">辅材</el-radio>
+            //   <el-radio disabled={this.formDialogType == 2} label="P">配件</el-radio>
+            //   <el-radio disabled={this.formDialogType == 2} label="A">辅材和配件</el-radio>
+            // </el-radio-group>
+			<el-checkbox-group v-model={this.formData.checkList}>
+			    <el-checkbox disabled={this.formDialogType == 2} label="辅材"></el-checkbox>
+			    <el-checkbox disabled={this.formDialogType == 2} label="配件"></el-checkbox>
+			    <el-checkbox disabled={this.formDialogType == 2} label="商品"></el-checkbox>
+			</el-checkbox-group>
           )
         }
       }, {
@@ -386,14 +392,16 @@ export default {
     					this.formDialogType = 1
     					getDetail({ id }).then(res => {
     					  Object.assign(this.formData, res.data, {
-    					    imageUrl: res.data?.imageUrl ? res.data?.imageUrl?.split(",").map(item => ({ url: item })) : []
+    					    imageUrl: res.data?.imageUrl ? res.data?.imageUrl?.split(",").map(item => ({ url: item })) : [],
+							checkList: res.data.venderType.split(',')
     					  })
     					})
     				}else{
     					this.formDialogType = 2
     					getDetail({ id }).then(res => {
     					  Object.assign(this.formData, res.data, {
-    					    imageUrl: res.data?.imageUrl ? res.data?.imageUrl?.split(",").map(item => ({ url: item })) : []
+    					    imageUrl: res.data?.imageUrl ? res.data?.imageUrl?.split(",").map(item => ({ url: item })) : [],
+							checkList: res.data.venderType.split(',')
     					  })
     					})
     				}
@@ -410,6 +418,7 @@ export default {
         if (valid) {
           ([add, edit][this.formDialogType])({
             ...this.formData,
+			venderType: this.formData.checkList.join(','),
             imageUrl: this.formData.imageUrl.map(item => item.url).join(",")
           }).then(res => {
             this.$message({ type: 'success', message: `${this.formDialogTitles[this.formDialogType]}成功!` })

+ 421 - 27
src/views/mallManagement/order/order_detail/index.vue

@@ -232,7 +232,7 @@
     <el-dialog :title="dialogTitle" :visible.sync="remarkVisible" :show-close="false" :width="dialogWidth"
       :close-on-click-modal="false">
       <el-form :model="orderForm" :rules="orderFormRules" ref="orderForm" v-if="curOpenDialogType !== 'query'"
-        label-width="90px" label-position="left">
+        label-width="100px" label-position="left">
         <el-form-item prop="remark" v-if="curOpenDialogType === 'remark'">
           <el-input type="textarea" :autosize="{ minRows: 8, maxRows: 16 }" placeholder="请输入备注内容" v-model="remark"
             maxlength="100" show-word-limit>
@@ -250,27 +250,218 @@
         <el-form-item label="收货地址" prop="receAddress" v-if="curOpenDialogType === 'info'">
           <el-input v-model="orderForm.receAddress" autocomplete="off" placeholder="请输入收货地址"></el-input>
         </el-form-item>
-        <el-form-item label="快递单号" prop="logisticsNo" v-if="curOpenDialogType === 'send'">
-          <el-input v-model="orderForm.logisticsNo" autocomplete="off" placeholder="请输入快递单号"></el-input>
-        </el-form-item>
-        <el-form-item label="物流公司" prop="companyCode" v-if="curOpenDialogType === 'send'">
-          <el-select v-model="orderForm.companyCode" placeholder="请选择物流公司" style="width: 100%;">
-            <el-option :label="item.name" :value="item.code" v-for="(item, index) in companyList"
-              :key="index"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="仓储" prop="storageId" v-if="curOpenDialogType === 'send'">
-          <el-select v-model="orderForm.storageId" 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-form-item label="是否派单" prop="workOrder" v-if="curOpenDialogType === 'send'">
-          <el-radio-group v-model="orderForm.workOrder">
-            <el-radio :label="true">是</el-radio>
-            <el-radio :label="false">否</el-radio>
-          </el-radio-group>
-        </el-form-item>
+		<template v-if="curOpenDialogType === 'send'">
+			<el-row :gutter="20">
+				<el-col :span="6">
+					<el-form-item label="发货方式" prop="pickType">
+					  <el-radio-group v-model="orderForm.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">
+					<el-form-item v-if="orderForm.pickType == 'YES'" label="提货人" prop="pickName" :rules="[{ required: true, message: '提货人不能为空', trigger: 'blur' }]">
+					  <el-input v-model="orderForm.pickName" placeholder="请输入提货人"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item v-if="orderForm.pickType == 'YES'" label="提货人电话" prop="pickPhone" :rules="[{ required: true, message: '提货人电话不能为空', trigger: 'blur' },{ pattern:/^((1[3456789]\d{9}))$/, message: '电话号码格式不正确', trigger: 'blur' }]">
+					  <el-input v-model="orderForm.pickPhone" placeholder="请输入提货人电话"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item v-if="orderForm.pickType == 'NO'" label="快递单号" prop="logisticsNo">
+					  <el-input v-model="orderForm.logisticsNo" autocomplete="off" placeholder="请输入快递单号"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item v-if="orderForm.pickType == 'NO'" label="物流公司" prop="companyCode">
+					  <el-select v-model="orderForm.companyCode" placeholder="请选择物流公司" style="width: 100%;">
+					    <el-option :label="item.name" :value="item.code" v-for="(item, index) in companyList"
+					      :key="index"></el-option>
+					  </el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :span="6">
+					<el-form-item label="仓储" prop="storageId">
+					  <el-select v-model="orderForm.storageId" 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-col :span="6">
+					<el-form-item label="是否派单" prop="workOrder">
+					  <el-radio-group v-model="orderForm.workOrder">
+					    <el-radio :label="true">是</el-radio>
+					    <el-radio :label="false">否</el-radio>
+					  </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>
+						<br/>
+						<el-button size="small" v-show="typeIndex == 2" type="primary" @click="addCode()">新增</el-button>
+						<el-button size="small" v-show="typeIndex == 1" 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-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="单位">
+										<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-column label="操作" align="center" width="140" fixed="right">
+										<template slot-scope="scope" v-if="joinCode">
+											<el-upload
+											  action='_'
+											  :show-file-list='false'
+											  :http-request="importCode"
+											>
+												<el-button @click="orderDetailId = scope.row.orderDetailId" size="mini" type="text">导入条码</el-button>
+											</el-upload>
+										</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" 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" 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 $message.warning('请先选择物料类型!');
+													}
+												}" @change="(e)=>{
+													scope.row.materialName = e.name
+													scope.row.stockQty = (e.uniqueCode=='YES'?1:null)
+													scope.row.uniqueCode = e.uniqueCode
+													scope.row.goodsMaterialItemId = e.itemId
+												}" value-key="name" :disabled="isEdit2 != scope.$index" 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="text" v-model="scope.row.materialCode" :disabled="isEdit2 != scope.$index" 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 || scope.row.uniqueCode=='YES'" placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column label="操作" align="right" width="140" fixed="right">
+										<template slot-scope="scope">
+											<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>
+		</template>
       </el-form>
       <el-table v-loading="logisticsLoading" :data="logistics" style="width: 100%" size="mini"
         v-if="curOpenDialogType === 'query'">
@@ -285,7 +476,9 @@
         <el-table-column prop="context" label="物流详情" align="center"></el-table-column>
       </el-table>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="saveForm" v-if="curOpenDialogType !== 'query'">保 存</el-button>
+		  
+        <el-button type="primary" @click="saveForm" v-if="curOpenDialogType !== 'query' && curOpenDialogType !== 'send'">保 存</el-button>
+		<el-button type="primary" @click="deliverGoods" v-if="curOpenDialogType == 'send'">发 货</el-button>
         <el-button @click="cancelForm">{{ curOpenDialogType === 'query' ? '关 闭' : '取 消' }}</el-button>
       </div>
     </el-dialog>
@@ -318,9 +511,10 @@ import {
   confirmOrder,
   getOrderDetail, goodsDeliver,
   saveRemark, orderRefund, orderCompensate, getCompensateList,
-  changeShow
+  changeShow, getCodeDetail, getMaterialList, listImport, saveCode, delCode
 } from "@/api/order";
 import { getExpress, getCompanyList } from "@/api/common";
+import { commonTemplateDownload } from '@/api/common.js'
 import * as Storage from "@/api/storage";
 import { mapGetters } from 'vuex'
 
@@ -344,6 +538,9 @@ export default {
         logisticsNo: '',
         companyCode: '',
         workOrder: true,
+		pickType: 'YES',
+		pickName: '',
+		pickPhone: ''
       },
       orderFormRules: {
         payAmount: [
@@ -456,6 +653,17 @@ export default {
         refundNum: '',
       },
       compensateList: [],
+	  typeIndex: '1',
+	  formData1: {
+	  	list: [],
+	  },
+	  formData2: {
+	  	list: [],
+	  },
+	  isEdit1: 0,
+	  isEdit2: 0,
+	  joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode,
+	  orderDetailId: ''
     }
   },
   created() {
@@ -472,10 +680,11 @@ export default {
         this.orderDetail.workerName = this.orderDetail.workerName ? this.orderDetail.workerName : '暂无'
         this.orderDetail.workerPhone = this.orderDetail.workerPhone ? this.orderDetail.workerPhone : ''
         this.evaluateDetail = res.data.orderComment;
+		this.formData1.list = res.data.orderDetails
       })
     },
     showDialog(type) {
-      this.dialogWidth = type === 'query' ? '80%' : '50%'
+      this.dialogWidth = type === 'query' ? '80%' : type === 'send' ? '80%': '50%'
       this.remarkVisible = true
       this.curOpenDialogType = type
       if (type === 'remark') {
@@ -705,7 +914,192 @@ export default {
         this.getDetail();
         this.$successMsg();
       })
-    }
+    },
+	
+	async getCodeDetail(){
+		getCodeDetail({orderId: this.orderId}).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)
+		row.orderDetailId = e.orderDetailId
+	},
+	async changeMaterial(e,row){
+		if(!row.specs){
+			return this.$message.warning('请先选择规格型号!');
+		}
+		row.material = null
+		row.materialName = ''
+		row.stockQty = ''
+		row.uniqueCode = ''
+		row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
+	},
+	//发货新增条码
+	addCode(){
+		this.$refs.formData2.validate((valid) => {
+			if (valid) {
+				this.isEdit2 = 0
+				this.formData2.list.unshift({
+					brandId: '',
+					brandName: '',
+					mainId: '',
+					mainName: '',
+					stockQty: '',
+					smallId: '',
+					smallName: '',
+					goodsMaterialItemType: '',
+					goodsMaterialName: '',
+					goodsMaterialId: '',
+					materialCode: '',
+					uniqueCode: '',
+					specs: null,
+					specsName: '',
+					materialName: '',
+					material: null,
+					materialList: [],
+					orderDetailId: '',
+					goodsMaterialItemId: ''
+				})
+			}
+		});
+	},
+	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.orderId,
+		}]
+		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()
+					}
+				})
+			}
+		})
+	},
+	deliverGoods(){
+		this.$refs.orderForm.validate((valid) => {
+		  if (valid) {
+		    goodsDeliver({
+		      orderId: this.orderId,
+		      logisticsNo: this.orderForm.logisticsNo,
+		      storageId: this.orderForm.storageId,
+		      companyCode: this.orderForm.companyCode,
+		      workOrder: this.orderForm.workOrder,
+		    				pickName: this.orderForm.pickName,
+		    				pickPhone: this.orderForm.pickPhone,
+		    				pickType: this.orderForm.pickType,
+		    }).then(() => {
+		      this.cancelForm();
+		      this.getDetail();
+		      this.$successMsg('发货成功');
+		    })
+		  }
+		})
+	},
+	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 = {
+			orderDetailId: this.orderDetailId
+		}
+		if (!!params) {
+		  for (const key in params) {
+		    if (Object.hasOwnProperty.call(params, key)) {
+		      formdata.append(key, params[key])
+		    }
+		  }
+		}
+		listImport({ formdata })
+		  .then(res => {
+		    this.getOrderDetail()
+		    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('下载失败')
+		})
+	},
 
   },
   computed: {
@@ -738,7 +1132,7 @@ export default {
       const totalAmount = parseFloat(this.orderDetail.totalAmount)
       const freight = parseFloat(this.orderDetail.freight)
       return (totalAmount - freight).toFixed(2)
-    }
+    },
   }
 }
 </script>

+ 422 - 26
src/views/mallManagement/order/order_list/index.vue

@@ -254,6 +254,10 @@
 				                @click="queryLogistics(order)">
 				                查看物流
 				              </el-button>
+							  <el-button type="text" size="small"
+							    v-if="(order.orderStatus === 'YFH' || order.orderStatus === 'OVER')" @click="showLogistics(order, 'detail')">
+							    查看发货条码
+							  </el-button>
 				              <!-- toWorkOrderDetail(order.orderId) -->
 				              <el-button type="text" size="small" v-if="order.toWorkOrder && $restrict('workOrder_detail')"
 				                @click="queryWorkOrder(order.orderId)">查看工单</el-button>
@@ -304,52 +308,233 @@
 				</div>
 			</div>
 			<!-- 发货弹窗 -->
-			<div v-if="activeKey == 'deliverGoods' || activeKey == 'editExpressage'" class="app-container">
+			<div v-if="activeKey == 'deliverGoods' || activeKey == 'editExpressage' || activeKey == 'deliverGoodsDetail'" class="app-container">
 				<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 != 'edit'">
+							  <el-radio-group v-model="logisticsForm.pickType">
+							    <el-radio :disabled="logisticsType == 'detail'" label="YES">自提/自送</el-radio>
+							    <el-radio :disabled="logisticsType == 'detail'" 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" :disabled="logisticsType == 'detail'" 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" :disabled="logisticsType == 'detail'" 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-input v-model="logisticsForm.logisticsNo" :disabled="logisticsType == 'detail'" 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%;">
+							  <el-select v-model="logisticsForm.companyCode" :disabled="logisticsType == 'detail'" placeholder="请选择物流公司" style="width: 100%;">
 							    <el-option :label="item.name" :value="item.code" v-for="(item, index) in companyList"
 							      :key="index"></el-option>
 							  </el-select>
 							</el-form-item>
 						</el-col>
 						<el-col :span="6">
-							<el-form-item label="仓储" prop="storageId" v-if="logisticsType === 'add'"
+							<el-form-item label="仓储" prop="storageId" v-if="logisticsType != 'edit'"
 							  :rules="[{ required: true, message: '请选择仓储', trigger: 'change' }]">
-							  <el-select v-model="logisticsForm.storageId" placeholder="请选择仓储" style="width: 100%;">
+							  <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"
 							      :key="index"></el-option>
 							  </el-select>
 							</el-form-item>
 						</el-col>
 						<el-col :span="6">
-							<el-form-item label="是否派单" prop="workOrder" v-if="logisticsType === 'add'">
+							<el-form-item label="是否派单" prop="workOrder" v-if="logisticsType != 'edit'">
 							  <el-radio-group v-model="logisticsForm.workOrder">
-							    <el-radio :label="true">是</el-radio>
-							    <el-radio :label="false">否</el-radio>
+							    <el-radio :disabled="logisticsType == 'detail'" :label="true">是</el-radio>
+							    <el-radio :disabled="logisticsType == 'detail'" :label="false">否</el-radio>
 							  </el-radio-group>
 							</el-form-item>
 						</el-col>
 						<el-col :span="6">
-							<el-form-item label="是否退换单" prop="exchange" v-if="logisticsType === 'add'">
+							<el-form-item label="是否退换单" prop="exchange" v-if="logisticsType != 'edit'">
 							  <el-radio-group v-model="logisticsForm.exchange">
-							    <el-radio :label="true">是</el-radio>
-							    <el-radio :label="false">否</el-radio>
+							    <el-radio :disabled="logisticsType == 'detail'" :label="true">是</el-radio>
+							    <el-radio :disabled="logisticsType == 'detail'" :label="false">否</el-radio>
 							  </el-radio-group>
 							</el-form-item>
 						</el-col>
+						<el-col :span="24">
+							<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 label="发货条码" name="2"></el-tab-pane>
+								</el-tabs>
+								<br/>
+								<el-button size="small" v-show="typeIndex == 2 && logisticsType == 'add'" type="primary" @click="addCode()">新增</el-button>
+								<el-button size="small" v-show="typeIndex == 1 && logisticsType == 'add'" 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-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="单位">
+												<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-column label="操作" align="center" width="140" fixed="right">
+												<template slot-scope="scope" v-if="formType != 2 && joinCode && logisticsType == 'add'">
+													<el-upload
+													  action='_'
+													  :show-file-list='false'
+													  :http-request="importCode"
+													>
+														<el-button @click="orderDetailId = scope.row.orderDetailId" size="mini" type="text">导入条码</el-button>
+													</el-upload>
+												</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 || logisticsType == 'detail'" 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 || logisticsType == 'detail'" 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 $message.warning('请先选择物料类型!');
+															}
+														}" @change="(e)=>{
+															scope.row.materialName = e.name
+															scope.row.stockQty = (e.uniqueCode=='YES'?1:null)
+															scope.row.uniqueCode = e.uniqueCode
+															scope.row.goodsMaterialItemId = e.itemId
+														}" value-key="name" :disabled="isEdit2 != scope.$index || formType == 2 || logisticsType == 'detail'" 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="text" v-model="scope.row.materialCode" :disabled="isEdit2 != scope.$index || formType == 2 || logisticsType == 'detail'" 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 || scope.row.uniqueCode=='YES' || logisticsType == 'detail'" 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="logisticsType == 'add'">
+													<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" v-if="logisticsType != 'detail'" @click="saveLogistics(data.removeTab)">{{logisticsType === 'add'?'发 货':'保 存'}}</el-button>
 				  <el-button @click="cancelLogistics;data.removeTab()">取 消</el-button>
 				</div>
 			</div>
@@ -437,14 +622,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,
@@ -487,9 +675,13 @@ export default {
       logisticsForm: {
         logisticsNo: '',
         storageId: '',
+		storageName: '',
         companyCode: '',
         workOrder: true,
         exchange: false,
+		pickType: 'YES',
+		pickName: '',
+		pickPhone: ''
       },
       storageList: [],
       companyList: [],
@@ -523,8 +715,19 @@ 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,
+		orderDetailId: ''
     }
   },
   computed: {
@@ -597,6 +800,131 @@ export default {
         // this.listLoading = false;
       })
     },
+	getOrderDetail(){
+		getOrderDetail({orderId: this.editOrderId}).then(res => {
+		  this.formData1.list = res.data.orderDetails
+		})
+	},
+	changeType(){
+		this.getOrderDetail()
+		this.getCodeDetail()
+	},
+	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)
+		row.orderDetailId = e.orderDetailId
+	},
+	async changeMaterial(e,row){
+		if(!row.specs){
+			return this.$message.warning('请先选择规格型号!');
+		}
+		row.material = null
+		row.materialName = ''
+		row.stockQty = ''
+		row.uniqueCode = ''
+		row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
+	},
+	//发货新增条码
+	addCode(){
+		this.$refs.formData2.validate((valid) => {
+			if (valid) {
+				this.isEdit2 = 0
+				this.formData2.list.unshift({
+					brandId: '',
+					brandName: '',
+					mainId: '',
+					mainName: '',
+					stockQty: '',
+					smallId: '',
+					smallName: '',
+					goodsMaterialItemType: '',
+					goodsMaterialName: '',
+					goodsMaterialId: '',
+					materialCode: '',
+					uniqueCode: '',
+					specs: null,
+					specsName: '',
+					materialName: '',
+					material: null,
+					materialList: [],
+					orderDetailId: '',
+					goodsMaterialItemId: ''
+				})
+			}
+		});
+	},
+	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}`});
@@ -615,7 +943,7 @@ export default {
 			// 唯一标识
 			key: type,
 			// 页签名称
-			label: ({ remark: "订单备注", editExpressage: "修改快递单号",editAddress: "修改收货地址", materialDetail: "查看物流", deliverGoods: "发货" })[type],
+			label: ({ remark: "订单备注", editExpressage: "修改快递单号",editAddress: "修改收货地址", materialDetail: "查看物流", deliverGoods: "发货", deliverGoodsDetail: '查看发货条码' })[type],
 			// 打开时事件
 			triggerEvent: () => {
 				
@@ -708,18 +1036,33 @@ 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 if(type == 'edit'){
+				this.openForm('editExpressage',item)
+			}else{
+				this.logisticsForm.logisticsNo = item.logisticsNo
+				this.logisticsForm.storageId = item.storageId
+				this.logisticsForm.storageName = item.storageName
+				this.logisticsForm.companyCode = item.companyCode
+				this.logisticsForm.workOrder = item.workOrder
+				this.logisticsForm.exchange = item.exchangeOrder
+				this.logisticsForm.pickType = item.pickType
+				this.logisticsForm.pickName = item.pickName
+				this.logisticsForm.pickPhone = item.pickPhone
+				this.getOrderDetail()
+				this.getCodeDetail()
+				this.openForm('deliverGoodsDetail',item)
+			}
     },
     // 取消快递信息填写
     cancelLogistics() {
@@ -740,6 +1083,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();
@@ -1056,6 +1402,56 @@ 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 = {
+			orderDetailId: this.orderDetailId
+		}
+		if (!!params) {
+		  for (const key in params) {
+		    if (Object.hasOwnProperty.call(params, key)) {
+		      formdata.append(key, params[key])
+		    }
+		  }
+		}
+		listImport({ formdata })
+		  .then(res => {
+		    this.getOrderDetail()
+			this.getCodeDetail()
+		    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('下载失败')
+		})
+	},
 
   }
 }

+ 3 - 3
src/views/mallManagement/order/order_refund/index.vue

@@ -365,7 +365,7 @@
                               value-key="goodsMaterialSpecsName"
                               :disabled=" isEdit2 != scope.$index || formType == 2 || activeKey == 'REFUND_GOODS_DETAIL' "
                               placeholder="请选择" style="width: 100%;">
-                              <el-option v-for="(     item, ind     ) in      formData1.list     " :key=" ind "
+                              <el-option v-for="(      item, ind      ) in       formData1.list      " :key=" ind "
                                 :label=" item.goodsMaterialSpecsName " :value=" item ">
                               </el-option>
                             </el-select>
@@ -381,7 +381,7 @@
                               :disabled=" isEdit2 != scope.$index || formType == 2 || activeKey == 'REFUND_GOODS_DETAIL' "
                               placeholder="请选择" style="width: 100%;">
                               <el-option
-                                v-for="(     item, ind     ) in      [{ name: '内机', id: 'INSIDE' }, { name: '外机', id: 'OUT' }, { name: '配件', id: 'PARTS' }]     "
+                                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>
@@ -408,7 +408,7 @@
   }
 " value-key="name" :disabled=" isEdit2 != scope.$index || formType == 2 || activeKey == 'REFUND_GOODS_DETAIL' "
                               placeholder="请选择" style="width: 100%;">
-                              <el-option v-for="(     item, ind     ) in      scope.row.materialList     " :key=" ind "
+                              <el-option v-for="(      item, ind      ) in       scope.row.materialList      " :key=" ind "
                                 :label=" item.name " :value=" item ">
                               </el-option>
                             </el-select>

+ 400 - 11
src/views/mallManagement/order/order_refund_detail/index.vue

@@ -22,7 +22,8 @@
             </div>
             <div class="order-refund-main-opt-btn">
               <template v-if="orderDetail.orderStatus === 'DSJCL'">
-                <el-popconfirm title="确定同意吗?" @confirm="changeExamineStatus('OK')">
+				<el-button v-if="orderDetail.refundType == 'REFUND_GOODS'" @click="changeExamineStatus('OK',orderDetail.refundType)" slot="reference" size="small" type="primary">同意</el-button>
+                <el-popconfirm v-else title="确定同意吗?" @confirm="changeExamineStatus('OK')">
                   <el-button slot="reference" size="small" type="primary">同意</el-button>
                 </el-popconfirm>
                 <el-popconfirm title="确定拒绝吗?" @confirm="changeExamineStatus('FAIL')" style="margin-left: 10px;">
@@ -178,11 +179,189 @@
         <el-button @click="logisticsVisible = false">关 闭</el-button>
       </div>
     </el-dialog>
+	<!-- 退货确认 -->
+	<el-dialog :title="'退货确认'" :visible.sync="returnGoodsVisible" :show-close="false" width="80%" :close-on-click-modal="false">
+		<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" @tab-click="changeType">
+						    <el-tab-pane label="发货数量" name="1"></el-tab-pane>
+						    <el-tab-pane label="发货条码" name="2"></el-tab-pane>
+						</el-tabs>
+						<br/>
+						<el-button size="small" v-show="typeIndex == 2" type="primary" @click="addCode()">新增</el-button>
+						<el-button size="small" v-show="typeIndex == 1" 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-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="单位">
+										<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="refundInsideCodeQty" align="center" label="导入内机条码数量" width="140"></el-table-column>
+									<el-table-column prop="refundOutCodeQty" align="center" label="导入外机条码数量" width="140"></el-table-column>
+									<el-table-column prop="refundPartsCodeQty" align="center" label="导入配件条码数量" width="140"></el-table-column>
+									<el-table-column label="操作" align="center" width="140" fixed="right">
+										<template slot-scope="scope" v-if="joinCode">
+											<el-upload
+											  action='_'
+											  :show-file-list='false'
+											  :http-request="importCode"
+											>
+												<el-button @click="orderDetailId = scope.row.orderDetailId" size="mini" type="text">导入条码</el-button>
+											</el-upload>
+										</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" 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" 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 $message.warning('请先选择物料类型!');
+													}
+												}" @change="(e)=>{
+													scope.row.materialName = e.name
+													scope.row.stockQty = (e.uniqueCode=='YES'?1:null)
+													scope.row.uniqueCode = e.uniqueCode
+													scope.row.goodsMaterialItemId = e.itemId
+													
+												}" value-key="name" :disabled="isEdit2 != scope.$index" 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="text" v-model="scope.row.materialCode" :disabled="isEdit2 != scope.$index" 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 || scope.row.uniqueCode=='YES'" placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column label="操作" align="right" width="140" fixed="right">
+										<template slot-scope="scope">
+											<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;">关 闭</el-button>
+		  <el-button type="primary" @click="saveReturnGoods()">确 定</el-button>
+		</div>
+	</el-dialog>
   </div>
 </template>
 
 <script>
-import {changeExamineStatus, getOrderRefundDetail, receiveProd, saveRefundRemark} from "@/api/order";
+import {changeExamineStatus, getOrderRefundDetail, receiveProd, saveRefundRemark, getOrderDetail, getCodeDetail2, getMaterialList, listImport2, saveCode2,delCode2} from "@/api/order";
 import {getExpress} from "@/api/common";
 
 export default {
@@ -193,11 +372,29 @@ export default {
       orderDetail: {},
       remarkVisible: false,
       logisticsVisible: false,
-      logistics: []
+      logistics: [],
+	  returnGoodsVisible: false,
+	  typeIndex: '1',
+	  formData1: {
+	  	list: [],
+	  },
+	  formData2: {
+	  	list: [],
+	  },
+	  isEdit1: 0,
+	  isEdit2: 0,
+	  joinCode: JSON.parse(localStorage.getItem('greemall_user')).joinCode,
+	  orderDetailId: '',
+	  returnGoodsFormRules: {
+	  	// refundMessage: [{ required: true, message: '请填写卖家留言', trigger: 'blur' }],
+	  },
+	  returnGoodsForm: {
+	  	refundMessage: ''
+	  },
     }
   },
   created() {
-    this.orderRefundId = this.$route.query.orderRefundId
+    this.orderRefundId = this.$route.query.orderRefundId || this.$route.query.orderId
     this.getDetail()
   },
   methods: {
@@ -211,7 +408,8 @@ export default {
     goBack() {
       // this.$router.go(-1);
 		this.$router.push({
-			name:"order_list"
+			name:"order_pr",
+			params: {}
 		})
     },
     showRemark() {
@@ -232,14 +430,30 @@ export default {
       })
     },
     // 变更维权处理状态
-    changeExamineStatus(examineStatus) {
-      console.log(123);
+    changeExamineStatus(examineStatus,refundType) {
+      console.log(refundType);
       const orderRefundId = this.orderRefundId
-      changeExamineStatus({orderRefundId, examineStatus}).then(() => {
-        this.getDetail();
-        this.$successMsg('操作成功');
-      })
+		if(refundType == 'REFUND_GOODS'){
+			this.getOrderDetail()
+			this.getCodeDetail2()
+			this.returnGoodsVisible = true
+		}else{
+			changeExamineStatus({orderRefundId, examineStatus}).then(() => {
+			  this.getDetail();
+			  this.$successMsg('操作成功');
+			})
+		}
     },
+	saveReturnGoods(){
+		changeExamineStatus({
+		  orderRefundId: this.orderRefundId,
+		  examineStatus: 'OK',
+		  refundMessage: this.returnGoodsForm.refundMessage
+		}).then(() => {
+		  this.getDetail();
+		  this.$successMsg('操作成功');
+		})
+	},
     // 确认收货
     receiveProd() {
       const orderRefundId = this.orderRefundId
@@ -255,6 +469,181 @@ export default {
         this.logistics = res.data
       })
     },
+		
+		getOrderDetail(){
+			getOrderDetail({orderId: this.orderDetail.orderId}).then(res => {
+			  this.formData1.list = res.data.orderDetails
+			})
+		},
+		changeType(){
+			this.getOrderDetail()
+			this.getCodeDetail2()
+		},
+		async getCodeDetail2(){
+			getCodeDetail2({orderId: this.orderDetail.orderId}).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)
+			row.orderDetailId = e.orderDetailId
+		},
+		async changeMaterial(e,row){
+			if(!row.specs){
+				return this.$message.warning('请先选择规格型号!');
+			}
+			row.material = null
+			row.materialName = ''
+			row.stockQty = ''
+			row.uniqueCode = ''
+			row.materialList = await this.getMaterialList(row.specsName,row.goodsMaterialItemType)
+		},
+		//发货新增条码
+		addCode(){
+			this.$refs.formData2.validate((valid) => {
+				if (valid) {
+					this.isEdit2 = 0
+					this.formData2.list.unshift({
+						brandId: '',
+						brandName: '',
+						mainId: '',
+						mainName: '',
+						stockQty: '',
+						smallId: '',
+						smallName: '',
+						goodsMaterialItemType: '',
+						goodsMaterialName: '',
+						goodsMaterialId: '',
+						materialCode: '',
+						uniqueCode: '',
+						specs: null,
+						specsName: '',
+						materialName: '',
+						material: null,
+						materialList: [],
+						orderDetailId: '',
+						goodsMaterialItemId: ''
+					})
+				}
+			});
+		},
+		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.orderRefundId,
+			}]
+			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()
+						}
+					})
+				}
+			})
+		},
+		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 = {
+				orderDetailId: this.orderDetailId
+			}
+			if (!!params) {
+			  for (const key in params) {
+			    if (Object.hasOwnProperty.call(params, key)) {
+			      formdata.append(key, params[key])
+			    }
+			  }
+			}
+			listImport2({ formdata })
+			  .then(res => {
+			    this.getOrderDetail()
+				this.getCodeDetail()
+			    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('下载失败')
+			})
+		},
   },
   computed: {
     totalAmountCompute() {

+ 108 - 0
src/views/salesPurchasing/goodsCodeMachineAccount/index.vue

@@ -0,0 +1,108 @@
+<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" :operationColumnWidth="80"
+			  :operation="operation()" :exportList="exportList">
+			</template-page>
+		</template>
+	</zj-tab-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import ImageUpload from '@/components/file-upload'
+import { downloadFiles } from '@/utils/util'
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import { listPageV2, pageExport, getDetail, listImport } from "@/api/salesPurchasing/goodsCodeMachineAccount";
+import { commonTemplateDownload } from '@/api/common.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+export default {
+	components: { TemplatePage, ImageUpload },
+	mixins: [import_mixin, operation_mixin],
+	data() {
+		return {
+			// 表格属性
+			tableAttributes: {
+				// 启用勾选列
+				selectColumn: true
+			},
+			// 表格事件
+			tableEvents: {
+				'selection-change': this.selectionChange
+			},
+			// 勾选选中行
+			recordSelected: [],
+			/** 表单变量 */
+			formDialogType: 0,
+			formDialogTitles: ["新增", "编辑", "详情"],
+			formDialog: false,
+			formData: {},
+			formType: 'add',
+			formVisible: false,
+			id: ''
+		}
+	},
+	computed: {
+		// 事件组合
+		optionsEvensGroup() {
+			return []
+		},
+		// 更多参数
+		moreParameters() {
+			return []
+		},
+
+		formItems() {
+			return []
+		}
+	},
+	created(){
+		if(this.$route.query.id){
+			this.id = this.$route.query.id
+		}
+	},
+	methods: {
+		// 列表请求函数
+		getList(p, cb) {
+			try {
+				var pam = JSON.parse(JSON.stringify(p))
+				if(this.id){
+					pam.params.push({ "param": "a.goods_material_id", "compare": "=", "value": this.id })
+				}
+				cb && cb(pam)
+				return listPageV2(pam)
+			} catch (error) {
+				console.log(error)
+			}
+		},
+		// 列表导出函数
+		exportList: pageExport,
+		// 表格列解析渲染数据更改
+		columnParsing(item, defaultData) {
+			return defaultData
+		},
+		// 监听勾选变化
+		selectionChange(data) {
+			this.recordSelected = data
+		},
+
+		operation() {
+			return this.operationBtn({
+			})
+		},
+		formCancel() {
+			this.formVisible = false
+			this.$refs?.formRef?.resetFields()
+			this.$data.formData = this.$options.data().formData
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.tab {
+	padding: 20px 20px 0 20px;
+}
+</style>

+ 115 - 0
src/views/salesPurchasing/goodsInventory/index.vue

@@ -0,0 +1,115 @@
+<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" :operationColumnWidth="80"
+			  :operation="operation()" :exportList="exportList">
+			</template-page>
+		</template>
+	</zj-tab-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import ImageUpload from '@/components/file-upload'
+import { downloadFiles } from '@/utils/util'
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import { listPageV2, pageExport, getDetail, listImport } from "@/api/salesPurchasing/goodsInventory";
+import { commonTemplateDownload } from '@/api/common.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+export default {
+	components: { TemplatePage, ImageUpload },
+	mixins: [import_mixin, operation_mixin],
+	data() {
+		return {
+			// 表格属性
+			tableAttributes: {
+				// 启用勾选列
+				selectColumn: true
+			},
+			// 表格事件
+			tableEvents: {
+				'selection-change': this.selectionChange
+			},
+			// 勾选选中行
+			recordSelected: [],
+			/** 表单变量 */
+			formDialogType: 0,
+			formDialogTitles: ["新增", "编辑", "详情"],
+			formDialog: false,
+			formData: {},
+			formType: 'add',
+			formVisible: false,
+		}
+	},
+	computed: {
+		// 事件组合
+		optionsEvensGroup() {
+			return []
+		},
+		// 更多参数
+		moreParameters() {
+			return []
+		},
+
+		formItems() {
+			return []
+		}
+	},
+	methods: {
+		// 列表请求函数
+		getList(p, cb) {
+			try {
+				var pam = JSON.parse(JSON.stringify(p))
+				cb && cb(pam)
+				return listPageV2(pam)
+			} catch (error) {
+				console.log(error)
+			}
+		},
+		// 列表导出函数
+		exportList: pageExport,
+		// 表格列解析渲染数据更改
+		columnParsing(item, defaultData) {
+			return defaultData
+		},
+		// 监听勾选变化
+		selectionChange(data) {
+			this.recordSelected = data
+		},
+
+		operation() {
+			return this.operationBtn({
+				detail: {
+					conditions: ({ row, index, column }) => {
+						return JSON.parse(localStorage.getItem('greemall_user')).joinCode
+					},
+					click: ({ row, index, column }) => {
+						this.$router.push({
+							name: 'goodsCodeMachineAccount',
+							params: {
+								pageName: row.id,
+							},
+							query: {
+								id: row.id,
+							}
+						})
+					}
+				},
+			})
+		},
+		formCancel() {
+			this.formVisible = false
+			this.$refs?.formRef?.resetFields()
+			this.$data.formData = this.$options.data().formData
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.tab {
+	padding: 20px 20px 0 20px;
+}
+</style>

+ 102 - 0
src/views/salesPurchasing/goodsSaleMachineAccount/index.vue

@@ -0,0 +1,102 @@
+<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" :operationColumnWidth="80"
+			  :operation="operation()" :exportList="exportList">
+			</template-page>
+		</template>
+	</zj-tab-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import ImageUpload from '@/components/file-upload'
+import { downloadFiles } from '@/utils/util'
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import { listPageV2, pageExport, getDetail, listImport } from "@/api/salesPurchasing/goodsSaleMachineAccount";
+import { commonTemplateDownload } from '@/api/common.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+export default {
+	components: { TemplatePage, ImageUpload },
+	mixins: [import_mixin, operation_mixin],
+	data() {
+		return {
+			// 表格属性
+			tableAttributes: {
+				// 启用勾选列
+				selectColumn: true
+			},
+			// 表格事件
+			tableEvents: {
+				'selection-change': this.selectionChange
+			},
+			// 勾选选中行
+			recordSelected: [],
+			/** 表单变量 */
+			formDialogType: 0,
+			formDialogTitles: ["新增", "编辑", "详情"],
+			formDialog: false,
+			formData: {},
+			formType: 'add',
+			formVisible: false,
+		}
+	},
+	computed: {
+		// 事件组合
+		optionsEvensGroup() {
+			return []
+		},
+		// 更多参数
+		moreParameters() {
+			return []
+		},
+
+		formItems() {
+			return []
+		}
+	},
+	created(){
+		
+	},
+	methods: {
+		// 列表请求函数
+		getList(p, cb) {
+			try {
+				var pam = JSON.parse(JSON.stringify(p))
+				cb && cb(pam)
+				return listPageV2(pam)
+			} catch (error) {
+				console.log(error)
+			}
+		},
+		// 列表导出函数
+		exportList: pageExport,
+		// 表格列解析渲染数据更改
+		columnParsing(item, defaultData) {
+			return defaultData
+		},
+		// 监听勾选变化
+		selectionChange(data) {
+			this.recordSelected = data
+		},
+
+		operation() {
+			return this.operationBtn({
+			})
+		},
+		formCancel() {
+			this.formVisible = false
+			this.$refs?.formRef?.resetFields()
+			this.$data.formData = this.$options.data().formData
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.tab {
+	padding: 20px 20px 0 20px;
+}
+</style>

+ 102 - 0
src/views/salesPurchasing/inventoryIIIMachineAccount/index.vue

@@ -0,0 +1,102 @@
+<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" :operationColumnWidth="80"
+			  :operation="operation()" :exportList="exportList">
+			</template-page>
+		</template>
+	</zj-tab-page>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import ImageUpload from '@/components/file-upload'
+import { downloadFiles } from '@/utils/util'
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import { listPageV2, pageExport, getDetail, listImport } from "@/api/salesPurchasing/inventoryIIIMachineAccount";
+import { commonTemplateDownload } from '@/api/common.js'
+import operation_mixin from '@/components/template/operation_mixin.js'
+export default {
+	components: { TemplatePage, ImageUpload },
+	mixins: [import_mixin, operation_mixin],
+	data() {
+		return {
+			// 表格属性
+			tableAttributes: {
+				// 启用勾选列
+				selectColumn: true
+			},
+			// 表格事件
+			tableEvents: {
+				'selection-change': this.selectionChange
+			},
+			// 勾选选中行
+			recordSelected: [],
+			/** 表单变量 */
+			formDialogType: 0,
+			formDialogTitles: ["新增", "编辑", "详情"],
+			formDialog: false,
+			formData: {},
+			formType: 'add',
+			formVisible: false,
+		}
+	},
+	computed: {
+		// 事件组合
+		optionsEvensGroup() {
+			return []
+		},
+		// 更多参数
+		moreParameters() {
+			return []
+		},
+
+		formItems() {
+			return []
+		}
+	},
+	created(){
+		
+	},
+	methods: {
+		// 列表请求函数
+		getList(p, cb) {
+			try {
+				var pam = JSON.parse(JSON.stringify(p))
+				cb && cb(pam)
+				return listPageV2(pam)
+			} catch (error) {
+				console.log(error)
+			}
+		},
+		// 列表导出函数
+		exportList: pageExport,
+		// 表格列解析渲染数据更改
+		columnParsing(item, defaultData) {
+			return defaultData
+		},
+		// 监听勾选变化
+		selectionChange(data) {
+			this.recordSelected = data
+		},
+
+		operation() {
+			return this.operationBtn({
+			})
+		},
+		formCancel() {
+			this.formVisible = false
+			this.$refs?.formRef?.resetFields()
+			this.$data.formData = this.$options.data().formData
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.tab {
+	padding: 20px 20px 0 20px;
+}
+</style>