浏览代码

对接发货

sakura 1 年之前
父节点
当前提交
160c841fa5

+ 21 - 3
manager-admin/src/api/order.js

@@ -71,12 +71,12 @@ export function getWarehouseOutInfo(id) {
 }
 
 /**
- * 获取出库单列表
+ * 获取发货列表
  * @param params
  */
-export function getWarehouseOutList(params) {
+export function getSaleOrderOutList(params) {
   return request({
-    url: 'admin/erp/warehouseOut',
+    url: '/admin/erp/order/saleOrder/list',
     method: 'get',
     loaidng: false,
     params
@@ -255,3 +255,21 @@ export function payment(id) {
     method: 'post'
   })
 }
+
+/* 快递鸟发货 /admin/erp/order/kdShip */
+export function getKdShip(id,order) {
+  return request({
+    url: `/admin/erp/order/kdShip/${id}`,
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: order
+  })
+}
+
+/* 发货 /admin/erp/order/orderSend/{orderId} */
+export function outOrderSend(id) {
+  return request({
+    url: `/admin/erp/order/orderSend/${id}`,
+    method: 'post'
+  })
+}

+ 1 - 1
manager-admin/src/router/index.js

@@ -154,7 +154,7 @@ const asyncRouters = [
       { path: 'order-detail/:id?', component: () => import('@/views/stock/orderAdd'), name: 'orderDetail', meta: { title: 'orderDetail' }, hidden: true },
       { path: 'warehouse-out', component: () => import('@/views/stock/warehouseOut'), name: 'warehouseOut', meta: { title: 'warehouseOut' } },
       { path: 'order-outbound/:sn?', component: () => import('@/views/stock/orderOutbound'), name: 'orderOutbound', meta: { title: 'orderOutbound', noCache: true }, hidden: true },
-      { path: 'warehouse-add', component: () => import('@/views/stock/orderOutbound'), name: 'orderOutboundAdd', meta: { title: 'orderOutboundAdd' }, hidden: true },
+      { path: 'warehouse-add/:id?', component: () => import('@/views/stock/orderOutbound'), name: 'orderOutboundAdd', meta: { title: 'orderOutboundAdd' }, hidden: true },
       { path: 'order-outbound/:id?', component: () => import('@/views/stock/orderOutbound'), name: 'orderOutboundDetail', meta: { title: 'orderOutbound', noCache: true }, hidden: true },
       { path: 'order-return', component: () => import('@/views/stock/orderReturn'), name: 'orderReturn', meta: { title: 'orderReturn' } },
       { path: 'order-return-add/:id?', component: () => import('@/views/stock/orderReturnAdd'), name: 'orderReturnAdd', hidden: true, meta: { title: 'orderReturnAdd' } },

+ 17 - 2
manager-admin/src/views/stock/goodsExchange/goodsExchange.vue

@@ -121,9 +121,13 @@
             {{ scope.row.sn }}
           </template>
         </el-table-column>
-        <el-table-column prop="warehouse_name" label="仓库名称" />
+        <el-table-column prop="warehouse_id" label="仓库名称">
+          <template slot-scope="scope">
+            {{ warehouseName(scope.row.warehouse_id) }}
+          </template>
+        </el-table-column>
         <el-table-column prop="order_id" label="订单编号" />
-        <el-table-column prop="memo" label="备注" />
+        <el-table-column prop="notes" label="备注" />
         <el-table-column label="操作" width="450">
           <template slot-scope="scope">
             <el-button
@@ -209,6 +213,17 @@ export default {
     },
   },
   methods: {
+    //获取仓库名称
+    warehouseName(val){
+      let name=''
+      this.warehouseList.map(el=>{
+       if(el.id==val) {
+        return name=el.name
+       }
+      })
+      return name
+    },
+
     handleClick(tab, event) {
       this.activeName = tab.name;
       if (tab.name == "first") {

+ 9 - 2
manager-admin/src/views/stock/goodsExchange/goodsExchangeAdd.vue

@@ -38,8 +38,8 @@
           <el-option
             v-for="item in typeList"
             :key="item.id"
-            :label="item.real_name"
-            :value="item.id"
+            :label="item.label"
+            :value="item.value"
           />
         </el-select>
       </el-form-item>
@@ -437,6 +437,7 @@ export default {
     this.sttorageType = this.$route.params.type;
     this.GET_WarehouseList();
     this.GET_DeptList();
+    this.outType()
   },
   watch: {
     $route: {
@@ -481,6 +482,12 @@ export default {
     ...mapGetters(["user"]),
   },
   methods: {
+    //获取出库类型字典
+    outType(){
+      API_Setting.getPage({dictType:"out_warehouse_type"}).then(res=>{
+        this.typeList=res.data
+      })
+    },
      /*//商品对应字段
      handleSelectionChange(val) {
       this.goodsList = val.map((el) => {

+ 72 - 11
manager-admin/src/views/stock/order.vue

@@ -41,7 +41,7 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="仓库">
-              <el-select v-model="advancedForm.warehouse_id">
+              <el-select v-model="advancedForm.warehouse_id" clearable>
                 <el-option
                   v-for="item in warehouseList"
                   :key="item.id"
@@ -139,8 +139,8 @@
             {{ scope.row.sn }}
           </template>
         </el-table-column>
-        <el-table-column label="会员">
-          <template slot-scope="scope">{{ scope.row.member_name }}</template>
+        <el-table-column label="客户">
+          <template slot-scope="scope">{{ memberType(scope.row.member_id) }}</template>
         </el-table-column>
         <el-table-column label="下单时间">
           <template slot-scope="scope">{{
@@ -153,10 +153,10 @@
           </template>
         </el-table-column>
         <el-table-column prop="delivery_type" label="配送方式">
-          <template slot-scope="scope">{{ scope.row.delivery_type }}</template>
+          <template slot-scope="scope">{{ deliveryType(scope.row.delivery_type) }}</template>
         </el-table-column>
         <el-table-column prop="pay_type" label="付款方式">
-          <template slot-scope="scope">{{ scope.row.pay_type }}</template>
+          <template slot-scope="scope">{{payType(scope.row.pay_type)  }}</template>
         </el-table-column>
         <el-table-column prop="status" label="实付金额">
           <template slot-scope="scope">{{
@@ -173,6 +173,8 @@
         </el-table-column> -->
         <el-table-column label="操作" width="250">
           <template slot-scope="scope">
+            <el-button size="mini"
+                       @click="handleAudit(scope.row)">查看</el-button>
              <el-button size="mini" type="success"
              v-if="scope.row.status==='TO_BE_COMMIT'"
                        @click="handleSubmit(scope.row.id)">确认</el-button>
@@ -182,8 +184,6 @@
             v-if="scope.row.status==='TO_BE_COMMIT'"
               >编辑</el-button
             >
-            <!-- <el-button size="mini" type="success" v-if="scope.row.allowable.audit && checkPermission(['order:audit'])"
-                       @click="handleAudit(scope.row)">审核</el-button> -->
             <!-- <el-button size="mini" type="primary" v-if="scope.row.allowable.payment && checkPermission(['order:payment'])"
                        @click="handlePayment(scope.row.id)">设为已支付</el-button> -->
           </template>
@@ -210,6 +210,7 @@ import * as API_order from "@/api/order";
 import Storage from "@/utils/storage";
 import * as API_BasicSetting from '@/api/basicSetting'
 import * as API_Setting from '@/api/setting'
+import * as API_CollectingAccount from "@/api/collectingAccount";
 export default {
   name: "orderList",
   data() {
@@ -240,12 +241,26 @@ export default {
 
       accessToken: Storage.getItem("seller_access_token"),
       multipleSelection: [],
-      orderType:[]
+      orderType:[],
+      collectingAccountList: [], // 支付方式列表
+      deliveryTypeList: [
+        {
+          code: "express",
+          name: "快递配送",
+        },
+        {
+          code: "self_pick",
+          name: "门店自提",
+        },
+      ],
+      customerList:[],
     };
   },
   mounted() {
     this.GET_OrderList();
     this.GET_WarehouseList()
+    this.GET_CollectingAccountList()
+    this.GET_CustomerList();
   },
   activated() {
     delete this.params.market_enable;
@@ -266,17 +281,64 @@ export default {
     next();
   },
   methods: {
+    memberType(val){
+      let name=''
+      this.customerList.map(el=>{
+       if(el.id==val) {
+        return name=el.name
+       }
+      })
+      return name
+    },
+     //获取客户列表
+     GET_CustomerList() {
+      API_BasicSetting.customer(this.params)
+        .then((response) => {
+          this.customerList = response.data;
+        })
+        .catch(() => {});
+    },
+    //配送方式查看
+    deliveryType(val){
+      let name=''
+      this.deliveryTypeList.map(el=>{
+       if(el.code==val) {
+        return name=el.name
+       }
+      })
+      return name
+    },
+    //获取付款方式
+    payType(val){
+      let name=''
+      this.collectingAccountList.map(el=>{
+       if(el.id==val) {
+        return name=el.name
+       }
+      })
+      return name
+    },
+     /** 获取支付方式列表 */
+     GET_CollectingAccountList() {
+      API_CollectingAccount.getList({
+        page_no: 1,
+        page_size: -1,
+        enable_flag: true,
+      }).then((response) => {
+        this.collectingAccountList = response.data;
+      });
+    },
+    //获取订单状态大小写转换.toUpperCase()
     typeName(val){
-      console.log(val);
       let name=''
       this.orderType.map(el=>{
        if(el.value==val) {
         return name=el.label
        }
       })
-      console.log(name);
       return name
     },
+    //获取仓库名称
     warehouseName(val){
       let name=''
       this.warehouseList.map(el=>{
@@ -305,7 +367,6 @@ export default {
       })
       API_Setting.getPage({dictType:"order_status"}).then(res=>{
         this.orderType=res.data
-        console.log(this.orderType);
       })
     },
     /** 计算高度 */

+ 20 - 20
manager-admin/src/views/stock/orderAdd.vue

@@ -123,10 +123,10 @@
         <el-col :span="10">
           <el-form-item
             label="配送方式"
-            prop="delivery_type"
-            :rules="rules.delivery_type"
+            prop="send_type"
+            :rules="rules.send_type"
           >
-            <el-select v-model="OrderForm.delivery_type" clearable>
+            <el-select v-model="OrderForm.send_type" clearable>
               <el-option
                 v-for="item in deliveryTypeList"
                 :key="item.code"
@@ -222,12 +222,12 @@
           <el-table-column type="selection" width="40" align="center" />
           <el-table-column label="商品编号">
             <template slot-scope="scope">
-              {{ scope.row.product_sn }}
+              {{ scope.row.sn }}
             </template>
           </el-table-column>
           <el-table-column label="商品名称">
             <template slot-scope="scope">
-              {{ scope.row.product_name }}
+              {{ scope.row.name }}
             </template>
           </el-table-column>
           <el-table-column label="条码">
@@ -242,12 +242,12 @@
           </el-table-column>
           <el-table-column label="规格型号">
             <template slot-scope="scope">
-              {{ scope.row.product_specification }}
+              {{ scope.row.goods_style }}
             </template>
           </el-table-column>
           <el-table-column label="单位">
             <template slot-scope="scope">
-              {{ scope.row.product_unit }}
+              {{ scope.row.goods_unit }}
             </template>
           </el-table-column>
           <el-table-column label="订单数量">
@@ -470,7 +470,7 @@ const initOrderForm = {
   discount_price: 0,
   pay_price: 0,
   deposit_price: 0,
-  delivery_type: "express",
+  send_type: "express",
   payment_status: "NOT_PAY",
 };
 
@@ -521,13 +521,13 @@ export default {
         pay_type: [this.MixinRequired("请选择付款方式", "change")],
         pay_price: [this.MixinRequired("请输入付款金额", "blur")],
         marketing_id: [this.MixinRequired("请选择销售人员", "change")],
-        delivery_type: [this.MixinRequired("请选择配送方式", "change")],
+        send_type: [this.MixinRequired("请选择配送方式", "change")],
         warehouse_id: [this.MixinRequired("请选择仓库", "change")],
         member_id: [this.MixinRequired("请选择会员", "change")],
         order_time: [this.MixinRequired("下单时间不能为空", "change")],
         payment_status: [this.MixinRequired("支付状态不能为空", "change")],
         payment_time: [this.MixinRequired("支付时间不能为空", "change")],
-        delivery_type: [this.MixinRequired("请选择配送方式", "change")],
+       // delivery_type: [this.MixinRequired("请选择配送方式", "change")],
         product_list: {
           num: [
             this.MixinRequired("数量不能为空", "change"),
@@ -845,11 +845,11 @@ export default {
       const defaultCollectingAccount = this.collectingAccountList.findLast(
         (item) => item.default_flag === true
       );
-      this.OrderForm.payment_list.push({
+     /*  this.OrderForm.payment_list.push({
         collecting_account_id: defaultCollectingAccount
           ? defaultCollectingAccount.id
           : null,
-      });
+      }); */
     },
     /** table单选框事件 */
     handleSelectionChange(val) {
@@ -1034,12 +1034,12 @@ export default {
           });
       } else {
         API_Order.addOrder(params)
-          .then(() => {
+          .then((res) => {
             this.$message.success("添加成功!");
-            /* API_Order.submit(id).then(res=>{
-              this.$message.success("订单已确认") }) */
+            console.log(res);
+            /**/API_Order.submit(res).then(res=>{
+              this.$message.success("订单已确认") })
               this.backOrderList();
-
           })
           .finally(() => {
             this.formLoading = false;
@@ -1142,7 +1142,7 @@ export default {
           item.tax_price = item.total_price * item.tax_rate * 0.01;
           // 合计
         });
-        this.OrderForm.total_price = newVal.reduce(
+        /* this.OrderForm.total_price = newVal.reduce(
           (sum, item) => sum + item.total_price,
           0
         );
@@ -1153,10 +1153,10 @@ export default {
         this.OrderForm.tax_price = newVal.reduce(
           (sum, item) => sum + item.tax_price,
           0
-        );
+        ); */
       },
     },
-    "OrderForm.payment_list": {
+    /* "OrderForm.payment_list": {
       deep: true,
       handler(newVal) {
         this.OrderForm.deposit_price = newVal.reduce(
@@ -1164,7 +1164,7 @@ export default {
           0
         );
       },
-    },
+    }, */
     $route: {
       immediate: true,
       handler(newVal) {

+ 420 - 160
manager-admin/src/views/stock/orderOutbound.vue

@@ -2,77 +2,136 @@
   <div>
     <div class="bg-in">
       <div>
-        <!-- <span class="font">仓库: {{ orderOutboundInfo.warehouse_name }}</span>
-        <span style="margin-left: 50px" class="font">
-          出库日期:&nbsp;
-          <el-date-picker style="width: 200px" v-model="orderOutboundInfo.out_time" value-format="timestamp"
-                          type="datetime" :clearable="false" :editable="false" :disabled="$route.name === 'orderOutboundDetail'" />
-        </span>
-        <span style="margin-left: 50px" class="font" v-if="id">提货人:&nbsp;
-          {{ orderOutboundInfo.warehouse_consignee_name ? orderOutboundInfo.warehouse_consignee_name : '无' }}
-        </span>
-        <span style="margin-left: 50px" class="font" v-if="!id">提货人:&nbsp;
-          <el-select v-model="orderOutboundInfo.warehouse_consignee_id">
-            <el-option v-for="item in adminList" :key="item.id" :label="item.real_name" :value="item.id" />
-          </el-select>
-        </span> -->
         <el-form
-          :model="warehouseOutForms"
-          ref="warehouseOutForms"
+          :model="deliveryForms"
+          :rules="rules"
+          ref="ruleForm"
           label-width="120px"
         >
           <el-row>
-            <el-col :span="12">
-              <el-form-item label="出库单号:" prop="name">
-                <el-select v-model="warehouseOutForms.sn">
-                  <!-- <el-option  /> -->
+            <el-col>
+              <el-form-item label="预约类型:" prop="appointment_type">
+                <el-select v-model="deliveryForms.appointment_type">
+                  <el-option label="立即单" value="0"> </el-option>
+                  <el-option label="预约上门单" value="1"> </el-option>
                 </el-select>
-                <!-- {{ warehouseOutForms.sn }} -->
               </el-form-item>
             </el-col>
+            <el-col>
+              <el-form-item label="预约时间:" prop="appointment_time">
+                <el-date-picker
+                  v-model="deliveryForms.appointment_time"
+                  type="datetime"
+                  placeholder="选择日期时间"
+                  value-format="yyyy-MM-dd HH:mm:ss"
+                ></el-date-picker>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-divider></el-divider>
+          <h3>发货人信息:</h3>
+          <el-row>
             <el-col :span="12">
-              <el-form-item label="订单编号:" prop="sn">
-                <el-select v-model="warehouseOutForms.order_sn_list">
-                  <!-- <el-option  /> -->
-                </el-select>
-                <!-- <span v-if="warehouseOutForms.order_sn_list">{{ formatFilter(warehouseOutForms.order_sn_list) }}</span> -->
-              </el-form-item></el-col
-            >
+              <el-form-item label="发货人姓名:" prop="sender.name">
+                <!-- <el-select v-model="deliveryForms.sender.name"> </el-select> -->
+                <el-input
+                  v-model="deliveryForms.sender.name"
+                  :minlength="1"
+                  :maxlength="20"
+                  placeholder="请输入发货人姓名"
+                ></el-input>
+              </el-form-item>
+            </el-col>
             <el-col :span="12">
-              <el-form-item label="配送方式:" prop="category_id">
-                <el-select>
-                  <!-- <el-option  /> -->
-                </el-select>
-                <!-- <el-radio v-model="warehouseOutForms.delivery_type" :label="'express'" :disabled="true">物流配送</el-radio>
-            <el-radio v-model="warehouseOutForms.delivery_type" :label="'self_pick'" :disabled="true">自提</el-radio> -->
-              </el-form-item></el-col
-            >
+              <el-form-item label="手机号:" prop="sender.phone">
+                <el-input
+                  v-model="deliveryForms.sender.phone"
+                  :minlength="1"
+                  :maxlength="20"
+                  placeholder="请输入手机号"
+                ></el-input> </el-form-item
+            ></el-col>
             <el-col :span="12">
+              <el-form-item label="配送地址:" prop="sender.address">
+                <el-cascader
+                  size="large"
+                  :options="options"
+                  clearable
+                  v-model="selectedOptions"
+                  @change="sendHandleChange"
+                >
+                </el-cascader>
+                <el-input
+                  v-model="deliveryForms.sender.address"
+                  placeholder="请输入"
+                ></el-input> </el-form-item
+            ></el-col>
+            <!--    <el-col :span="12">
               <el-form-item label="配送仓库:" prop="freight_price">
                 <el-select>
-                  <!-- <el-option  /> -->
+
                 </el-select>
               </el-form-item></el-col
             >
             <el-col :span="12">
               <el-form-item label="物流公司:" prop="logistics_company_id">
-                <el-select v-model="warehouseOutForms.logistics_company_id">
-                  <!-- <el-option  /> -->
+                <el-select v-model="deliveryForms.logistics_company_id">
+
                 </el-select>
               </el-form-item></el-col
             >
             <el-col :span="12">
               <el-form-item label="配送地址" prop="address">
                 <el-input
-                  v-model="warehouseOutForms.address"
+                  v-model="deliveryForms.address"
                   :minlength="1"
                   :maxlength="20"
                   clearable
                   placeholder="请输入提货人"
                 ></el-input> </el-form-item
+            ></el-col> -->
+          </el-row>
+          <el-divider></el-divider>
+          <h3>收货人信息:</h3>
+          <!-- --><el-row>
+            <el-col :span="12">
+              <el-form-item label="收货人姓名:" prop="receiver.name">
+                <el-input
+                  v-model="deliveryForms.receiver.name"
+                  :minlength="1"
+                  :maxlength="20"
+                  placeholder="请输入收货人姓名"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="手机号:" prop="receiver.phone">
+                <el-input
+                  v-model="deliveryForms.receiver.phone"
+                  :minlength="1"
+                  :maxlength="20"
+                  placeholder="请输入手机号"
+                ></el-input> </el-form-item
+            ></el-col>
+            <el-col :span="12">
+              <el-form-item label="配送地址:" prop="receiver.address">
+                <el-cascader
+                  size="large"
+                  :options="options"
+                  clearable
+                  v-model="receiverOptions"
+                  @change="receiverChange"
+                >
+                </el-cascader>
+                <el-input
+                  v-model="deliveryForms.receiver.address"
+                  size="medium"
+                  placeholder="请输入"
+                ></el-input> </el-form-item
             ></el-col>
           </el-row>
-          <el-row  :gutter="20">
+          <el-divider></el-divider>
+          <!--  <el-row  :gutter="20">
               <el-col :span="8" :offset="6">
               <el-form-item label="物流单号:" prop="tracking_number">
                 <el-input
@@ -85,151 +144,173 @@
                 <el-button>自动获取单号</el-button>
                 </el-form-item
             ></el-col>
-          </el-row>
-
-        </el-form>
-        <!-- <div style="display: flex;">
-         <span>物流单号:</span> <el-input v-model="tracking_number"  :minlength="1" :maxlength="20" clearable
-            placeholder="请输入物流单号"></el-input>
-        </div> -->
-      </div>
-
-      <el-divider></el-divider>
-      <!-- <div class="order-item" v-for="order in orderOutboundInfo.order_list">
-        <div><span class="font">订单编号:</span>{{ order.order_sn }}</div>
-
-        <div v-for="orderItem in order.order_item_list">
-          <div class="flex">
-            <div>商品名称: {{ orderItem.product_name }}</div>
-            <div>商品编号: {{ orderItem.product_sn }}</div>
-            <div>规格型号: {{ orderItem.product_specification }}</div>
-            <div>购买数量: {{ orderItem.num }}</div>
-            <div>
-              <el-button
-                class="button"
-                size="mini"
-                type="primary"
-                @click="handleSelectWarehouseEntryBatch(orderItem)"
-                :disabled="$route.name === 'orderOutboundDetail'"
-                >选择库存</el-button
-              >
-            </div>
-          </div>
-
+          </el-row> -->
+          <h3>商品信息:</h3>
           <el-table
-            :data="orderItem.batch_list"
+            :data="product_list"
             border
             :cell-style="{ textAlign: 'center' }"
             :header-cell-style="{ textAlign: 'center' }"
-            style="width: 100%; margin-top: 20px"
+            style="width: 95%"
           >
-            <el-table-column label="入库单号">
+            <el-table-column type="selection" width="40" align="center" />
+            <el-table-column label="商品编号">
               <template slot-scope="scope">
-                {{ scope.row.warehouse_entry_sn }}
+                {{ scope.row.sn }}
               </template>
             </el-table-column>
-            <el-table-column label="批次号">
+            <el-table-column label="商品名称">
               <template slot-scope="scope">
-                {{ scope.row.batch_sn }}
+                {{ scope.row.name }}
               </template>
             </el-table-column>
-            <el-table-column label="库存数量">
+            <el-table-column label="条码">
               <template slot-scope="scope">
-                {{ scope.row.remain_num }}
+                {{ scope.row.bar_code }}
               </template>
             </el-table-column>
-            <el-table-column label="出库数量">
+            <el-table-column label="序列号">
               <template slot-scope="scope">
-                <el-input
-                  :maxlength="22"
-                  v-model="scope.row.out_num"
-                  :disabled="$route.name === 'orderOutboundDetail'"
-                />
+                {{ scope.row.sn_code }}
+              </template>
+            </el-table-column>
+            <el-table-column label="规格型号">
+              <template slot-scope="scope">
+                {{ scope.row.goods_style }}
+              </template>
+            </el-table-column>
+            <el-table-column label="单位">
+              <template slot-scope="scope">
+                {{ scope.row.goods_unit }}
+              </template>
+            </el-table-column>
+            <el-table-column label="订单数量">
+              <template slot-scope="scope">
+                {{ scope.row.num }}
+              </template>
+            </el-table-column>
+            <el-table-column label="库存数量">
+              <template slot-scope="scope">
+                {{ scope.row.usable_stock }}
               </template>
             </el-table-column>
           </el-table>
-        </div>
+          <el-divider></el-divider>
+          <h3></h3>
+
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="物品总重量:" prop="total_weight">
+                <el-input
+                  v-model="deliveryForms.total_weight"
+                  :minlength="1"
+                  :maxlength="20"
+                  clearable
+                  placeholder="请输入物品总重量"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="物品总体积:" prop="total_volume">
+                <el-input
+                  v-model="deliveryForms.total_volume"
+                  :minlength="1"
+                  :maxlength="20"
+                  clearable
+                  placeholder="请输入物品总体积"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="物品价格:" prop="declared_value">
+                <el-input
+                  v-model="deliveryForms.declared_value"
+                  :minlength="1"
+                  :maxlength="20"
+                  clearable
+                  placeholder="请输入物品价格"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="16">
+              <el-form-item label="备注:" prop="remark">
+                <el-input
+                  v-model="deliveryForms.remark"
+                  type="textarea"
+                  clearable
+                  :autosize="{ minRows: 2, maxRows: 4 }"
+                  placeholder="请输入备注"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-divider></el-divider>
+          <el-row :gutter="20">
+            <el-col :span="8" :offset="6">
+              <el-form-item label="物流单号:" prop="tracking_number">
+                <el-input
+                  v-model="kdnCode"
+                  :minlength="1"
+                  :maxlength="20"
+                  :disabled="true"
+                  placeholder="请输入物流单号"
+                ></el-input>
+                <el-button @click="obtainOrder" v-if="kdnCode == ''"
+                  >获取单号</el-button
+                >
+              </el-form-item></el-col
+            >
+          </el-row>
+        </el-form>
       </div>
-      <el-card v-if="orderOutboundInfo.status === 'SHIP'">
-        <el-row :gutter="0">
-          <el-col :span="4">配送方式</el-col>
-          <el-col :span="8">{{
-            orderOutboundInfo.delivery_type === "express" ? "物流配送" : "自提"
-          }}</el-col>
-          <el-col :span="4">物流费用</el-col>
-          <el-col :span="8">{{ orderOutboundInfo.freight_price }}</el-col>
-        </el-row>
-        <el-row :gutter="0">
-          <el-col :span="4">提货人</el-col>
-          <el-col :span="8">{{ orderOutboundInfo.consignee }}</el-col>
-          <span v-if="orderOutboundInfo.delivery_type !== 'express'">
-            <el-col :span="4">自提点</el-col>
-            <el-col :span="8">{{ orderOutboundInfo.store_name }}</el-col>
-          </span>
-          <span v-else>
-            <el-col :span="4">物流公司</el-col>
-            <el-col :span="8">{{
-              orderOutboundInfo.logistics_company_name
-            }}</el-col>
-          </span>
-        </el-row>
-        <el-row
-          :gutter="0"
-          v-if="orderOutboundInfo.delivery_type === 'express'"
-        >
-          <el-col :span="4">物流单号</el-col>
-          <el-col :span="8">{{ orderOutboundInfo.tracking_number }}</el-col>
-        </el-row>
-      </el-card> -->
+
+      <!--  <el-divider></el-divider>
       <el-form
-        :model="warehouseOutForms"
-        ref="warehouseOutForms"
+        :model="deliveryForms"
+        ref="deliveryForms"
         label-width="120px"
       >
         <el-row>
           <el-col :span="12">
             <el-form-item label="出库单号:" prop="name">
-              <el-select v-model="warehouseOutForms.sn">
-                <!-- <el-option  /> -->
+              <el-select v-model="deliveryForms.sn">
+
               </el-select>
-              <!-- {{ warehouseOutForms.sn }} -->
+
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="订单编号:" prop="sn">
-              <el-select v-model="warehouseOutForms.order_sn_list">
-                <!-- <el-option  /> -->
+              <el-select v-model="deliveryForms.order_sn_list">
+
               </el-select>
-              <!-- <span v-if="warehouseOutForms.order_sn_list">{{ formatFilter(warehouseOutForms.order_sn_list) }}</span> -->
             </el-form-item></el-col
           >
           <el-col :span="12">
             <el-form-item label="配送方式:" prop="category_id">
               <el-select>
-                <!-- <el-option  /> -->
+
               </el-select>
-              <!-- <el-radio v-model="warehouseOutForms.delivery_type" :label="'express'" :disabled="true">物流配送</el-radio>
-            <el-radio v-model="warehouseOutForms.delivery_type" :label="'self_pick'" :disabled="true">自提</el-radio> -->
             </el-form-item></el-col
           >
           <el-col :span="12">
             <el-form-item label="配送仓库:" prop="freight_price">
               <el-select>
-                <!-- <el-option  /> -->
+
               </el-select>
             </el-form-item></el-col
           >
           <el-col :span="12">
             <el-form-item label="物流公司:" prop="logistics_company_id">
-              <el-select v-model="warehouseOutForms.logistics_company_id">
-                <!-- <el-option  /> -->
+              <el-select v-model="deliveryForms.logistics_company_id">
+
               </el-select>
             </el-form-item></el-col
           >
           <el-col :span="8" >
             <el-form-item label="配送地址" prop="address">
               <el-input
-                v-model="warehouseOutForms.address"
+                v-model="deliveryForms.address"
                 :minlength="1"
                 :maxlength="20"
                 clearable
@@ -252,22 +333,10 @@
                 </el-form-item
             ></el-col>
           </el-row>
-      </el-form>
-      <div class="footer">
-        <el-button
-          type="primary"
-
-          v-if="$route.name === 'orderOutboundDetail'"
-          >
-          <!-- @click="roBack()" -->
-          获取全部单号
-        </el-button>
-        <el-button
-          type="primary"
-          @click="saveErpWarehouseOut"
-
-          >发货
-        </el-button>
+      </el-form> -->
+      <div class="footer" v-if="kdnCode !== ''">
+        <!-- <el-button type="primary"> 获取全部单号 </el-button> -->
+        <el-button type="primary" @click="saveErpWarehouseOut">发货 </el-button>
         <el-button
           type="primary"
           @click="roBack2()"
@@ -283,7 +352,15 @@ import * as API_BasicSetting from "@/api/basicSetting";
 import * as API_order from "@/api/order";
 import * as API_Setting from "@/api/setting";
 import * as API_Auth from "@/api/auth";
+import { RegExp } from '~/ui-utils'
 import { Foundation } from "~/ui-utils";
+import {
+  provinceAndCityData,
+  pcTextArr,
+  regionData,
+  pcaTextArr,
+  codeToText,
+} from "element-china-area-data";
 import { mapGetters } from "vuex";
 
 export default {
@@ -297,19 +374,93 @@ export default {
       },
       id: "",
       adminList: [],
-      warehouseOutForms: {},
+      kdnCode: "",
+      deliveryForms: {
+        //发货人
+        sender: {
+          name: "",
+          phone: "",
+          address: "",
+        },
+        //收货人
+        receiver: {
+          name: "",
+          phone: "",
+          address: "",
+        },
+        //商品信息列表
+        goods_list: [],
+      },
+      product_list: [],
+      options: regionData,
+      selectedOptions: [],
+      receiverOptions: [],
+      rules: {
+        appointment_type: [
+          { required: true, message: "请选择预约类型", trigger: "change" },
+        ],
+        appointment_time: [
+          { required: true, message: "请选择上门时间", trigger: "change" },
+        ],
+        sender: {
+          name: [
+            { required: true, message: "请输入发货人姓名", trigger: "blur" },
+          ],
+
+          phone: [
+            this.MixinRequired("请输入手机号码!"),
+            {
+              validator: (rule, value, callback) => {
+                if (!RegExp.mobile.test(value)) {
+                  callback(new Error("手机号码格式有误!"));
+                } else {
+                  callback();
+                }
+              },
+              trigger: ["change", "blur"],
+            },
+          ],
+        },
+        receiver: {
+          name: [
+            { required: true, message: "请输入收货人姓名", trigger: "blur" },
+          ],
+          phone: [
+            this.MixinRequired("请输入手机号码!"),
+            {
+              validator: (rule, value, callback) => {
+                if (!RegExp.mobile.test(value)) {
+                  callback(new Error("手机号码格式有误!"));
+                } else {
+                  callback();
+                }
+              },
+              trigger: ["change", "blur"],
+            },
+          ],
+        },
+        total_weight: [
+          { required: true, message: "请输入物品总重量", trigger: "blur" },
+        ],
+        total_volume: [
+          { required: true, message: "请输入物品总体积", trigger: "blur" },
+        ],
+        declared_value: [
+          { required: true, message: "请输入物品价格", trigger: "blur" },
+        ],
+      },
     };
   },
   watch: {
     $route: {
       immediate: true,
       handler(newVal) {
-        if (this.$route.name === "orderOutboundDetail") {
-          this.id = this.$route.params.id;
-          this.GET_WarehouseOutDetail();
+        if (this.$route.name === "orderOutboundAdd") {
+          /* this.id = this.$route.params.id;
+          this.GET_WarehouseOutDetail(); */
         } else {
           this.orderIds = this.$route.params.orderIds;
-          this.GET_WarehouseOutPreview();
+          /* this.GET_WarehouseOutPreview(); */
         }
       },
     },
@@ -318,9 +469,75 @@ export default {
     ...mapGetters(["user"]),
   },
   mounted() {
+    /**/ this.id = this.$route.params.id;
+    this.GET_WarehouseOutDetail();
     this.GET_AdministratorList();
   },
   methods: {
+    /* 收获地址 */
+    receiverChange() {
+      this.deliveryForms.receiver.province_name =
+        codeToText[this.receiverOptions[0]];
+      this.deliveryForms.receiver.city_name =
+        codeToText[this.receiverOptions[1]];
+      this.deliveryForms.receiver.area_name =
+        codeToText[this.receiverOptions[2]];
+    },
+    /* 发货地址 */
+    sendHandleChange(val) {
+      this.deliveryForms.sender.province_name =
+        codeToText[this.selectedOptions[0]];
+      this.deliveryForms.sender.city_name = codeToText[this.selectedOptions[1]];
+      this.deliveryForms.sender.area_name = codeToText[this.selectedOptions[2]];
+    },
+
+    obtainOrder() {
+      this.$refs["ruleForm"].validate((valid) => {
+        if (valid) {
+          const params = this.MixinClone(this.deliveryForms);
+          //发货详细地址
+          params.receiver.province_city_area_address =
+            params.receiver.province_name +
+            params.receiver.city_name +
+            params.receiver.area_name +
+            params.receiver.address;
+          //收货详细地址
+          params.sender.province_city_area_address =
+            params.sender.province_name +
+            params.sender.city_name +
+            params.sender.area_name +
+            params.sender.address;
+          //商品信息
+          const item = {};
+          this.product_list.map((el) => {
+            item.goods_name = el.name;
+            item.goods_price = el.price;
+            item.quantity = el.num;
+            item.unit = el.goods_unit;
+            return params.goods_list.push(item);
+          });
+          params.goods_num = this.product_list.reduce(
+            (sum, e) => sum + Number(e.num || 0),
+            0
+          );
+          params.total_weight = Number(params.total_weight);
+          params.total_volume = Number(params.total_volume);
+          params.declared_value = Number(params.declared_value);
+          //
+          console.log(params);
+          params.order_code = this.id;
+          API_order.getKdShip(this.id, params).then((res) => {
+            this.kdnCode = res;
+          });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+
+    //获取地址
+    handleChange(value) {},
     /** 获取人员列表 */
     GET_AdministratorList() {
       API_Auth.getAdministratorList({
@@ -332,7 +549,10 @@ export default {
       });
     },
     saveErpWarehouseOut() {
-      return
+      API_order.outOrderSend(this.id).then((res) => {
+        this.$router.push({ name: "warehouseOut" });
+      });
+      return;
       API_order.addErpWarehouseOut({
         order_list: this.orderOutboundInfo.order_list,
         warehouse_consignee_id: this.orderOutboundInfo.warehouse_consignee_id,
@@ -385,11 +605,47 @@ export default {
       });
       this.$router.push({ name: "order" });
     },
-    /** 调拨单商品明细API*/
+    /** 获取发货单详情*/
     GET_WarehouseOutDetail() {
-      API_order.getWarehouseOutInfo(this.id).then((response) => {
-        this.orderOutboundInfo = response;
-        this.orderOutboundInfo.out_time = response.out_time * 1000;
+      API_order.getOrderDetail(this.id).then((res) => {
+        res.product_list = res.item_list.map((el) => {
+          el.allow_sn = el.goods_vo.allow_sn;
+          el.bar_code = el.goods_vo.bar_code;
+          el.brand_id = el.goods_vo.brand_id;
+          el.brand_name = el.goods_vo.brand_name;
+          el.category_id = el.goods_vo.category_id;
+          el.category_ids = el.goods_vo.category_ids;
+          el.category_name = el.goods_vo.category_name;
+          el.cost_price = el.goods_vo.cost_price;
+          el.create_time = el.goods_vo.create_time;
+          el.creator = el.goods_vo.creator;
+          el.description = el.goods_vo.description;
+          el.en_name = el.goods_vo.en_name;
+          el.freight_template_id = el.goods_vo.freight_template_id;
+          el.goods_style = el.goods_vo.goods_style;
+          el.goods_unit = el.goods_vo.goods_unit;
+          el.goods_unit = el.goods_vo.goods_unit;
+          el.have_spec = el.goods_vo.have_spec;
+          el.hire_or_sail = el.goods_vo.hire_or_sail;
+          el.id = el.goods_vo.id;
+          el.image = el.goods_vo.image;
+          el.image_list = el.goods_vo.image_list;
+          el.label_names = el.goods_vo.label_names;
+          el.market_enable = el.goods_vo.market_enable;
+          el.mkt_price = el.goods_vo.mkt_price;
+          el.name = el.goods_vo.name;
+          el.params_list = el.goods_vo.params_list;
+          el.price = el.goods_vo.price;
+          el.sn = el.goods_vo.sn;
+          el.sn_code = el.goods_vo.sn_code;
+          el.sort = el.goods_vo.sort;
+          el.update_time = el.goods_vo.update_time;
+          el.updater = el.goods_vo.updater;
+          el.usable_stock = el.goods_vo.usable_stock;
+          el.video = el.goods_vo.video;
+          return el;
+        });
+        this.product_list = res.item_list;
       });
     },
     /** 出库前预览 */
@@ -479,8 +735,12 @@ export default {
   z-index: 999;
   margin-top: 30px;
 }
-/deep/ .el-form-item__content{
+/deep/ .el-form-item__content {
   display: flex;
+  align-items: center;
+  .el-input {
+    width: 300px;
+  }
 }
 </style>
 

+ 45 - 62
manager-admin/src/views/stock/warehouseOut.vue

@@ -1,9 +1,9 @@
 <template>
   <div>
     <div>
-      <el-tabs v-model="activeShipped" type="card" @tab-click="handleClick">
-        <el-tab-pane label="已发货" name="shipped"></el-tab-pane>
-        <el-tab-pane label="未发货" name="unShipped"></el-tab-pane>
+      <el-tabs v-model="params.selectType" type="card" @tab-click="handleClick">
+        <el-tab-pane label="未发货" name="to_be_send"></el-tab-pane>
+        <el-tab-pane label="已发货" name="sending"></el-tab-pane>
       </el-tabs>
     </div>
     <div class="search">
@@ -63,50 +63,15 @@
       </el-form>
       <el-button @click="advancedSearchEvent"> 搜索 </el-button>
     </div>
-    <en-table-layout :tableData="tableData.data" :loading="loading" @selection-change="handleSelectionChange">
+    <en-table-layout :tableData="tableData.records" :loading="loading" @selection-change="handleSelectionChange">
       <div slot="toolbar" class="inner-toolbar">
         <div class="toolbar-btns">
-          <el-button size="mini" @click="addWarehouse">新增</el-button>
-            <el-button size="mini">发货</el-button>
+          <span v-if="params.selectType=='sending'">已发货:{{ tableData.total }}</span>
+            <!-- <el-button size="mini" @click="addWarehouse">新增</el-button>
+          <el-button size="mini">发货</el-button>
           <el-button size="mini" v-if="checkPermission(['warehouseOut:del'])" @click="handleDeleteWarehouseOut()" type="danger"
-            :disabled="multipleSelection.length === 0">删除</el-button>
+            :disabled="multipleSelection.length === 0">删除</el-button> -->
         </div>
-        <!-- <div class="toolbar-search">
-          <en-table-search @search="searchEvent" @advancedSearch="advancedSearchEvent" placeholder="请输入出库单编号" advanced
-            advancedWidth="465">
-            <template slot="advanced-content">
-              <el-form ref="advancedForm" :model="advancedForm" label-width="90px">
-                <el-form-item label="订单日期">
-                  <el-date-picker v-model="advancedForm.warehouseOut_time_range" type="daterange" align="center"
-                    :editable="false" unlink-panels :clearable="false" :default-time="['00:00:00', '23:59:59']"
-                    range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" value-format="timestamp"
-                    :picker-options="{ disabledDate(time) { return time.getTime() - 1 >= new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()).getTime() + 86400000 - 1 }, shortcuts: MixinPickerShortcuts }">
-                  </el-date-picker>
-                </el-form-item>
-                <el-form-item label="仓库">
-                  <el-cascader v-model="advancedForm.dept_id" :options="deptList" :props="{
-                    label: 'name',
-                    value: 'id',
-                    emitPath: false,
-                    checkStrictly: true
-                  }" clearable></el-cascader>
-                </el-form-item>
-                <el-form-item label="订单编号">
-                  <el-input v-model="advancedForm.order_sn" clearable placeholder="请输入订单编号"></el-input>
-                </el-form-item>
-
-                <el-form-item label="状态">
-                  <el-select v-model="advancedForm.status">
-                    <el-option key="WAIT_AUDIT" label="待审核" value="WAIT_AUDIT" />
-                    <el-option key="WAIT_SHIP" label="待发货" value="WAIT_SHIP" />
-                    <el-option key="SHIP" label="已发货" value="SHIP" />
-                  </el-select>
-                </el-form-item>
-
-              </el-form>
-            </template>
-          </en-table-search>
-        </div> -->
       </div>
       <template slot="table-columns">
         <el-table-column type="selection" width="55" />
@@ -126,26 +91,27 @@
         <el-table-column prop="" label="付款方式" />
 <!--        <el-table-column prop="audit_by" label="审核人" />-->
         <el-table-column prop="status" label="订单状态">
-          <!-- <template slot-scope="scope">{{ statusFilter(scope.row.status) }}</template> -->
+          <template slot-scope="scope">{{ typeName(scope.row.status) }}</template>
         </el-table-column>
-        <el-table-column prop="status" label="发货状态">
+        <!-- <el-table-column prop="status" label="发货状态">
           <template slot-scope="scope">{{ statusFilter(scope.row.status) }}</template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column label="操作" width="250">
           <template slot-scope="scope">
-<!--            <el-button size="mini" v-if="scope.row.allowable.audit && checkPermission(['warehouseOut:audit'])" type="success"-->
-<!--              @click="handleAuditDialog(scope.row)">审核</el-button>-->
+          <!--  <el-button size="mini" v-if="scope.row.status!=='TO_BE_SEND'" type="success"
+             @click="handleAuditDialog(scope.row)">查看</el-button> -->
            <!--  <el-button size="mini" v-if="scope.row.allowable.ship && checkPermission(['warehouseOut:send'])" type="success"
               @click="handleSendWarehouseOut(scope.row)">发货</el-button> -->
-            <!-- <el-button type="primary" v-if="checkPermission(['warehouseOut:print'])" size="mini"
-              @click="handlePrintWarehouseOutDialog(scope.row)">打印</el-button> -->
+              <el-button v-if="scope.row.status=='TO_BE_SEND'" size="mini" @click="addWarehouse(scope.row)">发货</el-button>
+            <el-button type="primary" size="mini"
+              @click="handlePrintWarehouseOutDialog(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </template>
 
       <el-pagination v-if="tableData" slot="pagination" @size-change="handlePageSizeChange"
-        @current-change="handlePageCurrentChange" :current-page="tableData.page_no" :page-sizes="[10, 20, 50, 100]"
-        :page-size="tableData.page_size" layout="total, sizes, prev, pager, next, jumper" :total="tableData.data_total">
+        @current-change="handlePageCurrentChange" :current-page="tableData.pages" :page-sizes="[10, 20, 50, 100]"
+        :page-size="tableData.size" layout="total, sizes, prev, pager, next, jumper" :total="tableData.total">
       </el-pagination>
     </en-table-layout>
 
@@ -293,7 +259,8 @@ export default {
       // 列表参数
       params: {
         page_no: 1,
-        page_size: 10
+        page_size: 10,
+        selectType:"to_be_send"
       },
       // 高级搜索数据
       advancedForm: {},
@@ -303,6 +270,7 @@ export default {
       dialogSendVisible: false,
       // 当前已选择的行
       multipleSelection: [],
+      orderType:[],
       warehouseOutForm: {},
       warehouseOutForms: {},
       // 审核弹窗显隐
@@ -311,7 +279,7 @@ export default {
       auditId: '',
       // 审核状态
       auditStatus: 'AUDIT_PASS',
-      activeShipped:"shipped"
+      activeShipped:"unShipped"
     }
   },
   mounted() {
@@ -327,25 +295,37 @@ export default {
     }
   },
   methods: {
+    //获取订单状态大小写转换.toUpperCase()
+    typeName(val){
+      let name=''
+      this.orderType.map(el=>{
+       if(el.value==val) {
+        return name=el.label
+       }
+      })
+      console.log(name);
+      return name
+    },
     /* 切换发货列表 */
     handleClick(tab, event) {
-      this.activeShipped=tab.name
-      if (tab.name == "shipped") {
-       /*  this.GET_GoodsExchangeList(); */
+      if (tab.name == "to_be_send") {
+        this.params.selectType=tab.name
+      this.GET_WarehouseOutList()
       } else {
-        /* this.GET_WarehouseEntry(); */
+        this.params.selectType=tab.name
+      this.GET_WarehouseOutList()
       }
     },
-    addWarehouse(){
+    addWarehouse(row){
       this.$router.push({
         name: 'orderOutboundAdd',
+        params: { id:row.id }
       })
       // this.$router.params{ name: 'orderOutboundDetail', params: { id: scope.row.id } }
     },
     /** 审核操作 */
     handleAuditDialog(row) {
-      this.auditVisible = true
-      this.auditId = row.id
+
     },
     /** 审核提交 */
     handleAuditWarehouseOut() {
@@ -394,6 +374,9 @@ export default {
       API_Setting.getDeptList().then(response => {
         this.deptList = Foundation.buildTree(response, '0')
       })
+      API_Setting.getPage({dictType:"order_status"}).then(res=>{
+        this.orderType=res.data
+      })
     },
     /** 打印对账详情 */
     handlePrintWarehouseOut() {
@@ -485,7 +468,7 @@ export default {
     /** 获取出库单列表 */
     GET_WarehouseOutList() {
       this.loading = true
-      API_Order.getWarehouseOutList(this.params).then(response => {
+      API_Order.getSaleOrderOutList(this.params).then(response => {
         this.loading = false
         this.tableData = response
       }).catch(() => { this.loading = false })