Bladeren bron

销售代下单,外部订单管理

wangxy 6 dagen geleden
bovenliggende
commit
0a2a53aa68

+ 9 - 0
src/api/his/doctor.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function getDoctorList(query) {
+  return request({
+    url: '/his/doctor/list',
+    method: 'get',
+    params: query
+  })
+}

+ 16 - 0
src/api/his/integralOrder.js

@@ -106,3 +106,19 @@ export function getCheckinPrizeGoodsList(query) {
     method: 'get'
   })
 }
+
+export function createIntegralOrder(data) {
+  return request({
+    url: '/his/integralOrder/createByManually',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getIntegralGoods(query) {
+  return request({
+    url: '/his/integralGoods/list',
+    method: 'get',
+    params: query
+  })
+}

+ 8 - 0
src/api/store/coupon.js

@@ -57,3 +57,11 @@ export function exportCoupon(query) {
     params: query
   })
 }
+
+export function getUserCoupon(query) {
+  return request({
+    url: '/store/coupon/getUserCoupon',
+    method: 'get',
+    params: query
+  })
+}

+ 32 - 0
src/api/store/externalOrder.js

@@ -0,0 +1,32 @@
+import request from '@/utils/request'
+
+export function listExternalOrder(query) {
+  return request({
+    url: '/store/externalOrder/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function createExternalOrder(data) {
+  return request({
+    url: '/store/externalOrder/create',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getExternalOrder(id) {
+  return request({
+    url: '/store/externalOrder/' + id,
+    method: 'get'
+  })
+}
+
+export function exportExternalOrder(query) {
+  return request({
+    url: '/store/externalOrder/export',
+    method: 'get',
+    params: query
+  })
+}

+ 8 - 0
src/api/store/inquiryOrder.js

@@ -128,3 +128,11 @@ export function getWxaCodeInquiryOrderUnLimit(orderId) {
     method: 'get',
   })
 }
+
+export function createInquiryOrderManually(data) {
+  return request({
+    url: '/store/inquiryOrder/createManually',
+    method: 'post',
+    data: data
+  })
+}

+ 8 - 0
src/api/store/package.js

@@ -137,3 +137,11 @@ export function appSalesWatchLogReportExport(query) {
     params: query
   })
 }
+
+export function addPackageOrder(data) {
+  return request({
+    url: '/store/packageOrder/createManually',
+    method: 'post',
+    data: data
+  })
+}

+ 35 - 10
src/views/his/integralOrder/index.vue

@@ -248,8 +248,15 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="支付金额" prop="payMoney">
-          <el-input v-model="form.payMoney" placeholder="请输入支付金额" clearable size="small" style="width: 200px;" />
+        <el-form-item label="优惠券" prop="couponId">
+          <el-select v-model="form.couponId" placeholder="请选择优惠券" clearable style="width: 300px;">
+            <el-option
+              v-for="item in couponList"
+              :key="item.couponId"
+              :label="item.title + ' - ' + item.price + '元'"
+              :value="item.couponId"
+            />
+          </el-select>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -274,6 +281,7 @@
 import { listIntegralOrder, getIntegralOrder, exportIntegralOrder, createOrderByManually, getCheckinPrizeGoodsList } from "@/api/his/integralOrder";
 import { userList } from "@/api/store/user";
 import { listUserAddress } from "@/api/store/userAddress";
+import { getUserCoupon } from "@/api/store/coupon";
 import integralOrderDetails from './components/integralOrderDetails.vue';
 import addUser from "@/views/store/components/addUser.vue";
 import addUserAddress from "@/views/store/components/addUserAddress.vue";
@@ -331,6 +339,7 @@ export default {
       address: [],
       addressloading: false,
       productJson: [],
+      couponList: [],
       payTypeOptions: [],
       userStatusOptions: [],
       // 表单参数
@@ -338,8 +347,8 @@ export default {
         addressId: null,
         userId: null,
         payType: null,
-        payMoney: null,
-        goodsIds: []
+        goodsIds: [],
+        couponId: null
       },
       // 表单校验
       rules: {},
@@ -479,6 +488,7 @@ export default {
     handleAdd() {
       this.reset();
       this.productJson = [];
+      this.couponList = [];
       this.phone = null;
       this.users = [];
       this.address = [];
@@ -487,8 +497,8 @@ export default {
         addressId: null,
         userId: null,
         payType: null,
-        payMoney: null,
-        goodsIds: []
+        goodsIds: [],
+        couponId: null
       };
       this.open = true;
       this.title = "创建订单";
@@ -504,8 +514,8 @@ export default {
         addressId: null,
         userId: null,
         payType: null,
-        payMoney: null,
-        goodsIds: []
+        goodsIds: [],
+        couponId: null
       };
       this.resetForm("form");
     },
@@ -520,8 +530,8 @@ export default {
               addressId: null,
               userId: null,
               payType: null,
-              payMoney: null,
-              goodsIds: []
+              goodsIds: [],
+              couponId: null
             };
             this.getList();
           });
@@ -601,6 +611,21 @@ export default {
     // 商品选择变化
     handleProductSelectionChange(selection) {
       this.form.goodsIds = selection.map(item => item.goodsId);
+      if (this.form.goodsIds.length > 0 && this.form.userId) {
+        this.getCouponList(this.form.userId, this.form.goodsIds[0]);
+      } else {
+        this.couponList = [];
+        this.form.couponId = null;
+      }
+    },
+    getCouponList(userId, goodsId) {
+      if (!goodsId) {
+        this.couponList = [];
+        return;
+      }
+      getUserCoupon({ userId: userId, couponType: 7, goodsId: goodsId }).then(response => {
+        this.couponList = response.rows || [];
+      });
     }
   }
 };

+ 256 - 0
src/views/member/components/consultationOrderDialog.vue

@@ -0,0 +1,256 @@
+<template>
+  <el-dialog title="创建问诊订单" :visible.sync="dialogVisible" width="1000px" append-to-body :close-on-click-modal="false" @close="handleClose">
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="就诊人信息" prop="patientId">
+        <el-row>
+          <el-col>
+            <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserPatient()">添加就诊人</el-button>
+          </el-col>
+        </el-row>
+        <el-radio-group v-model="form.patientId" style="width:100%">
+          <el-table border style="margin-top:5px;" v-loading="patientLoading" :data="patientList">
+            <el-table-column label="ID" align="center">
+              <template slot-scope="scope">
+                <el-radio :label="scope.row.patientId"></el-radio>
+              </template>
+            </el-table-column>
+            <el-table-column label="患者姓名" align="center" prop="patientName" />
+            <el-table-column label="身份证号" align="center" prop="idCard" width="170px"/>
+            <el-table-column label="出生年月" align="center" prop="birthday" width="180">
+              <template slot-scope="scope">
+                <span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="性别" align="center" prop="sex">
+              <template slot-scope="scope">
+                <dict-tag :options="sexOptions" :value="scope.row.sex"/>
+              </template>
+            </el-table-column>
+            <el-table-column label="手机号" align="center" prop="mobile" />
+          </el-table>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="病情描述" prop="illnessDesc">
+        <el-input type="textarea" rows="4" v-model="form.illnessDesc" placeholder="请输入病情描述" />
+      </el-form-item>
+      <el-form-item label="订单类型" prop="orderType">
+        <el-radio-group v-model="form.orderType">
+          <el-radio label="1">图文问诊</el-radio>
+          <el-radio label="2">视频问诊</el-radio>
+          <el-radio label="3">健康咨询</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="医生信息" prop="doctorId">
+        <el-select v-model="form.doctorId" remote filterable reserve-keyword placeholder="请选择医生" :remote-method="getDoctorList" style="width: 300px;" @change="handleDoctorChange">
+          <el-option
+            v-for="item in doctorList"
+            :key="item.doctorId"
+            :label="item.doctorName"
+            :value="item.doctorId">
+            <span style="float: left">{{ item.doctorName }}</span>
+            <span style="float: right; color: #8492a6; font-size: 13px">{{ item.deptName }}</span>
+          </el-option>
+        </el-select>
+        <el-table v-if="selectedDoctor" border style="margin-top:5px;" :data="[selectedDoctor]">
+          <el-table-column label="医生姓名" align="center" prop="doctorName" />
+          <el-table-column label="所属科室" align="center" prop="deptName" />
+          <el-table-column label="问诊费用" align="center">
+            <template slot-scope="scope">
+              <span>{{ getConsultFee(scope.row.priceJson) }}元</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+      <el-form-item label="优惠券" prop="couponId">
+        <el-select v-model="form.couponId" placeholder="请选择优惠券" clearable style="width: 300px;" @change="handleCouponChange">
+          <el-option
+            v-for="item in couponList"
+            :key="item.couponId"
+            :label="item.title + ' - ' + item.price + '元'"
+            :value="item.couponId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="支付方式" prop="payType">
+        <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
+          <el-option
+            v-for="item in payTypeOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="订单备注" prop="remark">
+        <el-input type="textarea" rows="2" v-model="form.remark" placeholder="" />
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="handleClose">取 消</el-button>
+    </div>
+
+    <el-dialog :title="userPatient.title" v-if="userPatient.open" :visible.sync="userPatient.open" width="800px" append-to-body>
+      <add-patient ref="addPatient" @addUserPatient="addUserPatient" />
+    </el-dialog>
+  </el-dialog>
+</template>
+
+<script>
+import { listPatient } from "@/api/store/patient";
+import { createInquiryOrderManually } from "@/api/store/inquiryOrder";
+import { getDoctorList } from "@/api/his/doctor";
+import { getUserCoupon } from "@/api/store/coupon";
+import addPatient from "@/views/store/components/addPatient";
+
+export default {
+  name: "ConsultationOrderDialog",
+  components: { addPatient },
+  props: {
+    userInfo: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      form: {
+        patientId: null,
+        illnessDesc: null,
+        orderType: '1',
+        doctorId: null,
+        payType: null,
+        remark: null,
+        couponId: null
+      },
+      rules: {
+        patientId: [{ required: true, message: "请选择就诊人", trigger: "change" }],
+        illnessDesc: [{ required: true, message: "请输入病情描述", trigger: "blur" }],
+        orderType: [{ required: true, message: "请选择订单类型", trigger: "change" }],
+        doctorId: [{ required: true, message: "请选择医生", trigger: "change" }],
+        payType: [{ required: true, message: "请选择支付方式", trigger: "change" }]
+      },
+      patientList: [],
+      patientLoading: false,
+      doctorList: [],
+      selectedDoctor: null,
+      couponList: [],
+      payTypeOptions: [],
+      sexOptions: [],
+      userPatient: {
+        open: false,
+        title: "创建就诊人"
+      }
+    };
+  },
+  created() {
+    this.getDicts("sys_package_pay_type").then(response => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("sys_user_sex").then(response => {
+      this.sexOptions = response.data;
+    });
+  },
+  methods: {
+    init(userInfo) {
+      this.dialogVisible = true;
+      this.resetForm();
+      this.$nextTick(() => {
+        this.getPatientList(userInfo.userId);
+        this.getCouponList(userInfo.userId);
+        this.getDoctorList();
+      });
+    },
+    resetForm() {
+      this.form = {
+        patientId: null,
+        illnessDesc: null,
+        orderType: '1',
+        doctorId: null,
+        payType: null,
+        remark: null,
+        couponId: null
+      };
+      this.selectedDoctor = null;
+      if (this.$refs.form) {
+        this.$refs.form.resetFields();
+      }
+    },
+    getPatientList(userId) {
+      var data = { userId: userId };
+      this.patientLoading = true;
+      listPatient(data).then(response => {
+        this.patientList = response.rows;
+        this.patientLoading = false;
+      });
+    },
+    getCouponList(userId) {
+      getUserCoupon({ userId: userId, couponType: 3 }).then(response => {
+        this.couponList = response.rows || [];
+      });
+    },
+    getDoctorList(query) {
+      var data = { doctorName: query, pageNum: 1, pageSize: 100 };
+      getDoctorList(data).then(response => {
+        this.doctorList = response.rows || [];
+      });
+    },
+    handleDoctorChange(doctorId) {
+      var item = this.doctorList.find(d => d.doctorId === doctorId);
+      if (item) {
+        this.selectedDoctor = item;
+      }
+    },
+    getConsultFee(priceJson) {
+      if (!priceJson) return 0;
+      try {
+        var priceList = JSON.parse(priceJson);
+        var item = priceList.find(p => p.type === parseInt(this.form.orderType));
+        return item ? item.price : 0;
+      } catch (e) {
+        return 0;
+      }
+    },
+    handleCouponChange(couponId) {
+      console.log('Selected coupon:', couponId);
+    },
+    handleAddUserPatient() {
+      this.userPatient.open = true;
+      setTimeout(() => {
+        this.$refs.addPatient.init(this.userInfo.userId);
+      }, 500);
+    },
+    addUserPatient() {
+      this.userPatient.open = false;
+      this.getPatientList(this.userInfo.userId);
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          var submitData = {
+            userId: this.userInfo.userId,
+            patientId: this.form.patientId,
+            title: this.form.illnessDesc,
+            orderType: this.form.orderType,
+            doctorId: this.form.doctorId,
+            payType: this.form.payType,
+            remark: this.form.remark,
+            couponId: this.form.couponId
+          };
+          createInquiryOrderManually(submitData).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.$emit("success");
+              this.handleClose();
+            }
+          });
+        }
+      });
+    },
+    handleClose() {
+      this.dialogVisible = false;
+    }
+  }
+};
+</script>

