| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514 |
- <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 label="未审核" name="1"></el-tab-pane>
- <el-tab-pane label="审核通过" name="2"></el-tab-pane>
- <el-tab-pane label="已发货" name="3"></el-tab-pane>
- <el-tab-pane label="已回款" name="4"></el-tab-pane>
- <el-tab-pane label="已取消" name="-3"></el-tab-pane>
- </el-tabs>
- <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="small">
- <el-form-item label="订单编号" prop="orderCode">
- <el-input v-model="queryParams.orderCode" placeholder="请输入订单号" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="所属部门" prop="deptId">
- <treeselect style="width:220px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
- </el-form-item>
- <el-form-item label="会员ID" prop="userId">
- <el-input v-model="queryParams.userId" placeholder="请输入会员ID" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="会员姓名" prop="memberName">
- <el-input v-model="queryParams.memberName" placeholder="请输入会员姓名" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="会员电话" prop="memberPhone">
- <el-input v-model="queryParams.memberPhone" placeholder="请输入会员电话" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="销售ID" prop="companyUserId">
- <el-input v-model="queryParams.companyUserId" placeholder="请输入销售ID" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="销售姓名" prop="companyUserName">
- <el-input v-model="queryParams.companyUserName" placeholder="请输入销售姓名" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="下单日期" prop="createTime">
- <el-date-picker
- v-model="createTime"
- style="width: 220px"
- value-format="yyyy-MM-dd"
- type="daterange"
- range-separator="-"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- @change="handleCreateTimeChange"
- />
- </el-form-item>
- <el-form-item label="签收状态" prop="deliveryStatus">
- <el-select v-model="queryParams.deliveryStatus" placeholder="请选择签收状态" clearable style="width:200px">
- <el-option
- v-for="item in deliveryStatusOptions"
- :key="item.dictValue"
- :label="item.dictLabel"
- :value="Number(item.dictValue)"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="订购产品" prop="productName">
- <el-input v-model="queryParams.productName" placeholder="请输入产品名称" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="地址" prop="address">
- <el-input v-model="queryParams.address" placeholder="请输入地址" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="定金" prop="payPrice">
- <el-input-number v-model="queryParams.payPrice" :precision="2" :min="0" placeholder="请输入定金" style="width:200px" controls-position="right" />
- </el-form-item>
- <el-form-item label="定金回款时间" prop="depositReturnTime">
- <el-date-picker
- v-model="depositReturnTime"
- style="width: 220px"
- value-format="yyyy-MM-dd"
- type="daterange"
- range-separator="-"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- @change="handleDepositReturnTimeChange"
- />
- </el-form-item>
- <el-form-item label="商品总额" prop="totalPrice">
- <el-input-number v-model="queryParams.totalPrice" :precision="2" :min="0" placeholder="请输入商品总额" style="width:200px" controls-position="right" />
- </el-form-item>
- <el-form-item label="代收金额" prop="collectionPrice">
- <el-input-number v-model="queryParams.collectionPrice" :precision="2" :min="0" placeholder="请输入代收金额" style="width:200px" controls-position="right" />
- </el-form-item>
- <el-form-item label="备注" prop="remark">
- <el-input v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="快递单号" prop="deliverySn">
- <el-input v-model="queryParams.deliverySn" placeholder="请输入快递单号" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="发货日期" prop="deliveryTime">
- <el-date-picker
- v-model="deliveryTime"
- style="width: 220px"
- value-format="yyyy-MM-dd"
- type="daterange"
- range-separator="-"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- @change="handleDeliveryTimeChange"
- />
- </el-form-item>
- <el-form-item label="快递公司" prop="deliveryCode">
- <el-input v-model="queryParams.deliveryCode" placeholder="请输入快递公司" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="快递类型" prop="deliveryName">
- <el-input v-model="queryParams.deliveryName" placeholder="请输入快递类型" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="跟单时间" prop="followTime">
- <el-date-picker
- v-model="followTime"
- style="width: 220px"
- value-format="yyyy-MM-dd"
- type="daterange"
- range-separator="-"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- @change="handleFollowTimeChange"
- />
- </el-form-item>
- <el-form-item label="退款金额" prop="refundPrice">
- <el-input-number v-model="queryParams.refundPrice" :precision="2" :min="0" placeholder="请输入退款金额" style="width:200px" controls-position="right" />
- </el-form-item>
- <el-form-item label="退款日期" prop="refundTime">
- <el-date-picker
- v-model="refundTime"
- style="width: 220px"
- value-format="yyyy-MM-dd"
- type="daterange"
- range-separator="-"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- @change="handleRefundTimeChange"
- />
- </el-form-item>
- <el-form-item label="审核人" prop="auditor">
- <el-input v-model="queryParams.auditor" placeholder="请输入审核人" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="审核时间" prop="auditTime">
- <el-date-picker
- v-model="auditTime"
- style="width: 220px"
- value-format="yyyy-MM-dd"
- type="daterange"
- range-separator="-"
- start-placeholder="开始日期"
- end-placeholder="结束日期"
- @change="handleAuditTimeChange"
- />
- </el-form-item>
- <el-form-item label="复购次数" prop="memberBuyCountMin">
- <el-input-number v-model="queryParams.memberBuyCountMin" :min="0" placeholder="最小次数" style="width:120px" controls-position="right" />
- </el-form-item>
- <el-form-item label="会员年龄" prop="memberAge">
- <el-input-number v-model="queryParams.memberAge" :min="0" placeholder="请输入年龄" style="width:200px" controls-position="right" />
- </el-form-item>
- <el-form-item label="会员性别" prop="memberSex">
- <el-select v-model="queryParams.memberSex" placeholder="请选择性别" clearable style="width:120px">
- <el-option label="男" :value="1" />
- <el-option label="女" :value="2" />
- </el-select>
- </el-form-item>
- <el-form-item label="病名" prop="diseaseName">
- <el-input v-model="queryParams.diseaseName" placeholder="请输入病名" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="省市" prop="province">
- <el-input v-model="queryParams.province" placeholder="请输入省市" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="二级市" prop="city">
- <el-input v-model="queryParams.city" placeholder="请输入二级市" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="区县" prop="district">
- <el-input v-model="queryParams.district" placeholder="请输入区县" clearable @keyup.enter.native="handleQuery" />
- </el-form-item>
- <el-form-item label="乡镇" prop="township">
- <el-input v-model="queryParams.township" placeholder="请输入乡镇" clearable @keyup.enter.native="handleQuery" />
- </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 ref="orderTable" v-loading="loading" border :data="orderList" style="width:100%" show-summary :summary-method="getSummaries" @filter-change="handleFilterChange">
- <el-table-column label="外部订单号" align="center" prop="orderCode" width="170" fixed="left" column-key="orderCode" :filters="getFilters('orderCode')" :filtered-value="columnFilters.orderCode" />
- <el-table-column label="会员ID" align="center" prop="userId" width="90" column-key="userId" :filters="getFilters('userId')" :filtered-value="columnFilters.userId" />
- <el-table-column label="订单状态" align="center" prop="status" width="100" column-key="status" :filters="statusFilters" :filtered-value="columnFilters.status">
- <template slot-scope="scope">
- <el-tag v-if="scope.row.status==1" type="warning" size="mini">未审核</el-tag>
- <el-tag v-else-if="scope.row.status==2" type="success" size="mini">审核通过</el-tag>
- <el-tag v-else-if="scope.row.status==3" type="primary" size="mini">已发货</el-tag>
- <el-tag v-else-if="scope.row.status==4" size="mini">已回款</el-tag>
- <el-tag v-else-if="scope.row.status==-3" type="danger" size="mini">已取消</el-tag>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column label="订单类型" align="center" prop="orderType" width="100" column-key="orderType" :filters="orderTypeFilters" :filtered-value="columnFilters.orderType">
- <template slot-scope="scope">
- <span v-if="scope.row.orderType==1">外部订单</span>
- <span v-else-if="scope.row.orderType==2">套餐包</span>
- <span v-else-if="scope.row.orderType==3">问诊</span>
- <span v-else-if="scope.row.orderType==4">积分</span>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column label="所属公司" align="center" prop="companyName" width="120" show-overflow-tooltip />
- <el-table-column label="部门" align="center" prop="deptName" width="120" show-overflow-tooltip />
- <el-table-column label="员工" align="center" prop="companyUserName" width="100" column-key="companyUserName" :filters="getFilters('companyUserName')" :filtered-value="columnFilters.companyUserName" />
- <el-table-column label="收货人" align="center" prop="userName" width="90" column-key="userName" :filters="getFilters('userName')" :filtered-value="columnFilters.userName" />
- <el-table-column label="会员手机号" align="center" prop="memberPhone" width="130" column-key="memberPhone" :filters="getFilters('memberPhone')" :filtered-value="columnFilters.memberPhone" />
- <el-table-column label="会员年龄" align="center" prop="memberAge" width="80" column-key="memberAge" :filters="getFilters('memberAge', null, true)" :filtered-value="columnFilters.memberAge" />
- <el-table-column label="会员性别" align="center" prop="memberSex" width="80" column-key="memberSex" :filters="memberSexFilters" :filtered-value="columnFilters.memberSex">
- <template slot-scope="scope">
- <span v-if="scope.row.memberSex==1">男</span>
- <span v-else-if="scope.row.memberSex==2">女</span>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column label="复购次数" align="center" prop="memberBuyCount" width="80" column-key="memberBuyCount" :filters="getFilters('memberBuyCount', null, true)" :filtered-value="columnFilters.memberBuyCount" />
- <el-table-column label="省" align="center" prop="province" width="80" column-key="province" :filters="getFilters('province')" :filtered-value="columnFilters.province" />
- <el-table-column label="二级市" align="center" prop="city" width="90" column-key="city" :filters="getFilters('city')" :filtered-value="columnFilters.city" />
- <el-table-column label="区县" align="center" prop="district" width="90" column-key="district" :filters="getFilters('district')" :filtered-value="columnFilters.district" />
- <el-table-column label="乡镇" align="center" prop="township" width="90" column-key="township" :filters="getFilters('township')" :filtered-value="columnFilters.township" />
- <el-table-column label="病名" align="center" prop="diseaseName" width="100" show-overflow-tooltip column-key="diseaseName" :filters="getFilters('diseaseName')" :filtered-value="columnFilters.diseaseName" />
- <el-table-column label="商品名称" align="center" prop="productNames" width="200" show-overflow-tooltip column-key="productNames" :filters="getFilters('productNames')" :filtered-value="columnFilters.productNames" />
- <el-table-column label="商品总额" align="center" prop="totalPrice" width="100" column-key="totalPrice" :filters="getFilters('totalPrice', null, true)" :filtered-value="columnFilters.totalPrice" />
- <el-table-column label="应收金额" align="center" prop="receivablePrice" width="100" column-key="receivablePrice" :filters="getFilters('receivablePrice', null, true)" :filtered-value="columnFilters.receivablePrice" />
- <el-table-column label="定金(实收)" align="center" prop="payPrice" width="100" column-key="payPrice" :filters="getFilters('payPrice', null, true)" :filtered-value="columnFilters.payPrice" />
- <el-table-column label="代收金额" align="center" prop="collectionPrice" width="100" column-key="collectionPrice" :filters="getFilters('collectionPrice', null, true)" :filtered-value="columnFilters.collectionPrice" />
- <el-table-column label="支付方式" align="center" prop="payType" width="100" column-key="payType" :filters="payTypeFilters" :filtered-value="columnFilters.payType">
- <template slot-scope="scope">
- <dict-tag :options="payTypeOptions" :value="scope.row.payType" />
- </template>
- </el-table-column>
- <el-table-column label="定金回款时间" align="center" prop="depositReturnTime" width="160" column-key="depositReturnTime" :filters="getDepositReturnTimeFilters()" :filtered-value="columnFilters.depositReturnTime">
- <template slot-scope="scope">
- <span>{{ scope.row.status == 4 ? scope.row.updateTime : '-' }}</span>
- </template>
- </el-table-column>
- <el-table-column label="创建时间" align="center" prop="externalCreateTime" width="160" column-key="externalCreateTime" :filters="getFilters('externalCreateTime')" :filtered-value="columnFilters.externalCreateTime" />
- <el-table-column label="快递单号" align="center" prop="deliverySn" width="150" show-overflow-tooltip column-key="deliverySn" :filters="getFilters('deliverySn')" :filtered-value="columnFilters.deliverySn" />
- <el-table-column label="快递公司" align="center" prop="deliveryCode" width="100" column-key="deliveryCode" :filters="getFilters('deliveryCode')" :filtered-value="columnFilters.deliveryCode" />
- <el-table-column label="快递类型" align="center" prop="deliveryName" width="100" column-key="deliveryName" :filters="getFilters('deliveryName')" :filtered-value="columnFilters.deliveryName" />
- <el-table-column label="发货日期" align="center" prop="deliveryTime" width="160" column-key="deliveryTime" :filters="getFilters('deliveryTime')" :filtered-value="columnFilters.deliveryTime" />
- <el-table-column label="签收状态" align="center" prop="deliveryStatus" width="100" column-key="deliveryStatus" :filters="deliveryStatusFilters" :filtered-value="columnFilters.deliveryStatus">
- <template slot-scope="scope">
- <dict-tag v-if="scope.row.deliveryStatus != null" :options="deliveryStatusOptions" :value="scope.row.deliveryStatus" />
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column label="跟单时间" align="center" prop="followTime" width="160" column-key="followTime" :filters="getFilters('followTime')" :filtered-value="columnFilters.followTime" />
- <el-table-column label="退款金额" align="center" prop="refundPrice" width="100" column-key="refundPrice" :filters="getFilters('refundPrice', null, true)" :filtered-value="columnFilters.refundPrice" />
- <el-table-column label="退款日期" align="center" prop="refundTime" width="160" column-key="refundTime" :filters="getFilters('refundTime')" :filtered-value="columnFilters.refundTime" />
- <el-table-column label="拒收回退时间" align="center" prop="rejectReturnTime" width="160" column-key="rejectReturnTime" :filters="getFilters('rejectReturnTime')" :filtered-value="columnFilters.rejectReturnTime" />
- <el-table-column label="备注" align="center" prop="remark" width="150" show-overflow-tooltip column-key="remark" :filters="getFilters('remark')" :filtered-value="columnFilters.remark" />
- <el-table-column label="审核人" align="center" prop="auditor" width="90" column-key="auditor" :filters="getFilters('auditor')" :filtered-value="columnFilters.auditor" />
- <el-table-column label="审核时间" align="center" prop="auditTime" width="160" column-key="auditTime" :filters="getFilters('auditTime')" :filtered-value="columnFilters.auditTime" />
- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200">
- <template slot-scope="scope">
- <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:query']" @click="handleView(scope.row)">查看</el-button>
- <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:audit']" @click="handleAudit(scope.row)" v-if="scope.row.status == 1">审核</el-button>
- <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:approveOrder']" @click="handleApprove(scope.row)" v-if="scope.row.status == 3 && !scope.row.isApplyAudit && isAbnormalDelivery(scope.row.deliveryType)">申请审核</el-button>
- <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:express']" @click="handleExpress(scope.row)" v-if="scope.row.deliverySn">查看物流</el-button>
- <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:cancel']" @click="handleCancel(scope.row)" v-if="scope.row.status != -3">取消订单</el-button>
- <el-button size="mini" type="text" v-hasPermi="['store:externalOrder:edit']" @click="handleEdit(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()" v-hasPermi="['his:user:addExternalUser']">添加外部订单用户</el-button>
- </el-col>
- </el-row>
- <el-radio-group v-model="form.userId" style="width:100%" @change="handleUserChange">
- <el-table border style="margin-top:5px;" v-loading="userloading" :data="users">
- <el-table-column label="选择" align="center" width="80">
- <template slot-scope="scope">
- <el-radio :label="scope.row.userId"></el-radio>
- </template>
- </el-table-column>
- <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">
- <template slot-scope="scope">
- <span v-if="scope.row.birthday">{{ Math.floor((Date.now() / 1000 - scope.row.birthday) / 31536000) }}</span>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column label="性别" align="center" prop="sex">
- <template slot-scope="scope">
- <span v-if="scope.row.sex == 1">男</span>
- <span v-else-if="scope.row.sex == 2">女</span>
- <span v-else>-</span>
- </template>
- </el-table-column>
- <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-radio-group>
- </el-form-item>
- <el-form-item label="收件人电话" prop="receiverPhone">
- <el-input v-model="form.receiverPhone" placeholder="请输入收件人电话" clearable size="small" style="width: 300px;" />
- <el-tooltip placement="right" effect="dark" :content="'该手机号会推送给快递公司。被快递公司记录成收件人电话。请按照自己公司下单发货规定,填写坐席电话或者用户电话。填错会查不到物流信息。'">
- <span style="color: red; margin-left: 5px; cursor: pointer; font-weight: bold;">*</span>
- </el-tooltip>
- </el-form-item>
- <el-form-item label="收货信息" prop="addressId">
- <el-row>
- <el-col>
- <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserAddress()" v-hasPermi="['his:userAddress:add']">添加收货地址</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="township" />
- <el-table-column label="收货人详细地址" align="center" prop="detail" />
- </el-table>
- </el-radio-group>
- </el-form-item>
- <el-form-item label="商品信息" prop="productList">
- <el-select v-model="selectedStoreId" placeholder="请选择店铺" clearable size="small" @change="handleStoreChange" style="width: 200px;">
- <el-option
- v-for="item in storeOptions"
- :key="item.dictValue"
- :label="item.dictLabel"
- :value="item.dictValue"
- />
- </el-select>
- <div style="float: right;"><el-button plain type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button></div>
- <el-table border width="100%" style="margin-top:5px;" :data="drugList">
- <el-table-column label="商品图片" align="center" width="100">
- <template slot-scope="scope">
- <el-popover placement="right" title="" trigger="hover">
- <img slot="reference" :src="scope.row.imgUrl" width="50">
- <img :src="scope.row.imgUrl" style="max-width: 50px;">
- </el-popover>
- </template>
- </el-table-column>
- <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
- <el-table-column label="数量" align="center" prop="count" width="150px">
- <template slot-scope="scope">
- <el-input-number v-model="scope.row.count" @change="handleProductCountChange(scope.row)" size="small" :min="1"></el-input-number>
- </template>
- </el-table-column>
- <el-table-column label="售价" align="center" prop="price" width="150px">
- <template slot-scope="scope">
- <el-input-number v-model="scope.row.price" @change="handleProductCountChange(scope.row)" size="small" :min="0" :precision="2"></el-input-number>
- </template>
- </el-table-column>
- <el-table-column label="小计" align="center" prop="money">
- <template slot-scope="scope">
- <div v-if="scope.row.money != null">{{ scope.row.money.toFixed(2) }}</div>
- </template>
- </el-table-column>
- <el-table-column label="操作" align="center" width="100px" fixed="right">
- <template slot-scope="scope">
- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleProductDelete(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </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="totalPrice">
- <el-input v-model="form.totalPrice" placeholder="请输入商品总额" clearable size="small" style="width: 200px;" />
- </el-form-item>
- <el-form-item :label="form.payType == 3 ? '定金' : '支付金额'" 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="1000px" append-to-body>
- <el-descriptions :column="3" border size="small">
- <el-descriptions-item label="外部订单号">{{ detailData.orderCode }}</el-descriptions-item>
- <el-descriptions-item label="订单状态">
- <el-tag v-if="detailData.status==1" type="warning" size="mini">未审核</el-tag>
- <el-tag v-else-if="detailData.status==2" type="success" size="mini">审核通过</el-tag>
- <el-tag v-else-if="detailData.status==3" type="primary" size="mini">已发货</el-tag>
- <el-tag v-else-if="detailData.status==4" size="mini">已回款</el-tag>
- <el-tag v-else-if="detailData.status==-3" type="danger" size="mini">已取消</el-tag>
- </el-descriptions-item>
- <el-descriptions-item label="订单类型">
- <span v-if="detailData.orderType==1">外部订单</span>
- <span v-else-if="detailData.orderType==2">套餐包</span>
- <span v-else-if="detailData.orderType==3">问诊</span>
- <span v-else-if="detailData.orderType==4">积分</span>
- <span v-else>-</span>
- </el-descriptions-item>
- <el-descriptions-item label="所属公司">{{ detailData.companyName }}</el-descriptions-item>
- <el-descriptions-item label="部门">{{ detailData.deptName || '-' }}</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="会员ID">{{ detailData.userId || '-' }}</el-descriptions-item>
- <el-descriptions-item label="会员手机号">{{ detailData.memberPhone || '-' }}</el-descriptions-item>
- <el-descriptions-item label="会员年龄">{{ detailData.memberAge || '-' }}</el-descriptions-item>
- <el-descriptions-item label="会员性别">
- <span v-if="detailData.memberSex==1">男</span>
- <span v-else-if="detailData.memberSex==2">女</span>
- <span v-else>-</span>
- </el-descriptions-item>
- <el-descriptions-item label="复购次数">{{ detailData.memberBuyCount != null ? detailData.memberBuyCount : '-' }}</el-descriptions-item>
- <el-descriptions-item label="病名">{{ detailData.diseaseName || '-' }}</el-descriptions-item>
- <el-descriptions-item label="省">{{ detailData.province || '-' }}</el-descriptions-item>
- <el-descriptions-item label="二级市">{{ detailData.city || '-' }}</el-descriptions-item>
- <el-descriptions-item label="区县">{{ detailData.district || '-' }}</el-descriptions-item>
- <el-descriptions-item label="乡镇">{{ detailData.township || '-' }}</el-descriptions-item>
- <el-descriptions-item label="收货地址" :span="2">{{ detailData.userAddress }}</el-descriptions-item>
- <el-descriptions-item label="商品总额">{{ detailData.totalPrice }}</el-descriptions-item>
- <el-descriptions-item label="应收金额">{{ detailData.receivablePrice }}</el-descriptions-item>
- <el-descriptions-item label="定金(实收)">{{ detailData.payPrice }}</el-descriptions-item>
- <el-descriptions-item label="代收金额">{{ detailData.collectionPrice != null ? detailData.collectionPrice : '-' }}</el-descriptions-item>
- <el-descriptions-item label="支付方式">
- <dict-tag :options="payTypeOptions" :value="detailData.payType" />
- </el-descriptions-item>
- <el-descriptions-item label="定金回款时间">{{ detailData.status == 4 ? detailData.updateTime : '-' }}</el-descriptions-item>
- <el-descriptions-item label="创建时间">{{ detailData.externalCreateTime }}</el-descriptions-item>
- <el-descriptions-item label="快递单号">{{ detailData.deliverySn || '-' }}</el-descriptions-item>
- <el-descriptions-item label="快递公司">{{ detailData.deliveryCode || '-' }}</el-descriptions-item>
- <el-descriptions-item label="快递类型">{{ detailData.deliveryName || '-' }}</el-descriptions-item>
- <el-descriptions-item label="发货日期">{{ detailData.deliveryTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="签收状态">
- <dict-tag v-if="detailData.deliveryStatus != null" :options="deliveryStatusOptions" :value="detailData.deliveryStatus" />
- <span v-else>-</span>
- </el-descriptions-item>
- <el-descriptions-item label="跟单时间">{{ detailData.followTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="退款金额">{{ detailData.refundPrice != null ? detailData.refundPrice : '-' }}</el-descriptions-item>
- <el-descriptions-item label="退款日期">{{ detailData.refundTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="拒收回退时间">{{ detailData.rejectReturnTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="审核人">{{ detailData.auditor || '-' }}</el-descriptions-item>
- <el-descriptions-item label="审核时间">{{ detailData.auditTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="备注" :span="3">{{ detailData.remark || '-' }}</el-descriptions-item>
- </el-descriptions>
- <el-divider content-position="left">商品信息</el-divider>
- <el-table border :data="detailData.productList || []" size="small">
- <el-table-column label="商品名称" align="center" prop="productName" />
- <el-table-column label="规格" align="center" prop="productSpec" />
- <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="expressDialog.title" :visible.sync="expressDialog.open" width="700px" append-to-body>
- <div style="margin-bottom: 10px;">
- <el-button
- size="mini"
- type="primary"
- v-hasPermi="['store:externalOrder:syncExpress']"
- @click="handleSyncExpress(expressDialog.row)"
- v-if="expressDialog.row && expressDialog.row.deliverySn"
- >同步快递鸟物流状态</el-button>
- </div>
- <el-table style="width: 100%" :data="traces" border>
- <el-table-column label="操作时间" width="160" align="center" prop="AcceptTime" />
- <el-table-column label="位置" align="center" prop="Location" />
- <el-table-column label="描述" align="center" prop="AcceptStation" />
- </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>
- <el-dialog title="申请审核" :visible.sync="approveOpen" width="600px" append-to-body :close-on-click-modal="false">
- <el-form ref="approveForm" :model="approveForm" :rules="approveRules" label-width="120px">
- <el-form-item label="审核类型" prop="auditType">
- <el-radio-group v-model="approveForm.auditType">
- <el-radio :label="1">申请改价</el-radio>
- <el-radio :label="2">订单完成</el-radio>
- </el-radio-group>
- </el-form-item>
- <template v-if="approveForm.auditType === 1">
- <el-form-item label="原价格">
- <el-input v-model="approveForm.oldTotalPrice" disabled style="width: 200px;" />
- </el-form-item>
- <el-form-item label="更改后总价" prop="newTotalPrice">
- <el-input-number v-model="approveForm.newTotalPrice" :precision="2" :min="0" style="width: 200px;" />
- </el-form-item>
- <el-form-item label="更改后实收" prop="newPayPrice">
- <el-input-number v-model="approveForm.newPayPrice" :precision="2" :min="0" style="width: 200px;" />
- </el-form-item>
- </template>
- <el-form-item label="申请原因" prop="priceChangeReason">
- <el-input v-model="approveForm.priceChangeReason" type="textarea" :rows="3" placeholder="请输入申请原因" />
- </el-form-item>
- <el-form-item label="凭证图片">
- <el-upload
- class="avatar-uploader"
- :action="uploadUrl"
- :headers="headers"
- :show-file-list="false"
- :on-success="handleUploadSuccess"
- accept="image/*"
- >
- <img v-if="approveForm.voucherImages" :src="approveForm.voucherImages" style="max-width: 200px; max-height: 200px;">
- <el-button v-else size="small" type="primary">点击上传</el-button>
- </el-upload>
- </el-form-item>
- <el-form-item label="凭证说明">
- <el-input v-model="approveForm.voucherRemark" type="textarea" :rows="2" placeholder="请输入凭证说明" />
- </el-form-item>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <el-button @click="approveOpen = false">取 消</el-button>
- <el-button type="primary" @click="submitApprove">确 定</el-button>
- </div>
- </el-dialog>
- <el-dialog title="选择商品" :visible.sync="productDialogVisible" width="900px" append-to-body>
- <el-row style="margin-bottom: 10px;">
- <el-input v-model="productSearchKeyword" placeholder="请输入商品名称搜索" clearable size="small" style="width: 300px;" @keyup.enter.native="searchProductDialog" />
- <el-button type="primary" size="small" style="margin-left: 10px;" @click="searchProductDialog">搜索</el-button>
- </el-row>
- <el-table border :data="productDialogList" @row-click="selectProduct" highlight-current-row style="cursor: pointer;">
- <el-table-column label="商品图片" align="center" width="100">
- <template slot-scope="scope">
- <el-popover placement="right" title="" trigger="hover">
- <img slot="reference" :src="scope.row.imgUrl" width="50">
- <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" width="120" />
- <el-table-column label="库存" align="center" prop="stock" width="100" />
- </el-table>
- <pagination
- v-show="productDialogTotal > 0"
- :total="productDialogTotal"
- :page.sync="productDialogPage.pageNum"
- :limit.sync="productDialogPage.pageSize"
- @pagination="getProductDialogList"
- />
- </el-dialog>
- <el-dialog title="订单修改" v-if="editOpen" :visible.sync="editOpen" width="600px" append-to-body :close-on-click-modal="false">
- <el-form ref="editForm" :model="editForm" label-width="120px">
- <el-form-item label="订单状态">
- <el-select v-model="editForm.status" placeholder="请选择订单状态" clearable size="small" style="width:200px;">
- <el-option label="未审核" :value="1" />
- <el-option label="审核通过" :value="2" />
- <el-option label="已发货" :value="3" />
- <el-option label="已回款" :value="4" />
- <el-option label="已取消" :value="-3" />
- </el-select>
- </el-form-item>
- <el-form-item label="跟单时间">
- <el-date-picker v-model="editForm.followTime" type="datetime" placeholder="请选择跟单时间" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
- </el-form-item>
- <el-form-item label="快递类型">
- <el-input v-model="editForm.deliveryName" placeholder="请输入快递类型" clearable size="small" style="width:200px;" />
- </el-form-item>
- <el-form-item label="签收状态">
- <el-select v-model="editForm.deliveryStatus" placeholder="请选择签收状态" clearable size="small" style="width:200px;">
- <el-option
- v-for="item in deliveryStatusOptions"
- :key="item.dictValue"
- :label="item.dictLabel"
- :value="Number(item.dictValue)"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="代收金额">
- <el-input-number v-model="editForm.collectionPrice" :precision="2" :min="0" size="small" style="width:200px;" />
- </el-form-item>
- <el-form-item label="定金回款时间" v-if="editForm.status == 4">
- <el-date-picker v-model="editForm.updateTime" type="datetime" placeholder="请选择回款时间" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
- </el-form-item>
- <el-form-item label="备注">
- <el-input v-model="editForm.remark" type="textarea" :rows="3" placeholder="请输入备注" style="width:350px;" />
- </el-form-item>
- <el-form-item label="快递公司">
- <el-input v-model="editForm.deliveryCode" placeholder="请输入快递公司编号" clearable size="small" style="width:200px;" />
- </el-form-item>
- <el-form-item label="退款金额">
- <el-input-number v-model="editForm.refundPrice" :precision="2" :min="0" size="small" style="width:200px;" />
- </el-form-item>
- <el-form-item label="退款日期">
- <el-date-picker v-model="editForm.refundTime" type="datetime" placeholder="请选择退款日期" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
- </el-form-item>
- <el-form-item label="拒收回退时间" v-if="showRejectReturnTime">
- <el-date-picker v-model="editForm.rejectReturnTime" type="datetime" placeholder="请选择拒收回退时间" size="small" style="width:200px;" value-format="yyyy-MM-dd HH:mm:ss" />
- </el-form-item>
- <el-form-item label="是否还货" v-if="showReturnGoods">
- <el-select v-model="editForm.isReturnGoods" placeholder="请选择是否还货" clearable size="small" style="width:200px;">
- <el-option label="是" :value="1" />
- <el-option label="否" :value="2" />
- </el-select>
- </el-form-item>
- <el-form-item label="病名">
- <el-input v-model="editForm.diseaseName" placeholder="请输入病名" clearable size="small" style="width:200px;" />
- </el-form-item>
- </el-form>
- <div slot="footer" class="dialog-footer">
- <el-button @click="editOpen = false">取 消</el-button>
- <el-button type="primary" @click="submitEditConfirm">确 定</el-button>
- </div>
- </el-dialog>
- <el-dialog title="确认修改" :visible.sync="editConfirmOpen" width="360px" append-to-body>
- <span>确认修改该订单信息吗?</span>
- <div slot="footer" class="dialog-footer">
- <el-button @click="editConfirmOpen = false">取 消</el-button>
- <el-button type="primary" @click="submitEdit">确 认</el-button>
- </div>
- </el-dialog>
- </div>
- </template>
- <script>
- import { listExternalOrder, createExternalOrder, getExternalOrder, auditExternalOrder, cancelExternalOrder, approveExternalOrder, exportExternalOrder, getExternalOrderExpress, syncExternalOrderExpress, editExternalOrder } from "@/api/store/externalOrder";
- import { getCompanyList } from "@/api/company/company";
- import { listUserAddress } from "@/api/store/userAddress";
- import { listStoreProduct, listStore } from "@/api/store/storeProduct";
- import { treeselect } from "@/api/company/companyDept";
- import Treeselect from "@riophae/vue-treeselect";
- import "@riophae/vue-treeselect/dist/vue-treeselect.css";
- 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, Treeselect },
- data() {
- return {
- activeStatus: "all",
- loading: true,
- exportLoading: false,
- showSearch: true,
- total: 0,
- orderList: [],
- companyList: [],
- open: false,
- title: "",
- detailOpen: false,
- detailData: {},
- expressDialog: {
- title: "物流信息",
- open: false,
- row: null
- },
- express: null,
- traces: [],
- phone: null,
- userloading: false,
- users: [],
- address: [],
- addressloading: false,
- drugList: [],
- storeOptions: [],
- selectedStoreId: null,
- productDialogVisible: false,
- productSearchKeyword: null,
- productDialogList: [],
- productDialogTotal: 0,
- productDialogPage: {
- pageNum: 1,
- pageSize: 10
- },
- user: {
- open: false,
- title: "创建外部订单用户"
- },
- userAddress: {
- open: false,
- title: "创建收货地址"
- },
- queryParams: {
- pageNum: 1,
- pageSize: 10,
- orderCode: null,
- deptId: null,
- userId: null,
- memberName: null,
- memberPhone: null,
- memberSex: null,
- memberAge: null,
- memberBuyCountMin: null,
- companyUserId: null,
- companyUserName: null,
- address: null,
- productName: null,
- payPrice: null,
- totalPrice: null,
- collectionPrice: null,
- refundPrice: null,
- deliverySn: null,
- deliveryCode: null,
- deliveryName: null,
- deliveryStatus: null,
- auditor: null,
- diseaseName: null,
- remark: null,
- province: null,
- city: null,
- district: null,
- township: null,
- sTime: null,
- eTime: null,
- deliveryStartTime: null,
- deliveryEndTime: null,
- depositReturnTimeStart: null,
- depositReturnTimeEnd: null,
- followTimeStart: null,
- followTimeEnd: null,
- refundTimeStart: null,
- refundTimeEnd: null,
- auditTimeStart: null,
- auditTimeEnd: null,
- rejectReturnTimeStart: null,
- rejectReturnTimeEnd: null,
- // 以下为列头筛选用字段
- orderType: null,
- payType: null,
- userName: null,
- memberBuyCount: null,
- receivablePrice: null
- },
- createTime: null,
- deliveryTime: null,
- depositReturnTime: null,
- followTime: null,
- refundTime: null,
- auditTime: null,
- form: {
- addressId: null,
- userId: null,
- receiverPhone: null,
- payType: null,
- totalPrice: null,
- payMoney: null,
- products: []
- },
- rules: {
- addressId: [{ required: true, message: "请选择收货地址", trigger: "change" }],
- userId: [{ required: true, message: "请选择会员", trigger: "change" }],
- receiverPhone: [{ required: true, message: "请输入收件人电话", trigger: "blur" }],
- payType: [{ required: true, message: "支付方式不能为空", trigger: "change" }],
- payMoney: [{ required: true, message: "支付金额不能为空", trigger: "blur" }]
- },
- approveOpen: false,
- approveForm: {
- orderIds: [],
- auditType: 1,
- oldTotalPrice: null,
- newTotalPrice: null,
- newPayPrice: null,
- priceChangeReason: null,
- voucherImages: null,
- voucherRemark: null
- },
- approveRules: {
- auditType: [
- { required: true, message: "请选择审核类型", trigger: "change" }
- ],
- newTotalPrice: [
- { required: true, message: "请输入更改后总价", trigger: "blur" }
- ],
- newPayPrice: [
- { required: true, message: "请输入更改后实收", trigger: "blur" }
- ],
- priceChangeReason: [
- { required: true, message: "请输入申请原因", trigger: "blur" }
- ]
- },
- uploadUrl: process.env.VUE_APP_BASE_API + "/common/upload",
- headers: { Authorization: "Bearer " + this.$store.getters.token },
- payTypeOptions: [],
- deliveryStatusOptions: [],
- deliveryTypeOptions: [],
- userStatusOptions: [],
- deptOptions: [],
- // 列头筛选-枚举字段展示文案映射
- statusMap: { 1: '未审核', 2: '审核通过', 3: '已发货', 4: '已回款', '-3': '已取消' },
- orderTypeMap: { 1: '外部订单', 2: '套餐包', 3: '问诊', 4: '积分' },
- memberSexMap: { 1: '男', 2: '女' },
- // 列头筛选-各列选中值(单选语义,用数组承载以适配 Element filtered-value)
- columnFilters: {
- orderCode: [], userId: [], status: [], orderType: [],
- companyUserName: [], userName: [], memberPhone: [], memberAge: [],
- memberSex: [], memberBuyCount: [], province: [], city: [],
- district: [], township: [], diseaseName: [], productNames: [],
- totalPrice: [], receivablePrice: [], payPrice: [], collectionPrice: [],
- payType: [], depositReturnTime: [], externalCreateTime: [],
- deliverySn: [], deliveryCode: [], deliveryName: [], deliveryTime: [],
- deliveryStatus: [], followTime: [], refundPrice: [], refundTime: [],
- rejectReturnTime: [], remark: [], auditor: [], auditTime: []
- },
- editOpen: false,
- editConfirmOpen: false,
- editForm: {
- orderId: null,
- status: null,
- followTime: null,
- deliveryName: null,
- deliveryStatus: null,
- collectionPrice: null,
- updateTime: null,
- remark: null,
- deliveryCode: null,
- refundPrice: null,
- refundTime: null,
- rejectReturnTime: null,
- diseaseName: null,
- isReturnGoods: null
- }
- };
- },
- computed: {
- showRejectReturnTime() {
- if (this.editForm.deliveryStatus == null) return false;
- const statusItem = this.deliveryStatusOptions.find(item => Number(item.dictValue) === this.editForm.deliveryStatus);
- if (statusItem) {
- const label = statusItem.dictLabel;
- return ['已拒收', '已退回', '退回签收'].includes(label);
- }
- return false;
- },
- showReturnGoods() {
- if (this.editForm.deliveryStatus == null) return false;
- const statusItem = this.deliveryStatusOptions.find(item => Number(item.dictValue) === this.editForm.deliveryStatus);
- if (statusItem) {
- return statusItem.dictLabel === '已拒收';
- }
- return false;
- },
- // 订单状态-全量枚举筛选项
- statusFilters() {
- return Object.keys(this.statusMap).map(k => ({ text: this.statusMap[k], value: Number(k) }));
- },
- // 订单类型-全量枚举筛选项
- orderTypeFilters() {
- return Object.keys(this.orderTypeMap).map(k => ({ text: this.orderTypeMap[k], value: Number(k) }));
- },
- // 会员性别-全量枚举筛选项
- memberSexFilters() {
- return Object.keys(this.memberSexMap).map(k => ({ text: this.memberSexMap[k], value: Number(k) }));
- },
- // 支付方式-全量字典筛选项
- payTypeFilters() {
- return (this.payTypeOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
- },
- // 签收状态-全量字典筛选项
- deliveryStatusFilters() {
- return (this.deliveryStatusOptions || []).map(d => ({ text: d.dictLabel, value: Number(d.dictValue) }));
- }
- },
- created() {
- this.getList();
- this.getCompanyList();
- this.getDicts("sys_package_pay_type").then(response => {
- this.payTypeOptions = response.data;
- });
- this.getDicts("sys_store_order_delivery_status").then(response => {
- this.deliveryStatusOptions = response.data;
- });
- this.getDicts("sys_delivery_type").then(response => {
- this.deliveryTypeOptions = response.data;
- });
- this.getDicts("sys_company_status").then(response => {
- this.userStatusOptions = response.data;
- });
- this.getTreeselect();
- },
- methods: {
- handleTabClick(tab) {
- if (tab.name === "all") {
- this.queryParams.status = null;
- } else {
- this.queryParams.status = tab.name;
- }
- // 切换 tab 时清空列头筛选,避免与 tab 状态筛选冲突
- this.resetColumnFilters();
- this.handleQuery();
- },
- getList() {
- this.loading = true;
- const params = { ...this.queryParams };
- // el-input-number 清空后默认值为0,需转为null避免作为筛选条件传给后端
- const numFields = ['memberAge', 'memberBuyCountMin', 'payPrice', 'totalPrice', 'collectionPrice', 'refundPrice'];
- numFields.forEach(f => { if (params[f] === 0) params[f] = null; });
- listExternalOrder(params).then(response => {
- this.orderList = response.rows;
- this.total = response.total;
- this.loading = false;
- }).catch(() => {
- this.loading = false;
- });
- },
- /** 列头筛选:根据当前列表数据生成某字段去重后的筛选项(sort=true 时按数值正序排序) */
- getFilters(prop, labelMap = null, sort = false) {
- if (!this.orderList || this.orderList.length === 0) return [];
- const seen = new Map();
- this.orderList.forEach(item => {
- const v = item[prop];
- if (v === null || v === undefined || v === '') return;
- if (!seen.has(v)) seen.set(v, true);
- });
- let keys = Array.from(seen.keys());
- if (sort) {
- keys.sort((a, b) => Number(a) - Number(b));
- }
- return keys.map(v => ({
- text: labelMap ? (labelMap[v] || String(v)) : String(v),
- value: v
- }));
- },
- /** 定金回款时间筛选项(仅 status==4 显示 updateTime,否则显示 -) */
- getDepositReturnTimeFilters() {
- if (!this.orderList || this.orderList.length === 0) return [];
- const seen = new Map();
- this.orderList.forEach(item => {
- const v = item.status == 4 ? item.updateTime : '-';
- if (v === null || v === undefined || v === '') return;
- if (!seen.has(v)) seen.set(v, true);
- });
- return Array.from(seen.keys()).map(v => ({ text: String(v), value: v }));
- },
- /** 列头筛选变化:单选语义,取最后选中值映射到后端查询参数并重新请求 */
- handleFilterChange(filters) {
- // 时间字段:选中值当天范围映射
- const timeRangeMap = {
- externalCreateTime: ['sTime', 'eTime'],
- deliveryTime: ['deliveryStartTime', 'deliveryEndTime'],
- followTime: ['followTimeStart', 'followTimeEnd'],
- refundTime: ['refundTimeStart', 'refundTimeEnd'],
- auditTime: ['auditTimeStart', 'auditTimeEnd'],
- depositReturnTime: ['depositReturnTimeStart', 'depositReturnTimeEnd'],
- rejectReturnTime: ['rejectReturnTimeStart', 'rejectReturnTimeEnd']
- };
- // 列 column-key 到 queryParams 字段名的映射(特殊映射)
- const fieldMap = {
- productNames: 'productName'
- };
- Object.keys(filters).forEach(key => {
- const vals = filters[key] || [];
- // 单选:只保留最后选中的一项
- const last = vals.length > 0 ? vals[vals.length - 1] : null;
- this.$set(this.columnFilters, key, last != null ? [last] : []);
- if (timeRangeMap[key]) {
- const [startField, endField] = timeRangeMap[key];
- if (last != null && String(last).length >= 10) {
- const day = String(last).substring(0, 10);
- this.queryParams[startField] = day + ' 00:00:00';
- this.queryParams[endField] = day + ' 23:59:59';
- } else {
- this.queryParams[startField] = null;
- this.queryParams[endField] = null;
- }
- } else {
- const fieldName = fieldMap[key] || key;
- this.queryParams[fieldName] = last;
- }
- });
- this.handleQuery();
- },
- /** 重置所有列头筛选选中状态 */
- resetColumnFilters() {
- Object.keys(this.columnFilters).forEach(key => {
- this.columnFilters[key] = [];
- });
- },
- /** 合计行:对金额/数量列求和(基于当前页数据) */
- getSummaries({ columns, data }) {
- const sums = [];
- const sumProps = ['totalPrice', 'receivablePrice', 'payPrice', 'collectionPrice', 'refundPrice', 'memberBuyCount'];
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = '总计';
- return;
- }
- if (sumProps.includes(column.property)) {
- const total = data.reduce((sum, row) => {
- const v = Number(row[column.property]);
- return isNaN(v) ? sum : sum + v;
- }, 0);
- sums[index] = column.property === 'memberBuyCount' ? total : total.toFixed(2);
- } else {
- sums[index] = '';
- }
- });
- return sums;
- },
- getCompanyList() {
- getCompanyList().then(response => {
- this.companyList = response.data || [];
- });
- },
- /** 查询部门下拉树结构 */
- getTreeselect() {
- treeselect().then((response) => {
- this.deptOptions = 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;
- }
- },
- handleDeliveryTimeChange(val) {
- if (val) {
- this.queryParams.deliveryStartTime = val[0];
- this.queryParams.deliveryEndTime = val[1];
- } else {
- this.queryParams.deliveryStartTime = null;
- this.queryParams.deliveryEndTime = null;
- }
- },
- handleDepositReturnTimeChange(val) {
- if (val) {
- this.queryParams.depositReturnTimeStart = val[0];
- this.queryParams.depositReturnTimeEnd = val[1];
- } else {
- this.queryParams.depositReturnTimeStart = null;
- this.queryParams.depositReturnTimeEnd = null;
- }
- },
- handleFollowTimeChange(val) {
- if (val) {
- this.queryParams.followTimeStart = val[0];
- this.queryParams.followTimeEnd = val[1];
- } else {
- this.queryParams.followTimeStart = null;
- this.queryParams.followTimeEnd = null;
- }
- },
- handleRefundTimeChange(val) {
- if (val) {
- this.queryParams.refundTimeStart = val[0];
- this.queryParams.refundTimeEnd = val[1];
- } else {
- this.queryParams.refundTimeStart = null;
- this.queryParams.refundTimeEnd = null;
- }
- },
- handleAuditTimeChange(val) {
- if (val) {
- this.queryParams.auditTimeStart = val[0];
- this.queryParams.auditTimeEnd = val[1];
- } else {
- this.queryParams.auditTimeStart = null;
- this.queryParams.auditTimeEnd = null;
- }
- },
- handleQuery() {
- this.queryParams.pageNum = 1;
- this.getList();
- },
- resetQuery() {
- this.resetForm("queryForm");
- this.createTime = null;
- this.deliveryTime = null;
- this.depositReturnTime = null;
- this.followTime = null;
- this.refundTime = null;
- this.auditTime = null;
- this.queryParams.sTime = null;
- this.queryParams.eTime = null;
- this.queryParams.deliveryStartTime = null;
- this.queryParams.deliveryEndTime = null;
- this.queryParams.depositReturnTimeStart = null;
- this.queryParams.depositReturnTimeEnd = null;
- this.queryParams.followTimeStart = null;
- this.queryParams.followTimeEnd = null;
- this.queryParams.refundTimeStart = null;
- this.queryParams.refundTimeEnd = null;
- this.queryParams.auditTimeStart = null;
- this.queryParams.auditTimeEnd = null;
- this.queryParams.rejectReturnTimeStart = null;
- this.queryParams.rejectReturnTimeEnd = null;
- // 清空列头筛选选中状态及对应查询参数
- this.resetColumnFilters();
- this.handleQuery();
- },
- handleAdd() {
- this.reset();
- this.phone = null;
- this.users = [];
- this.address = [];
- this.drugList = [];
- this.selectedStoreId = null;
- this.storeOptions = [];
- this.loadStoreList();
- this.open = true;
- this.title = "创建外部订单";
- },
- reset() {
- this.form = {
- addressId: null,
- userId: null,
- receiverPhone: null,
- payType: null,
- totalPrice: null,
- payMoney: null,
- products: []
- };
- this.drugList = [];
- this.selectedStoreId = null;
- 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 = [];
- this.form.userId = null;
- this.form.addressId = null;
- 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;
- },
- handleUserChange(userId) {
- this.form.addressId = null;
- if (userId != null) {
- this.getAddressList(userId);
- } else {
- this.address = [];
- }
- },
- 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;
- });
- },
- handleAddProduct() {
- if (!this.selectedStoreId) {
- this.$message({ message: '请先选择店铺', type: 'warning' });
- return;
- }
- this.productSearchKeyword = null;
- this.productDialogPage.pageNum = 1;
- this.getProductDialogList();
- this.productDialogVisible = true;
- },
- searchProductDialog() {
- this.productDialogPage.pageNum = 1;
- this.getProductDialogList();
- },
- getProductDialogList() {
- var data = {
- pageNum: this.productDialogPage.pageNum,
- pageSize: this.productDialogPage.pageSize,
- productName: this.productSearchKeyword,
- storeId: this.selectedStoreId
- };
- listStoreProduct(data).then(response => {
- this.productDialogList = response.rows || [];
- this.productDialogTotal = response.total || 0;
- });
- },
- loadStoreList() {
- listStore().then(response => {
- this.storeOptions = response.rows || [];
- });
- },
- handleStoreChange() {
- this.drugList = [];
- this.form.totalPrice = null;
- },
- selectProduct(row) {
- for (var i = 0; i < this.drugList.length; i++) {
- if (this.drugList[i].productId == row.productId) {
- this.$message({ message: '该商品已添加', type: 'warning' });
- return;
- }
- }
- row.count = 1;
- row.price = Number(row.price) || 0;
- row.money = row.count * row.price;
- this.drugList.push({ ...row });
- this.compute();
- this.$message({ message: '添加成功', type: 'success' });
- },
- handleProductDelete(row) {
- this.drugList.splice(this.drugList.findIndex(item => item.productId === row.productId), 1);
- this.compute();
- },
- handleProductCountChange(row) {
- row.money = row.count * row.price;
- this.$forceUpdate();
- this.compute();
- },
- compute() {
- var total = 0;
- this.drugList.forEach(function(value) {
- total += value.money;
- });
- this.form.totalPrice = total.toFixed(2);
- },
- submitForm() {
- this.$refs["form"].validate(valid => {
- if (valid) {
- if (this.form.userId == null) {
- this.msgError("请选择会员");
- return;
- }
- if (this.drugList.length === 0) {
- this.msgError("请添加至少一个商品");
- return;
- }
- const products = this.drugList.map(item => ({
- productId: item.productId,
- num: item.count || 1,
- price: item.price
- }));
- var submitData = {
- addressId: this.form.addressId,
- userId: this.form.userId,
- payType: this.form.payType,
- totalPrice: parseFloat(this.form.totalPrice) || 0,
- payMoney: parseFloat(this.form.payMoney) || 0,
- receiverPhone: this.form.receiverPhone,
- products: products
- };
- 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;
- });
- },
- handleExpress(row) {
- this.expressDialog.row = row;
- this.expressDialog.open = true;
- this.express = null;
- this.traces = [];
- getExternalOrderExpress(row.orderId).then(response => {
- this.express = response.data;
- if (this.express != null && this.express.Traces != null) {
- this.traces = this.express.Traces;
- }
- });
- },
- handleSyncExpress(row) {
- if (!row || !row.orderId) {
- this.msgError("请选择订单");
- return;
- }
- this.$confirm("确定同步物流状态吗?", "警告", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning"
- }).then(() => {
- return syncExternalOrderExpress(row.orderId);
- }).then(() => {
- this.msgSuccess("操作成功");
- this.expressDialog.open = false;
- this.getList();
- }).catch(function() {});
- },
- handleAudit(row) {
- this.$confirm("确认审核该订单?审核后订单将变为审核通过状态", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning"
- }).then(() => {
- auditExternalOrder(row.orderId).then(response => {
- if (response.code === 200) {
- this.msgSuccess("审核成功");
- this.getList();
- }
- });
- });
- },
- handleCancel(row) {
- this.$confirm("确认取消该订单?取消后订单将变为已取消状态", "警告", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning"
- }).then(() => {
- cancelExternalOrder(row.orderId).then(response => {
- if (response.code === 200) {
- this.msgSuccess("取消订单成功");
- this.getList();
- }
- });
- });
- },
- handleApprove(row) {
- this.approveForm = {
- orderIds: [row.orderId],
- auditType: 1,
- oldTotalPrice: row.payPrice,
- newTotalPrice: null,
- newPayPrice: null,
- priceChangeReason: null,
- voucherImages: null,
- voucherRemark: null
- };
- this.approveOpen = true;
- },
- handleUploadSuccess(response) {
- if (response.code === 200) {
- this.approveForm.voucherImages = response.url;
- this.msgSuccess("上传成功");
- } else {
- this.msgError(response.msg);
- }
- },
- submitApprove() {
- this.$refs["approveForm"].validate(valid => {
- if (valid) {
- const data = {
- orderIds: this.approveForm.orderIds,
- auditType: this.approveForm.auditType,
- newTotalPrice: this.approveForm.newTotalPrice,
- newPayPrice: this.approveForm.newPayPrice,
- priceChangeReason: this.approveForm.priceChangeReason,
- voucherImages: this.approveForm.voucherImages,
- voucherRemark: this.approveForm.voucherRemark
- };
- approveExternalOrder(data).then(response => {
- this.msgSuccess("提交成功");
- this.approveOpen = false;
- this.getList();
- });
- }
- });
- },
- isAbnormalDelivery(deliveryType) {
- if (deliveryType == null) return false;
- const type = Number(deliveryType);
- return type === 4 || (type >= 401 && type <= 423);
- },
- 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(() => {});
- },
- handleEdit(row) {
- getExternalOrder(row.orderId).then(response => {
- const d = response.data;
- this.editForm = {
- orderId: d.orderId,
- status: d.status,
- followTime: d.followTime || null,
- deliveryName: d.deliveryName || null,
- deliveryStatus: d.deliveryStatus != null ? d.deliveryStatus : null,
- collectionPrice: d.collectionPrice != null ? Number(d.collectionPrice) : null,
- updateTime: d.updateTime || null,
- remark: d.remark || null,
- deliveryCode: d.deliveryCode || null,
- refundPrice: d.refundPrice != null ? Number(d.refundPrice) : null,
- refundTime: d.refundTime || null,
- rejectReturnTime: d.rejectReturnTime || null,
- diseaseName: d.diseaseName || null,
- isReturnGoods: d.isReturnGoods != null ? d.isReturnGoods : null
- };
- this.editOpen = true;
- });
- },
- submitEditConfirm() {
- this.editConfirmOpen = true;
- },
- submitEdit() {
- editExternalOrder(this.editForm).then(response => {
- if (response.code === 200) {
- this.msgSuccess("修改成功");
- this.editConfirmOpen = false;
- this.editOpen = false;
- this.getList();
- }
- });
- }
- }
- };
- </script>
|