+ 229 - 0
src/views/member/components/integralOrderDialog.vue

@@ -0,0 +1,229 @@
+<template>
+  <el-dialog title="创建积分订单" :visible.sync="dialogVisible" width="1000px" append-to-body :close-on-click-modal="false" @close="handleClose">
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="收货信息" prop="addressId">
+        <el-row>
+          <el-col>
+            <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserAddress()">添加收货地址</el-button>
+          </el-col>
+        </el-row>
+        <el-radio-group v-model="form.addressId" style="width:100%">
+          <el-table border style="margin-top:5px;" v-loading="addressloading" :data="address">
+            <el-table-column label="ID" align="center">
+              <template slot-scope="scope">
+                <el-radio :label="scope.row.addressId"></el-radio>
+              </template>
+            </el-table-column>
+            <el-table-column label="收货人姓名" align="center" prop="realName" />
+            <el-table-column label="收货人所在省" align="center" prop="province" />
+            <el-table-column label="收货人所在市" align="center" prop="city" />
+            <el-table-column label="收货人所在区" align="center" prop="district" />
+            <el-table-column label="收货人详细地址" align="center" prop="detail" />
+          </el-table>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="商品信息" prop="goodsIds">
+        <el-input
+          v-model="productNameSearch"
+          placeholder="请输入商品名称搜索"
+          clearable
+          size="small"
+          style="width: 300px; margin-bottom: 10px;"
+          @keyup.enter.native="getProductList"
+        />
+        <el-button type="primary" size="small" style="margin-left: 10px;" @click="getProductList">搜索</el-button>
+        <el-table border width="100%" style="margin-top:5px;" :data="productJson" @selection-change="handleProductSelectionChange">
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="商品图片" align="center" width="120">
+            <template slot-scope="scope">
+              <el-popover placement="right" title="" trigger="hover">
+                <img slot="reference" :src="scope.row.imgUrl" width="100">
+                <img :src="scope.row.imgUrl" style="max-width: 150px">
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="goodsName" />
+          <el-table-column label="积分" align="center" prop="integral" />
+          <el-table-column label="金额" align="center" prop="cash">
+            <template slot-scope="scope">
+              <span v-if="scope.row.cash!=null">{{ scope.row.cash.toFixed(1) }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+      <el-form-item label="优惠券" prop="couponId">
+        <el-select v-model="form.couponId" placeholder="请选择优惠券" clearable style="width: 300px;" @change="handleCouponChange">
+          <el-option
+            v-for="item in couponList"
+            :key="item.couponId"
+            :label="item.title + ' - ' + item.price + '元'"
+            :value="item.couponId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="支付方式" prop="payType">
+        <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
+          <el-option
+            v-for="item in payTypeOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="handleClose">取 消</el-button>
+    </div>
+
+    <el-dialog :title="userAddress.title" v-if="userAddress.open" :visible.sync="userAddress.open" width="800px" append-to-body>
+      <add-user-address ref="addUserAddress" @addUserAddress="addUserAddress" />
+    </el-dialog>
+  </el-dialog>
+</template>
+
+<script>
+import { listUserAddress } from "@/api/store/userAddress";
+import { getIntegralGoods, createIntegralOrder } from "@/api/his/integralOrder";
+import { getUserCoupon } from "@/api/store/coupon";
+import addUserAddress from "@/views/store/components/addUserAddress";
+
+export default {
+  name: "IntegralOrderDialog",
+  components: { addUserAddress },
+  props: {
+    userInfo: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      productNameSearch: null,
+      form: {
+        addressId: null,
+        payType: null,
+        goodsIds: [],
+        couponId: null
+      },
+      rules: {
+        addressId: [{ required: true, message: "请选择收货地址", trigger: "change" }],
+        payType: [{ required: true, message: "请选择支付方式", trigger: "change" }]
+      },
+      address: [],
+      addressloading: false,
+      productJson: [],
+      couponList: [],
+      payTypeOptions: [],
+      userAddress: {
+        open: false,
+        title: "创建收货地址"
+      }
+    };
+  },
+  created() {
+    this.getDicts("sys_package_pay_type").then(response => {
+      this.payTypeOptions = response.data;
+    });
+  },
+  methods: {
+    init(userInfo) {
+      this.dialogVisible = true;
+      this.resetForm();
+      this.$nextTick(() => {
+        this.getAddressList(userInfo.userId);
+      });
+    },
+    resetForm() {
+      this.form = {
+        addressId: null,
+        payType: null,
+        goodsIds: [],
+        couponId: null
+      };
+      this.productJson = [];
+      this.productNameSearch = null;
+      if (this.$refs.form) {
+        this.$refs.form.resetFields();
+      }
+    },
+    getAddressList(userId) {
+      var data = { userId: userId };
+      this.addressloading = true;
+      listUserAddress(data).then(response => {
+        this.address = response.rows;
+        this.addressloading = false;
+      });
+    },
+    getCouponList(userId, goodsId) {
+      if (!goodsId) {
+        this.couponList = [];
+        return;
+      }
+      getUserCoupon({ userId: userId, couponType: 7, goodsId: goodsId }).then(response => {
+        this.couponList = response.rows || [];
+      });
+    },
+    getProductList() {
+      var data = {};
+      if (this.productNameSearch) {
+        data.goodsName = this.productNameSearch;
+      }
+      getIntegralGoods(data).then(response => {
+        this.productJson = response.rows || [];
+      });
+    },
+    handleProductSelectionChange(selection) {
+      this.form.goodsIds = selection.map(item => item.goodsId);
+      if (this.form.goodsIds.length > 0) {
+        this.getCouponList(this.userInfo.userId, this.form.goodsIds[0]);
+      } else {
+        this.couponList = [];
+        this.form.couponId = null;
+      }
+    },
+    handleCouponChange(couponId) {
+      console.log('Selected coupon:', couponId);
+    },
+    handleAddUserAddress() {
+      this.userAddress.open = true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.userInfo.userId);
+      }, 500);
+    },
+    addUserAddress() {
+      this.userAddress.open = false;
+      this.getAddressList(this.userInfo.userId);
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.goodsIds.length === 0) {
+            this.msgError("请选择至少一个商品");
+            return;
+          }
+          var submitData = {
+            userId: this.userInfo.userId,
+            addressId: this.form.addressId,
+            payType: this.form.payType,
+            goodsIds: this.form.goodsIds,
+            couponId: this.form.couponId
+          };
+          createIntegralOrder(submitData).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.$emit("success");
+              this.handleClose();
+            }
+          });
+        }
+      });
+    },
+    handleClose() {
+      this.dialogVisible = false;
+    }
+  }
+};
+</script>

+ 294 - 0
src/views/member/components/packageOrderDialog.vue

@@ -0,0 +1,294 @@
+<template>
+  <el-dialog title="创建套餐包订单" :visible.sync="dialogVisible" width="1000px" append-to-body :close-on-click-modal="false" @close="handleClose">
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="收货信息" prop="addressId">
+        <el-row>
+          <el-col>
+            <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserAddress()">添加收货地址</el-button>
+          </el-col>
+        </el-row>
+        <el-radio-group v-model="form.addressId" style="width:100%">
+          <el-table border style="margin-top:5px;" v-loading="addressloading" :data="address">
+            <el-table-column label="ID" align="center">
+              <template slot-scope="scope">
+                <el-radio :label="scope.row.addressId"></el-radio>
+              </template>
+            </el-table-column>
+            <el-table-column label="收货人姓名" align="center" prop="realName" />
+            <el-table-column label="收货人所在省" align="center" prop="province" />
+            <el-table-column label="收货人所在市" align="center" prop="city" />
+            <el-table-column label="收货人所在区" align="center" prop="district" />
+            <el-table-column label="收货人详细地址" align="center" prop="detail" />
+          </el-table>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="就诊人信息" prop="patientId">
+        <el-row>
+          <el-col>
+            <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserPatient()">添加就诊人</el-button>
+          </el-col>
+        </el-row>
+        <el-radio-group v-model="form.patientId" style="width:100%">
+          <el-table border style="margin-top:5px;" v-loading="patientLoading" :data="patientList">
+            <el-table-column label="ID" align="center">
+              <template slot-scope="scope">
+                <el-radio :label="scope.row.patientId"></el-radio>
+              </template>
+            </el-table-column>
+            <el-table-column label="患者姓名" align="center" prop="patientName" />
+            <el-table-column label="身份证号" align="center" prop="idCard" width="170px"/>
+            <el-table-column label="出生年月" align="center" prop="birthday" width="180">
+              <template slot-scope="scope">
+                <span>{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="性别" align="center" prop="sex">
+              <template slot-scope="scope">
+                <dict-tag :options="sexOptions" :value="scope.row.sex"/>
+              </template>
+            </el-table-column>
+            <el-table-column label="手机号" align="center" prop="mobile" />
+          </el-table>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="套餐包" prop="packageId">
+        <el-select v-model="form.packageId" remote filterable reserve-keyword placeholder="套餐包" :remote-method="packageMethod" style="width: 300px;" @change="changePackage">
+          <el-option
+            v-for="dict in packageList"
+            :key="dict.packageId"
+            :label="dict.packageName"
+            :value="dict.packageId">
+            <span style="float: left ;margin-right: 20px;">{{ dict.packageName }}</span>
+            <span style="float: left">{{ dict.secondName }}</span>
+          </el-option>
+        </el-select>
+        <el-table border style="margin-top:5px;" :data="package">
+          <el-table-column label="套餐包名称" align="center" prop="packageName" />
+          <el-table-column label="别名" align="center" prop="secondName" />
+          <el-table-column label="类型" align="center" prop="packageType">
+            <template slot-scope="scope">
+              <dict-tag :options="packageTypeOptions" :value="scope.row.packageType"/>
+            </template>
+          </el-table-column>
+          <el-table-column label="子类型" align="center" prop="packageSubType">
+            <template slot-scope="scope">
+              <dict-tag :options="packageSubTypeOptions" :value="scope.row.packageSubType"/>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+      <el-form-item label="优惠券" prop="couponId">
+        <el-select v-model="form.couponId" placeholder="请选择优惠券" clearable style="width: 300px;" @change="handleCouponChange">
+          <el-option
+            v-for="item in couponList"
+            :key="item.couponId"
+            :label="item.title + ' - ' + item.price + '元'"
+            :value="item.couponId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="支付方式" prop="payType">
+        <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
+          <el-option
+            v-for="item in payTypeOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="订单备注" prop="mark">
+        <el-input type="textarea" rows="2" v-model="form.mark" placeholder="" />
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="handleClose">取 消</el-button>
+    </div>
+
+    <el-dialog :title="userAddress.title" v-if="userAddress.open" :visible.sync="userAddress.open" width="800px" append-to-body>
+      <add-user-address ref="addUserAddress" @addUserAddress="addUserAddress" />
+    </el-dialog>
+    <el-dialog :title="userPatient.title" v-if="userPatient.open" :visible.sync="userPatient.open" width="800px" append-to-body>
+      <add-patient ref="addPatient" @addUserPatient="addUserPatient" />
+    </el-dialog>
+  </el-dialog>
+</template>
+
+<script>
+import { listUserAddress } from "@/api/store/userAddress";
+import { listPatient } from "@/api/store/patient";
+import { packageList, addPackageOrder } from "@/api/store/package";
+import { getUserCoupon } from "@/api/store/coupon";
+import addUserAddress from "@/views/store/components/addUserAddress";
+import addPatient from "@/views/store/components/addPatient";
+
+export default {
+  name: "PackageOrderDialog",
+  components: { addUserAddress, addPatient },
+  props: {
+    userInfo: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      form: {
+        addressId: null,
+        patientId: null,
+        packageId: null,
+        payType: null,
+        mark: null,
+        couponId: null
+      },
+      rules: {
+        addressId: [{ required: true, message: "请选择收货地址", trigger: "change" }],
+        packageId: [{ required: true, message: "请选择套餐包", trigger: "change" }],
+        payType: [{ required: true, message: "请选择支付方式", trigger: "change" }]
+      },
+      address: [],
+      addressloading: false,
+      patientList: [],
+      patientLoading: false,
+      package: [],
+      packageList: [],
+      couponList: [],
+      payTypeOptions: [],
+      packageTypeOptions: [],
+      packageSubTypeOptions: [],
+      sexOptions: [],
+      userAddress: {
+        open: false,
+        title: "创建收货地址"
+      },
+      userPatient: {
+        open: false,
+        title: "创建就诊人"
+      }
+    };
+  },
+  created() {
+    this.getDicts("sys_package_pay_type").then(response => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("sys_package_type").then(response => {
+      this.packageTypeOptions = response.data;
+    });
+    this.getDicts("sys_package_sub_type").then(response => {
+      this.packageSubTypeOptions = response.data;
+    });
+    this.getDicts("sys_user_sex").then(response => {
+      this.sexOptions = response.data;
+    });
+  },
+  methods: {
+    init(userInfo) {
+      this.dialogVisible = true;
+      this.resetForm();
+      this.$nextTick(() => {
+        this.getAddressList(userInfo.userId);
+        this.getPatientList(userInfo.userId);
+        this.getCouponList(userInfo.userId);
+      });
+    },
+    resetForm() {
+      this.form = {
+        addressId: null,
+        patientId: null,
+        packageId: null,
+        payType: null,
+        mark: null,
+        couponId: null
+      };
+      this.package = [];
+      if (this.$refs.form) {
+        this.$refs.form.resetFields();
+      }
+    },
+    getAddressList(userId) {
+      var data = { userId: userId };
+      this.addressloading = true;
+      listUserAddress(data).then(response => {
+        this.address = response.rows;
+        this.addressloading = false;
+      });
+    },
+    getPatientList(userId) {
+      var data = { userId: userId };
+      this.patientLoading = true;
+      listPatient(data).then(response => {
+        this.patientList = response.rows;
+        this.patientLoading = false;
+      });
+    },
+    getCouponList(userId) {
+      getUserCoupon({ userId: userId, couponType: 5 }).then(response => {
+        this.couponList = response.rows || [];
+      });
+    },
+    packageMethod(query) {
+      if (query !== '') {
+        packageList(query).then(response => {
+          this.packageList = response.data || [];
+        });
+      }
+    },
+    changePackage(packageId) {
+      var item = this.packageList.find(p => p.packageId === packageId);
+      if (item) {
+        this.package = [item];
+      }
+    },
+    handleCouponChange(couponId) {
+      console.log('Selected coupon:', couponId);
+    },
+    handleAddUserAddress() {
+      this.userAddress.open = true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.userInfo.userId);
+      }, 500);
+    },
+    addUserAddress() {
+      this.userAddress.open = false;
+      this.getAddressList(this.userInfo.userId);
+    },
+    handleAddUserPatient() {
+      this.userPatient.open = true;
+      setTimeout(() => {
+        this.$refs.addPatient.init(this.userInfo.userId);
+      }, 500);
+    },
+    addUserPatient() {
+      this.userPatient.open = false;
+      this.getPatientList(this.userInfo.userId);
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          var submitData = {
+            userId: this.userInfo.userId,
+            addressId: this.form.addressId,
+            patientId: this.form.patientId,
+            packageId: this.form.packageId,
+            payType: this.form.payType,
+            mark: this.form.mark,
+            couponId: this.form.couponId
+          };
+          addPackageOrder(submitData).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.$emit("success");
+              this.handleClose();
+            }
+          });
+        }
+      });
+    },
+    handleClose() {
+      this.dialogVisible = false;
+    }
+  }
+};
+</script>

+ 90 - 4
src/views/member/mylist.vue

@@ -229,7 +229,7 @@
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width" fixed="right">
+      <el-table-column label="操作" align="center" width="180" class-name="small-padding fixed-width" fixed="right">
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -245,12 +245,17 @@
             @click="handleUpdate(scope.row)"
             v-hasPermi="['user:fsUser:edit']"
           >修改</el-button>
-
           <el-button
             size="mini"
             type="text"
             @click="handledetails(scope.row)"
           >详情</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleCreateOrder(scope.row)"
+              v-hasPermi="['store:packageOrder:manually', 'store:inquiryOrder:manually','his:integralOrder:createByManually']"
+          >去下单</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -347,6 +352,45 @@
       <userCoursePeriod :userIds="ids" :companyId="companyId" :companyUserId="companyUserId"/>
     </el-dialog>
 
+    <el-dialog title="选择订单类型" :visible.sync="orderTypeDialogVisible" width="500px" append-to-body>
+      <el-radio-group v-model="selectedOrderType" style="width: 100%;">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-card shadow="hover" :class="{'selected-card': selectedOrderType === 'package'}" @click.native="selectedOrderType = 'package'">
+              <div style="text-align: center; padding: 20px;">
+                <i class="el-icon-box" style="font-size: 40px; color: #409EFF;"></i>
+                <p style="margin-top: 10px; font-size: 16px;">套餐包订单</p>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="8">
+            <el-card shadow="hover" :class="{'selected-card': selectedOrderType === 'consultation'}" @click.native="selectedOrderType = 'consultation'">
+              <div style="text-align: center; padding: 20px;">
+                <i class="el-icon-chat-dot-round" style="font-size: 40px; color: #67C23A;"></i>
+                <p style="margin-top: 10px; font-size: 16px;">问诊订单</p>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="8">
+            <el-card shadow="hover" :class="{'selected-card': selectedOrderType === 'integral'}" @click.native="selectedOrderType = 'integral'">
+              <div style="text-align: center; padding: 20px;">
+                <i class="el-icon-coin" style="font-size: 40px; color: #E6A23C;"></i>
+                <p style="margin-top: 10px; font-size: 16px;">积分订单</p>
+              </div>
+            </el-card>
+          </el-col>
+        </el-row>
+      </el-radio-group>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="orderTypeDialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="confirmOrderType">确 定</el-button>
+      </div>
+    </el-dialog>
+
+    <package-order-dialog ref="packageOrderDialog" :userInfo="currentOrderUser" @success="handleOrderSuccess" />
+    <consultation-order-dialog ref="consultationOrderDialog" :userInfo="currentOrderUser" @success="handleOrderSuccess" />
+    <integral-order-dialog ref="integralOrderDialog" :userInfo="currentOrderUser" @success="handleOrderSuccess" />
+
 
 
   </div>
@@ -358,9 +402,12 @@ import {transferUser} from "@/api/users/user";
 import {getUserList} from "@/api/company/companyUser";
 import userDetails from '@/views/store/components/userDetails.vue';
 import userCoursePeriod from '../../components/course/userCoursePeriod.vue'
+import packageOrderDialog from './components/packageOrderDialog.vue';
+import consultationOrderDialog from './components/consultationOrderDialog.vue';
+import integralOrderDialog from './components/integralOrderDialog.vue';
 export default {
   name: "FsUser",
-  components: {userDetails,userCoursePeriod},
+  components: {userDetails,userCoursePeriod,packageOrderDialog,consultationOrderDialog,integralOrderDialog},
   data() {
     return {
 
@@ -444,7 +491,10 @@ export default {
           { required: true, message: "状态不能为空", trigger: "change" }
         ]
       },
-      projectOptions: []
+      projectOptions: [],
+      orderTypeDialogVisible: false,
+      selectedOrderType: 'package',
+      currentOrderUser: {}
     };
   },
   created() {
@@ -744,6 +794,38 @@ export default {
     },
     handleClose(){
       this.dialogVisible = false;
+    },
+    handleCreateOrder(row) {
+      this.currentOrderUser = {
+        userId: row.userId,
+        nickname: row.nickname,
+        phone: row.phone
+      };
+      this.selectedOrderType = 'package';
+      this.orderTypeDialogVisible = true;
+    },
+    confirmOrderType() {
+      if (!this.selectedOrderType) {
+        this.$message.warning('请选择订单类型');
+        return;
+      }
+      this.orderTypeDialogVisible = false;
+      this.$nextTick(() => {
+        switch (this.selectedOrderType) {
+          case 'package':
+            this.$refs.packageOrderDialog.init(this.currentOrderUser);
+            break;
+          case 'consultation':
+            this.$refs.consultationOrderDialog.init(this.currentOrderUser);
+            break;
+          case 'integral':
+            this.$refs.integralOrderDialog.init(this.currentOrderUser);
+            break;
+        }
+      });
+    },
+    handleOrderSuccess() {
+      this.getList();
     }
   }
 };
@@ -756,4 +838,8 @@ export default {
 .mb8 {
   margin-bottom: 8px;
 }
+.selected-card {
+  border: 2px solid #409EFF;
+  background-color: #ecf5ff;
+}
 </style>

+ 75 - 0
src/views/store/components/addExternalUser.vue

@@ -0,0 +1,75 @@
+<template>
+  <div>
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="用户昵称" prop="nickName">
+        <el-input v-model="form.nickName" placeholder="请输入用户昵称" />
+      </el-form-item>
+      <el-form-item label="手机号码" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入手机号码" />
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-radio-group v-model="form.status">
+          <el-radio :label="item.dictValue" v-for="item in statusOptions" :key="item.dictValue">{{item.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <div style="text-align:right;">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import request from '@/utils/request'
+
+export default {
+  name: "addExternalUser",
+  data() {
+    return {
+      statusOptions: [],
+      form: {
+        status: "1"
+      },
+      rules: {
+        phone: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            required: true,
+            trigger: "blur"
+          }
+        ],
+        nickName: [
+          { required: true, message: "用户昵称不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getDicts("sys_company_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          request({
+            url: '/store/user/addExternalUser',
+            method: 'post',
+            data: this.form
+          }).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("新增成功");
+              this.$emit("addUser", this.form.phone);
+            }
+          });
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style scoped>
+</style>

+ 118 - 0
src/views/store/components/addExternalUserAddress.vue

@@ -0,0 +1,118 @@
+<template>
+  <div>
+    <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="收货人姓名" prop="realName">
+        <el-input v-model="form.realName" placeholder="请输入收货人姓名" />
+      </el-form-item>
+      <el-form-item label="收货人电话" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入收货人电话" />
+      </el-form-item>
+      <el-form-item label="省市区">
+        <el-cascader
+          ref="citySelect"
+          v-model="cityIds"
+          :options="citys"
+          @change="handleCityChange"
+          style="width: 100%;">
+        </el-cascader>
+      </el-form-item>
+      <el-form-item label="详细地址" prop="detail">
+        <el-input v-model="form.detail" placeholder="请输入收货人详细地址" />
+      </el-form-item>
+      <el-form-item label="是否默认地址" prop="isDefault">
+        <el-radio-group v-model="form.isDefault">
+          <el-radio :label="item.dictValue" v-for="item in orOptions" :key="item.dictValue">{{item.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <div style="text-align:right;">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { listUserAddress, addUserAddress } from "@/api/store/userAddress";
+import { getCitys } from "@/api/store/city";
+
+export default {
+  name: "addExternalUserAddress",
+  data() {
+    return {
+      citys: [],
+      orOptions: [],
+      cityIds: null,
+      form: {
+        province: null,
+        city: null,
+        district: null,
+        cityId: null,
+        isDefault: '0'
+      },
+      rules: {
+        userId: [
+          { required: true, message: "用户id不能为空", trigger: "blur" }
+        ],
+        realName: [
+          { required: true, message: "收货人姓名不能为空", trigger: "blur" }
+        ],
+        phone: [
+          { required: true, message: "收货人电话不能为空", trigger: "blur" },
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
+        ],
+        detail: [
+          { required: true, message: "收货人详细地址不能为空", trigger: "blur" }
+        ],
+        isDefault: [
+          { required: true, message: "是否默认不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getCitys();
+    this.getDicts("sys_company_or").then(response => {
+      this.orOptions = response.data;
+    });
+  },
+  methods: {
+    getCitys() {
+      getCitys().then(res => {
+        this.citys = res.data;
+      });
+    },
+    handleCityChange(value) {
+      var nodes = this.$refs.citySelect.getCheckedNodes();
+      this.cityIds = value.toString();
+      this.form.province = nodes[0].pathLabels[0];
+      this.form.city = nodes[0].pathLabels[1];
+      this.form.district = nodes[0].pathLabels[2];
+    },
+    init(userId) {
+      this.form.userId = userId;
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.city == null || this.form.province == null || this.form.district == null) {
+            return this.msgError("省市区不能为空");
+          }
+          addUserAddress(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("新增成功");
+              this.$emit("addUserAddress");
+            }
+          });
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style scoped>
+</style>

+ 547 - 0
src/views/store/externalOrder/index.vue

@@ -0,0 +1,547 @@
+<template>
+  <div class="app-container">
+    <el-tabs v-model="activeStatus" @tab-click="handleTabClick">
+      <el-tab-pane label="全部" name="all"></el-tab-pane>
+      <el-tab-pane
+        v-for="item in statusOptions"
+        :key="item.dictValue"
+        :label="item.dictLabel"
+        :name="item.dictValue"
+      ></el-tab-pane>
+    </el-tabs>
+
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
+      <el-form-item label="订单号" prop="orderCode">
+        <el-input
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="用户ID" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="收货人" prop="userName">
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="请输入收货人"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="收货人电话" prop="userPhone">
+        <el-input
+          v-model="queryParams.userPhone"
+          placeholder="请输入收货人电话"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="是否支付" prop="isPay">
+        <el-select v-model="queryParams.isPay" placeholder="请选择是否支付" clearable size="small">
+          <el-option label="是" value="1" />
+          <el-option label="否" value="0" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="createTime"
+          size="small"
+          style="width: 220px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          @change="handleCreateTimeChange"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['his:externalOrder:create']"
+        >创建外部订单</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['store:externalOrder:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" border :data="orderList">
+      <el-table-column label="外部订单号" align="center" prop="orderCode" width="180px" />
+      <el-table-column label="所属公司" align="center" prop="companyName" />
+      <el-table-column label="员工" align="center" prop="companyUserName" />
+      <el-table-column label="收货人" align="center" prop="userName" />
+      <el-table-column label="商品名称" align="center" prop="productNames" show-overflow-tooltip />
+      <el-table-column label="应收金额" align="center" prop="receivablePrice" />
+      <el-table-column label="实收金额" align="center" prop="payPrice" />
+      <el-table-column label="支付方式" align="center" prop="payType">
+        <template slot-scope="scope">
+          <dict-tag :options="payTypeOptions" :value="scope.row.payType" />
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="externalCreateTime" width="180" />
+      <el-table-column label="订单状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="statusOptions" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="100px">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            v-hasPermi="['store:externalOrder:query']"
+            @click="handleView(scope.row)"
+          >查看</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <el-dialog :title="title" v-if="open" :visible.sync="open" width="1000px" append-to-body :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="会员信息" prop="userId">
+          <el-row>
+            <el-col>
+              <el-input placeholder="请输入会员手机号" style="width:240px;" v-model="phone"/>
+              <el-button plain style="margin-left:10px;" @click="searchUser()">查询</el-button>
+              <el-button plain style="margin-left:10px;" icon="el-icon-plus" type="primary" @click="handleAddUser()">添加外部订单用户</el-button>
+            </el-col>
+          </el-row>
+          <el-table border style="margin-top:5px;" v-loading="userloading" :data="users">
+            <el-table-column label="ID" align="center" prop="userId" />
+            <el-table-column label="会员头像" align="center" width="80">
+              <template slot-scope="scope">
+                <el-popover placement="right" title="" trigger="hover">
+                  <img slot="reference" :src="scope.row.avatar" width="50" >
+                  <img :src="scope.row.avatar" style="max-width: 120px;">
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column label="昵称" align="center" prop="nickName" />
+            <el-table-column label="手机号" align="center" prop="phone" />
+            <el-table-column label="状态" align="center" prop="status" >
+              <template slot-scope="scope">
+                <el-tag prop="status" v-for="(item, index) in userStatusOptions" :key="index" v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+        <el-form-item label="收货信息" prop="addressId">
+          <el-row>
+            <el-col>
+              <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserAddress()">添加收货地址</el-button>
+            </el-col>
+          </el-row>
+          <el-radio-group v-model="form.addressId" style="width:100%">
+            <el-table border style="margin-top:5px;" v-loading="addressloading" :data="address">
+              <el-table-column label="ID" align="center" >
+                <template slot-scope="scope">
+                  <el-radio :label="scope.row.addressId"></el-radio>
+                </template>
+              </el-table-column>
+              <el-table-column label="收货人姓名" align="center" prop="realName" />
+              <el-table-column label="收货人所在省" align="center" prop="province" />
+              <el-table-column label="收货人所在市" align="center" prop="city" />
+              <el-table-column label="收货人所在区" align="center" prop="district" />
+              <el-table-column label="收货人详细地址" align="center" prop="detail" />
+            </el-table>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="商品信息" prop="productList">
+          <el-input
+            v-model="productNameSearch"
+            placeholder="请输入商品名称搜索"
+            clearable
+            size="small"
+            style="width: 300px; margin-bottom: 10px;"
+            @keyup.enter.native="getProductList"
+          />
+          <el-button type="primary" size="small" style="margin-left: 10px;" @click="getProductList">搜索</el-button>
+          <el-table border width="100%" style="margin-top:5px;" :data="productJson" @selection-change="handleProductSelectionChange">
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="商品图片" align="center" width="120">
+              <template slot-scope="scope">
+                <el-popover placement="right" title="" trigger="hover">
+                  <img slot="reference" :src="scope.row.imgUrl" width="100">
+                  <img :src="scope.row.imgUrl" style="max-width: 150px;">
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
+            <el-table-column label="售价" align="center" prop="price" >
+              <template slot-scope="scope">
+                <span v-if="scope.row.price!=null">{{scope.row.price.toFixed(2)}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="库存" align="center" prop="stock" />
+          </el-table>
+        </el-form-item>
+        <el-form-item label="支付方式" prop="payType">
+          <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
+            <el-option
+              v-for="item in payTypeOptions"
+              :key="item.dictValue"
+              :label="item.dictLabel"
+              :value="item.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="支付金额" prop="payMoney">
+          <el-input v-model="form.payMoney" placeholder="请输入支付金额" clearable size="small" style="width: 200px;" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog title="订单详情" v-if="detailOpen" :visible.sync="detailOpen" width="800px" append-to-body>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="外部订单号">{{ detailData.orderCode }}</el-descriptions-item>
+        <el-descriptions-item label="所属公司">{{ detailData.companyName }}</el-descriptions-item>
+        <el-descriptions-item label="员工">{{ detailData.companyUserName }}</el-descriptions-item>
+        <el-descriptions-item label="收货人">{{ detailData.userName }}</el-descriptions-item>
+        <el-descriptions-item label="收货人电话">{{ detailData.userPhone }}</el-descriptions-item>
+        <el-descriptions-item label="收货地址">{{ detailData.userAddress }}</el-descriptions-item>
+        <el-descriptions-item label="实收金额">{{ detailData.payPrice }}</el-descriptions-item>
+        <el-descriptions-item label="支付方式">
+          <dict-tag :options="payTypeOptions" :value="detailData.payType" />
+        </el-descriptions-item>
+        <el-descriptions-item label="订单状态">
+          <dict-tag :options="statusOptions" :value="detailData.status" />
+        </el-descriptions-item>
+        <el-descriptions-item label="创建时间">{{ detailData.externalCreateTime }}</el-descriptions-item>
+      </el-descriptions>
+      <el-divider content-position="left">商品信息</el-divider>
+      <el-table border :data="detailData.productList || []">
+        <el-table-column label="商品名称" align="center" prop="productName" />
+        <el-table-column label="商品价格" align="center" prop="price" />
+        <el-table-column label="数量" align="center" prop="num" />
+        <el-table-column label="小计" align="center">
+          <template slot-scope="scope">
+            {{ (scope.row.price * scope.row.num).toFixed(2) }}
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+
+    <el-dialog :title="user.title" v-if="user.open" :visible.sync="user.open" width="500px" append-to-body>
+      <add-external-user @addUser="addUser" />
+    </el-dialog>
+
+    <el-dialog :title="userAddress.title" v-if="userAddress.open" :visible.sync="userAddress.open" width="800px" append-to-body>
+      <add-external-user-address ref="addExternalUserAddress" @addUserAddress="addUserAddress" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listExternalOrder, createExternalOrder, getExternalOrder, exportExternalOrder } from "@/api/store/externalOrder";
+import { getCompanyList } from "@/api/company/company";
+import { listUserAddress } from "@/api/store/userAddress";
+import { listStoreProduct } from "@/api/store/storeProduct";
+import addExternalUserAddress from "@/views/store/components/addExternalUserAddress.vue";
+import addExternalUser from "@/views/store/components/addExternalUser.vue";
+import request from '@/utils/request';
+
+export default {
+  name: "ExternalOrder",
+  components: { addExternalUserAddress, addExternalUser },
+  data() {
+    return {
+      activeStatus: "all",
+      loading: true,
+      exportLoading: false,
+      showSearch: true,
+      total: 0,
+      orderList: [],
+      companyList: [],
+      createTime: null,
+      open: false,
+      title: "",
+      detailOpen: false,
+      detailData: {},
+      phone: null,
+      userloading: false,
+      users: [],
+      address: [],
+      addressloading: false,
+      productJson: [],
+      productNameSearch: null,
+      user: {
+        open: false,
+        title: "创建外部订单用户"
+      },
+      userAddress: {
+        open: false,
+        title: "创建收货地址"
+      },
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        userId: null,
+        userName: null,
+        userPhone: null,
+        isPay: null,
+        companyId: null,
+        status: null,
+        sTime: null,
+        eTime: null
+      },
+      form: {
+        addressId: null,
+        userId: null,
+        payType: null,
+        payMoney: null,
+        productIds: []
+      },
+      rules: {
+        addressId: [{ required: true, message: "请选择收货地址", trigger: "change" }],
+        payType: [{ required: true, message: "支付方式不能为空", trigger: "change" }],
+        payMoney: [{ required: true, message: "支付金额不能为空", trigger: "blur" }]
+      },
+      payTypeOptions: [],
+      statusOptions: [],
+      userStatusOptions: []
+    };
+  },
+  created() {
+    this.getList();
+    this.getCompanyList();
+    this.getDicts("sys_package_pay_type").then(response => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("sys_order_status").then(response => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("sys_company_status").then(response => {
+      this.userStatusOptions = response.data;
+    });
+  },
+  methods: {
+    handleTabClick(tab) {
+      if (tab.name === "all") {
+        this.queryParams.status = null;
+      } else {
+        this.queryParams.status = tab.name;
+      }
+      this.handleQuery();
+    },
+    getList() {
+      this.loading = true;
+      listExternalOrder(this.queryParams).then(response => {
+        this.orderList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      }).catch(() => {
+        this.loading = false;
+      });
+    },
+    getCompanyList() {
+      getCompanyList().then(response => {
+        this.companyList = response.data || [];
+      });
+    },
+    handleCreateTimeChange(val) {
+      if (val) {
+        this.queryParams.sTime = val[0];
+        this.queryParams.eTime = val[1];
+      } else {
+        this.queryParams.sTime = null;
+        this.queryParams.eTime = null;
+      }
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.createTime = null;
+      this.queryParams.sTime = null;
+      this.queryParams.eTime = null;
+      this.handleQuery();
+    },
+    handleAdd() {
+      this.reset();
+      this.phone = null;
+      this.users = [];
+      this.address = [];
+      this.productJson = [];
+      this.productNameSearch = null;
+      this.open = true;
+      this.title = "创建外部订单";
+    },
+    reset() {
+      this.form = {
+        addressId: null,
+        userId: null,
+        payType: null,
+        payMoney: null,
+        productIds: []
+      };
+      this.resetForm("form");
+    },
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    searchUser() {
+      if (this.phone == null || this.phone == "") {
+        this.msgError("请输入会员手机号");
+        return;
+      }
+      var data = { phone: this.phone };
+      this.userloading = true;
+      this.users = [];
+      this.address = [];
+      request({
+        url: '/store/user/externalList',
+        method: 'get',
+        params: data
+      }).then(response => {
+        this.users = response.rows || [];
+        this.userloading = false;
+        if (this.users != null && this.users.length == 1) {
+          this.form.userId = this.users[0].userId;
+          this.getAddressList(this.form.userId);
+        }
+      }).catch(() => {
+        this.userloading = false;
+      });
+    },
+    handleAddUser() {
+      this.user.open = true;
+    },
+    addUser(phone) {
+      this.user.open = false;
+      this.phone = phone;
+      this.searchUser();
+    },
+    handleAddUserAddress() {
+      if (this.form.userId == null) {
+        this.msgError("请选择会员");
+        return;
+      }
+      this.userAddress.open = true;
+      setTimeout(() => {
+        this.$refs.addExternalUserAddress.init(this.form.userId);
+      }, 500);
+    },
+    addUserAddress() {
+      this.userAddress.open = false;
+      this.getAddressList(this.form.userId);
+    },
+    getAddressList(userId) {
+      var data = { userId: userId };
+      this.addressloading = true;
+      this.address = [];
+      listUserAddress(data).then(response => {
+        this.address = response.rows;
+        this.addressloading = false;
+      });
+    },
+    getProductList() {
+      var data = {
+        productName: this.productNameSearch,
+        pageNum: 1,
+        pageSize: 100
+      };
+      listStoreProduct(data).then(response => {
+        this.productJson = response.rows;
+      });
+    },
+    handleProductSelectionChange(selection) {
+      this.form.productIds = selection.map(item => item.productId);
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.userId == null) {
+            this.msgError("请选择会员");
+            return;
+          }
+          if (this.form.productIds.length === 0) {
+            this.msgError("请选择至少一个商品");
+            return;
+          }
+          var submitData = {
+            addressId: this.form.addressId,
+            userId: this.form.userId,
+            payType: this.form.payType,
+            payMoney: parseFloat(this.form.payMoney) || 0,
+            productIds: this.form.productIds
+          };
+          createExternalOrder(submitData).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.open = false;
+              this.getList();
+            }
+          });
+        }
+      });
+    },
+    handleView(row) {
+      getExternalOrder(row.orderId).then(response => {
+        this.detailData = response.data;
+        this.detailOpen = true;
+      });
+    },
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("是否确认导出外部订单数据项?", "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportExternalOrder(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    }
+  }
+};
+</script>